Compare commits

...

21 Commits

Author SHA1 Message Date
Sebastian McKenzie
95cf793df4 v3.3.10 2015-02-04 23:25:42 +11:00
Sebastian McKenzie
ea2ad96089 update 3.3.10 changelog 2015-02-04 23:24:13 +11:00
Sebastian McKenzie
4b2cf2e2c5 fix styling errors 2015-02-04 23:24:08 +11:00
Sebastian McKenzie
23b8c72e9a remove unused traverse requires 2015-02-04 23:22:26 +11:00
Sebastian McKenzie
80876a2c0a add 3.3.10 changelog 2015-02-04 23:20:53 +11:00
Sebastian McKenzie
c923010292 fix source map tests 2015-02-04 23:20:47 +11:00
Sebastian McKenzie
c84af909f7 track end of node positions for sourcemaps - fixes douglasduteil/isparta#8 2015-02-04 23:10:54 +11:00
Sebastian McKenzie
d6b39bc89b HomeObject isn't dynamic - fixes #690 2015-02-04 18:47:58 +11:00
Sebastian McKenzie
39fe737cb6 rename es7.objectSpread transformer to es7.objectRestSpread 2015-02-04 18:35:43 +11:00
Sebastian McKenzie
37ef976515 more cleanup of the destructuring transformer 2015-02-04 18:21:10 +11:00
Sebastian McKenzie
fa5a3022d4 clean up destructuring transformer 2015-02-04 17:48:27 +11:00
Sebastian McKenzie
58bed088f5 throw an error when destructuring a null or undefined value on an empty object pattern - fixes #681 2015-02-04 17:35:24 +11:00
Sebastian McKenzie
4f023e83f8 refactor traversals that have scopes to use the scope helper method 2015-02-04 13:25:23 +11:00
Sebastian McKenzie
7d950cd60a i made the javascripts faster with a transformer prepass to check what transformers actually have to be ran 2015-02-04 12:56:34 +11:00
Sebastian McKenzie
ffc9244f88 make #683 more inline with the official jsx compiler 2015-02-04 10:38:35 +11:00
Sebastian McKenzie
6ede3986c7 Merge branch 'master' of github.com:6to5/6to5 2015-02-04 10:23:29 +11:00
Sebastian McKenzie
5a81d22167 Merge pull request #683 from caseywebdev/concat-string-literals
Concatenate adjacent string literals in JSX
2015-02-04 10:22:51 +11:00
Sebastian McKenzie
2bf2e26a64 3.3.9 2015-02-04 10:15:19 +11:00
Sebastian McKenzie
ee466e90ca v3.3.9 2015-02-04 10:13:10 +11:00
Sebastian McKenzie
911e3939b9 remove class-super-constructor-call-check helper 2015-02-04 10:08:55 +11:00
Casey Foster
2562b0c201 Concatenate adjacent string literals in JSX 2015-02-03 10:46:54 -06:00
73 changed files with 599 additions and 406 deletions

View File

@@ -11,7 +11,19 @@
_Note: Gaps between patch versions are faulty/broken releases._
## 3.3.8
## 3.3.10
* **Internal**
* Restructure transformers so they're only ran if the AST contains nodes that they need to worry about. Improves transpilation speed significantly.
* **Bug Fix**
* Fix source maps not tracking end of node locations.
* **Spec Compliancy**
* Use static super references as the home object is actually done at definition time.
* **Polish**
* Force the `es6.destructuring` transformer to be whitelisted when the `es7.objectSpread` transformer is.
* Join sibling string literals when creating JSX.
## 3.3.9
* **Bug Fix**
* Fix super inside of functions.

View File

@@ -53,7 +53,7 @@ File.helpers = [
"get",
"set",
"class-call-check",
"class-super-constructor-call"
"object-destructuring-empty"
];
File.validOptions = [
@@ -182,6 +182,7 @@ File.prototype.buildTransformers = function () {
if (pass.canRun(file)) {
stack.push(pass);
if (transformer.secondPass) {
secondaryStack.push(pass);
}
@@ -353,6 +354,8 @@ File.prototype.transform = function (ast) {
modFormatter.init();
}
this.checkNode(ast);
var astRun = function (key) {
each(self.transformerStack, function (pass) {
pass.astRun(key);
@@ -368,6 +371,30 @@ File.prototype.transform = function (ast) {
astRun("exit");
};
var checkTransformerVisitor = {
enter: function (node, parent, scope, context, state) {
state.check(node, scope);
}
};
File.prototype.checkNode = function (node, scope) {
var self = this;
scope = scope || this.scope;
var check = function (node, scope) {
each(self.transformerStack, function (pass) {
if (pass.shouldRun) return;
pass.checkNode(node, scope);
});
};
check(node, scope);
scope.traverse(node, checkTransformerVisitor, {
check: check
});
};
File.prototype.generate = function () {
var opts = this.opts;
var ast = this.ast;

View File

@@ -94,8 +94,10 @@ exports.Literal = function (node) {
});
this.push(val);
} else if (type === "boolean" || type === "number") {
this.push(JSON.stringify(val));
} else if (type === "number") {
this.push(val + "");
} else if (type === "boolean") {
this.push(val ? "true" : "false");
} else if (node.regex) {
this.push("/" + node.regex.pattern + "/" + node.regex.flags);
} else if (val === null) {

View File

@@ -190,7 +190,7 @@ CodeGenerator.prototype.print = function (node, parent, opts) {
newline(true);
if (opts.before) opts.before();
this.map.mark(node);
this.map.mark(node, "start");
this[node.type](node, this.buildPrint(node), parent);
@@ -200,6 +200,7 @@ CodeGenerator.prototype.print = function (node, parent, opts) {
}
if (needsParens) this.push(")");
this.map.mark(node, "end");
if (opts.after) opts.after();
newline(false);

View File

@@ -30,7 +30,7 @@ SourceMap.prototype.get = function () {
}
};
SourceMap.prototype.mark = function (node) {
SourceMap.prototype.mark = function (node, type) {
var loc = node.loc;
if (!loc) return; // no location info
@@ -46,7 +46,7 @@ SourceMap.prototype.mark = function (node) {
column: position.column
};
var original = loc.start;
var original = loc[type];
map.addMapping({
source: this.opts.sourceFileName,

View File

@@ -1,8 +1,7 @@
"use strict";
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
var util = require("../../util");
var t = require("../../types");
var visitor = {
enter: function (node, parent, scope, context, state) {
@@ -35,7 +34,7 @@ exports.property = function (node, file, scope) {
outerDeclar: scope.getBinding(id),
};
traverse(node, visitor, scope, state);
scope.traverse(node, visitor, state);
if (state.selfReference) {
// todo: support generators

View File

@@ -1,7 +1,6 @@
"use strict";
var traverse = require("../../traverse");
var t = require("../../types");
var t = require("../../types");
var visitor = {
enter: function (node, parent, scope, context) {
@@ -23,7 +22,7 @@ module.exports = function (node, callId, scope) {
node.async = false;
node.generator = true;
traverse(node, visitor, scope);
scope.traverse(node, visitor);
var call = t.callExpression(callId, [node]);
var id = node.id;

View File

@@ -2,8 +2,7 @@
module.exports = ReplaceSupers;
var traverse = require("../../traverse");
var t = require("../../types");
var t = require("../../types");
/**
* Description
@@ -38,12 +37,7 @@ ReplaceSupers.prototype.setSuperProperty = function (property, value, isStatic,
return t.callExpression(
this.file.addHelper("set"),
[
t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")),
[
isStatic ? this.className : t.memberExpression(this.className, t.identifier("prototype"))
]
),
isStatic ? this.superName : t.memberExpression(this.superName, t.identifier("prototype")),
isComputed ? property : t.literal(property.name),
value,
thisExpression
@@ -65,63 +59,17 @@ ReplaceSupers.prototype.setSuperProperty = function (property, value, isStatic,
* @returns {Node}
*/
ReplaceSupers.prototype.superProperty = function (property, isStatic, isComputed, thisExpression) {
ReplaceSupers.prototype.getSuperProperty = function (property, isStatic, isComputed, thisExpression) {
return t.callExpression(
this.file.addHelper("get"),
[
t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")),
[
isStatic ? this.className : t.memberExpression(this.className, t.identifier("prototype"))
]
),
isStatic ? this.superName : t.memberExpression(this.superName, t.identifier("prototype")),
isComputed ? property : t.literal(property.name),
thisExpression
]
);
};
/**
* Description
*
* @param {Object} node
* @param {Object} id
* @param {Object} parent
* @returns {Object}
*/
ReplaceSupers.prototype.looseSuperProperty = function (methodNode, id, parent) {
var methodName = methodNode.key;
var superName = this.superName || t.identifier("Function");
if (parent.property === id) {
return;
} else if (t.isCallExpression(parent, { callee: id })) {
// super(); -> ClassName.prototype.MethodName.call(this);
parent.arguments.unshift(t.thisExpression());
if (methodName.name === "constructor") {
// constructor() { super(); }
return t.memberExpression(superName, t.identifier("call"));
} else {
id = superName;
// foo() { super(); }
if (!methodNode.static) {
id = t.memberExpression(id, t.identifier("prototype"));
}
id = t.memberExpression(id, methodName, methodNode.computed);
return t.memberExpression(id, t.identifier("call"));
}
} else if (t.isMemberExpression(parent) && !methodNode.static) {
// super.test -> ClassName.prototype.test
return t.memberExpression(superName, t.identifier("prototype"));
} else {
return superName;
}
};
/**
* Description
*/
@@ -167,7 +115,7 @@ var visitor = {
ReplaceSupers.prototype.traverseLevel = function (node, topLevel) {
var state = { self: this, topLevel: topLevel };
traverse(node, visitor, this.scope, state);
this.scope.traverse(node, visitor, state);
};
/**
@@ -186,6 +134,47 @@ ReplaceSupers.prototype.getThisReference = function () {
}
};
/**
* Description
*
* @param {Object} node
* @param {Object} id
* @param {Object} parent
* @returns {Object}
*/
ReplaceSupers.prototype.getLooseSuperProperty = function (methodNode, id, parent) {
var methodName = methodNode.key;
var superName = this.superName || t.identifier("Function");
if (parent.property === id) {
return;
} else if (t.isCallExpression(parent, { callee: id })) {
// super(); -> ClassName.prototype.MethodName.call(this);
parent.arguments.unshift(t.thisExpression());
if (methodName.name === "constructor") {
// constructor() { super(); }
return t.memberExpression(superName, t.identifier("call"));
} else {
id = superName;
// foo() { super(); }
if (!methodNode.static) {
id = t.memberExpression(id, t.identifier("prototype"));
}
id = t.memberExpression(id, methodName, methodNode.computed);
return t.memberExpression(id, t.identifier("call"));
}
} else if (t.isMemberExpression(parent) && !methodNode.static) {
// super.test -> ClassName.prototype.test
return t.memberExpression(superName, t.identifier("prototype"));
} else {
return superName;
}
};
/**
* Description
*
@@ -196,7 +185,7 @@ ReplaceSupers.prototype.getThisReference = function () {
ReplaceSupers.prototype.looseHandle = function (getThisReference, node, parent) {
if (t.isIdentifier(node, { name: "super" })) {
return this.looseSuperProperty(this.methodNode, node, parent);
return this.getLooseSuperProperty(this.methodNode, node, parent);
} else if (t.isCallExpression(node)) {
var callee = node.callee;
if (!t.isMemberExpression(callee)) return;
@@ -269,7 +258,7 @@ ReplaceSupers.prototype.specHandle = function (getThisReference, node, parent) {
if (!property) return;
thisReference = getThisReference();
var superProperty = this.superProperty(property, methodNode.static, computed, thisReference);
var superProperty = this.getSuperProperty(property, methodNode.static, computed, thisReference);
if (args) {
if (args.length === 1 && t.isSpreadElement(args[0])) {
// super(...arguments);

View File

@@ -2,7 +2,6 @@
module.exports = DefaultFormatter;
var traverse = require("../../traverse");
var object = require("../../helpers/object");
var util = require("../../util");
var t = require("../../types");
@@ -60,7 +59,7 @@ var exportsVisitor = {
};
DefaultFormatter.prototype.getLocalExports = function () {
traverse(this.file.ast, exportsVisitor, this.file.scope, this);
this.file.scope.traverse(this.file.ast, exportsVisitor, this);
};
var importsVisitor = {
@@ -74,7 +73,7 @@ var importsVisitor = {
};
DefaultFormatter.prototype.getLocalImports = function () {
traverse(this.file.ast, importsVisitor, this.file.scope, this);
this.file.scope.traverse(this.file.ast, importsVisitor, this);
};
var remapVisitor = {
@@ -116,7 +115,7 @@ var remapVisitor = {
DefaultFormatter.prototype.remapAssignments = function () {
if (this.hasLocalImports) {
traverse(this.file.ast, remapVisitor, this.file.scope, this);
this.file.scope.traverse(this.file.ast, remapVisitor, this);
}
};

View File

@@ -5,7 +5,6 @@ module.exports = SystemFormatter;
var DefaultFormatter = require("./_default");
var AMDFormatter = require("./amd");
var useStrict = require("../helpers/use-strict");
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
var last = require("lodash/array/last");
@@ -97,7 +96,7 @@ SystemFormatter.prototype.buildRunnerSetters = function (block, hoistDeclarators
hoistDeclarators: hoistDeclarators
};
traverse(block, runnerSettersVisitor, scope, state);
scope.traverse(block, runnerSettersVisitor, state);
return t.functionExpression(null, [uid], t.blockStatement(state.nodes));
}));
@@ -182,7 +181,7 @@ SystemFormatter.prototype.transform = function (ast) {
var returnStatement = handlerBody.pop();
// hoist up all variable declarations
traverse(block, hoistVariablesVisitor, this.file.scope, hoistDeclarators);
this.file.scope.traverse(block, hoistVariablesVisitor, hoistDeclarators);
if (hoistDeclarators.length) {
var hoistDeclar = t.variableDeclaration("var", hoistDeclarators);
@@ -191,7 +190,7 @@ SystemFormatter.prototype.transform = function (ast) {
}
// hoist up function declarations for circular references
traverse(block, hoistFunctionsVisitor, this.file.scope, handlerBody);
this.file.scope.traverse(block, hoistFunctionsVisitor, handlerBody);
handlerBody.push(returnStatement);

View File

@@ -1,3 +1,3 @@
if (Object.getPrototypeOf(CLASS_NAME) !== null) {
Object.getPrototypeOf(CLASS_NAME).apply(this, arguments);
if (SUPER_NAME != null) {
SUPER_NAME.apply(this, arguments);
}

View File

@@ -0,0 +1,3 @@
(function (obj) {
if (obj == null) throw new TypeError("Cannot destructure undefined");
});

View File

@@ -1,6 +1,5 @@
module.exports = TransformerPass;
var traverse = require("../traverse");
var util = require("../util");
var contains = require("lodash/collection/contains");
@@ -11,11 +10,14 @@ var contains = require("lodash/collection/contains");
function TransformerPass(file, transformer) {
this.transformer = transformer;
this.shouldRun = !transformer.check;
this.handlers = transformer.handlers;
this.file = file;
}
TransformerPass.prototype.astRun = function (key) {
if (!this.shouldRun) return;
var handlers = this.handlers;
var file = this.file;
@@ -29,23 +31,39 @@ TransformerPass.prototype.canRun = function () {
var opts = this.file.opts;
var key = transformer.key;
// internal
if (key[0] === "_") return true;
// blacklist
var blacklist = opts.blacklist;
if (blacklist.length && contains(blacklist, key)) return false;
// whitelist
var whitelist = opts.whitelist;
if (whitelist.length && !contains(whitelist, key)) return false;
// optional
if (transformer.optional && !contains(opts.optional, key)) return false;
// experimental
if (transformer.experimental && !opts.experimental) return false;
// playground
if (transformer.playground && !opts.playground) return false;
return true;
};
TransformerPass.prototype.checkNode = function (node) {
var check = this.transformer.check;
if (check) {
return this.shouldRun = check(node);
} else {
return true;
}
};
var transformVisitor = {
enter: function (node, parent, scope, context, state) {
var fns = state.handlers[node.type];
@@ -61,6 +79,8 @@ var transformVisitor = {
};
TransformerPass.prototype.transform = function () {
if (!this.shouldRun) return;
var file = this.file;
util.debug(file.opts.filename + ": Running transformer " + this.transformer.key);
@@ -68,7 +88,7 @@ TransformerPass.prototype.transform = function () {
this.astRun("before");
var state = { file: file, handlers: this.handlers, pass: this };
traverse(file.ast, transformVisitor, file.scope, state);
file.scope.traverse(file.ast, transformVisitor, state);
this.astRun("after");
};

View File

@@ -16,13 +16,16 @@ var each = require("lodash/collection/each");
function Transformer(key, transformer, opts) {
this.manipulateOptions = transformer.manipulateOptions;
this.experimental = !!transformer.experimental;
this.playground = !!transformer.playground;
this.secondPass = !!transformer.secondPass;
this.optional = !!transformer.optional;
this.handlers = this.normalize(transformer);
this.opts = opts || {};
this.key = key;
this.check = transformer.check;
this.experimental = !!transformer.experimental;
this.playground = !!transformer.playground;
this.secondPass = !!transformer.secondPass;
this.optional = !!transformer.optional;
this.handlers = this.normalize(transformer);
this.opts = opts || {};
this.key = key;
}
Transformer.prototype.normalize = function (transformer) {

View File

@@ -12,7 +12,8 @@
"generatorComprehension": "es7.comprehensions",
"arrowFunctions": "es6.arrowFunctions",
"classes": "es6.classes",
"objectSpread": "es7.objectSpread",
"objectSpread": "es7.objectRestSpread",
"es7.objectSpread": "es7.objectRestSpread",
"exponentiationOperator": "es7.exponentiationOperator",
"spread": "es6.spread",
"templateLiterals": "es6.templateLiterals",

View File

@@ -3,6 +3,10 @@
var defineMap = require("../../helpers/define-map");
var t = require("../../../types");
exports.check = function (node) {
return t.isProperty(node) && (node.kind === "get" || node.kind === "set");
};
exports.ObjectExpression = function (node) {
var mutatorMap = {};
var hasAny = false;

View File

@@ -2,6 +2,8 @@
var t = require("../../../types");
exports.check = t.isArrowFunctionExpression;
exports.ArrowFunctionExpression = function (node) {
t.ensureBlock(node);

View File

@@ -1,7 +1,6 @@
"use strict";
var traverse = require("../../../traverse");
var t = require("../../../types");
var t = require("../../../types");
var visitor = {
enter: function (node, parent, scope, context, state) {
@@ -46,5 +45,5 @@ exports.BlockStatement = function (node, parent, scope, context, file) {
file: file
};
traverse(node, visitor, scope, state);
scope.traverse(node, visitor, state);
};

View File

@@ -7,6 +7,10 @@ var t = require("../../../types");
var values = require("lodash/object/values");
var extend = require("lodash/object/extend");
exports.check = function (node) {
return t.isVariableDeclaration(node) && (node.kind === "let" || node.kind === "const");
};
var isLet = function (node, parent) {
if (!t.isVariableDeclaration(node)) return false;
if (node._let) return true;
@@ -126,7 +130,7 @@ var replaceVisitor = {
function traverseReplace(node, parent, scope, remaps) {
replace(node, parent, scope, null, remaps);
traverse(node, replaceVisitor, scope, remaps);
scope.traverse(node, replaceVisitor, remaps);
}
/**
@@ -172,7 +176,7 @@ BlockScoping.prototype.remap = function () {
traverseReplace(loopParent.update, loopParent, scope, remaps);
}
traverse(this.block, replaceVisitor, scope, remaps);
scope.traverse(this.block, replaceVisitor, remaps);
};
/**
@@ -239,7 +243,7 @@ var letReferenceFunctionVisitor = {
var letReferenceBlockVisitor = {
enter: function (node, parent, scope, context, state) {
if (t.isFunction(node)) {
traverse(node, letReferenceFunctionVisitor, scope, state);
scope.traverse(node, letReferenceFunctionVisitor, state);
return context.skip();
}
}
@@ -292,7 +296,7 @@ BlockScoping.prototype.getLetReferences = function () {
// traverse through this block, stopping on functions and checking if they
// contain any local let references
traverse(this.block, letReferenceBlockVisitor, this.scope, state);
this.scope.traverse(this.block, letReferenceBlockVisitor, state);
return state.closurify;
};
@@ -311,7 +315,7 @@ var loopVisitor = {
if (t.isLoop(node)) {
state.ignoreLabeless = true;
traverse(node, loopVisitor, scope, state);
scope.traverse(node, loopVisitor, state);
state.ignoreLabeless = false;
}
@@ -384,8 +388,8 @@ BlockScoping.prototype.checkLoop = function () {
map: {}
};
traverse(this.block, loopLabelVisitor, this.scope, state);
traverse(this.block, loopVisitor, this.scope, state);
this.scope.traverse(this.block, loopLabelVisitor, state);
this.scope.traverse(this.block, loopVisitor, state);
return state;
};

View File

@@ -6,6 +6,8 @@ var defineMap = require("../../helpers/define-map");
var util = require("../../../util");
var t = require("../../../types");
exports.check = t.isClass;
exports.ClassDeclaration = function (node, parent, scope, context, file) {
return new Class(node, file, scope, true).run();
};
@@ -48,7 +50,8 @@ function Class(node, file, scope, isStatement) {
this.staticMutatorMap = {};
this.hasConstructor = false;
this.className = node.id || scope.generateUidIdentifier("class");
this.superName = node.superClass;
this.superName = node.superClass || t.identifier("Function");
this.hasSuper = !!node.superClass;
this.isLoose = file.isLoose("es6.classes");
}
@@ -91,7 +94,7 @@ Class.prototype.run = function () {
//
if (superName) {
if (this.hasSuper) {
closureArgs.push(superName);
if (!t.isIdentifier(superName)) {
@@ -167,7 +170,7 @@ Class.prototype.buildBody = function () {
}
// we have no constructor, we have a super, and the super doesn't appear to be falsy
if (!this.hasConstructor && superName && !t.isFalsyExpression(superName)) {
if (!this.hasConstructor && this.hasSuper && !t.isFalsyExpression(superName)) {
var helperName = "class-super-constructor-call";
if (this.isLoose) helperName += "-loose";
constructor.body.body.push(util.template(helperName, {

View File

@@ -1,7 +1,10 @@
"use strict";
var traverse = require("../../../traverse");
var t = require("../../../types");
var t = require("../../../types");
exports.check = function (node) {
return t.isVariableDeclaration(node, { kind: "const" });
};
var visitor = {
enter: function (node, parent, scope, context, state) {
@@ -33,7 +36,7 @@ var visitor = {
};
exports.Scope = function (node, parent, scope, context, file) {
traverse(node, visitor, scope, {
scope.traverse(node, visitor, {
constants: scope.getAllDeclarationsOfKind("const"),
file: file
});

View File

@@ -1,11 +1,20 @@
"use strict";
// TODO: Clean up
var t = require("../../../types");
var buildVariableAssign = function (opts, id, init) {
var op = opts.operator;
exports.check = t.isPattern;
function Destructuring(opts) {
this.blockHoist = opts.blockHoist;
this.operator = opts.operator;
this.nodes = opts.nodes;
this.scope = opts.scope;
this.file = opts.file;
this.kind = opts.kind;
}
Destructuring.prototype.buildVariableAssignment = function (id, init) {
var op = this.operator;
if (t.isMemberExpression(id)) op = "=";
var node;
@@ -13,47 +22,46 @@ var buildVariableAssign = function (opts, id, init) {
if (op) {
node = t.expressionStatement(t.assignmentExpression(op, id, init));
} else {
node = t.variableDeclaration(opts.kind, [
node = t.variableDeclaration(this.kind, [
t.variableDeclarator(id, init)
]);
}
node._blockHoist = opts.blockHoist;
node._blockHoist = this.blockHoist;
return node;
};
var buildVariableDeclar = function (opts, id, init) {
Destructuring.prototype.buildVariableDeclaration = function (id, init) {
var declar = t.variableDeclaration("var", [
t.variableDeclarator(id, init)
]);
declar._blockHoist = opts.blockHoist;
declar._blockHoist = this.blockHoist;
return declar;
};
var push = function (opts, nodes, elem, parentId) {
Destructuring.prototype.push = function (elem, parentId) {
if (t.isObjectPattern(elem)) {
pushObjectPattern(opts, nodes, elem, parentId);
this.pushObjectPattern(elem, parentId);
} else if (t.isArrayPattern(elem)) {
pushArrayPattern(opts, nodes, elem, parentId);
this.pushArrayPattern(elem, parentId);
} else if (t.isAssignmentPattern(elem)) {
pushAssignmentPattern(opts, nodes, elem, parentId);
this.pushAssignmentPattern(elem, parentId);
} else {
nodes.push(buildVariableAssign(opts, elem, parentId));
this.nodes.push(this.buildVariableAssignment(elem, parentId));
}
};
var pushAssignmentPattern = function (opts, nodes, pattern, parentId) {
var tempParentId = opts.scope.generateUidBasedOnNode(parentId, opts.file);
Destructuring.prototype.pushAssignmentPattern = function (pattern, parentId) {
var tempParentId = this.scope.generateUidBasedOnNode(parentId);
var declar = t.variableDeclaration("var", [
t.variableDeclarator(tempParentId, parentId)
]);
declar._blockHoist = opts.blockHoist;
nodes.push(declar);
declar._blockHoist = this.blockHoist;
this.nodes.push(declar);
nodes.push(buildVariableAssign(
opts,
this.nodes.push(this.buildVariableAssignment(
pattern.left,
t.conditionalExpression(
t.binaryExpression("===", tempParentId, t.identifier("undefined")),
@@ -63,72 +71,88 @@ var pushAssignmentPattern = function (opts, nodes, pattern, parentId) {
));
};
var pushObjectPattern = function (opts, nodes, pattern, parentId) {
Destructuring.prototype.pushObjectSpread = function (pattern, parentId, prop, i) {
// get all the keys that appear in this object before the current spread
var keys = [];
for (var i2 = 0; i2 < pattern.properties.length; i2++) {
var prop2 = pattern.properties[i2];
if (i2 >= i) break;
if (t.isSpreadProperty(prop2)) continue;
var key = prop2.key;
if (t.isIdentifier(key)) {
key = t.literal(prop2.key.name);
}
keys.push(key);
}
keys = t.arrayExpression(keys);
var value = t.callExpression(this.file.addHelper("object-without-properties"), [parentId, keys]);
this.nodes.push(this.buildVariableAssignment(prop.argument, value));
};
Destructuring.prototype.pushObjectProperty = function (prop, parentId) {
if (t.isLiteral(prop.key)) prop.computed = true;
var pattern2 = prop.value;
var patternId2 = t.memberExpression(parentId, prop.key, prop.computed);
if (t.isPattern(pattern2)) {
this.push(pattern2, patternId2);
} else {
this.nodes.push(this.buildVariableAssignment(pattern2, patternId2));
}
};
Destructuring.prototype.pushObjectPattern = function (pattern, parentId) {
if (!pattern.properties.length) {
this.nodes.push(t.expressionStatement(
t.callExpression(this.file.addHelper("object-destructuring-empty"), [parentId])
));
}
for (var i = 0; i < pattern.properties.length; i++) {
var prop = pattern.properties[i];
if (t.isSpreadProperty(prop)) {
// get all the keys that appear in this object before the current spread
var keys = [];
for (var i2 = 0; i2 < pattern.properties.length; i2++) {
var prop2 = pattern.properties[i2];
if (i2 >= i) break;
if (t.isSpreadProperty(prop2)) continue;
var key = prop2.key;
if (t.isIdentifier(key)) {
key = t.literal(prop2.key.name);
}
keys.push(key);
}
keys = t.arrayExpression(keys);
var value = t.callExpression(opts.file.addHelper("object-without-properties"), [parentId, keys]);
nodes.push(buildVariableAssign(opts, prop.argument, value));
this.pushObjectSpread(pattern, parentId, prop, i);
} else {
if (t.isLiteral(prop.key)) prop.computed = true;
var pattern2 = prop.value;
var patternId2 = t.memberExpression(parentId, prop.key, prop.computed);
if (t.isPattern(pattern2)) {
push(opts, nodes, pattern2, patternId2);
} else {
nodes.push(buildVariableAssign(opts, pattern2, patternId2));
}
this.pushObjectProperty(prop, parentId);
}
}
};
var pushArrayPattern = function (opts, nodes, pattern, parentId) {
if (!pattern.elements) return;
var i;
var hasRest = false;
for (i = 0; i < pattern.elements.length; i++) {
var hasRest = function (pattern) {
for (var i = 0; i < pattern.elements.length; i++) {
if (t.isRestElement(pattern.elements[i])) {
hasRest = true;
break;
return true;
}
}
return false;
};
var toArray = opts.file.toArray(parentId, !hasRest && pattern.elements.length);
Destructuring.prototype.pushArrayPattern = function (pattern, parentId) {
if (!pattern.elements) return;
var _parentId = opts.scope.generateUidBasedOnNode(parentId, opts.file);
nodes.push(buildVariableDeclar(opts, _parentId, toArray));
// if we have a rest then we need all the elements
var count = !hasRest(pattern) && pattern.elements.length;
var toArray = this.file.toArray(parentId, count);
var _parentId = this.scope.generateUidBasedOnNode(parentId, this.file);
this.nodes.push(this.buildVariableDeclaration(_parentId, toArray));
parentId = _parentId;
for (i = 0; i < pattern.elements.length; i++) {
for (var i = 0; i < pattern.elements.length; i++) {
var elem = pattern.elements[i];
if (!elem) continue;
i = +i;
// hole
if (!elem) continue;
var newPatternId;
if (t.isRestElement(elem)) {
newPatternId = opts.file.toArray(parentId);
newPatternId = this.file.toArray(parentId);
if (i > 0) {
newPatternId = t.callExpression(t.memberExpression(newPatternId, t.identifier("slice")), [t.literal(i)]);
@@ -139,23 +163,18 @@ var pushArrayPattern = function (opts, nodes, pattern, parentId) {
newPatternId = t.memberExpression(parentId, t.literal(i), true);
}
push(opts, nodes, elem, newPatternId);
this.push(elem, newPatternId);
}
};
var pushPattern = function (opts) {
var nodes = opts.nodes;
var pattern = opts.pattern;
var parentId = opts.id;
var scope = opts.scope;
Destructuring.prototype.init = function (pattern, parentId) {
if (!t.isArrayExpression(parentId) && !t.isMemberExpression(parentId) && !t.isIdentifier(parentId)) {
var key = scope.generateUidBasedOnNode(parentId);
nodes.push(buildVariableDeclar(opts, key, parentId));
var key = this.scope.generateUidBasedOnNode(parentId);
this.nodes.push(this.buildVariableDeclaration(key, parentId));
parentId = key;
}
push(opts, nodes, pattern, parentId);
this.push(pattern, parentId);
};
exports.ForInStatement =
@@ -173,11 +192,14 @@ exports.ForOfStatement = function (node, parent, scope, context, file) {
var nodes = [];
push({
var destructuring = new Destructuring({
kind: declar.kind,
file: file,
scope: scope
}, nodes, pattern, key);
scope: scope,
nodes: nodes
});
destructuring.init(pattern, key);
t.ensureBlock(node);
@@ -196,15 +218,14 @@ exports.Function = function (node, parent, scope, context, file) {
hasDestructuring = true;
var parentId = scope.generateUidIdentifier("ref");
pushPattern({
var destructuring = new Destructuring({
blockHoist: node.params.length - i,
pattern: pattern,
nodes: nodes,
scope: scope,
file: file,
kind: "var",
id: parentId
});
destructuring.init(pattern, parentId);
return parentId;
});
@@ -226,11 +247,13 @@ exports.CatchClause = function (node, parent, scope, context, file) {
var nodes = [];
push({
var destructuring = new Destructuring({
kind: "var",
file: file,
scope: scope
}, nodes, pattern, ref);
scope: scope,
nodes: nodes
});
destructuring.init(pattern, ref);
node.body.body = nodes.concat(node.body.body);
};
@@ -248,11 +271,13 @@ exports.ExpressionStatement = function (node, parent, scope, context, file) {
t.variableDeclarator(ref, expr.right)
]));
push({
var destructuring = new Destructuring({
operator: expr.operator,
file: file,
scope: scope
}, nodes, expr.left, ref);
scope: scope,
nodes: nodes
});
destructuring.init(expr.left, ref);
return nodes;
};
@@ -269,50 +294,50 @@ exports.AssignmentExpression = function (node, parent, scope, context, file) {
var nodes = [];
nodes.push(t.assignmentExpression("=", ref, node.right));
push({
var destructuring = new Destructuring({
operator: node.operator,
file: file,
scope: scope
}, nodes, node.left, ref);
scope: scope,
nodes: nodes
});
destructuring.init(node.left, ref);
nodes.push(ref);
return t.toSequenceExpression(nodes, scope);
};
exports.VariableDeclaration = function (node, parent, scope, context, file) {
if (t.isForInStatement(parent) || t.isForOfStatement(parent)) return;
var nodes = [];
var i;
var declar;
var hasPattern = false;
for (i = 0; i < node.declarations.length; i++) {
declar = node.declarations[i];
if (t.isPattern(declar.id)) {
hasPattern = true;
break;
var variableDeclarationhasPattern = function (node) {
for (var i = 0; i < node.declarations.length; i++) {
if (t.isPattern(node.declarations[i].id)) {
return true;
}
}
if (!hasPattern) return;
return false;
};
for (i = 0; i < node.declarations.length; i++) {
exports.VariableDeclaration = function (node, parent, scope, context, file) {
if (t.isForInStatement(parent) || t.isForOfStatement(parent)) return;
if (!variableDeclarationhasPattern(node)) return;
var nodes = [];
var declar;
for (var i = 0; i < node.declarations.length; i++) {
declar = node.declarations[i];
var patternId = declar.init;
var pattern = declar.id;
var opts = {
pattern: pattern,
nodes: nodes,
scope: scope,
kind: node.kind,
file: file,
id: patternId,
};
var destructuring = new Destructuring({
nodes: nodes,
scope: scope,
kind: node.kind,
file: file
});
if (t.isPattern(pattern) && patternId) {
pushPattern(opts);
destructuring.init(pattern, patternId);
if (+i !== node.declarations.length - 1) {
// we aren't the last declarator so let's just make the
@@ -320,11 +345,14 @@ exports.VariableDeclaration = function (node, parent, scope, context, file) {
t.inherits(nodes[nodes.length - 1], declar);
}
} else {
nodes.push(t.inherits(buildVariableAssign(opts, declar.id, declar.init), declar));
nodes.push(t.inherits(destructuring.buildVariableAssignment(declar.id, declar.init), declar));
}
}
if (!t.isProgram(parent) && !t.isBlockStatement(parent)) {
// https://github.com/6to5/6to5/issues/113
// for (let [x] = [0]; false;) {}
declar = null;
for (i = 0; i < nodes.length; i++) {

View File

@@ -3,6 +3,8 @@
var util = require("../../../util");
var t = require("../../../types");
exports.check = t.isForOfStatement;
exports.ForOfStatement = function (node, parent, scope, context, file) {
var callback = spec;
if (file.isLoose("es6.forOf")) callback = loose;

View File

@@ -2,6 +2,8 @@
var t = require("../../../types");
exports.check = require("../internal/modules").check;
exports.ImportDeclaration = function (node, parent, scope, context, file) {
var nodes = [];

View File

@@ -1,8 +1,11 @@
"use strict";
var traverse = require("../../../traverse");
var util = require("../../../util");
var t = require("../../../types");
var util = require("../../../util");
var t = require("../../../types");
exports.check = function (node) {
return t.isFunction(node) && hasDefaults(node);
};
var hasDefaults = function (node) {
for (var i = 0; i < node.params.length; i++) {
@@ -51,7 +54,7 @@ exports.Function = function (node, parent, scope) {
if (t.isIdentifier(right) && scope.hasOwnReference(right.name)) {
state.iife = true;
} else {
traverse(right, iifeVisitor, scope, state);
scope.traverse(right, iifeVisitor, state);
}
}

View File

@@ -3,6 +3,8 @@
var util = require("../../../util");
var t = require("../../../types");
exports.check = t.isRestElement;
var hasRest = function (node) {
return t.isRestElement(node.params[node.params.length - 1]);
};

View File

@@ -2,6 +2,10 @@
var t = require("../../../types");
exports.check = function (node) {
return t.isProperty(node) && node.computed;
};
exports.ObjectExpression = function (node, parent, scope, context, file) {
var hasComputed = false;

View File

@@ -4,6 +4,10 @@ var nameMethod = require("../../helpers/name-method");
var t = require("../../../types");
var clone = require("lodash/lang/clone");
exports.check = function (node) {
return t.isProperty(node) && (node.method || node.shorthand);
};
exports.Property = function (node, parent, scope, context, file) {
if (node.method) {
node.method = false;

View File

@@ -1,7 +1,9 @@
"use strict";
var t = require("../../../types");
var contains = require("lodash/collection/contains");
var t = require("../../../types");
exports.check = t.isSpreadElement;
var getSpreadLiteral = function (spread, file) {
return file.toArray(spread.argument);

View File

@@ -6,6 +6,10 @@ var buildBinaryExpression = function (left, right) {
return t.binaryExpression("+", left, right);
};
exports.check = function (node) {
return t.isTemplateLiteral(node) || t.isTaggedTemplateExpression(node);
};
exports.TaggedTemplateExpression = function (node, parent, scope, context, file) {
var args = [];
var quasi = node.quasi;

View File

@@ -2,6 +2,11 @@
var rewritePattern = require("regexpu/rewrite-pattern");
var pull = require("lodash/array/pull");
var t = require("../../../types");
exports.check = function (node) {
return t.isLiteral(node) && node.regex && node.regex.flags.indexOf("u") >= 0;
};
exports.Literal = function (node) {
var regex = node.regex;

View File

@@ -6,18 +6,21 @@ var t = require("../../../types");
exports.experimental = true;
exports.ObjectExpression = function (node, parent, scope, context, file) {
var hasSpread = false;
var i;
var prop;
for (i = 0; i < node.properties.length; i++) {
prop = node.properties[i];
if (t.isSpreadProperty(prop)) {
hasSpread = true;
break;
exports.manipulateOptions = function (opts) {
if (opts.whitelist.length) opts.whitelist.push("es6.destructuring");
};
var hasSpread = function (node) {
for (var i = 0; i < node.properties.length; i++) {
if (t.isSpreadProperty(node.properties[i])) {
return true;
}
}
if (!hasSpread) return;
return false;
};
exports.ObjectExpression = function (node, parent, scope, context, file) {
if (!hasSpread(node)) return;
var args = [];
var props = [];
@@ -28,8 +31,8 @@ exports.ObjectExpression = function (node, parent, scope, context, file) {
props = [];
};
for (i = 0; i < node.properties.length; i++) {
prop = node.properties[i];
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
if (t.isSpreadProperty(prop)) {
push();
args.push(prop.argument);

View File

@@ -27,7 +27,7 @@ module.exports = {
asyncToGenerator: require("./other/async-to-generator"),
bluebirdCoroutines: require("./other/bluebird-coroutines"),
"es7.objectSpread": require("./es7/object-spread"),
"es7.objectRestSpread": require("./es7/object-rest-spread"),
"es7.exponentiationOperator": require("./es7/exponentiation-operator"),
"es6.spread": require("./es6/spread"),
"es6.templateLiterals": require("./es6/template-literals"),

View File

@@ -1,7 +1,6 @@
"use strict";
var traverse = require("../../../traverse");
var t = require("../../../types");
var t = require("../../../types");
var functionChildrenVisitor = {
enter: function (node, parent, scope, context, state) {
@@ -37,7 +36,7 @@ var functionVisitor = {
}
// traverse all child nodes of this function and find `arguments` and `this`
traverse(node, functionChildrenVisitor, scope, state);
scope.traverse(node, functionChildrenVisitor, state);
return context.skip();
}
@@ -58,7 +57,7 @@ var go = function (getBody, node, scope) {
// traverse the function and find all alias functions so we can alias
// `arguments` and `this` if necessary
traverse(node, functionVisitor, scope, state);
scope.traverse(node, functionVisitor, state);
var body;

View File

@@ -15,6 +15,10 @@ var resolveModuleSource = function (node, parent, scope, context, file) {
}
};
exports.check = function (node) {
return t.isImportDeclaration(node) || t.isExportDeclaration(node);
};
exports.ImportDeclaration = resolveModuleSource;
exports.ExportDeclaration = function (node, parent, scope) {

View File

@@ -5,9 +5,16 @@
// jsx
var esutils = require("esutils");
var react = require("../../helpers/react");
var t = require("../../../types");
var isString = require("lodash/lang/isString");
var esutils = require("esutils");
var react = require("../../helpers/react");
var t = require("../../../types");
exports.check = function (node) {
if (t.isJSX(node)) return true;
if (react.isCreateClass(node)) return true;
return false;
};
exports.JSXIdentifier = function (node, parent) {
if (node.name === "this" && t.isReferenced(node, parent)) {
@@ -160,6 +167,8 @@ exports.JSXElement = {
callExpr.arguments.push(child);
}
callExpr.arguments = flatten(callExpr.arguments);
if (callExpr.arguments.length >= 3) {
callExpr._prettyCall = true;
}
@@ -168,6 +177,27 @@ exports.JSXElement = {
}
};
var isStringLiteral = function (node) {
return t.isLiteral(node) && isString(node.value);
};
var flatten = function (args) {
var flattened = [];
var last;
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (isStringLiteral(arg) && isStringLiteral(last)) {
last.value += arg.value;
} else {
last = arg;
flattened.push(arg);
}
}
return flattened;
};
var cleanJSXElementLiteralChild = function (child, args) {
var lines = child.value.split(/\r\n|\n|\r/);

View File

@@ -1,6 +1,11 @@
"use strict";
var regenerator = require("regenerator-6to5");
var t = require("../../../types");
exports.check = function (node) {
return t.isFunction(node) && (node.async || node.generator);
};
exports.ast = {
before: function (ast, file) {

View File

@@ -1,6 +1,5 @@
"use strict";
var traverse = require("../../../traverse");
var util = require("../../../util");
var core = require("core-js/library");
var t = require("../../../types");
@@ -77,7 +76,7 @@ exports.ast = {
},
after: function (ast, file) {
traverse(ast, astVisitor, null, file);
file.scope.traverse(ast, astVisitor, file);
}
};

View File

@@ -1,7 +1,6 @@
"use strict";
var traverse = require("../../../traverse");
var t = require("../../../types");
var t = require("../../../types");
exports.playground = true;
@@ -23,6 +22,7 @@ exports.Property =
exports.MethodDefinition = function (node, parent, scope, context, file) {
if (node.kind !== "memo") return;
node.kind = "get";
file.checkNode(node, scope);
var value = node.value;
t.ensureBlock(value);
@@ -38,5 +38,5 @@ exports.MethodDefinition = function (node, parent, scope, context, file) {
file: file
};
traverse(value, visitor, scope, state);
scope.traverse(value, visitor, state);
};

View File

@@ -10,11 +10,12 @@ var contains = require("lodash/collection/contains");
var flatten = require("lodash/array/flatten");
var compact = require("lodash/array/compact");
function TraversalContext() {
function TraversalContext(scope) {
this.shouldFlatten = false;
this.shouldRemove = false;
this.shouldSkip = false;
this.shouldStop = false;
this.scope = scope;
}
TraversalContext.prototype.flatten = function () {
@@ -44,20 +45,31 @@ TraversalContext.prototype.reset = function () {
TraversalContext.prototype.maybeRemove = function (obj, key) {
if (this.shouldRemove) {
obj[key] = null;
this.shouldFlatten = true;
this.flatten();
}
};
function replaceNode(obj, key, node, result) {
var isArray = Array.isArray(result);
TraversalContext.prototype.replaceNode = function (obj, key, node, replacement, scope) {
var isArray = Array.isArray(replacement);
// inherit comments from original node to the first replacement node
var inheritTo = result;
if (isArray) inheritTo = result[0];
var inheritTo = replacement;
if (isArray) inheritTo = replacement[0];
if (inheritTo) t.inheritsComments(inheritTo, node);
// replace the node
obj[key] = result;
obj[key] = replacement;
var file = this.scope && this.scope.file;
if (file) {
if (isArray) {
for (var i = 0; i < replacement.length; i++) {
file.checkNode(replacement[i], scope);
}
} else {
file.checkNode(replacement, scope);
}
}
// we're replacing a statement or block node with an array of statements so we better
// ensure that it's a block
@@ -66,39 +78,16 @@ function replaceNode(obj, key, node, result) {
}
if (isArray) {
return true;
this.flatten();
}
}
TraversalContext.prototype.enterNode = function (obj, key, node, enter, parent, scope, state) {
var result = enter(node, parent, scope, this, state);
var flatten = false;
if (result) {
flatten = replaceNode(obj, key, node, result);
node = result;
if (flatten) {
this.shouldFlatten = true;
}
}
this.maybeRemove(obj, key);
return node;
};
TraversalContext.prototype.exitNode = function (obj, key, node, exit, parent, scope, state) {
var result = exit(node, parent, scope, this, state);
var flatten = false;
TraversalContext.prototype.call = function (fn, obj, key, node, parent, scope, state) {
var replacement = fn(node, parent, scope, this, state);
if (result) {
flatten = replaceNode(obj, key, node, result);
node = result;
if (flatten) {
this.shouldFlatten = true;
}
if (replacement) {
this.replaceNode(obj, key, node, replacement, scope);
node = replacement;
}
this.maybeRemove(obj, key);
@@ -122,7 +111,7 @@ TraversalContext.prototype.visitNode = function (obj, key, opts, scope, parent,
ourScope = new Scope(node, parent, scope);
}
node = this.enterNode(obj, key, node, opts.enter, parent, ourScope, state);
node = this.call(opts.enter, obj, key, node, parent, ourScope, state);
if (this.shouldSkip) {
return this.shouldStop;
@@ -136,7 +125,7 @@ TraversalContext.prototype.visitNode = function (obj, key, opts, scope, parent,
}
} else {
traverseNode(node, opts, ourScope, state);
this.exitNode(obj, key, node, opts.exit, parent, ourScope, state);
this.call(opts.exit, obj, key, node, parent, ourScope, state);
}
return this.shouldStop;
@@ -174,7 +163,7 @@ function traverseNode(node, opts, scope, state) {
var keys = t.VISITOR_KEYS[node.type];
if (!keys) return;
var context = new TraversalContext();
var context = new TraversalContext(scope);
for (var i = 0; i < keys.length; i++) {
if (context.visit(node, keys[i], opts, scope, state)) {
return;

View File

@@ -35,6 +35,18 @@ function Scope(block, parentBlock, parent, file) {
Scope.defaultDeclarations = flatten([globals.builtin, globals.browser, globals.node].map(Object.keys));
/**
* Description
*
* @param {Object} node
* @param {Object} opts
* @param [state]
*/
Scope.prototype.traverse = function (node, opts, state) {
traverse(node, opts, this, state);
};
/**
* Description
*
@@ -296,7 +308,7 @@ Scope.prototype.crawl = function () {
// Program, BlockStatement - let variables
if (t.isBlockStatement(block) || t.isProgram(block)) {
traverse(block, blockVariableVisitor, this, this);
this.traverse(block, blockVariableVisitor, this);
}
// CatchClause - param
@@ -322,7 +334,7 @@ Scope.prototype.crawl = function () {
// Program, Function - var variables
if (t.isProgram(block) || t.isFunction(block)) {
traverse(block, functionVariableVisitor, this, {
this.traverse(block, functionVariableVisitor, {
blockId: block.id,
scope: this
});
@@ -339,7 +351,7 @@ Scope.prototype.crawl = function () {
// Program
if (t.isProgram(block)) {
traverse(block, programReferenceVisitor, this, this);
this.traverse(block, programReferenceVisitor, this);
}
};

View File

@@ -44,28 +44,39 @@
"ArrayPattern": ["Pattern"],
"AssignmentPattern": ["Pattern"],
"Property": ["UserWhitespacable"],
"Property": ["UserWhitespacable"],
"JSXElement": ["UserWhitespacable", "Expression"],
"ArrayExpression": ["Expression"],
"AssignmentExpression": ["Expression"],
"AwaitExpression": ["Expression"],
"BindFunctionExpression": ["Expression"],
"BindMemberExpression": ["Expression"],
"CallExpression": ["Expression"],
"ComprehensionExpression": ["Expression", "Scope"],
"ConditionalExpression": ["Expression"],
"Identifier": ["Expression"],
"Literal": ["Expression"],
"MemberExpression": ["Expression"],
"NewExpression": ["Expression"],
"ObjectExpression": ["Expression"],
"SequenceExpression": ["Expression"],
"TaggedTemplateExpression": ["Expression"],
"ThisExpression": ["Expression"],
"UpdateExpression": ["Expression"],
"ArrayExpression": ["Expression"],
"AssignmentExpression": ["Expression"],
"AwaitExpression": ["Expression"],
"BindFunctionExpression": ["Expression"],
"BindMemberExpression": ["Expression"],
"CallExpression": ["Expression"],
"ComprehensionExpression": ["Expression", "Scope"],
"ConditionalExpression": ["Expression"],
"Identifier": ["Expression"],
"Literal": ["Expression"],
"MemberExpression": ["Expression"],
"NewExpression": ["Expression"],
"ObjectExpression": ["Expression"],
"SequenceExpression": ["Expression"],
"TaggedTemplateExpression": ["Expression"],
"ThisExpression": ["Expression"],
"UpdateExpression": ["Expression"],
"VirtualPropertyExpression": ["Expression"],
"JSXEmptyExpression": ["Expression"],
"JSXMemberExpression": ["Expression"],
"YieldExpression": ["Expression"]
"JSXEmptyExpression": ["Expression"],
"JSXMemberExpression": ["Expression"],
"YieldExpression": ["Expression"],
"JSXAttribute": ["JSX"],
"JSXClosingElement": ["JSX"],
"JSXElement": ["JSX"],
"JSXEmptyExpression": ["JSX"],
"JSXExpressionContainer": ["JSX"],
"JSXIdentifier": ["JSX"],
"JSXMemberExpression": ["JSX"],
"JSXNamespacedName": ["JSX"],
"JSXOpeningElement": ["JSX"],
"JSXSpreadAttribute": ["JSX"]
}

View File

@@ -138,7 +138,7 @@ exports.parse = function (opts, code, callback) {
var ast = acorn.parse(code, {
allowImportExportEverywhere: opts.allowImportExportEverywhere,
allowReturnOutsideFunction: true,
allowReturnOutsideFunction: !opts._anal,
ecmaVersion: opts.experimental ? 7 : 6,
playground: opts.playground,
strictMode: opts.strictMode,

View File

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

View File

@@ -1,7 +1,7 @@
{
"name": "6to5-runtime",
"description": "6to5 selfContained runtime",
"version": "3.3.7",
"version": "3.3.9",
"repository": "6to5/6to5",
"author": "Sebastian McKenzie <sebmck@gmail.com>"
}

View File

@@ -1,7 +1,8 @@
var util = require("../lib/6to5/util");
var path = require("path");
var fs = require("fs");
var _ = require("lodash");
var esvalid = require("esvalid");
var util = require("../lib/6to5/util");
var path = require("path");
var fs = require("fs");
var _ = require("lodash");
var humanize = function (val, noext) {
if (noext) val = path.basename(val, path.extname(val));
@@ -18,6 +19,17 @@ var readFile = exports.readFile = function (filename) {
}
};
exports.esvalid = function (ast, loc) {
var errors = esvalid.errors(ast);
if (errors.length) {
var msg = [];
_.each(errors, function (err) {
msg.push(err.message + " - " + JSON.stringify(err.node));
});
throw new Error(loc + ": " + msg.join(". "));
}
};
exports.assertVendor = function (name) {
if (!fs.existsSync(__dirname + "/../vendor/" + name)) {
console.error("No vendor/" + name + " - run `make bootstrap`");

View File

@@ -2,7 +2,6 @@ var genHelpers = require("./_generator-helpers");
var transform = require("../lib/6to5/transformation");
var sourceMap = require("source-map");
var codeFrame = require("../lib/6to5/helpers/code-frame");
var esvalid = require("esvalid");
var Module = require("module");
var helper = require("./_helper");
var assert = require("assert");
@@ -55,15 +54,7 @@ var run = function (task, done) {
var checkAst = function (result, opts) {
if (noCheckAst) return;
var errors = esvalid.errors(result.ast.program);
if (errors.length) {
var msg = [];
_.each(errors, function (err) {
msg.push(err.message + " - " + JSON.stringify(err.node));
});
throw new Error(opts.loc + ": " + msg.join(". "));
}
helper.esvalid(result.ast.program, opts.loc);
};
if (execCode) {

View File

@@ -5,4 +5,4 @@ var _classCallCheck = function (instance, Constructor) { if (!(instance instance
var Test = function Test() {
_classCallCheck(this, Test);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9iYXIvYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7SUFBTSxnQkFBQTt3QkFBQSIsImZpbGUiOiJzcmMvYmFyL2Jhci5qcyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIFRlc3Qge1xuXG59Il19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9iYXIvYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7SUFBTSxJQUFJLFlBQUosSUFBSTt3QkFBSixJQUFJIiwiZmlsZSI6InNyYy9iYXIvYmFyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgVGVzdCB7XG5cbn0iXX0=

View File

@@ -3,4 +3,4 @@
arr.map(function (x) {
return x * MULTIPLIER;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9mb28uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFJLElBQUksVUFBQTtTQUFLLElBQUkiLCJmaWxlIjoic3JjL2Zvby5qcyIsInNvdXJjZXNDb250ZW50IjpbImFyci5tYXAoeCA9PiB4ICogTVVMVElQTElFUik7Il19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9mb28uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQztTQUFJLENBQUMsR0FBRyxVQUFVO0NBQUEsQ0FBQyxDQUFDIiwiZmlsZSI6InNyYy9mb28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJhcnIubWFwKHggPT4geCAqIE1VTFRJUExJRVIpOyJdfQ==

View File

@@ -1 +1 @@
{"version":3,"sources":["src/bar/bar.js"],"names":[],"mappings":";;;;IAAM,gBAAA;wBAAA","file":"src/bar/bar.js","sourcesContent":["class Test {\n\n}"]}
{"version":3,"sources":["src/bar/bar.js"],"names":[],"mappings":";;;;IAAM,IAAI,YAAJ,IAAI;wBAAJ,IAAI","file":"src/bar/bar.js","sourcesContent":["class Test {\n\n}"]}

View File

@@ -1 +1 @@
{"version":3,"sources":["src/foo.js"],"names":[],"mappings":";;AAAA,IAAI,IAAI,UAAA;SAAK,IAAI","file":"src/foo.js","sourcesContent":["arr.map(x => x * MULTIPLIER);"]}
{"version":3,"sources":["src/foo.js"],"names":[],"mappings":";;AAAA,GAAG,CAAC,GAAG,CAAC,UAAA,CAAC;SAAI,CAAC,GAAG,UAAU;CAAA,CAAC,CAAC","file":"src/foo.js","sourcesContent":["arr.map(x => x * MULTIPLIER);"]}

View File

@@ -4,4 +4,4 @@ arr.map(function (x) {
return x * MULTIPLIER;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLElBQUksSUFBSSxVQUFBO1NBQUssSUFBSSIsImZpbGUiOiJzY3JpcHQyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiYXJyLm1hcCh4ID0+IHggKiBNVUxUSVBMSUVSKTsiXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDO1NBQUksQ0FBQyxHQUFHLFVBQVU7Q0FBQSxDQUFDLENBQUMiLCJmaWxlIjoic2NyaXB0Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbImFyci5tYXAoeCA9PiB4ICogTVVMVElQTElFUik7Il19

View File

@@ -11,4 +11,4 @@ arr.map(function (x) {
return x * MULTIPLIER;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdC5qcyIsInNjcmlwdDIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztJQUFNLGdCQUFBO3dCQUFBOzs7OztBQ0FOLElBQUksSUFBSSxVQUFBO1NBQUssSUFBSSIsImZpbGUiOiJzY3JpcHQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgVGVzdCB7XG5cbn0iLCJhcnIubWFwKHggPT4geCAqIE1VTFRJUExJRVIpOyJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdC5qcyIsInNjcmlwdDIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztJQUFNLElBQUksWUFBSixJQUFJO3dCQUFKLElBQUk7Ozs7O0FDQVYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUM7U0FBSSxDQUFDLEdBQUcsVUFBVTtDQUFBLENBQUMsQ0FBQyIsImZpbGUiOiJzY3JpcHQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgVGVzdCB7XG5cbn0iLCJhcnIubWFwKHggPT4geCAqIE1VTFRJUExJRVIpOyJdfQ==

View File

@@ -1 +1 @@
{"version":3,"sources":["script.js","script2.js"],"names":[],"mappings":";;;;IAAM,gBAAA;wBAAA;;;;;ACAN,IAAI,IAAI,UAAA;SAAK,IAAI","file":"script3.js","sourcesContent":["class Test {\n\n}","arr.map(x => x * MULTIPLIER);"]}
{"version":3,"sources":["script.js","script2.js"],"names":[],"mappings":";;;;IAAM,IAAI,YAAJ,IAAI;wBAAJ,IAAI;;;;;ACAV,GAAG,CAAC,GAAG,CAAC,UAAA,CAAC;SAAI,CAAC,GAAG,UAAU;CAAA,CAAC,CAAC","file":"script3.js","sourcesContent":["class Test {\n\n}","arr.map(x => x * MULTIPLIER);"]}

View File

@@ -1 +1 @@
{"version":3,"sources":["stdin"],"names":[],"mappings":";;AAAA,IAAI,IAAI,UAAA;SAAK,IAAI","file":"test.js","sourcesContent":["arr.map(x => x * x);"]}
{"version":3,"sources":["stdin"],"names":[],"mappings":";;AAAA,GAAG,CAAC,GAAG,CAAC,UAAA,CAAC;SAAI,CAAC,GAAG,CAAC;CAAA,CAAC,CAAC","file":"test.js","sourcesContent":["arr.map(x => x * x);"]}

View File

@@ -4,4 +4,4 @@ arr.map(function (x) {
return x * x;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBSSxJQUFJLFVBQUE7U0FBSyxJQUFJIiwiZmlsZSI6InN0ZG91dCIsInNvdXJjZXNDb250ZW50IjpbImFyci5tYXAoeCA9PiB4ICogeCk7Il19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUM7U0FBSSxDQUFDLEdBQUcsQ0FBQztDQUFBLENBQUMsQ0FBQyIsImZpbGUiOiJzdGRvdXQiLCJzb3VyY2VzQ29udGVudCI6WyJhcnIubWFwKHggPT4geCAqIHgpOyJdfQ==

View File

@@ -1,21 +0,0 @@
var log = '';
class Base {
p() { log += '[Base]'; }
}
class OtherBase {
p() { log += '[OtherBase]'; }
}
class Derived extends Base {
p() {
log += '[Derived]';
super.p();
Derived.prototype.__proto__ = OtherBase.prototype;
super.p();
}
}
new Derived().p();
assert.equal(log, '[Derived][Base][OtherBase]');

View File

@@ -15,14 +15,14 @@ var Test = (function (Foo) {
_classCallCheck(this, Test);
woops["super"].test();
_get(Object.getPrototypeOf(Test.prototype), "constructor", this).call(this);
_get(Object.getPrototypeOf(Test.prototype), "test", this).call(this);
_get(Foo.prototype, "constructor", this).call(this);
_get(Foo.prototype, "test", this).call(this);
_get(Object.getPrototypeOf(Test.prototype), "constructor", this).apply(this, arguments);
(_get2 = _get(Object.getPrototypeOf(Test.prototype), "constructor", this)).call.apply(_get2, [this, "test"].concat(_slice.call(arguments)));
_get(Foo.prototype, "constructor", this).apply(this, arguments);
(_get2 = _get(Foo.prototype, "constructor", this)).call.apply(_get2, [this, "test"].concat(_slice.call(arguments)));
_get(Object.getPrototypeOf(Test.prototype), "test", this).apply(this, arguments);
(_get3 = _get(Object.getPrototypeOf(Test.prototype), "test", this)).call.apply(_get3, [this, "test"].concat(_slice.call(arguments)));
_get(Foo.prototype, "test", this).apply(this, arguments);
(_get3 = _get(Foo.prototype, "test", this)).call.apply(_get3, [this, "test"].concat(_slice.call(arguments)));
}
_inherits(Test, Foo);
@@ -31,9 +31,9 @@ var Test = (function (Foo) {
foo: {
value: function foo() {
var _get2;
_get(Object.getPrototypeOf(Test), "foo", this).call(this);
_get(Object.getPrototypeOf(Test), "foo", this).apply(this, arguments);
(_get2 = _get(Object.getPrototypeOf(Test), "foo", this)).call.apply(_get2, [this, "test"].concat(_slice.call(arguments)));
_get(Foo, "foo", this).call(this);
_get(Foo, "foo", this).apply(this, arguments);
(_get2 = _get(Foo, "foo", this)).call.apply(_get2, [this, "test"].concat(_slice.call(arguments)));
},
writable: true,
configurable: true
@@ -42,9 +42,9 @@ var Test = (function (Foo) {
test: {
value: function test() {
var _get2;
_get(Object.getPrototypeOf(Test.prototype), "test", this).call(this);
_get(Object.getPrototypeOf(Test.prototype), "test", this).apply(this, arguments);
(_get2 = _get(Object.getPrototypeOf(Test.prototype), "test", this)).call.apply(_get2, [this, "test"].concat(_slice.call(arguments)));
_get(Foo.prototype, "test", this).call(this);
_get(Foo.prototype, "test", this).apply(this, arguments);
(_get2 = _get(Foo.prototype, "test", this)).call.apply(_get2, [this, "test"].concat(_slice.call(arguments)));
},
writable: true,
configurable: true

View File

@@ -10,8 +10,8 @@ var Test = (function (Foo) {
function Test() {
_classCallCheck(this, Test);
_get(Object.getPrototypeOf(Test.prototype), "test", this);
_get(Object.getPrototypeOf(Test.prototype), "test", this).whatever;
_get(Foo.prototype, "test", this);
_get(Foo.prototype, "test", this).whatever;
}
_inherits(Test, Foo);

View File

@@ -12,8 +12,8 @@ var Test = (function (Foo) {
function Test() {
_classCallCheck(this, Test);
_get(Object.getPrototypeOf(Test.prototype), "test", this).whatever();
_get(Object.getPrototypeOf(Test.prototype), "test", this).call(this);
_get(Foo.prototype, "test", this).whatever();
_get(Foo.prototype, "test", this).call(this);
}
_inherits(Test, Foo);
@@ -21,7 +21,7 @@ var Test = (function (Foo) {
_prototypeProperties(Test, {
test: {
value: function test() {
return _get(Object.getPrototypeOf(Test), "wow", this).call(this);
return _get(Foo, "wow", this).call(this);
},
writable: true,
configurable: true

View File

@@ -8,8 +8,8 @@ var BaseController = (function (_Chaplin$Controller) {
function BaseController() {
_classCallCheck(this, BaseController);
if (Object.getPrototypeOf(BaseController) !== null) {
Object.getPrototypeOf(BaseController).apply(this, arguments);
if (_Chaplin$Controller != null) {
_Chaplin$Controller.apply(this, arguments);
}
}
@@ -22,12 +22,12 @@ var BaseController2 = (function (_Chaplin$Controller$Another) {
function BaseController2() {
_classCallCheck(this, BaseController2);
if (Object.getPrototypeOf(BaseController2) !== null) {
Object.getPrototypeOf(BaseController2).apply(this, arguments);
if (_Chaplin$Controller$Another != null) {
_Chaplin$Controller$Another.apply(this, arguments);
}
}
_inherits(BaseController2, _Chaplin$Controller$Another);
return BaseController2;
})(Chaplin.Controller.Another);
})(Chaplin.Controller.Another);

View File

@@ -8,12 +8,12 @@ var Test = (function (Foo) {
function Test() {
_classCallCheck(this, Test);
if (Object.getPrototypeOf(Test) !== null) {
Object.getPrototypeOf(Test).apply(this, arguments);
if (Foo != null) {
Foo.apply(this, arguments);
}
}
_inherits(Test, Foo);
return Test;
})(Foo);
})(Foo);

View File

@@ -7,5 +7,5 @@ var _classCallCheck = function (instance, Constructor) { if (!(instance instance
var Test = function Test() {
_classCallCheck(this, Test);
_get(Object.getPrototypeOf(Test.prototype), "hasOwnProperty", this).call(this, "test");
};
_get(Function.prototype, "hasOwnProperty", this).call(this, "test");
};

View File

@@ -0,0 +1 @@
var {} = null;

View File

@@ -0,0 +1,3 @@
assert.throws(function () {
var {} = null;
}, /Cannot destructure undefined/);

View File

@@ -0,0 +1,7 @@
"use strict";
var _objectDestructuringEmpty = function (obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); };
var _ref = null;
_objectDestructuringEmpty(_ref);

View File

@@ -0,0 +1,13 @@
var x =
<div>
foo
{'bar'}
baz
<div>
buz
bang
</div>
qux
{null}
quack
</div>

View File

@@ -0,0 +1,13 @@
var x = React.createElement(
"div",
null,
"foobarbaz",
React.createElement(
"div",
null,
"buz bang"
),
"qux",
null,
"quack"
);

View File

@@ -1,7 +1,7 @@
[{
"original": {
"line": 1,
"column": 13
"column": 14
},
"generated": {
"line": 4,

View File

@@ -3,6 +3,6 @@
"file": "source-maps/full/expected.js",
"sources": ["source-maps/full/actual.js"],
"names": [],
"mappings": ";;AAAA,IAAI,IAAI,UAAA;SAAK,IAAI",
"mappings": ";;AAAA,GAAG,CAAC,GAAG,CAAC,UAAA,CAAC;SAAI,CAAC,GAAG,CAAC;CAAA,CAAC,CAAC",
"sourcesContent": ["arr.map(x => x * x);"]
}

View File

@@ -3,4 +3,4 @@
arr.map(function (x) {
return x * x;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvdXJjZS1tYXBzL2lubGluZS9hY3R1YWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFJLElBQUksVUFBQTtTQUFLLElBQUkiLCJmaWxlIjoic291cmNlLW1hcHMvaW5saW5lL2V4cGVjdGVkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiYXJyLm1hcCh4ID0+IHggKiB4KTsiXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvdXJjZS1tYXBzL2lubGluZS9hY3R1YWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQztTQUFJLENBQUMsR0FBRyxDQUFDO0NBQUEsQ0FBQyxDQUFDIiwiZmlsZSI6InNvdXJjZS1tYXBzL2lubGluZS9leHBlY3RlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImFyci5tYXAoeCA9PiB4ICogeCk7Il19

View File

@@ -10,12 +10,12 @@ var Foo = (function (Bar) {
function Foo() {
_classCallCheck(this, Foo);
if (Object.getPrototypeOf(Foo) !== null) {
Object.getPrototypeOf(Foo).apply(this, arguments);
if (Bar != null) {
Bar.apply(this, arguments);
}
}
_inherits(Foo, Bar);
return Foo;
})(Bar);
})(Bar);

View File

@@ -4,6 +4,7 @@ require("./_helper").assertVendor("test262");
var transform = require("../lib/6to5/transformation");
var readdir = require("fs-readdir-recursive");
var helper = require("./_helper");
var path = require("path");
var fs = require("fs");
var _ = require("lodash");
@@ -16,7 +17,7 @@ var read = function (loc) {
});
};
var exec = function (loc) {
var check = function (loc) {
try {
var file = fs.readFileSync(loc, "utf8");
@@ -26,25 +27,21 @@ var exec = function (loc) {
// ReferenceError: 1++; (runtime)
var lazyError = /negative: (\S+)/.test(file);
var compiled = transform(file, {
transform(file, {
filename: loc,
blacklist: ["useStrict"]
blacklist: ["useStrict"],
_anal: true
});
global.eval(compiled);
} catch (err) {
if (err && lazyError && err instanceof SyntaxError) {
return;
} else {
err.stack = loc + ": " + err.stack;
throw err;
}
}
};
// harness
var harness = read(test262Loc + "/harness");
_.each(harness, exec);
// tests!
var tests = read(test262Loc + "/test");
_.each(tests, function (loc) {
@@ -52,6 +49,6 @@ _.each(tests, function (loc) {
alias = alias.replace(/\.([^\.]+)$/g, "");
test(alias, function () {
this.timeout(0);
exec(loc);
check(loc);
});
});