diff --git a/src/babel/transformation/file/index.js b/src/babel/transformation/file/index.js index 029173a2ed..ae61d7cefe 100644 --- a/src/babel/transformation/file/index.js +++ b/src/babel/transformation/file/index.js @@ -85,6 +85,8 @@ export default class File { "default-props" ]; + "proxy-create", + "proxy-directory" static options = require("./options"); normalizeOptions(opts: Object) { diff --git a/src/babel/transformation/templates/helper-proxy-create.js b/src/babel/transformation/templates/helper-proxy-create.js new file mode 100644 index 0000000000..8ecc6af771 --- /dev/null +++ b/src/babel/transformation/templates/helper-proxy-create.js @@ -0,0 +1,4 @@ +(function (proxy, directory) { + directory.push(proxy); + return proxy; +}) diff --git a/src/babel/transformation/templates/helper-proxy-directory.js b/src/babel/transformation/templates/helper-proxy-directory.js new file mode 100644 index 0000000000..5e1ab7855e --- /dev/null +++ b/src/babel/transformation/templates/helper-proxy-directory.js @@ -0,0 +1 @@ +[]; diff --git a/src/babel/transformation/transformers/es6/proxies.js b/src/babel/transformation/transformers/es6/proxies.js new file mode 100644 index 0000000000..918a9722bf --- /dev/null +++ b/src/babel/transformation/transformers/es6/proxies.js @@ -0,0 +1,43 @@ +import * as t from "../../../types"; + +export var metadata = { + optional: true +}; + +// foo.bar +export function MemberExpression(node) { + +} + +// Object.setPrototypeOf +// Object.preventExtensions +// Object.keys +// Object.isExtensible +// Object.getOwnPropertyDescriptor +// Object.defineProperty +export function CallExpression(node) { + +} + +// delete foo.bar +export function UnaryExpression(node) { + +} + +// foo in bar +export function BinaryExpression(node) { + +} + +export function AssignmentExpression(node) { + +} + +// new Proxy +export function NewExpression(node, parent, scope, file) { + if (this.get("callee").isIdentifier({ name: "Proxy" })) { + return t.callExpression(file.addHelper("proxy-create"), [node.arguments[0], file.addHelper("proxy-directory")]); + } else { + // possible proxy constructor + } +} diff --git a/src/babel/transformation/transformers/index.js b/src/babel/transformation/transformers/index.js index 42ccc1d6b5..81f96c342e 100644 --- a/src/babel/transformation/transformers/index.js +++ b/src/babel/transformation/transformers/index.js @@ -2,6 +2,7 @@ export default { "es7.classProperties": require("./es7/class-properties"), "es7.asyncFunctions": require("./es7/async-functions"), "es7.decorators": require("./es7/decorators"), + "es6.proxies": require("./es6/proxies"), strict: require("./other/strict"), diff --git a/test/core/fixtures/transformation/es6.proxies/apply-handler.js b/test/core/fixtures/transformation/es6.proxies/apply-handler.js new file mode 100644 index 0000000000..19bcd6ce82 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/apply-handler.js @@ -0,0 +1,11 @@ +var proxied = function(){}; +var passed = false; +var host = { + method: new Proxy(proxied, { + apply: function (t, thisArg, args) { + passed = t === proxied && thisArg === host && args + "" === "foo,bar"; + } + }) +}; +host.method("foo", "bar"); +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/construct-handler.js b/test/core/fixtures/transformation/es6.proxies/construct-handler.js new file mode 100644 index 0000000000..5e8d8a909b --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/construct-handler.js @@ -0,0 +1,9 @@ +var proxied = function(){}; +var passed = false; +new new Proxy(proxied, { + construct: function (t, args) { + passed = t === proxied && args + "" === "foo,bar"; + return {}; + } +})("foo","bar"); +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/define-property-handler.js b/test/core/fixtures/transformation/es6.proxies/define-property-handler.js new file mode 100644 index 0000000000..ca2591db23 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/define-property-handler.js @@ -0,0 +1,13 @@ +var proxied = {}; +var passed = false; +Object.defineProperty( + new Proxy(proxied, { + defineProperty: function (t, k, d) { + passed = t === proxied && k === "foo" && d.value === 5; + return true; + } + }), + "foo", + { value: 5, configurable: true } +); +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/delete-property-handler.js b/test/core/fixtures/transformation/es6.proxies/delete-property-handler.js new file mode 100644 index 0000000000..90dafe2515 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/delete-property-handler.js @@ -0,0 +1,8 @@ +var proxied = {}; +var passed = false; +delete new Proxy(proxied, { + deleteProperty: function (t, k) { + passed = t === proxied && k === "foo"; + } +}).foo; +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/enumerate-handler.js b/test/core/fixtures/transformation/es6.proxies/enumerate-handler.js new file mode 100644 index 0000000000..4ce91749b7 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/enumerate-handler.js @@ -0,0 +1,13 @@ +var proxied = {}; +var passed = false; +for (var i in + new Proxy(proxied, { + enumerate: function (t) { + passed = t === proxied; + return { + next: function(){ return { done: true, value: null };} + }; + } + }) +) { } +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/get-handler-instance-of-proxies.js b/test/core/fixtures/transformation/es6.proxies/get-handler-instance-of-proxies.js new file mode 100644 index 0000000000..ac99d743cf --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/get-handler-instance-of-proxies.js @@ -0,0 +1,7 @@ +var proxied = { }; +var proxy = Object.create(new Proxy(proxied, { + get: function (t, k, r) { + return t === proxied && k === "foo" && r === proxy && 5; + } +})); +assert.equal(proxy.foo, 5); diff --git a/test/core/fixtures/transformation/es6.proxies/get-handler.js b/test/core/fixtures/transformation/es6.proxies/get-handler.js new file mode 100644 index 0000000000..600c9a575d --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/get-handler.js @@ -0,0 +1,7 @@ +var proxied = {}; +var proxy = new Proxy(proxied, { + get: function (t, k, r) { + return t === proxied && k === "foo" && r === proxy && 5; + } +}); +assert.equal(proxy.foo, 5); diff --git a/test/core/fixtures/transformation/es6.proxies/get-own-property-descriptor-handler.js b/test/core/fixtures/transformation/es6.proxies/get-own-property-descriptor-handler.js new file mode 100644 index 0000000000..4685bff725 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/get-own-property-descriptor-handler.js @@ -0,0 +1,14 @@ +var proxied = {}; +var fakeDesc = { value: "foo", configurable: true }; +var returnedDesc = Object.getOwnPropertyDescriptor( + new Proxy(proxied, { + getOwnPropertyDescriptor: function (t, k) { + return t === proxied && k === "foo" && fakeDesc; + } + }), + "foo" +); +assert.equal(returnedDesc.value, fakeDesc.value); +assert.equal(returnedDesc.configurable, fakeDesc.configurable); +assert.equal(returnedDesc.writable, false); +assert.equal(returnedDesc.enumerable, false); diff --git a/test/core/fixtures/transformation/es6.proxies/get-prototype-of-handler.js b/test/core/fixtures/transformation/es6.proxies/get-prototype-of-handler.js new file mode 100644 index 0000000000..0f21cfddc2 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/get-prototype-of-handler.js @@ -0,0 +1,8 @@ +var proxied = {}; +var fakeProto = {}; +var proxy = new Proxy(proxied, { + getPrototypeOf: function (t) { + return t === proxied && fakeProto; + } +}); +assert.equal(Object.getPrototypeOf(proxy), fakeProto); diff --git a/test/core/fixtures/transformation/es6.proxies/has-handler-instance-of-proxies.js b/test/core/fixtures/transformation/es6.proxies/has-handler-instance-of-proxies.js new file mode 100644 index 0000000000..127a6cc5d1 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/has-handler-instance-of-proxies.js @@ -0,0 +1,8 @@ +var proxied = {}; +var passed = false; +"foo" in Object.create(new Proxy(proxied, { + has: function (t, k) { + passed = t === proxied && k === "foo"; + } +})); +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/has-handler.js b/test/core/fixtures/transformation/es6.proxies/has-handler.js new file mode 100644 index 0000000000..653647ca62 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/has-handler.js @@ -0,0 +1,8 @@ +var proxied = {}; +var passed = false; +"foo" in new Proxy(proxied, { + has: function (t, k) { + passed = t === proxied && k === "foo"; + } +}); +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/is-extensible-handler.js b/test/core/fixtures/transformation/es6.proxies/is-extensible-handler.js new file mode 100644 index 0000000000..02b28971bb --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/is-extensible-handler.js @@ -0,0 +1,10 @@ +var proxied = {}; +var passed = false; +Object.isExtensible( + new Proxy(proxied, { + isExtensible: function (t) { + passed = t === proxied; return true; + } + }) +); +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/options.json b/test/core/fixtures/transformation/es6.proxies/options.json new file mode 100644 index 0000000000..84b1a52d53 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/options.json @@ -0,0 +1,3 @@ +{ + "optional": ["es6.proxies"] +} diff --git a/test/core/fixtures/transformation/es6.proxies/own-keys-handler.js b/test/core/fixtures/transformation/es6.proxies/own-keys-handler.js new file mode 100644 index 0000000000..4ed7c0912a --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/own-keys-handler.js @@ -0,0 +1,11 @@ +var proxied = {}; +var passed = false; +Object.keys( + new Proxy(proxied, { + ownKeys: function (t) { + passed = t === proxied; return []; + } + }) +); +assert.ok(passed); + diff --git a/test/core/fixtures/transformation/es6.proxies/prevent-extensions.js b/test/core/fixtures/transformation/es6.proxies/prevent-extensions.js new file mode 100644 index 0000000000..16b876f879 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/prevent-extensions.js @@ -0,0 +1,12 @@ +var proxied = {}; +var passed = false; +Object.preventExtensions( + new Proxy(proxied, { + preventExtensions: function (t) { + passed = t === proxied; + return Object.preventExtensions(proxied); + } + }) +); +assert.ok(passed); + diff --git a/test/core/fixtures/transformation/es6.proxies/set-handler-instance-of-proxies.js b/test/core/fixtures/transformation/es6.proxies/set-handler-instance-of-proxies.js new file mode 100644 index 0000000000..0ee509c7c0 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/set-handler-instance-of-proxies.js @@ -0,0 +1,10 @@ +var proxied = {}; +var passed = false; +var proxy = Object.create(new Proxy(proxied, { + set: function (t, k, v, r) { + passed = t === proxied && k + v === "foobar" && r === proxy; + } +})); +proxy.foo = "bar"; +assert.ok(passed); + diff --git a/test/core/fixtures/transformation/es6.proxies/set-handler.js b/test/core/fixtures/transformation/es6.proxies/set-handler.js new file mode 100644 index 0000000000..ed09468094 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/set-handler.js @@ -0,0 +1,9 @@ +var proxied = {}; +var passed = false; +var proxy = new Proxy(proxied, { + set: function (t, k, v, r) { + passed = t === proxied && k + v === "foobar" && r === proxy; + } +}); +proxy.foo = "bar"; +assert.ok(passed); diff --git a/test/core/fixtures/transformation/es6.proxies/set-prototype-of-handler.js b/test/core/fixtures/transformation/es6.proxies/set-prototype-of-handler.js new file mode 100644 index 0000000000..950fad52e2 --- /dev/null +++ b/test/core/fixtures/transformation/es6.proxies/set-prototype-of-handler.js @@ -0,0 +1,13 @@ +var proxied = {}; +var newProto = {}; +var passed = false; +Object.setPrototypeOf( + new Proxy(proxied, { + setPrototypeOf: function (t, p) { + passed = t === proxied && p === newProto; + return true; + } + }), + newProto +); +assert.ok(passed);