diff --git a/Makefile b/Makefile index 9a1cbf30a4..de2a259761 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,7 @@ publish: make publish-core make publish-runtime - rm -rf templates.json browser.js browser-polyfill.js + rm -rf templates.json browser.js browser-polyfill.js runtime.js publish-runtime: cd packages; \ diff --git a/bin/6to5/util.js b/bin/6to5/util.js index bd196c8fa0..7cfcbb70ce 100644 --- a/bin/6to5/util.js +++ b/bin/6to5/util.js @@ -2,7 +2,7 @@ var readdir = require("fs-readdir-recursive"); var index = require("./index"); var util = require("../../lib/6to5/util"); var path = require("path"); -var to5 = require("../../lib/6to5"); +var to5 = require("../../lib/6to5/api/node"); var fs = require("fs"); var _ = require("lodash"); diff --git a/bin/_6to5-node b/bin/_6to5-node index d35558a5aa..982ed5dbc9 100644 --- a/bin/_6to5-node +++ b/bin/_6to5-node @@ -4,7 +4,7 @@ var commander = require("commander"); var Module = require("module"); var path = require("path"); var repl = require("repl"); -var to5 = require("../lib/6to5"); +var to5 = require("../lib/6to5/api/node"); var util = require("../lib/6to5/util"); var vm = require("vm"); var _ = require("lodash"); diff --git a/lib/6to5/browser.js b/lib/6to5/api/browser.js similarity index 94% rename from lib/6to5/browser.js rename to lib/6to5/api/browser.js index 9f0d32b425..2de894e56f 100644 --- a/lib/6to5/browser.js +++ b/lib/6to5/api/browser.js @@ -1,8 +1,8 @@ "use strict"; -var transform = module.exports = require("./transformation"); +var transform = module.exports = require("../transformation"); -transform.version = require("../../package").version; +transform.version = require("../../../package").version; transform.transform = transform; diff --git a/lib/6to5/index.js b/lib/6to5/api/node.js similarity index 76% rename from lib/6to5/index.js rename to lib/6to5/api/node.js index de4474c5d4..fbe3843d9e 100644 --- a/lib/6to5/index.js +++ b/lib/6to5/api/node.js @@ -1,24 +1,24 @@ "use strict"; -var transform = require("./transformation"); -var util = require("./util"); -var fs = require("fs"); var isFunction = require("lodash/lang/isFunction"); +var transform = require("../transformation"); +var util = require("../util"); +var fs = require("fs"); -exports.version = require("../../package").version; +exports.version = require("../../../package").version; -exports.runtime = require("./build-runtime"); +exports.runtime = require("../build-runtime"); -exports.types = require("./types"); +exports.types = require("../types"); exports.register = function (opts) { - var register = require("./register"); + var register = require("./register/node"); if (opts != null) register(opts); return register; }; exports.polyfill = function () { - require("./polyfill"); + require("../polyfill"); }; exports.canCompile = util.canCompile; diff --git a/lib/6to5/register-browser.js b/lib/6to5/api/register/browser.js similarity index 81% rename from lib/6to5/register-browser.js rename to lib/6to5/api/register/browser.js index bd18a5fbc9..f7576c91ac 100644 --- a/lib/6to5/register-browser.js +++ b/lib/6to5/api/register/browser.js @@ -4,4 +4,4 @@ module.exports = function () {}; -require("./polyfill"); +require("../../polyfill"); diff --git a/lib/6to5/register-cache.js b/lib/6to5/api/register/cache.js similarity index 100% rename from lib/6to5/register-cache.js rename to lib/6to5/api/register/cache.js diff --git a/lib/6to5/register.js b/lib/6to5/api/register/node.js similarity index 95% rename from lib/6to5/register.js rename to lib/6to5/api/register/node.js index 68f40886fd..f4837a4276 100644 --- a/lib/6to5/register.js +++ b/lib/6to5/api/register/node.js @@ -1,14 +1,14 @@ "use strict"; -require("./polyfill"); +require("../../polyfill"); var sourceMapSupport = require("source-map-support"); -var registerCache = require("./register-cache"); -var util = require("./util"); -var to5 = require("./index"); -var fs = require("fs"); +var registerCache = require("./cache"); var extend = require("lodash/object/extend"); var each = require("lodash/collection/each"); +var util = require("../../util"); +var to5 = require("../node"); +var fs = require("fs"); sourceMapSupport.install({ retrieveSourceMap: function (source) { diff --git a/lib/6to5/build-helpers.js b/lib/6to5/build-helpers.js index f9640abd27..82b3975517 100644 --- a/lib/6to5/build-helpers.js +++ b/lib/6to5/build-helpers.js @@ -1,4 +1,4 @@ -var File = require("./file"); +var File = require("./transformation/file"); var util = require("./util"); var each = require("lodash/collection/each"); var t = require("./types"); diff --git a/lib/6to5/detection/index.js b/lib/6to5/detection/index.js index 942342a8ad..7d2eb54c86 100644 --- a/lib/6to5/detection/index.js +++ b/lib/6to5/detection/index.js @@ -1,7 +1,7 @@ module.exports = detect; var SYNTAX_KEYS = require("./syntax-keys"); -var traverse = require("../traverse"); +var traverse = require("../traversal"); var visitors = traverse.explode(require("./visitors")); function detect(ast) { diff --git a/lib/6to5/helpers/normalize-ast.js b/lib/6to5/helpers/normalize-ast.js new file mode 100644 index 0000000000..54631556c9 --- /dev/null +++ b/lib/6to5/helpers/normalize-ast.js @@ -0,0 +1,9 @@ +var t = require("../types"); + +module.exports = function (ast, comments, tokens) { + if (ast && ast.type === "Program") { + return t.file(ast, comments || [], tokens || []); + } else { + throw new Error("Not a valid ast?"); + } +}; diff --git a/lib/6to5/helpers/parse.js b/lib/6to5/helpers/parse.js new file mode 100644 index 0000000000..1b2a9a8fca --- /dev/null +++ b/lib/6to5/helpers/parse.js @@ -0,0 +1,49 @@ +var normalizeAst = require("./normalize-ast"); +var estraverse = require("estraverse"); +var codeFrame = require("./code-frame"); +var acorn = require("acorn-6to5"); + +module.exports = function (opts, code, callback) { + try { + var comments = []; + var tokens = []; + + var ast = acorn.parse(code, { + allowImportExportEverywhere: opts.allowImportExportEverywhere, + allowReturnOutsideFunction: !opts._anal, + ecmaVersion: opts.experimental ? 7 : 6, + playground: opts.playground, + strictMode: opts.strictMode, + onComment: comments, + locations: true, + onToken: tokens, + ranges: true + }); + + estraverse.attachComments(ast, comments, tokens); + + ast = normalizeAst(ast, comments, tokens); + + if (callback) { + return callback(ast); + } else { + return ast; + } + } catch (err) { + if (!err._6to5) { + err._6to5 = true; + var message = opts.filename + ": " + err.message; + + var loc = err.loc; + if (loc) { + var frame = codeFrame(code, loc.line, loc.column + 1); + message += frame; + } + + if (err.stack) err.stack = err.stack.replace(err.message, message); + err.message = message; + } + + throw err; + } +}; diff --git a/lib/6to5/patch.js b/lib/6to5/patch.js index adda701345..7a3d9a7081 100644 --- a/lib/6to5/patch.js +++ b/lib/6to5/patch.js @@ -1,7 +1,7 @@ "use strict"; -var t = require("./types"); var extend = require("lodash/object/extend"); +var t = require("./types"); require("./types/node"); diff --git a/lib/6to5/file.js b/lib/6to5/transformation/file.js similarity index 94% rename from lib/6to5/file.js rename to lib/6to5/transformation/file.js index 7d5cc035d2..75a1cb0ddc 100644 --- a/lib/6to5/file.js +++ b/lib/6to5/transformation/file.js @@ -5,16 +5,17 @@ module.exports = File; var SHEBANG_REGEX = /^\#\!.*/; var isFunction = require("lodash/lang/isFunction"); -var transform = require("./transformation"); -var generate = require("./generation"); +var transform = require("./index"); +var generate = require("../generation"); var defaults = require("lodash/object/defaults"); var contains = require("lodash/collection/contains"); -var clone = require("./helpers/clone"); -var Scope = require("./traverse/scope"); -var util = require("./util"); +var clone = require("../helpers/clone"); +var parse = require("../helpers/parse"); +var Scope = require("../traversal/scope"); +var util = require("../util"); var path = require("path"); var each = require("lodash/collection/each"); -var t = require("./types"); +var t = require("../types"); function File(opts) { this.dynamicImportIds = {}; @@ -334,7 +335,7 @@ File.prototype.parse = function (code) { opts.allowImportExportEverywhere = this.isLoose("es6.modules"); //opts.strictMode = this.transformers.useStrict.canRun(); - return util.parse(opts, code, function (tree) { + return parse(opts, code, function (tree) { self.transform(tree); return self.generate(); }); @@ -373,25 +374,25 @@ File.prototype.transform = function (ast) { var checkTransformerVisitor = { enter: function (node, parent, scope, context, state) { - state.check(node, scope); + checkNode(state.stack, node, scope); } }; +var checkNode = function (stack, node, scope) { + each(stack, function (pass) { + if (pass.shouldRun) return; + pass.checkNode(node, scope); + }); +}; + File.prototype.checkNode = function (node, scope) { - var self = this; + var stack = this.transformerStack; 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); + checkNode(stack, node, scope); scope.traverse(node, checkTransformerVisitor, { - check: check + stack: stack }); }; diff --git a/lib/6to5/transformation/helpers/define-map.js b/lib/6to5/transformation/helpers/define-map.js index b463e9045e..cd7f82b0f1 100644 --- a/lib/6to5/transformation/helpers/define-map.js +++ b/lib/6to5/transformation/helpers/define-map.js @@ -1,5 +1,5 @@ var cloneDeep = require("lodash/lang/cloneDeep"); -var traverse = require("../../traverse"); +var traverse = require("../../traversal"); var clone = require("lodash/lang/clone"); var each = require("lodash/collection/each"); var has = require("lodash/object/has"); diff --git a/lib/6to5/transformation/index.js b/lib/6to5/transformation/index.js index eec84eae40..755b5f5a8b 100644 --- a/lib/6to5/transformation/index.js +++ b/lib/6to5/transformation/index.js @@ -2,11 +2,12 @@ module.exports = transform; -var Transformer = require("./transformer"); -var object = require("../helpers/object"); -var File = require("../file"); -var util = require("../util"); -var each = require("lodash/collection/each"); +var normalizeAst = require("../helpers/normalize-ast"); +var Transformer = require("./transformer"); +var object = require("../helpers/object"); +var File = require("./file"); +var util = require("../util"); +var each = require("lodash/collection/each"); function transform(code, opts) { var file = new File(opts); @@ -14,7 +15,7 @@ function transform(code, opts) { } transform.fromAst = function (ast, code, opts) { - ast = util.normalizeAst(ast); + ast = normalizeAst(ast); var file = new File(opts); file.addCode(code); diff --git a/lib/6to5/transformation/transformer.js b/lib/6to5/transformation/transformer.js index ce4a87e3d9..2f94ff3f69 100644 --- a/lib/6to5/transformation/transformer.js +++ b/lib/6to5/transformation/transformer.js @@ -4,7 +4,7 @@ module.exports = Transformer; var TransformerPass = require("./transformer-pass"); var isFunction = require("lodash/lang/isFunction"); -var traverse = require("../traverse"); +var traverse = require("../traversal"); var isObject = require("lodash/lang/isObject"); var each = require("lodash/collection/each"); diff --git a/lib/6to5/transformation/transformers/es6/block-scoping.js b/lib/6to5/transformation/transformers/es6/block-scoping.js index 8a1c7775b3..2a6edc14fd 100644 --- a/lib/6to5/transformation/transformers/es6/block-scoping.js +++ b/lib/6to5/transformation/transformers/es6/block-scoping.js @@ -1,6 +1,6 @@ "use strict"; -var traverse = require("../../../traverse"); +var traverse = require("../../../traversal"); var object = require("../../../helpers/object"); var util = require("../../../util"); var t = require("../../../types"); diff --git a/lib/6to5/transformation/transformers/es7/comprehensions.js b/lib/6to5/transformation/transformers/es7/comprehensions.js index 9b9a4d2b9c..a7b613ce69 100644 --- a/lib/6to5/transformation/transformers/es7/comprehensions.js +++ b/lib/6to5/transformation/transformers/es7/comprehensions.js @@ -1,7 +1,7 @@ "use strict"; var buildComprehension = require("../../helpers/build-comprehension"); -var traverse = require("../../../traverse"); +var traverse = require("../../../traversal"); var util = require("../../../util"); var t = require("../../../types"); diff --git a/lib/6to5/transformation/transformers/minification/dead-code-elimination.js b/lib/6to5/transformation/transformers/minification/dead-code-elimination.js index 0d92cddb4e..5668829823 100644 --- a/lib/6to5/transformation/transformers/minification/dead-code-elimination.js +++ b/lib/6to5/transformation/transformers/minification/dead-code-elimination.js @@ -25,7 +25,7 @@ exports.IfStatement = { var alternate = node.alternate; var test = node.test; - // we can check if a test will be truthy 100% and if so we can inline + // we can check if a test will be truthy 100% and if so then we can inline // the consequent and completely ignore the alternate // // if (true) { foo; } -> { foo; } @@ -36,8 +36,8 @@ exports.IfStatement = { return alternate; } - // we can check if a test will be falsy 100% and if so we can inline - // the alternate if there is one and completely remove the consequent + // we can check if a test will be falsy 100% and if so we can inline the + // alternate if there is one and completely remove the consequent // // if ("") { bar; } else { foo; } -> { foo; } // if ("") { bar; } -> @@ -60,11 +60,10 @@ exports.IfStatement = { alternate = node.alternate = null; } - // turn alternate blocks into a consequent and flip the test if the - // consequent block is empty + // if the consequent block is empty turn alternate blocks into a consequent + // and flip the test // - // if (foo) {} else { bar; } - // if (!foo) { bar; } + // if (foo) {} else { bar; } -> if (!foo) { bar; } // if (t.blockStatement(consequent) && !consequent.body.length && diff --git a/lib/6to5/transformation/transformers/playground/object-getter-memoization.js b/lib/6to5/transformation/transformers/playground/object-getter-memoization.js index 12458e3702..5f49b46dc2 100644 --- a/lib/6to5/transformation/transformers/playground/object-getter-memoization.js +++ b/lib/6to5/transformation/transformers/playground/object-getter-memoization.js @@ -6,7 +6,7 @@ exports.playground = true; var visitor = { enter: function (node, parent, scope, context, state) { - if (t.isFunction(node)) return; + if (t.isFunction(node)) return context.skip(); if (t.isReturnStatement(node) && node.argument) { node.argument = t.memberExpression(t.callExpression(state.file.addHelper("define-property"), [ @@ -22,7 +22,6 @@ 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); @@ -39,4 +38,6 @@ exports.MethodDefinition = function (node, parent, scope, context, file) { }; scope.traverse(value, visitor, state); + + return node; }; diff --git a/lib/6to5/traverse/index.js b/lib/6to5/traversal/index.js similarity index 100% rename from lib/6to5/traverse/index.js rename to lib/6to5/traversal/index.js diff --git a/lib/6to5/traverse/scope.js b/lib/6to5/traversal/scope.js similarity index 98% rename from lib/6to5/traverse/scope.js rename to lib/6to5/traversal/scope.js index f4639fd6ac..064aae2290 100644 --- a/lib/6to5/traverse/scope.js +++ b/lib/6to5/traversal/scope.js @@ -341,8 +341,6 @@ Scope.prototype.crawl = function () { if (t.isFunctionExpression(block) && block.id) { if (!t.isProperty(this.parentBlock, { method: true })) { - // SpiderMonkey AST doesn't use MethodDefinition here when it probably - // should since they should be semantically the same? this.register(block.id); } } diff --git a/lib/6to5/util.js b/lib/6to5/util.js index 8cf3aa3fd7..756c76292c 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -2,23 +2,22 @@ require("./patch"); -var estraverse = require("estraverse"); +var cloneDeep = require("lodash/lang/cloneDeep"); var codeFrame = require("./helpers/code-frame"); -var traverse = require("./traverse"); -var debug = require("debug/node"); -var acorn = require("acorn-6to5"); -var path = require("path"); -var util = require("util"); -var fs = require("fs"); -var t = require("./types"); -var each = require("lodash/collection/each"); +var contains = require("lodash/collection/contains"); +var traverse = require("./traversal"); var isNumber = require("lodash/lang/isNumber"); var isString = require("lodash/lang/isString"); var isRegExp = require("lodash/lang/isRegExp"); var isEmpty = require("lodash/lang/isEmpty"); -var cloneDeep = require("lodash/lang/cloneDeep"); +var parse = require("./helpers/parse"); +var debug = require("debug/node"); +var path = require("path"); +var util = require("util"); +var each = require("lodash/collection/each"); var has = require("lodash/object/has"); -var contains = require("lodash/collection/contains"); +var fs = require("fs"); +var t = require("./types"); exports.inherits = util.inherits; @@ -123,61 +122,8 @@ exports.repeat = function (width, cha) { return result; }; -exports.normalizeAst = function (ast, comments, tokens) { - if (ast && ast.type === "Program") { - return t.file(ast, comments || [], tokens || []); - } else { - throw new Error("Not a valid ast?"); - } -}; - -exports.parse = function (opts, code, callback) { - try { - var comments = []; - var tokens = []; - - var ast = acorn.parse(code, { - allowImportExportEverywhere: opts.allowImportExportEverywhere, - allowReturnOutsideFunction: !opts._anal, - ecmaVersion: opts.experimental ? 7 : 6, - playground: opts.playground, - strictMode: opts.strictMode, - onComment: comments, - locations: true, - onToken: tokens, - ranges: true - }); - - estraverse.attachComments(ast, comments, tokens); - - ast = exports.normalizeAst(ast, comments, tokens); - - if (callback) { - return callback(ast); - } else { - return ast; - } - } catch (err) { - if (!err._6to5) { - err._6to5 = true; - var message = opts.filename + ": " + err.message; - - var loc = err.loc; - if (loc) { - var frame = codeFrame(code, loc.line, loc.column + 1); - message += frame; - } - - if (err.stack) err.stack = err.stack.replace(err.message, message); - err.message = message; - } - - throw err; - } -}; - exports.parseTemplate = function (loc, code) { - var ast = exports.parse({ filename: loc }, code).program; + var ast = parse({ filename: loc }, code).program; return traverse.removeProperties(ast); }; diff --git a/package.json b/package.json index 0f603c6358..13787b1e9f 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "homepage": "https://6to5.org/", "repository": "6to5/6to5", "preferGlobal": true, - "main": "lib/6to5/index.js", + "main": "lib/6to5/api/node.js", + "browser": "lib/6to5/api/browser.js", "bin": { "6to5": "./bin/6to5/index.js", "6to5-minify": "./bin/6to5-minify", @@ -14,8 +15,7 @@ "6to5-runtime": "./bin/6to5-runtime" }, "browser": { - "./lib/6to5/index.js": "./lib/6to5/browser.js", - "./lib/6to5/register.js": "./lib/6to5/register-browser.js" + "./lib/6to5/api/register/node.js": "./lib/6to5/api/register/browser.js" }, "keywords": [ "harmony", diff --git a/packages/6to5-runtime/package.json b/packages/6to5-runtime/package.json index f91a1b6798..e1fe7e15b6 100644 --- a/packages/6to5-runtime/package.json +++ b/packages/6to5-runtime/package.json @@ -1,7 +1,7 @@ { "name": "6to5-runtime", "description": "6to5 selfContained runtime", - "version": "3.3.11", + "version": "3.3.12", "repository": "6to5/6to5", "author": "Sebastian McKenzie " } \ No newline at end of file diff --git a/register.js b/register.js index a8de654c4b..51f2ac517b 100644 --- a/register.js +++ b/register.js @@ -1 +1 @@ -module.exports = require("./lib/6to5/register"); +module.exports = require("./lib/6to5/api/register/node"); diff --git a/test/detection.js b/test/detection.js index 781b17caeb..1b237b2620 100644 --- a/test/detection.js +++ b/test/detection.js @@ -1,10 +1,10 @@ var detect = require("../lib/6to5/detection"); var assert = require("assert"); -var util = require("../lib/6to5/util"); +var parse = require("../lib/6to5/helpers/parse"); suite("detection", function () { var checkSyntax = function (code, name) { - var ast = util.parse({ + var ast = parse({ experimental: true }, code); diff --git a/test/generation.js b/test/generation.js index ba7c22efa9..e24d1e3e5a 100644 --- a/test/generation.js +++ b/test/generation.js @@ -1,7 +1,7 @@ var generate = require("../lib/6to5/generation"); var assert = require("assert"); var helper = require("./_helper"); -var util = require("../lib/6to5/util"); +var parse = require("../lib/6to5/helpers/parse"); var chai = require("chai"); var t = require("../lib/6to5/types"); var _ = require("lodash"); @@ -26,7 +26,7 @@ _.each(helper.get("generation"), function (testSuite) { var expect = task.expect; var actual = task.actual; - var actualAst = util.parse({ filename: actual.loc, experimental: true }, actual.code); + var actualAst = parse({ filename: actual.loc, experimental: true }, actual.code); var actualCode = generate(actualAst, null, actual.code).code; chai.expect(actualCode).to.equal(expect.code, actual.loc + " !== " + expect.loc);