Ben Newman
(Meteor)
Facebook New York
10 November 2014
{ github,
twitter,
instagram,
facebook
}.com/benjamn
var Answer = Component.extend({
onLoad: function() {
var params = { uid: this.viewer, aid: this.answer };
this.$("#upvote").click(this.bind(function() {
this.serverCall("upvote", params).send();
}));
this.$("#downvote").click(this.bind(function() {
this.serverCall("downvote", params).send();
}));
this.$("body").bind("scroll", this.bind(function() {
// Every time the viewport scrolls, check visibility.
if (this.$("#container").inViewport()) {
this.serverCall("viewed_answer", params).send();
}
}));
}
});
gofmt?jsfmt.
var recast = require("recast");
var ast = recast.parse(source);
transform(ast); // Anything goes.
console.log(recast.print(ast).code);
recast.parse
var foo = recast.parse("foo;").program.body[0];
assert.deepEqual(foo, {
"type": "ExpressionStatement",
"expression": {
"type": "Identifier",
"name": "foo",
"original": { // Identical to foo.original.expression.
"type": "Identifier",
"name": "foo",
"loc": { "start": { "line": 1, "column": 0 },
"end": { "line": 1, "column": 3 } }
},
},
"original": {
"type": "ExpressionStatement",
"expression": { // Identical to foo.expression.original.
"type": "Identifier",
"name": "foo",
"loc": { "start": { "line": 1, "column": 0 },
"end": { "line": 1, "column": 4 } }
}
}
});
recast.visitrecast.visit is
only a suggestion!)
=> function syntax[3, 1, 10, 28].sort((a, b) => a - b)
var recast = require("recast");
var n = recast.types.namedTypes;
var b = recast.types.builders;
var ast = recast.parse(
"[3, 1, 10, 28].sort((a, b) => a - b)"
);
recast.visit(ast, {
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
if (!n.BlockStatement.check(node.body)) {
}
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
if (!n.BlockStatement.check(node.body)) {
n.Expression.assert(node.body);
}
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
if (!n.BlockStatement.check(node.body)) {
n.Expression.assert(node.body);
node.body = b.blockStatement([b.returnStatement(node.body)]);
}
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
if (!n.BlockStatement.check(node.body)) {
n.Expression.assert(node.body);
node.body = b.blockStatement([b.returnStatement(node.body)]);
node.expression = false;
}
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
if (!n.BlockStatement.check(node.body)) {
n.Expression.assert(node.body);
node.body = b.blockStatement([b.returnStatement(node.body)]);
node.expression = false;
}
var funExp = b.functionExpression(
node.id, node.params, node.body,
node.generator, node.expression
);
}
});
recast.visit(ast, {
visitArrowFunctionExpression: function(path) {
var node = path.node;
if (!n.BlockStatement.check(node.body)) {
n.Expression.assert(node.body);
node.body = b.blockStatement([b.returnStatement(node.body)]);
node.expression = false;
}
var funExp = b.functionExpression(
node.id, node.params, node.body,
node.generator, node.expression
);
return b.callExpression(
b.memberExpression(funExp, b.identifier("bind"), false),
[b.thisExpression()]
);
}
});
recast.printLines instead of strings
(lib/lines.js)
recast.print tries to recyle the original
source code wherever possible.
find ~/www/html/js/lib | \ grep "\.js$" | \ time parallel ~/www/scripts/bin/classify --update 228.03s user 12.25s system 1229% cpu 19.548 total
recast.visit
github.com/{
benjamn/jsconf-2014,
facebook/jstransform,
benjamn/recast,
benjamn/ast-types,
facebook/regenerator,
square/esnext
}
code.facebook.com/projects
What about Traceur?