Compare commits

...

19 Commits

Author SHA1 Message Date
Sebastian McKenzie
47c6f74251 v1.12.12 2014-11-14 23:15:14 +11:00
Sebastian McKenzie
37f360c72d make scope tracker more reliable to handle all edgecases 2014-11-14 23:13:58 +11:00
Sebastian McKenzie
e5a8c95b62 v1.12.11 2014-11-14 19:39:25 +11:00
Sebastian McKenzie
921d459f13 fix transformation let scoping hoisting test 2014-11-14 19:38:29 +11:00
Sebastian McKenzie
58898932e6 shift letScoping to before forOf transformer 2014-11-14 19:35:07 +11:00
Sebastian McKenzie
c7b45116c4 fix generation of integer Literals in MemberExpression 2014-11-14 19:34:54 +11:00
Sebastian McKenzie
32ddd638ba Revert "expose moduleName option - closes #158"
This reverts commit fdd1451d53.
2014-11-14 18:33:11 +11:00
Sebastian McKenzie
0eb3cda2d4 add 1.12.11 changelog 2014-11-14 17:20:05 +11:00
Sebastian McKenzie
2acb24d43d block scope classes 2014-11-14 17:19:46 +11:00
Sebastian McKenzie
fdd1451d53 expose moduleName option - closes #158 2014-11-14 17:19:39 +11:00
Sebastian McKenzie
43e2f121a6 remove nodes replacing in util.template 2014-11-14 09:28:23 +11:00
Sebastian McKenzie
297e55ba63 Revert "fix up types.toStatement and return an expressionStatement if all else fails"
This reverts commit 740193b1e2.
2014-11-14 09:28:04 +11:00
Sebastian McKenzie
38396dadd5 remove unused nodes.inherits in util.template 2014-11-14 09:15:29 +11:00
Sebastian McKenzie
f75f045026 turn custom runtime into a proper identifier 2014-11-14 09:15:00 +11:00
Sebastian McKenzie
740193b1e2 fix up types.toStatement and return an expressionStatement if all else fails 2014-11-14 09:14:49 +11:00
Sebastian McKenzie
b9fe1475c2 add basic api test 2014-11-14 09:13:00 +11:00
Sebastian McKenzie
6065220f9b add runtime test 2014-11-14 09:12:54 +11:00
Sebastian McKenzie
715884662e fix basic unicode-regex test 2014-11-14 09:12:49 +11:00
Sebastian McKenzie
11780c28ff add let scoping hoisting test 2014-11-14 09:12:38 +11:00
17 changed files with 154 additions and 51 deletions

View File

@@ -1,3 +1,12 @@
# 1.12.12
* Make scope tracker more reliable to handle all edgecases.
# 1.12.11
* Block scope classes.
* Fix generation of integer `Literal`s in `MemberExpression`.
# 1.12.10
* Fix let scoping var hoisting.

View File

@@ -1,4 +1,5 @@
var t = require("../../types");
var util = require("../../util");
var t = require("../../types");
exports.UnaryExpression = function (node, print) {
var hasSpace = /[a-z]$/.test(node.operator);
@@ -105,6 +106,11 @@ exports.MemberExpression = function (node, print) {
print(node.property);
this.push("]");
} else {
// 5..toFixed(2);
if (t.isLiteral(node.object) && util.isInteger(node.object.value)) {
this.push(".");
}
this.push(".");
print(node.property);
}

View File

@@ -2,8 +2,8 @@ module.exports = Node;
var whitespace = require("./whitespace");
var parens = require("./parentheses");
var t = require("../../types");
var _ = require("lodash");
var t = require("../../types");
var _ = require("lodash");
var find = function (obj, node, parent) {
var result;

View File

@@ -5,7 +5,7 @@ var t = require("./types");
var _ = require("lodash");
module.exports = function (namespace) {
namespace = t.identifier(namespace || "to5Runtime");
namespace = t.identifier(t.toIdentifier(namespace || "to5Runtime"));
var body = [];
var container = t.functionExpression(null, [], t.blockStatement(body));

View File

@@ -44,8 +44,8 @@ _.each({
defaultParameters: require("./transformers/default-parameters"),
restParameters: require("./transformers/rest-parameters"),
destructuring: require("./transformers/destructuring"),
letScoping: require("./transformers/let-scoping"),
forOf: require("./transformers/for-of"),
letScoping: require("./transformers/let-scoping"),
unicodeRegex: require("./transformers/unicode-regex"),
react: require("./transformers/react"),

View File

@@ -4,7 +4,7 @@ var t = require("../../types");
var _ = require("lodash");
exports.ClassDeclaration = function (node, parent, file, scope) {
return t.variableDeclaration("var", [
return t.variableDeclaration("let", [
t.variableDeclarator(node.id, new Class(node, file, scope).run())
]);
};

View File

@@ -4,6 +4,8 @@ var traverse = require("./index");
var t = require("../types");
var _ = require("lodash");
var FOR_KEYS = ["left", "init"];
function Scope(parent, block) {
this.parent = parent;
this.block = block;
@@ -19,29 +21,59 @@ Scope.prototype.getIds = function () {
var self = this;
var ids = block._scopeIds = {};
if (t.isBlockStatement(block)) {
_.each(block.body, function (node) {
if (t.isVariableDeclaration(node) && node.kind !== "var") {
self.add(node, ids);
}
});
} else if (t.isProgram(block) || t.isFunction(block)) {
traverse(block, function (node, parent) {
if (parent !== block && t.isVariableDeclaration(node) && node.kind !== "var") {
return;
}
// ForStatement - left, init
if (t.isDeclaration(node)) {
self.add(node, ids);
} else if (t.isFunction(node)) {
return false;
}
if (t.isFor(block)) {
_.each(FOR_KEYS, function (key) {
var node = block[key];
if (t.isLet(node)) self.add(node, ids);
});
} else if (t.isCatchClause(block)) {
block = block.body;
}
// Program, BlockStatement - let variables
if (t.isBlockStatement(block) || t.isProgram(block)) {
_.each(block.body, function (node) {
// check for non-var `VariableDeclaration`s
if (t.isLet(node)) self.add(node, ids);
});
}
// CatchClause - param
if (t.isCatchClause(block)) {
self.add(block.param, ids);
}
// Program, Function - var variables
if (t.isProgram(block) || t.isFunction(block)) {
traverse(block, function (node) {
if (t.isFor(node)) {
_.each(FOR_KEYS, function (key) {
var declar = node[key];
if (t.isVar(declar)) self.add(declar, ids);
});
}
// this block is a function so we'll stop since none of the variables
// declared within are accessible
if (t.isFunction(node)) return false;
// we've ran into a declaration!
// we'll let the BlockStatement scope deal with `let` declarations
if (t.isDeclaration(node) && !t.isLet(node)) {
self.add(node, ids);
}
});
}
// Function - params
if (t.isFunction(block)) {
this.add(block.rest, ids);
_.each(block.params, function (param) {
self.add(param, ids);
});
@@ -51,6 +83,7 @@ Scope.prototype.getIds = function () {
};
Scope.prototype.add = function (node, ids) {
if (!node) return;
_.merge(ids || this.ids, t.getIds(node, true));
};

View File

@@ -35,9 +35,9 @@
"ClassDeclaration": ["Statement", "Declaration", "Class"],
"ClassExpression": ["Class"],
"ForOfStatement": ["Statement", "For"],
"ForInStatement": ["Statement", "For"],
"ForStatement": ["Statement", "For"],
"ForOfStatement": ["Statement", "For", "Scope"],
"ForInStatement": ["Statement", "For", "Scope"],
"ForStatement": ["Statement", "For", "Scope"],
"ObjectPattern": ["Pattern"],
"ArrayPattern": ["Pattern"],

View File

@@ -185,6 +185,14 @@ t.getIds = function (node, map, ignoreTypes) {
return ids;
};
t.isLet = function (node) {
return t.isVariableDeclaration(node) && (node.kind !== "var" || node._let);
};
t.isVar = function (node) {
return t.isVariableDeclaration(node, { kind: "var" }) && !node._let;
};
t.getIds.nodes = {
AssignmentExpression: "left",
ImportSpecifier: "id",

View File

@@ -17,6 +17,10 @@ exports.canCompile = function (filename, altExts) {
return _.contains(exts, ext);
};
exports.isInteger = function (i) {
return _.isNumber(i) && i % 1 === 0;
};
exports.resolve = function (loc) {
try {
return require.resolve(loc);
@@ -123,23 +127,17 @@ exports.template = function (name, nodes, keepExpression) {
template = _.cloneDeep(template);
var inherits = false;
if (nodes) {
inherits = nodes.inherits;
delete nodes.inherits;
if (!_.isEmpty(nodes)) {
traverse(template, function (node) {
if (t.isIdentifier(node) && _.has(nodes, node.name)) {
var newNode = nodes[node.name];
if (_.isString(newNode)) {
node.name = newNode;
} else {
return newNode;
}
if (!_.isEmpty(nodes)) {
traverse(template, function (node) {
if (t.isIdentifier(node) && _.has(nodes, node.name)) {
var newNode = nodes[node.name];
if (_.isString(newNode)) {
node.name = newNode;
} else {
return newNode;
}
});
}
}
});
}
var node = template.body[0];
@@ -150,10 +148,6 @@ exports.template = function (name, nodes, keepExpression) {
if (t.isParenthesizedExpression(node)) node = node.expression;
}
if (inherits) {
node = t.inherits(node, inherits);
}
return node;
};

View File

@@ -1,7 +1,7 @@
{
"name": "6to5",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "1.12.10",
"version": "1.12.12",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://github.com/6to5/6to5",
"repository": {

17
test/api.js Normal file
View File

@@ -0,0 +1,17 @@
var transform = require("../lib/6to5/transformation/transform");
var assert = require("assert");
var File = require("../lib/6to5/file");
suite("api", function () {
test("{ code: false }", function () {
var result = transform("foo('bar');", { code: false });
assert.ok(!result.code);
});
test("addDeclaration unknown", function () {
var file = new File;
assert.throws(function () {
file.addDeclaration("foob");
}, /unknown declaration foob/);
});
});

View File

@@ -0,0 +1,5 @@
let x = [0];
for (let x of x) {
assert.equal(x, 0);
}
assert.deepEqual(x, [0]);

View File

@@ -0,0 +1,6 @@
for (let i of [1, 2, 3]) {
var x = 5;
fns.push(function () {
return i * x;
});
}

View File

@@ -0,0 +1,12 @@
"use strict";
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var x;
(function () {
var i = _step.value;
x = 5;
fns.push(function () {
return i * x;
});
})();
}

View File

@@ -1,4 +1,2 @@
"use strict";
var string = "foo\ud83d\udca9bar";
var match = string.match(/foo((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF]))bar/);
var string = 'foo💩bar';
var match = string.match(/foo(.)bar/u);

15
test/runtime.js Normal file
View File

@@ -0,0 +1,15 @@
var runtime = require("../lib/6to5/runtime");
var assert = require("assert");
suite("runtime", function () {
test("default", function () {
var code = runtime();
assert.ok(!!code.match(/to5Runtime/));
});
test("custom", function () {
var code = runtime("customNamespace");
assert.ok(code.match(/customNamespace/));
assert.ok(!code.match(/to5Runtime/));
});
});