add proxies

This commit is contained in:
Sebastian McKenzie 2015-04-11 14:32:52 -07:00
parent 070152f6c1
commit 0995cc3f4e
23 changed files with 225 additions and 0 deletions

View File

@ -85,6 +85,8 @@ export default class File {
"default-props" "default-props"
]; ];
"proxy-create",
"proxy-directory"
static options = require("./options"); static options = require("./options");
normalizeOptions(opts: Object) { normalizeOptions(opts: Object) {

View File

@ -0,0 +1,4 @@
(function (proxy, directory) {
directory.push(proxy);
return proxy;
})

View File

@ -0,0 +1 @@
[];

View File

@ -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
}
}

View File

@ -2,6 +2,7 @@ export default {
"es7.classProperties": require("./es7/class-properties"), "es7.classProperties": require("./es7/class-properties"),
"es7.asyncFunctions": require("./es7/async-functions"), "es7.asyncFunctions": require("./es7/async-functions"),
"es7.decorators": require("./es7/decorators"), "es7.decorators": require("./es7/decorators"),
"es6.proxies": require("./es6/proxies"),
strict: require("./other/strict"), strict: require("./other/strict"),

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -0,0 +1,3 @@
{
"optional": ["es6.proxies"]
}

View File

@ -0,0 +1,11 @@
var proxied = {};
var passed = false;
Object.keys(
new Proxy(proxied, {
ownKeys: function (t) {
passed = t === proxied; return [];
}
})
);
assert.ok(passed);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);