Compare commits

...

18 Commits

Author SHA1 Message Date
Sebastian McKenzie
a1bdd804e2 v1.12.14 2014-11-15 11:30:37 +11:00
Sebastian McKenzie
10c051890b fix changelog version 2014-11-15 11:29:41 +11:00
Sebastian McKenzie
ac49d0a335 v1.12.4 2014-11-15 11:29:06 +11:00
Sebastian McKenzie
b56f1800e5 update regenerator-6to5 2014-11-15 11:27:29 +11:00
Sebastian McKenzie
49ef92c586 add changelog for v1.12.4 2014-11-15 11:23:42 +11:00
Sebastian McKenzie
542fe89123 fix up tests to work with new member expression keyword generator 2014-11-15 11:23:16 +11:00
Sebastian McKenzie
5b118c0c3f add _property-literals test 2014-11-15 11:13:10 +11:00
Sebastian McKenzie
8503916799 add _memberExpressionKeywords transformer that turns keyword identifiers to computed literals 2014-11-15 11:13:02 +11:00
Sebastian McKenzie
206c828a56 more react compliant whitespace - #165 2014-11-15 11:00:32 +11:00
Sebastian McKenzie
7a261a1db1 fix duplicate let scoping in functions - fixes #166 2014-11-15 09:47:48 +11:00
Sebastian McKenzie
c9d9a085f1 v1.12.13 2014-11-15 03:08:35 +11:00
Sebastian McKenzie
6d1953d9c3 fix constants transformer not accurately checking nodes 2014-11-15 03:07:33 +11:00
Sebastian McKenzie
92621d71c7 remove unused variable 2014-11-15 03:01:58 +11:00
Sebastian McKenzie
dc01731c25 add changelog for 1.12.13 2014-11-15 03:01:01 +11:00
Sebastian McKenzie
9fb8a80f60 support raw property on tagged template literals - closes #164 2014-11-15 03:00:53 +11:00
Sebastian McKenzie
85c2de57e4 fix for-head duplication testing and replacement - fixes #162 2014-11-15 02:50:05 +11:00
Sebastian McKenzie
58fac2e2be support duplicate constants within different block scopes - fixes #161 2014-11-15 02:49:49 +11:00
Sebastian McKenzie
682806f1ca instead of ignoring dot tests, add them as pending 2014-11-15 02:49:28 +11:00
43 changed files with 263 additions and 128 deletions

View File

@@ -1,3 +1,16 @@
# 1.12.14
* Fix duplicate let scoping in functions.
* Make JSX whitespace more React-compliant.
* Add `_memberExpressionKeywords` transformer that turns keyword identifiers to computed literals.
* Upgrade `regenerator-6to5`.
# 1.12.13
* Support duplicate constants within different block scopes.
* Fix for-head duplication testing and replacement.
* Support `raw` property on tagged template literals.
# 1.12.12
* Make scope tracker more reliable to handle all edgecases.

View File

@@ -18,7 +18,8 @@ function File(opts) {
this.ast = {};
}
File.declarations = ["extends", "class-props", "slice", "apply-constructor"];
File.declarations = ["extends", "class-props", "slice", "apply-constructor",
"tagged-template-literal"];
File.normaliseOptions = function (opts) {
opts = _.cloneDeep(opts || {});

View File

@@ -0,0 +1,4 @@
(function (strings, raw) {
return Object.defineProperties(strings, { raw: { value: raw } });
});

View File

@@ -27,37 +27,38 @@ transform.moduleFormatters = {
};
_.each({
modules: require("./transformers/modules"),
propertyNameShorthand: require("./transformers/property-name-shorthand"),
constants: require("./transformers/constants"),
arrayComprehension: require("./transformers/array-comprehension"),
generatorComprehension: require("./transformers/generator-comprehension"),
arrowFunctions: require("./transformers/arrow-functions"),
classes: require("./transformers/classes"),
modules: require("./transformers/modules"),
propertyNameShorthand: require("./transformers/property-name-shorthand"),
constants: require("./transformers/constants"),
arrayComprehension: require("./transformers/array-comprehension"),
generatorComprehension: require("./transformers/generator-comprehension"),
arrowFunctions: require("./transformers/arrow-functions"),
classes: require("./transformers/classes"),
_propertyLiterals: require("./transformers/_property-literals"),
computedPropertyNames: require("./transformers/computed-property-names"),
_propertyLiterals: require("./transformers/_property-literals"),
computedPropertyNames: require("./transformers/computed-property-names"),
spread: require("./transformers/spread"),
templateLiterals: require("./transformers/template-literals"),
propertyMethodAssignment: require("./transformers/property-method-assignment"),
defaultParameters: require("./transformers/default-parameters"),
restParameters: require("./transformers/rest-parameters"),
destructuring: require("./transformers/destructuring"),
forOf: require("./transformers/for-of"),
letScoping: require("./transformers/let-scoping"),
unicodeRegex: require("./transformers/unicode-regex"),
spread: require("./transformers/spread"),
templateLiterals: require("./transformers/template-literals"),
propertyMethodAssignment: require("./transformers/property-method-assignment"),
defaultParameters: require("./transformers/default-parameters"),
restParameters: require("./transformers/rest-parameters"),
destructuring: require("./transformers/destructuring"),
forOf: require("./transformers/for-of"),
letScoping: require("./transformers/let-scoping"),
unicodeRegex: require("./transformers/unicode-regex"),
react: require("./transformers/react"),
react: require("./transformers/react"),
_aliasFunctions: require("./transformers/_alias-functions"),
_blockHoist: require("./transformers/_block-hoist"),
_declarations: require("./transformers/_declarations"),
_aliasFunctions: require("./transformers/_alias-functions"),
_blockHoist: require("./transformers/_block-hoist"),
_declarations: require("./transformers/_declarations"),
generators: require("./transformers/generators"),
useStrict: require("./transformers/use-strict"),
generators: require("./transformers/generators"),
useStrict: require("./transformers/use-strict"),
_moduleFormatter: require("./transformers/_module-formatter")
_memberExpressionKeywords: require("./transformers/_member-expression-keywords"),
_moduleFormatter: require("./transformers/_module-formatter")
}, function (transformer, key) {
transform.transformers[key] = new Transformer(key, transformer);
});

View File

@@ -0,0 +1,10 @@
var esutils = require("esutils");
var t = require("../../types");
exports.MemberExpression = function (node) {
var prop = node.property;
if (t.isIdentifier(prop) && esutils.keyword.isKeywordES6(prop.name, true)) {
node.property = t.literal(prop.name);
node.computed = true;
}
};

View File

@@ -7,13 +7,14 @@ exports.BlockStatement =
exports.ForInStatement =
exports.ForOfStatement =
exports.ForStatement = function (node, parent, file) {
var constants = [];
var constants = {};
var check = function (node, names) {
var check = function (node, names, parent) {
_.each(names, function (name) {
if (constants.indexOf(name) >= 0) {
throw file.errorWithNode(node, name + " is read-only");
}
if (!_.has(constants, name)) return;
if (parent && t.isBlockStatement(parent) && parent !== constants[name]) return;
throw file.errorWithNode(node, name + " is read-only");
});
};
@@ -21,12 +22,12 @@ exports.ForStatement = function (node, parent, file) {
return t.getIds(node, false, ["MemberExpression"]);
};
_.each(node.body, function (child) {
_.each(node.body, function (child, parent) {
if (child && t.isVariableDeclaration(child, { kind: "const" })) {
_.each(child.declarations, function (declar) {
_.each(getIds(declar), function (name) {
check(declar, [name]);
constants.push(name);
check(declar, [name], parent);
constants[name] = parent;
});
declar._ignoreConstant = true;
@@ -37,13 +38,13 @@ exports.ForStatement = function (node, parent, file) {
}
});
if (!constants.length) return;
if (_.isEmpty(constants)) return;
traverse(node, function (child) {
traverse(node, function (child, parent) {
if (child._ignoreConstant) return;
if (t.isVariableDeclarator(child) || t.isDeclaration(child) || t.isAssignmentExpression(child)) {
check(child, getIds(child));
if (t.isDeclaration(child) || t.isAssignmentExpression(child)) {
check(child, getIds(child), parent);
}
});
};

View File

@@ -74,7 +74,6 @@ function LetScoping(forParent, block, parent, file, scope) {
this.letReferences = {};
this.body = [];
this.info = this.getInfo();
}
/**
@@ -87,8 +86,10 @@ LetScoping.prototype.run = function () {
if (block._letDone) return;
block._letDone = true;
this.info = this.getInfo();
// this is a block within a `Function` so we can safely leave it be
if (t.isFunction(this.parent)) return;
if (t.isFunction(this.parent)) return this.noClosure();
// this block has no let references so let's clean up
if (!this.info.keys.length) return this.noClosure();
@@ -145,11 +146,25 @@ LetScoping.prototype.noClosure = function () {
if (_.isEmpty(replacements)) return;
traverse(block, function (node, parent) {
var replace = function (node, parent) {
if (!t.isIdentifier(node)) return;
if (!t.isReferenced(node, parent)) return;
node.name = replacements[node.name] || node.name;
});
};
var traverseReplace = function (node, parent) {
replace(node, parent);
traverse(node, replace);
};
var forParent = this.forParent;
if (forParent) {
traverseReplace(forParent.right, forParent);
traverseReplace(forParent.test, forParent);
traverseReplace(forParent.update, forParent);
}
traverse(block, replace);
};
/**
@@ -181,10 +196,23 @@ LetScoping.prototype.getInfo = function () {
keys: []
};
var duplicates = function (id, key) {
var has = scope.parentGet(key);
if (has && has !== id) {
// there's a variable with this exact name in an upper scope so we need
// to generate a new name
opts.duplicates[key] = id.name = file.generateUid(key, scope);
}
};
_.each(opts.declarators, function (declar) {
opts.declarators.push(declar);
var keys = t.getIds(declar);
var keys = t.getIds(declar, true);
_.each(keys, duplicates);
keys = _.keys(keys);
opts.outsideKeys = opts.outsideKeys.concat(keys);
opts.keys = opts.keys.concat(keys);
});
@@ -193,14 +221,7 @@ LetScoping.prototype.getInfo = function () {
if (!isLet(declar)) return;
_.each(t.getIds(declar, true), function (id, key) {
var has = scope.parentGet(key);
if (has && has !== id) {
// there's a variable with this exact name in an upper scope so we need
// to generate a new name
opts.duplicates[key] = id.name = file.generateUid(key, scope);
}
duplicates(id, key);
opts.keys.push(key);
});
});

View File

@@ -106,11 +106,35 @@ exports.XJSElement = {
exit: function (node) {
var callExpr = node.openingElement;
var childrenToRender = node.children.filter(function(child) {
return !(t.isLiteral(child) && _.isString(child.value) && child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
});
_.each(node.children, function (child) {
if (t.isLiteral(child)) {
var lines = child.value.split(/\r\n|\n|\r/);
_.each(lines, function (line, i) {
var isFirstLine = i === 0;
var isLastLine = i === lines.length - 1;
// replace rendered whitespace tabs with spaces
var trimmedLine = line.replace(/\t/g, ' ');
// trim whitespace touching a newline
if (!isFirstLine) {
trimmedLine = trimmedLine.replace(/^[ ]+/, '');
}
// trim whitespace touching an endline
if (!isLastLine) {
trimmedLine = trimmedLine.replace(/[ ]+$/, '');
}
if (trimmedLine) {
callExpr.arguments.push(t.literal(trimmedLine));
}
});
return;
}
_.each(childrenToRender, function (child) {
callExpr.arguments.push(child);
});

View File

@@ -5,14 +5,22 @@ var buildBinaryExpression = function (left, right) {
return t.binaryExpression("+", left, right);
};
exports.TaggedTemplateExpression = function (node) {
exports.TaggedTemplateExpression = function (node, parent, file) {
var args = [];
var quasi = node.quasi;
var strings = quasi.quasis.map(function (elem) {
return t.literal(elem.value.raw);
var strings = [];
var raw = [];
_.each(quasi.quasis, function (elem) {
strings.push(t.literal(elem.value.cooked));
raw.push(t.literal(elem.value.raw));
});
args.push(t.arrayExpression(strings));
args.push(t.callExpression(file.addDeclaration("tagged-template-literal"), [
t.arrayExpression(strings),
t.arrayExpression(raw)
]));
_.each(quasi.expressions, function (expr) {
args.push(expr);

View File

@@ -1,7 +1,7 @@
{
"name": "6to5",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "1.12.12",
"version": "1.12.14",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://github.com/6to5/6to5",
"repository": {
@@ -44,7 +44,7 @@
"es6-symbol": "0.1.1",
"regexpu": "0.3.0",
"source-map": "0.1.40",
"regenerator-6to5": "https://github.com/6to5/regenerator-6to5/archive/75925940a7bb67d1ee8afec36b6d6eec072fb47c.tar.gz",
"regenerator-6to5": "https://github.com/6to5/regenerator-6to5/archive/a9c53518af063ffef410f826225f8ee250131932.tar.gz",
"chokidar": "0.10.5",
"source-map-support": "0.2.8",
"esutils": "1.1.4",

View File

@@ -36,8 +36,6 @@ exports.get = function (entryName) {
if (fs.existsSync(suiteOptsLoc)) suite.options = require(suiteOptsLoc);
_.each(fs.readdirSync(suite.filename), function (taskName) {
if (taskName[0] === ".") return;
var taskDir = suite.filename + "/" + taskName;
if (fs.statSync(taskDir).isFile()) return;
@@ -59,6 +57,7 @@ exports.get = function (entryName) {
var test = {
title: humanise(taskName),
disabled: taskName[0] === ".",
options: taskOpts,
exec: {
code: readFile(execLoc),

View File

@@ -19,7 +19,7 @@ var _extends = function (child, parent) {
var Test = (function (Foo) {
var Test = function Test() {
woops.super.test();
woops["super"].test();
Foo.call(this);
Foo.prototype.test.call(this);
foob(Foo);

View File

@@ -0,0 +1,6 @@
let x = 1;
{
let x = 2;
assert.equal(x, 2);
}
assert.equal(x, 1);

View File

@@ -0,0 +1,10 @@
function test () {
let value = "outer";
return (function () {
let value = "inner";
return value;
})();
}
assert(test(), "inner");

View File

@@ -0,0 +1,5 @@
assert.equal((function(){
let a = 1;
for (let a = 0; a < 8; a++) {}
return a;
}()), 1);

View File

@@ -0,0 +1,4 @@
test.catch;
test.catch["foo"];
test["catch"];
test["catch"]["foo"];

View File

@@ -0,0 +1,6 @@
"use strict";
test["catch"];
test["catch"]["foo"];
test["catch"];
test["catch"]["foo"];

View File

@@ -0,0 +1,6 @@
var obj = {
"test": "foob",
"!@#$": "foob",
"33rd": "foob",
fooBar: "foob"
};

View File

@@ -0,0 +1,8 @@
"use strict";
var obj = {
test: "foob",
"!@#$": "foob",
"33rd": "foob",
fooBar: "foob"
};

View File

@@ -1,15 +1,15 @@
define(["exports"], function (exports) {
"use strict";
exports.default = 42;
exports.default = {};
exports.default = [];
exports.default = foo;
exports.default = function () {};
exports.default = function () {};
exports["default"] = 42;
exports["default"] = {};
exports["default"] = [];
exports["default"] = foo;
exports["default"] = function () {};
exports["default"] = function () {};
function foo() {}
exports.default = foo;
exports["default"] = foo;
var Foo = function Foo() {};
exports.default = Foo;
exports["default"] = Foo;
});

View File

@@ -11,7 +11,7 @@ define(["exports", "foo"], function (exports, _foo) {
exports.foo = _foo.foo;
exports.bar = _foo.bar;
exports.bar = _foo.foo;
exports.default = _foo.foo;
exports.default = _foo.foo;
exports["default"] = _foo.foo;
exports["default"] = _foo.foo;
exports.bar = _foo.bar;
});
});

View File

@@ -5,7 +5,7 @@ define(["exports"], function (exports) {
exports.foo = foo;
exports.bar = bar;
exports.bar = foo;
exports.default = foo;
exports.default = foo;
exports["default"] = foo;
exports["default"] = foo;
exports.bar = bar;
});
});

View File

@@ -1,6 +1,6 @@
define(["exports", "foo"], function (exports, _foo) {
"use strict";
var foo = _foo.default;
var foo = _foo.default;
});
var foo = _foo["default"];
var foo = _foo["default"];
});

View File

@@ -1,6 +1,6 @@
define(["exports", "foo"], function (exports, _foo) {
"use strict";
var foo = _foo.default;
var foo = _foo["default"];
var xyz = _foo.baz;
});
});

View File

@@ -1,12 +1,12 @@
define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo, _fooBar, _directoryFooBar) {
"use strict";
var foo = _foo.default;
var foo = _foo["default"];
var foo = _foo;
var bar = _foo.bar;
var bar = _foo.foo;
exports.test = test;
var test = exports.test = 5;
exports.default = test;
exports["default"] = test;
});

View File

@@ -1,13 +1,13 @@
"use strict";
exports.default = 42;
exports.default = {};
exports.default = [];
exports.default = foo;
exports.default = function () {};
exports.default = function () {};
exports["default"] = 42;
exports["default"] = {};
exports["default"] = [];
exports["default"] = foo;
exports["default"] = function () {};
exports["default"] = function () {};
function foo() {}
exports.default = foo;
exports["default"] = foo;
var Foo = function Foo() {};
exports.default = Foo;
exports["default"] = Foo;

View File

@@ -10,6 +10,6 @@ exports.foo = require("foo").foo;
exports.foo = require("foo").foo;
exports.bar = require("foo").bar;
exports.bar = require("foo").foo;
exports.default = require("foo").foo;
exports.default = require("foo").foo;
exports.bar = require("foo").bar;
exports["default"] = require("foo").foo;
exports["default"] = require("foo").foo;
exports.bar = require("foo").bar;

View File

@@ -4,6 +4,6 @@ exports.foo = foo;
exports.foo = foo;
exports.bar = bar;
exports.bar = foo;
exports.default = foo;
exports.default = foo;
exports.bar = bar;
exports["default"] = foo;
exports["default"] = foo;
exports.bar = bar;

View File

@@ -1,4 +1,4 @@
"use strict";
var foo = require("foo").default;
var foo = require("foo").default;
var foo = require("foo")["default"];
var foo = require("foo")["default"];

View File

@@ -1,4 +1,4 @@
"use strict";
var foo = require("foo").default;
var foo = require("foo")["default"];
var xyz = require("foo").baz;

View File

@@ -6,7 +6,7 @@ require("foo-bar");
require("./directory/foo-bar");
var foo = require("foo").default;
var foo = require("foo")["default"];
var foo = require("foo");
var bar = require("foo").bar;
@@ -14,4 +14,4 @@ var bar = require("foo").foo;
exports.test = test;
var test = exports.test = 5;
exports.default = test;
exports["default"] = test;

View File

@@ -7,15 +7,15 @@
})(function (exports) {
"use strict";
exports.default = 42;
exports.default = {};
exports.default = [];
exports.default = foo;
exports.default = function () {};
exports.default = function () {};
exports["default"] = 42;
exports["default"] = {};
exports["default"] = [];
exports["default"] = foo;
exports["default"] = function () {};
exports["default"] = function () {};
function foo() {}
exports.default = foo;
exports["default"] = foo;
var Foo = function Foo() {};
exports.default = Foo;
exports["default"] = Foo;
});

View File

@@ -17,7 +17,7 @@
exports.foo = _foo.foo;
exports.bar = _foo.bar;
exports.bar = _foo.foo;
exports.default = _foo.foo;
exports.default = _foo.foo;
exports["default"] = _foo.foo;
exports["default"] = _foo.foo;
exports.bar = _foo.bar;
});

View File

@@ -11,7 +11,7 @@
exports.foo = foo;
exports.bar = bar;
exports.bar = foo;
exports.default = foo;
exports.default = foo;
exports["default"] = foo;
exports["default"] = foo;
exports.bar = bar;
});
});

View File

@@ -7,6 +7,6 @@
})(function (exports, _foo) {
"use strict";
var foo = _foo.default;
var foo = _foo.default;
});
var foo = _foo["default"];
var foo = _foo["default"];
});

View File

@@ -7,6 +7,6 @@
})(function (exports, _foo) {
"use strict";
var foo = _foo.default;
var foo = _foo["default"];
var xyz = _foo.baz;
});
});

View File

@@ -7,12 +7,12 @@
})(function (exports, _foo, _fooBar, _directoryFooBar) {
"use strict";
var foo = _foo.default;
var foo = _foo["default"];
var foo = _foo;
var bar = _foo.bar;
var bar = _foo.foo;
exports.test = test;
var test = exports.test = 5;
exports.default = test;
exports["default"] = test;
});

View File

@@ -1 +1 @@
var foo = bar`a${ 42 }b ${_.foobar()}`;
var foo = bar`wow\na${ 42 }b ${_.foobar()}`;

View File

@@ -1,3 +1,11 @@
"use strict";
var foo = bar(["a", "b ", ""], 42, _.foobar());
var _taggedTemplateLiteral = function (strings, raw) {
return Object.defineProperties(strings, {
raw: {
value: raw
}
});
};
var foo = bar(_taggedTemplateLiteral(["wow\na", "b ", ""], ["wow\\na", "b ", ""]), 42, _.foobar());

View File

@@ -22,7 +22,7 @@ suite("generation", function () {
_.each(helper.get("generation"), function (testSuite) {
suite("generation/" + testSuite.title, function () {
_.each(testSuite.tests, function (task) {
test(task.title, function () {
test(task.title, !task.disabled && function () {
var expect = task.expect;
var actual = task.actual;

View File

@@ -64,7 +64,7 @@ var run = function (task) {
_.each(helper.get("transformation"), function (testSuite) {
suite("transformation/" + testSuite.title, function () {
_.each(testSuite.tests, function (task) {
test(task.title, function () {
test(task.title, !task.disabled && function () {
var runTask = function () {
run(task);
};