diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..2bf824307c --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +src/babel/transformation/templates diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000..650e2795e6 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,20 @@ +{ + "parser": "/Users/sebastian/Projects/6to5/6to5/eslint.js", + "ecmaFeatures": { + "blockBindings": true + }, + "rules": { + "strict": 0, + "no-underscore-dangle": 0, + "no-unused-vars": 0, + "curly": 0, + "no-multi-spaces": 0, + "key-spacing": 0, + "no-return-assign": 0, + "consistent-return": 0, + "no-shadow": 0 + }, + "env": { + "node": true + } +} diff --git a/eslint.js b/eslint.js new file mode 100644 index 0000000000..3879e0cc05 --- /dev/null +++ b/eslint.js @@ -0,0 +1,59 @@ +var traverse = require("./lib/babel/traversal"); +var Module = require("module"); +var acorn = require("acorn-babel"); + +var hasPatched = false; + +function monkeypatch() { + if (hasPatched) return; + hasPatched = true; + + var mod = new Module(require.resolve("eslint")); + + // monkeypatch estraverse + //var estraverse = mod.require("estraverse"); + + // monkeypatch escope + var escope = mod.require("escope"); + console.log(escope); +} + +var tokTypes = acorn.tokTypes; + +function toEsprimaToken(token) { + var type = token.type; + + if (type === tokTypes.name) { + token.type = "Identifier"; + } else if (type === tokTypes.semi || type === tokTypes.comma || type === tokTypes.parenL || type === tokTypes.parenR || type === tokTypes.braceL || type === tokTypes.braceR) { + token.type = "Punctuator"; + token.value = type.type; + } +} + +exports.parse = function (code) { + monkeypatch(); + + var opts = {}; + opts.ecmaVersion = 7; + opts.locations = true; + opts.playground = true; + opts.ranges = true; + + var comments = opts.onComment = []; + var tokens = opts.onToken = []; + + var ast = acorn.parse(code, opts); + + // convert tokens + ast.tokens = tokens.map(function (token) { + return toEsprimaToken(token) || token; + }); + + // add comments + ast.comments = comments; + + // transform esprima and acorn divergent nodes + + return ast; +}; diff --git a/src/babel/api/node.js b/src/babel/api/node.js index 2c22a440eb..25fa7b746e 100644 --- a/src/babel/api/node.js +++ b/src/babel/api/node.js @@ -4,6 +4,7 @@ import fs from "fs"; export { default as _util, canCompile } from "../util"; export { default as transform } from "../transformation"; +export { default as parse } from "../esprima-compatibility"; export { version } from "../../../package"; @@ -11,9 +12,9 @@ export { default as buildExternalHelpers } from "../build-external-helpers"; export { default as types } from "../types"; export function register(opts) { - var register = require("./register/node"); - if (opts != null) register(opts); - return register; + var callback = require("./register/node"); + if (opts != null) callback(opts); + return callback; } export function polyfill() { diff --git a/src/babel/detection/visitors.js b/src/babel/detection/visitors.js index 098cbb267b..e8e26e356b 100644 --- a/src/babel/detection/visitors.js +++ b/src/babel/detection/visitors.js @@ -51,4 +51,4 @@ exports.Function = function (node, parent, detected) { if (node.async) { detected("es7.asyncFunctions"); } -} +}; diff --git a/src/babel/generation/generators/comprehensions.js b/src/babel/generation/generators/comprehensions.js index 77886b2eed..dce50114ae 100644 --- a/src/babel/generation/generators/comprehensions.js +++ b/src/babel/generation/generators/comprehensions.js @@ -5,7 +5,7 @@ export function ComprehensionBlock(node, print) { this.push(" of "); print(node.right); this.push(")"); -}; +} export function ComprehensionExpression(node, print) { this.push(node.generator ? "(" : "["); @@ -24,4 +24,4 @@ export function ComprehensionExpression(node, print) { print(node.body); this.push(node.generator ? ")" : "]"); -}; +} diff --git a/src/babel/generation/generators/jsx.js b/src/babel/generation/generators/jsx.js index fd560f59cb..a467a627bf 100644 --- a/src/babel/generation/generators/jsx.js +++ b/src/babel/generation/generators/jsx.js @@ -71,4 +71,4 @@ export function JSXClosingElement(node, print) { this.push(">"); } -export function JSXEmptyExpression() {}; +export function JSXEmptyExpression() {} diff --git a/src/babel/generation/node/whitespace.js b/src/babel/generation/node/whitespace.js index a2529503d7..bf9dc32cf4 100644 --- a/src/babel/generation/node/whitespace.js +++ b/src/babel/generation/node/whitespace.js @@ -3,7 +3,7 @@ import each from "lodash/collection/each"; import map from "lodash/collection/map"; import t from "../../types"; -var crawl = function (node, state) { +function crawl(node, state) { state ||= {}; if (t.isMemberExpression(node)) { @@ -22,9 +22,9 @@ var crawl = function (node, state) { } return state; -}; +} -var isHelper = function (node) { +function isHelper(node) { if (t.isMemberExpression(node)) { return isHelper(node.object) || isHelper(node.property); } else if (t.isIdentifier(node)) { @@ -36,12 +36,12 @@ var isHelper = function (node) { } else { return false; } -}; +} -var isType = function (node) { +function isType(node) { return t.isLiteral(node) || t.isObjectExpression(node) || t.isArrayExpression(node) || t.isIdentifier(node) || t.isMemberExpression(node); -}; +} exports.nodes = { AssignmentExpression(node) { diff --git a/src/babel/transformation/transformer.js b/src/babel/transformation/transformer.js index 4794462a92..9949dbb178 100644 --- a/src/babel/transformation/transformer.js +++ b/src/babel/transformation/transformer.js @@ -12,7 +12,7 @@ import each from "lodash/collection/each"; */ export default class Transformer { - constructor(key, transformer, opts) { + constructor(transformerKey, transformer, opts) { transformer = assign({}, transformer); var take = function (key) { @@ -33,7 +33,7 @@ export default class Transformer { this.handlers = this.normalize(transformer); this.opts ||= {}; - this.key = key; + this.key = transformerKey; } normalize(transformer) { diff --git a/src/babel/transformation/transformers/es6/modules.js b/src/babel/transformation/transformers/es6/modules.js index 35c007e39d..41ff9f729b 100644 --- a/src/babel/transformation/transformers/es6/modules.js +++ b/src/babel/transformation/transformers/es6/modules.js @@ -1,8 +1,8 @@ import t from "../../../types"; -exports.check = require("../internal/modules").check; +export { check } from "../internal/modules"; -exports.ImportDeclaration = function (node, parent, scope, file) { +export function ImportDeclaration(node, parent, scope, file) { // flow type if (node.isType) return; @@ -22,9 +22,9 @@ exports.ImportDeclaration = function (node, parent, scope, file) { } return nodes; -}; +} -exports.ExportDeclaration = function (node, parent, scope, file) { +export function ExportDeclaration(node, parent, scope, file) { // flow type if (t.isTypeAlias(node.declaration)) return; @@ -53,4 +53,4 @@ exports.ExportDeclaration = function (node, parent, scope, file) { } return nodes; -}; +} diff --git a/src/babel/transformation/transformers/es6/object-super.js b/src/babel/transformation/transformers/es6/object-super.js index f5463bfe4a..4ccad049be 100644 --- a/src/babel/transformation/transformers/es6/object-super.js +++ b/src/babel/transformation/transformers/es6/object-super.js @@ -1,11 +1,11 @@ import ReplaceSupers from "../../helpers/replace-supers"; import t from "../../../types"; -exports.check = function (node) { +export function check(node) { return t.isIdentifier(node, { name: "super" }); -}; +} -exports.Property = function (node, parent, scope, file) { +export function Property(node, parent, scope, file) { if (!node.method) return; var value = node.value; @@ -29,4 +29,4 @@ exports.Property = function (node, parent, scope, file) { ]) ); } -}; +} diff --git a/src/babel/transformation/transformers/es6/parameters.default.js b/src/babel/transformation/transformers/es6/parameters.default.js index 62b757c768..9632e9db72 100644 --- a/src/babel/transformation/transformers/es6/parameters.default.js +++ b/src/babel/transformation/transformers/es6/parameters.default.js @@ -1,9 +1,9 @@ import * as util from "../../../util"; import t from "../../../types"; -exports.check = function (node) { +export function check(node) { return t.isFunction(node) && hasDefaults(node); -}; +} var hasDefaults = function (node) { for (var i = 0; i < node.params.length; i++) { diff --git a/src/babel/transformation/transformers/es6/properties.computed.js b/src/babel/transformation/transformers/es6/properties.computed.js index 47ebcc4041..1788a1ee85 100644 --- a/src/babel/transformation/transformers/es6/properties.computed.js +++ b/src/babel/transformation/transformers/es6/properties.computed.js @@ -1,48 +1,6 @@ import t from "../../../types"; -exports.check = function (node) { - return t.isProperty(node) && node.computed; -}; - -exports.ObjectExpression = function (node, parent, scope, file) { - var hasComputed = false; - - for (var i = 0; i < node.properties.length; i++) { - hasComputed = t.isProperty(node.properties[i], { computed: true, kind: "init" }); - if (hasComputed) break; - } - - if (!hasComputed) return; - - var initProps = []; - var objId = scope.generateUidBasedOnNode(parent); - - // - - var body = []; - var container = t.functionExpression(null, [], t.blockStatement(body)); - container._aliasFunction = true; - - // - - var callback = spec; - if (file.isLoose("es6.properties.computed")) callback = loose; - - var result = callback(node, body, objId, initProps, file); - if (result) return result; - - // - - body.unshift(t.variableDeclaration("var", [ - t.variableDeclarator(objId, t.objectExpression(initProps)) - ])); - - body.push(t.returnStatement(objId)); - - return t.callExpression(container, []); -}; - -var loose = function (node, body, objId) { +function loose(node, body, objId) { for (var i = 0; i < node.properties.length; i++) { var prop = node.properties[i]; @@ -54,9 +12,9 @@ var loose = function (node, body, objId) { ) )); } -}; +} -var spec = function (node, body, objId, initProps, file) { +function spec(node, body, objId, initProps, file) { var props = node.properties; var prop, key; @@ -124,4 +82,46 @@ var spec = function (node, body, objId, initProps, file) { return first; } } -}; +} + +export function check(node) { + return t.isProperty(node) && node.computed; +} + +export function ObjectExpression(node, parent, scope, file) { + var hasComputed = false; + + for (var i = 0; i < node.properties.length; i++) { + hasComputed = t.isProperty(node.properties[i], { computed: true, kind: "init" }); + if (hasComputed) break; + } + + if (!hasComputed) return; + + var initProps = []; + var objId = scope.generateUidBasedOnNode(parent); + + // + + var body = []; + var container = t.functionExpression(null, [], t.blockStatement(body)); + container._aliasFunction = true; + + // + + var callback = spec; + if (file.isLoose("es6.properties.computed")) callback = loose; + + var result = callback(node, body, objId, initProps, file); + if (result) return result; + + // + + body.unshift(t.variableDeclaration("var", [ + t.variableDeclarator(objId, t.objectExpression(initProps)) + ])); + + body.push(t.returnStatement(objId)); + + return t.callExpression(container, []); +} diff --git a/src/babel/transformation/transformers/es6/properties.shorthand.js b/src/babel/transformation/transformers/es6/properties.shorthand.js index 8c4949c327..f27c895c06 100644 --- a/src/babel/transformation/transformers/es6/properties.shorthand.js +++ b/src/babel/transformation/transformers/es6/properties.shorthand.js @@ -1,11 +1,11 @@ import clone from "lodash/lang/clone"; import t from "../../../types"; -exports.check = function (node) { +export function check(node) { return t.isProperty(node) && (node.method || node.shorthand); -}; +} -exports.Property = function (node) { +export function Property(node) { if (node.method) { node.method = false; } @@ -14,4 +14,4 @@ exports.Property = function (node) { node.shorthand = false; node.key = t.removeComments(clone(node.key)); } -}; +} diff --git a/src/babel/transformation/transformers/es6/spread.js b/src/babel/transformation/transformers/es6/spread.js index 83725258e8..128e41c669 100644 --- a/src/babel/transformation/transformers/es6/spread.js +++ b/src/babel/transformation/transformers/es6/spread.js @@ -3,20 +3,20 @@ import t from "../../../types"; exports.check = t.isSpreadElement; -var getSpreadLiteral = function (spread, scope) { +function getSpreadLiteral(spread, scope) { return scope.toArray(spread.argument, true); -}; +} -var hasSpread = function (nodes) { +function hasSpread(nodes) { for (var i = 0; i < nodes.length; i++) { if (t.isSpreadElement(nodes[i])) { return true; } } return false; -}; +} -var build = function (props, scope) { +function build(props, scope) { var nodes = []; var _props = []; @@ -40,9 +40,9 @@ var build = function (props, scope) { push(); return nodes; -}; +} -exports.ArrayExpression = function (node, parent, scope) { +export function ArrayExpression(node, parent, scope) { var elements = node.elements; if (!hasSpread(elements)) return; @@ -55,9 +55,9 @@ exports.ArrayExpression = function (node, parent, scope) { } return t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes); -}; +} -exports.CallExpression = function (node, parent, scope) { +export function CallExpression(node, parent, scope) { var args = node.arguments; if (!hasSpread(args)) return; @@ -95,9 +95,9 @@ exports.CallExpression = function (node, parent, scope) { } node.arguments.unshift(contextLiteral); -}; +} -exports.NewExpression = function (node, parent, scope, file) { +export function NewExpression(node, parent, scope, file) { var args = node.arguments; if (!hasSpread(args)) return; @@ -128,4 +128,4 @@ exports.NewExpression = function (node, parent, scope, file) { } else { return t.callExpression(file.addHelper("apply-constructor"), [node.callee, args]); } -}; +} diff --git a/src/babel/transformation/transformers/es6/template-literals.js b/src/babel/transformation/transformers/es6/template-literals.js index 72206bf5bf..c2ebf2e788 100644 --- a/src/babel/transformation/transformers/es6/template-literals.js +++ b/src/babel/transformation/transformers/es6/template-literals.js @@ -4,11 +4,11 @@ var buildBinaryExpression = function (left, right) { return t.binaryExpression("+", left, right); }; -exports.check = function (node) { +export function check(node) { return t.isTemplateLiteral(node) || t.isTaggedTemplateExpression(node); -}; +} -exports.TaggedTemplateExpression = function (node, parent, scope, file) { +export function TaggedTemplateExpression(node, parent, scope, file) { var args = []; var quasi = node.quasi; @@ -31,9 +31,9 @@ exports.TaggedTemplateExpression = function (node, parent, scope, file) { args = args.concat(quasi.expressions); return t.callExpression(node.tag, args); -}; +} -exports.TemplateLiteral = function (node) { +export function TemplateLiteral(node) { var nodes = []; var i; @@ -61,4 +61,4 @@ exports.TemplateLiteral = function (node) { } else { return nodes[0]; } -}; +} diff --git a/src/babel/transformation/transformers/es6/unicode-regex.js b/src/babel/transformation/transformers/es6/unicode-regex.js index 2badeeff07..f5d1ab0be0 100644 --- a/src/babel/transformation/transformers/es6/unicode-regex.js +++ b/src/babel/transformation/transformers/es6/unicode-regex.js @@ -2,11 +2,11 @@ import rewritePattern from "regexpu/rewrite-pattern"; import pull from "lodash/array/pull"; import t from "../../../types"; -exports.check = function (node) { +export function check(node) { return t.isLiteral(node) && node.regex && node.regex.flags.indexOf("u") >= 0; -}; +} -exports.Literal = function (node) { +export function Literal(node) { var regex = node.regex; if (!regex) return; @@ -16,4 +16,4 @@ exports.Literal = function (node) { regex.pattern = rewritePattern(regex.pattern, regex.flags); regex.flags = flags.join(""); -}; +} diff --git a/src/babel/transformation/transformers/es7/abstract-references.js b/src/babel/transformation/transformers/es7/abstract-references.js index 8114f7c449..4443428fc2 100644 --- a/src/babel/transformation/transformers/es7/abstract-references.js +++ b/src/babel/transformation/transformers/es7/abstract-references.js @@ -3,7 +3,7 @@ import * as util from "../../../util"; import t from "../../../types"; -exports.experimental = true; +export var experimental = true; var container = function (parent, call, ret, file) { if (t.isExpressionStatement(parent) && !file.isConsequenceExpressionStatement(parent)) { @@ -21,7 +21,7 @@ var container = function (parent, call, ret, file) { } }; -exports.AssignmentExpression = function (node, parent, scope, file) { +export function AssignmentExpression(node, parent, scope, file) { var left = node.left; if (!t.isVirtualPropertyExpression(left)) return; @@ -59,9 +59,9 @@ exports.AssignmentExpression = function (node, parent, scope, file) { } return container(parent, call, value, file); -}; +} -exports.UnaryExpression = function (node, parent, scope, file) { +export function UnaryExpression(node, parent, scope, file) { var arg = node.argument; if (!t.isVirtualPropertyExpression(arg)) return; if (node.operator !== "delete") return; @@ -72,9 +72,9 @@ exports.UnaryExpression = function (node, parent, scope, file) { }); return container(parent, call, t.literal(true), file); -}; +} -exports.CallExpression = function (node, parent, scope) { +export function CallExpression(node, parent, scope) { var callee = node.callee; if (!t.isVirtualPropertyExpression(callee)) return; @@ -95,17 +95,17 @@ exports.CallExpression = function (node, parent, scope) { } else { return call; } -}; +} -exports.VirtualPropertyExpression = function (node) { +export function VirtualPropertyExpression(node) { return util.template("abstract-expression-get", { PROPERTY: node.property, OBJECT: node.object }); -}; +} -exports.PrivateDeclaration = function (node) { +export function PrivateDeclaration(node) { return t.variableDeclaration("const", node.declarations.map(function (id) { return t.variableDeclarator(id, t.newExpression(t.identifier("WeakMap"), [])); })); -}; +} diff --git a/src/babel/transformation/transformers/es7/comprehensions.js b/src/babel/transformation/transformers/es7/comprehensions.js index 69a7431b21..654c944af9 100644 --- a/src/babel/transformation/transformers/es7/comprehensions.js +++ b/src/babel/transformation/transformers/es7/comprehensions.js @@ -3,13 +3,13 @@ import traverse from "../../../traversal"; import * as util from "../../../util"; import t from "../../../types"; -exports.experimental = true; +export var experimental = true; -exports.ComprehensionExpression = function (node, parent, scope, file) { +export function ComprehensionExpression(node, parent, scope, file) { var callback = array; if (node.generator) callback = generator; return callback(node, parent, scope, file); -}; +} var generator = function (node) { var body = []; diff --git a/src/babel/transformation/transformers/es7/exponentiation-operator.js b/src/babel/transformation/transformers/es7/exponentiation-operator.js index 92068344a8..cc5d1c93f7 100644 --- a/src/babel/transformation/transformers/es7/exponentiation-operator.js +++ b/src/babel/transformation/transformers/es7/exponentiation-operator.js @@ -1,10 +1,10 @@ // https://github.com/rwaldron/exponentiation-operator -exports.experimental = true; - import build from "../../helpers/build-binary-assignment-operator-transformer"; import t from "../../../types"; +export var experimental = true; + var MATH_POW = t.memberExpression(t.identifier("Math"), t.identifier("pow")); build(exports, { diff --git a/src/babel/transformation/transformers/es7/object-rest-spread.js b/src/babel/transformation/transformers/es7/object-rest-spread.js index 219ff3f2b8..b555e9b62f 100644 --- a/src/babel/transformation/transformers/es7/object-rest-spread.js +++ b/src/babel/transformation/transformers/es7/object-rest-spread.js @@ -2,11 +2,11 @@ import t from "../../../types"; -exports.experimental = true; +export var experimental = true; -exports.manipulateOptions = function (opts) { +export function manipulateOptions(opts) { if (opts.whitelist.length) opts.whitelist.push("es6.destructuring"); -}; +} var hasSpread = function (node) { for (var i = 0; i < node.properties.length; i++) { @@ -17,7 +17,7 @@ var hasSpread = function (node) { return false; }; -exports.ObjectExpression = function (node, parent, scope, file) { +export function ObjectExpression(node, parent, scope, file) { if (!hasSpread(node)) return; var args = []; @@ -46,4 +46,4 @@ exports.ObjectExpression = function (node, parent, scope, file) { } return t.callExpression(file.addHelper("extends"), args); -}; +} diff --git a/src/babel/transformation/transformers/internal/cleanup.js b/src/babel/transformation/transformers/internal/cleanup.js index 40164b4fe8..9c0108fcd3 100644 --- a/src/babel/transformation/transformers/internal/cleanup.js +++ b/src/babel/transformation/transformers/internal/cleanup.js @@ -1,5 +1,5 @@ -exports.SequenceExpression = function (node) { +export function SequenceExpression(node) { if (node.expressions.length === 1) { return node.expressions[0]; } -}; +} diff --git a/src/babel/transformation/transformers/internal/declarations.js b/src/babel/transformation/transformers/internal/declarations.js index cc3beb67aa..b6ecfcf261 100644 --- a/src/babel/transformation/transformers/internal/declarations.js +++ b/src/babel/transformation/transformers/internal/declarations.js @@ -1,7 +1,7 @@ import useStrict from "../../helpers/use-strict"; import t from "../../../types"; -exports.secondPass = true; +export var secondPass = true; exports.BlockStatement = exports.Program = function (node, parent, scope, file) { diff --git a/src/babel/transformation/transformers/internal/module-formatter.js b/src/babel/transformation/transformers/internal/module-formatter.js index a2115a112f..4355571aa2 100644 --- a/src/babel/transformation/transformers/internal/module-formatter.js +++ b/src/babel/transformation/transformers/internal/module-formatter.js @@ -1,6 +1,6 @@ import useStrict from "../../helpers/use-strict"; -exports.Program = function (program, parent, scope, file) { +export function Program(program, parent, scope, file) { if (!file.transformers["es6.modules"].canRun()) return; useStrict.wrap(program, function () { @@ -10,4 +10,4 @@ exports.Program = function (program, parent, scope, file) { if (file.moduleFormatter.transform) { file.moduleFormatter.transform(program); } -}; +} diff --git a/src/babel/transformation/transformers/internal/modules.js b/src/babel/transformation/transformers/internal/modules.js index 63e465273c..0f9926d419 100644 --- a/src/babel/transformation/transformers/internal/modules.js +++ b/src/babel/transformation/transformers/internal/modules.js @@ -49,4 +49,4 @@ export function ExportDeclaration(node, parent, scope) { return [declar, node]; } } -}; +} diff --git a/src/babel/transformation/transformers/spec/typeof-symbol.js b/src/babel/transformation/transformers/spec/typeof-symbol.js index b9f2293cfe..5f4ddab5e4 100644 --- a/src/babel/transformation/transformers/spec/typeof-symbol.js +++ b/src/babel/transformation/transformers/spec/typeof-symbol.js @@ -18,4 +18,4 @@ export function UnaryExpression(node, parent, scope, file) { return call; } } -}; +} diff --git a/src/babel/transformation/transformers/validation/react.js b/src/babel/transformation/transformers/validation/react.js index a1c8b2f197..c772b7280b 100644 --- a/src/babel/transformation/transformers/validation/react.js +++ b/src/babel/transformation/transformers/validation/react.js @@ -19,7 +19,6 @@ export function CallExpression(node, parent, scope, file) { } } -exports.ImportDeclaration = -exports.ExportDeclaration = function (node, parent, scope, file) { +export function ModuleDeclaration(node, parent, scope, file) { check(node.source, file); -}; +} diff --git a/src/babel/traversal/path.js b/src/babel/traversal/path.js index 88b2f6d0b1..a07d46a1cb 100644 --- a/src/babel/traversal/path.js +++ b/src/babel/traversal/path.js @@ -120,7 +120,7 @@ export default class TraversalPath { // type is blacklisted if (opts.blacklist && opts.blacklist.indexOf(node.type) > -1) { - return; + return false; } this.call("enter"); diff --git a/src/babel/types/alias-keys.json b/src/babel/types/alias-keys.json index eee0bab538..059f50e156 100644 --- a/src/babel/types/alias-keys.json +++ b/src/babel/types/alias-keys.json @@ -14,8 +14,8 @@ "EmptyStatement": ["Statement"], "LabeledStatement": ["Statement"], "VariableDeclaration": ["Statement", "Declaration"], - "ExportDeclaration": ["Statement", "Declaration"], - "ImportDeclaration": ["Statement", "Declaration"], + "ExportDeclaration": ["Statement", "Declaration", "ModuleDeclaration"], + "ImportDeclaration": ["Statement", "Declaration", "ModuleDeclaration"], "PrivateDeclaration": ["Statement", "Declaration"], "ArrowFunctionExpression": ["Scopable", "Function", "Expression"], diff --git a/src/babel/types/builder-keys.json b/src/babel/types/builder-keys.json index 147f6ea28d..129d3582d5 100644 --- a/src/babel/types/builder-keys.json +++ b/src/babel/types/builder-keys.json @@ -136,6 +136,11 @@ "expressions": null }, + "TemplateLiteral": { + "quasis": null, + "expressions": null + }, + "ThrowExpression": { "argument": null }, diff --git a/src/babel/types/index.js b/src/babel/types/index.js index 41f7bcf298..98d8a8d1d9 100644 --- a/src/babel/types/index.js +++ b/src/babel/types/index.js @@ -535,7 +535,7 @@ t.toExpression = function (node) { } else { throw new Error("cannot turn " + node.type + " to an expression"); } -} +}; /** * Description diff --git a/src/babel/util.js b/src/babel/util.js index 667210fc9e..d26dc8555a 100644 --- a/src/babel/util.js +++ b/src/babel/util.js @@ -74,23 +74,23 @@ var templateVisitor = { }; export function template(name, nodes, keepExpression) { - var template = exports.templates[name]; - if (!template) throw new ReferenceError("unknown template " + name); + var ast = exports.templates[name]; + if (!ast) throw new ReferenceError("unknown template " + name); if (nodes === true) { keepExpression = true; nodes = null; } - template = cloneDeep(template); + ast = cloneDeep(ast); if (!isEmpty(nodes)) { - traverse(template, templateVisitor, null, nodes); + traverse(ast, templateVisitor, null, nodes); } - if (template.body.length > 1) return template.body; + if (ast.body.length > 1) return ast.body; - var node = template.body[0]; + var node = ast.body[0]; if (!keepExpression && t.isExpressionStatement(node)) { return node.expression; @@ -107,7 +107,7 @@ export function parseTemplate(loc, code) { function loadTemplates() { var templates = {}; - var templatesLoc = __dirname + "/transformation/templates"; + var templatesLoc = path.join(__dirname, "transformation/templates"); if (!fs.existsSync(templatesLoc)) { throw new Error("no templates directory - this is most likely the " + "result of a broken `npm publish`. Please report to " + @@ -118,7 +118,7 @@ function loadTemplates() { if (name[0] === ".") return; var key = path.basename(name, path.extname(name)); - var loc = templatesLoc + "/" + name; + var loc = path.join(templatesLoc, name); var code = fs.readFileSync(loc, "utf8"); templates[key] = parseTemplate(loc, code);