diff --git a/packages/babel-core/src/transformation/transformers/es3/member-expression-literals.js b/packages/babel-core/src/transformation/transformers/es3/member-expression-literals.js deleted file mode 100644 index d3d838f45a..0000000000 --- a/packages/babel-core/src/transformation/transformers/es3/member-expression-literals.js +++ /dev/null @@ -1,41 +0,0 @@ -import * as t from "babel-types"; - -export var metadata = { - group: "builtin-trailing" -}; - -/** - * Turn member expression reserved word properties into literals. - * - * @example - * - * **In** - * - * ```javascript - * foo.catch; - * ``` - * - * **Out** - * - * ```javascript - * foo["catch"]; - * ``` - */ - -export var visitor = { - /** - * Look for non-computed properties with names that are not valid identifiers. - * Turn them into computed properties with literal names. - */ - - MemberExpression: { - exit(node) { - var prop = node.property; - if (!node.computed && t.isIdentifier(prop) && !t.isValidIdentifier(prop.name)) { - // foo.default -> foo["default"] - node.property = t.stringLiteral(prop.name); - node.computed = true; - } - } - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es3/property-literals.js b/packages/babel-core/src/transformation/transformers/es3/property-literals.js deleted file mode 100644 index a134e915b8..0000000000 --- a/packages/babel-core/src/transformation/transformers/es3/property-literals.js +++ /dev/null @@ -1,42 +0,0 @@ -import * as t from "babel-types"; - -export var metadata = { - group: "builtin-trailing" -}; - -/** - * Turn reserved word properties into literals. - * - * **In** - * - * ```javascript - * var foo = { - * catch: function () {} - * }; - * ``` - * - * **Out** - * - * ```javascript - * var foo = { - * "catch": function () {} - * }; - * ``` - */ - -export var visitor = { - /** - * Look for non-computed keys with names that are not valid identifiers. - * Turn them into literals. - */ - - Property: { - exit(node) { - var key = node.key; - if (!node.computed && t.isIdentifier(key) && !t.isValidIdentifier(key.name)) { - // default: "bar" -> "default": "bar" - node.key = t.stringLiteral(key.name); - } - } - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/arrow-functions.js b/packages/babel-core/src/transformation/transformers/es6/arrow-functions.js deleted file mode 100644 index 659d4fa12a..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/arrow-functions.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Turn arrow functions into normal functions. - * - * @example - * - * **In** - * - * ```javascript - * arr.map(x => x * x); - * ``` - * - * **Out** - * - * ```javascript - * arr.map(function (x) { - * return x * x; - * }); - */ - -export var visitor = { - /** - * Look for arrow functions and mark them as "shadow functions". - * @see /transformation/transformers/internal/shadow-functions.js - */ - - ArrowFunctionExpression(node) { - this.ensureBlock(); - node.expression = false; - node.type = "FunctionExpression"; - node.shadow = node.shadow || true; - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/classes/index.js b/packages/babel-core/src/transformation/transformers/es6/classes/index.js index da21f8f9a2..9f35895124 100644 --- a/packages/babel-core/src/transformation/transformers/es6/classes/index.js +++ b/packages/babel-core/src/transformation/transformers/es6/classes/index.js @@ -5,12 +5,11 @@ import { bare } from "../../../helpers/name-method"; export var visitor = { ClassDeclaration(node) { - return t.variableDeclaration("let", [ + return t.variableDeclaration("var", [ t.variableDeclarator(node.id, t.toExpression(node)) ]); }, - ClassExpression(node, parent, scope, file) { var inferred = bare(node, parent, scope); if (inferred) return inferred; diff --git a/packages/babel-core/src/transformation/transformers/es6/constants.js b/packages/babel-core/src/transformation/transformers/es6/constants.js deleted file mode 100644 index b4e5b0a171..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/constants.js +++ /dev/null @@ -1,49 +0,0 @@ -import * as messages from "babel-messages"; - -/** - * Turn constants into variables. - * Ensure there are no constant violations in any scope. - * - * @example - * - * **In** - * - * ```javascript - * const MULTIPLIER = 5; - * ``` - * - * **Out** - * - * ```javascript - * var MULTIPLIER = 5; - * ``` - */ - -export var visitor = { - /** - * Look for any constants (or modules) in scope. - * If they have any `constantViolations` throw an error. - */ - - Scope(node, parent, scope) { - for (var name in scope.bindings) { - var binding = scope.bindings[name]; - - // not a constant - if (binding.kind !== "const" && binding.kind !== "module") continue; - - for (var violation of (binding.constantViolations: Array)) { - throw violation.errorWithNode(messages.get("readOnly", name)); - } - } - }, - - /** - * Look for constants. - * Turn them into `let` variables. - */ - - VariableDeclaration(node) { - if (node.kind === "const") node.kind = "let"; - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/destructuring.js b/packages/babel-core/src/transformation/transformers/es6/destructuring.js deleted file mode 100644 index 22efa3ce6d..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/destructuring.js +++ /dev/null @@ -1,532 +0,0 @@ -import * as messages from "babel-messages"; -import * as t from "babel-types"; - -export var metadata = { - group: "builtin-advanced" -}; - -export var visitor = { - ForXStatement(node, parent, scope, file) { - var left = node.left; - - if (t.isPattern(left)) { - // for ({ length: k } in { abc: 3 }); - - var temp = scope.generateUidIdentifier("ref"); - - node.left = t.variableDeclaration("var", [ - t.variableDeclarator(temp) - ]); - - this.ensureBlock(); - - node.body.body.unshift(t.variableDeclaration("var", [ - t.variableDeclarator(left, temp) - ])); - - return; - } - - if (!t.isVariableDeclaration(left)) return; - - var pattern = left.declarations[0].id; - if (!t.isPattern(pattern)) return; - - var key = scope.generateUidIdentifier("ref"); - node.left = t.variableDeclaration(left.kind, [ - t.variableDeclarator(key, null) - ]); - - var nodes = []; - - var destructuring = new DestructuringTransformer({ - kind: left.kind, - file: file, - scope: scope, - nodes: nodes - }); - - destructuring.init(pattern, key); - - this.ensureBlock(); - - var block = node.body; - block.body = nodes.concat(block.body); - }, - - Function(node, parent, scope, file) { - var hasDestructuring = false; - for (let pattern of (node.params: Array)) { - if (t.isPattern(pattern)) { - hasDestructuring = true; - break; - } - } - if (!hasDestructuring) return; - - var nodes = []; - - for (var i = 0; i < node.params.length; i++) { - let pattern = node.params[i]; - if (!t.isPattern(pattern)) continue; - - var ref = scope.generateUidIdentifier("ref"); - if (t.isAssignmentPattern(pattern)) { - var _pattern = pattern; - pattern = pattern.left; - _pattern.left = ref; - } else { - node.params[i] = ref; - } - - t.inherits(ref, pattern); - - var destructuring = new DestructuringTransformer({ - blockHoist: node.params.length - i + 1, - nodes: nodes, - scope: scope, - file: file, - kind: "let" - }); - - destructuring.init(pattern, ref); - } - - this.ensureBlock(); - - var block = node.body; - block.body = nodes.concat(block.body); - }, - - CatchClause(node, parent, scope, file) { - var pattern = node.param; - if (!t.isPattern(pattern)) return; - - var ref = scope.generateUidIdentifier("ref"); - node.param = ref; - - var nodes = []; - - var destructuring = new DestructuringTransformer({ - kind: "let", - file: file, - scope: scope, - nodes: nodes - }); - destructuring.init(pattern, ref); - - node.body.body = nodes.concat(node.body.body); - }, - - AssignmentExpression(node, parent, scope, file) { - if (!t.isPattern(node.left)) return; - - var nodes = []; - - var destructuring = new DestructuringTransformer({ - operator: node.operator, - file: file, - scope: scope, - nodes: nodes - }); - - var ref; - if (this.isCompletionRecord() || !this.parentPath.isExpressionStatement()) { - ref = scope.generateUidIdentifierBasedOnNode(node.right, "ref"); - - nodes.push(t.variableDeclaration("var", [ - t.variableDeclarator(ref, node.right) - ])); - - if (t.isArrayExpression(node.right)) { - destructuring.arrays[ref.name] = true; - } - } - - destructuring.init(node.left, ref || node.right); - - if (ref) { - nodes.push(t.expressionStatement(ref)); - } - - return nodes; - }, - - VariableDeclaration(node, parent, scope, file) { - if (t.isForXStatement(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 destructuring = new DestructuringTransformer({ - nodes: nodes, - scope: scope, - kind: node.kind, - file: file - }); - - if (t.isPattern(pattern)) { - destructuring.init(pattern, patternId); - - if (+i !== node.declarations.length - 1) { - // we aren't the last declarator so let's just make the - // last transformed node inherit from us - t.inherits(nodes[nodes.length - 1], declar); - } - } else { - nodes.push(t.inherits(destructuring.buildVariableAssignment(declar.id, declar.init), declar)); - } - } - - if (!t.isProgram(parent) && !t.isBlockStatement(parent)) { - // https://github.com/babel/babel/issues/113 - // for (let [x] = [0]; false;) {} - - declar = null; - - for (i = 0; i < nodes.length; i++) { - node = nodes[i]; - declar = declar || t.variableDeclaration(node.kind, []); - - if (!t.isVariableDeclaration(node) && declar.kind !== node.kind) { - throw file.errorWithNode(node, messages.get("invalidParentForThisNode")); - } - - declar.declarations = declar.declarations.concat(node.declarations); - } - - return declar; - } - - return nodes; - } -}; - -/** - * Test if a VariableDeclaration's declarations contains any Patterns. - */ - -function variableDeclarationHasPattern(node) { - for (var i = 0; i < node.declarations.length; i++) { - if (t.isPattern(node.declarations[i].id)) { - return true; - } - } - return false; -} - -/** - * Test if an ArrayPattern's elements contain any RestElements. - */ - -function hasRest(pattern) { - for (var i = 0; i < pattern.elements.length; i++) { - if (t.isRestElement(pattern.elements[i])) { - return true; - } - } - return false; -} - -var arrayUnpackVisitor = { - ReferencedIdentifier(node, parent, scope, state) { - if (state.bindings[node.name]) { - state.deopt = true; - this.stop(); - } - } -}; - -class DestructuringTransformer { - constructor(opts) { - this.blockHoist = opts.blockHoist; - this.operator = opts.operator; - this.arrays = {}; - this.nodes = opts.nodes || []; - this.scope = opts.scope; - this.file = opts.file; - this.kind = opts.kind; - } - - buildVariableAssignment(id, init) { - var op = this.operator; - if (t.isMemberExpression(id)) op = "="; - - var node; - - if (op) { - node = t.expressionStatement(t.assignmentExpression(op, id, init)); - } else { - node = t.variableDeclaration(this.kind, [ - t.variableDeclarator(id, init) - ]); - } - - node._blockHoist = this.blockHoist; - - return node; - } - - buildVariableDeclaration(id, init) { - var declar = t.variableDeclaration("var", [ - t.variableDeclarator(id, init) - ]); - declar._blockHoist = this.blockHoist; - return declar; - } - - push(id, init) { - if (t.isObjectPattern(id)) { - this.pushObjectPattern(id, init); - } else if (t.isArrayPattern(id)) { - this.pushArrayPattern(id, init); - } else if (t.isAssignmentPattern(id)) { - this.pushAssignmentPattern(id, init); - } else { - this.nodes.push(this.buildVariableAssignment(id, init)); - } - } - - toArray(node, count) { - if (this.file.isLoose("es6.destructuring") || (t.isIdentifier(node) && this.arrays[node.name])) { - return node; - } else { - return this.scope.toArray(node, count); - } - } - - pushAssignmentPattern(pattern, valueRef) { - // we need to assign the current value of the assignment to avoid evaluating - // it more than once - - var tempValueRef = this.scope.generateUidIdentifierBasedOnNode(valueRef); - - var declar = t.variableDeclaration("var", [ - t.variableDeclarator(tempValueRef, valueRef) - ]); - declar._blockHoist = this.blockHoist; - this.nodes.push(declar); - - // - - var tempConditional = t.conditionalExpression( - t.binaryExpression("===", tempValueRef, t.identifier("undefined")), - pattern.right, - tempValueRef - ); - - var left = pattern.left; - if (t.isPattern(left)) { - var tempValueDefault = t.expressionStatement( - t.assignmentExpression("=", tempValueRef, tempConditional) - ); - tempValueDefault._blockHoist = this.blockHoist; - - this.nodes.push(tempValueDefault); - this.push(left, tempValueRef); - } else { - this.nodes.push(this.buildVariableAssignment(left, tempConditional)); - } - } - - pushObjectSpread(pattern, objRef, spreadProp, spreadPropIndex) { - // get all the keys that appear in this object before the current spread - - var keys = []; - - for (var i = 0; i < pattern.properties.length; i++) { - var prop = pattern.properties[i]; - - // we've exceeded the index of the spread property to all properties to the - // right need to be ignored - if (i >= spreadPropIndex) break; - - // ignore other spread properties - if (t.isSpreadProperty(prop)) continue; - - var key = prop.key; - if (t.isIdentifier(key) && !prop.computed) key = t.stringLiteral(prop.key.name); - keys.push(key); - } - - keys = t.arrayExpression(keys); - - // - - var value = t.callExpression(this.file.addHelper("object-without-properties"), [objRef, keys]); - this.nodes.push(this.buildVariableAssignment(spreadProp.argument, value)); - } - - pushObjectProperty(prop, propRef) { - if (t.isLiteral(prop.key)) prop.computed = true; - - var pattern = prop.value; - var objRef = t.memberExpression(propRef, prop.key, prop.computed); - - if (t.isPattern(pattern)) { - this.push(pattern, objRef); - } else { - this.nodes.push(this.buildVariableAssignment(pattern, objRef)); - } - } - - pushObjectPattern(pattern, objRef) { - // https://github.com/babel/babel/issues/681 - - if (!pattern.properties.length) { - this.nodes.push(t.expressionStatement( - t.callExpression(this.file.addHelper("object-destructuring-empty"), [objRef]) - )); - } - - // if we have more than one properties in this pattern and the objectRef is a - // member expression then we need to assign it to a temporary variable so it's - // only evaluated once - - if (pattern.properties.length > 1 && !this.scope.isStatic(objRef)) { - var temp = this.scope.generateUidIdentifierBasedOnNode(objRef); - this.nodes.push(this.buildVariableDeclaration(temp, objRef)); - objRef = temp; - } - - // - - for (var i = 0; i < pattern.properties.length; i++) { - var prop = pattern.properties[i]; - if (t.isSpreadProperty(prop)) { - this.pushObjectSpread(pattern, objRef, prop, i); - } else { - this.pushObjectProperty(prop, objRef); - } - } - } - - canUnpackArrayPattern(pattern, arr) { - // not an array so there's no way we can deal with this - if (!t.isArrayExpression(arr)) return false; - - // pattern has less elements than the array and doesn't have a rest so some - // elements wont be evaluated - if (pattern.elements.length > arr.elements.length) return; - if (pattern.elements.length < arr.elements.length && !hasRest(pattern)) return false; - - for (let elem of (pattern.elements: Array)) { - // deopt on holes - if (!elem) return false; - - // deopt on member expressions as they may be included in the RHS - if (t.isMemberExpression(elem)) return false; - } - - for (let elem of (arr.elements: Array)) { - // deopt on spread elements - if (t.isSpreadElement(elem)) return false; - } - - // deopt on reference to left side identifiers - var bindings = t.getBindingIdentifiers(pattern); - var state = { deopt: false, bindings }; - this.scope.traverse(arr, arrayUnpackVisitor, state); - return !state.deopt; - } - - pushUnpackedArrayPattern(pattern, arr) { - for (var i = 0; i < pattern.elements.length; i++) { - var elem = pattern.elements[i]; - if (t.isRestElement(elem)) { - this.push(elem.argument, t.arrayExpression(arr.elements.slice(i))); - } else { - this.push(elem, arr.elements[i]); - } - } - } - - pushArrayPattern(pattern, arrayRef) { - if (!pattern.elements) return; - - // optimise basic array destructuring of an array expression - // - // we can't do this to a pattern of unequal size to it's right hand - // array expression as then there will be values that wont be evaluated - // - // eg: var [a, b] = [1, 2]; - - if (this.canUnpackArrayPattern(pattern, arrayRef)) { - return this.pushUnpackedArrayPattern(pattern, arrayRef); - } - - // if we have a rest then we need all the elements so don't tell - // `scope.toArray` to only get a certain amount - - var count = !hasRest(pattern) && pattern.elements.length; - - // so we need to ensure that the `arrayRef` is an array, `scope.toArray` will - // return a locally bound identifier if it's been inferred to be an array, - // otherwise it'll be a call to a helper that will ensure it's one - - var toArray = this.toArray(arrayRef, count); - - if (t.isIdentifier(toArray)) { - // we've been given an identifier so it must have been inferred to be an - // array - arrayRef = toArray; - } else { - arrayRef = this.scope.generateUidIdentifierBasedOnNode(arrayRef); - this.arrays[arrayRef.name] = true; - this.nodes.push(this.buildVariableDeclaration(arrayRef, toArray)); - } - - // - - for (var i = 0; i < pattern.elements.length; i++) { - var elem = pattern.elements[i]; - - // hole - if (!elem) continue; - - var elemRef; - - if (t.isRestElement(elem)) { - elemRef = this.toArray(arrayRef); - - if (i > 0) { - elemRef = t.callExpression(t.memberExpression(elemRef, t.identifier("slice")), [t.numberLiteral(i)]); - } - - // set the element to the rest element argument since we've dealt with it - // being a rest already - elem = elem.argument; - } else { - elemRef = t.memberExpression(arrayRef, t.numberLiteral(i), true); - } - - this.push(elem, elemRef); - } - } - - init(pattern, ref) { - // trying to destructure a value that we can't evaluate more than once so we - // need to save it to a variable - - if (!t.isArrayExpression(ref) && !t.isMemberExpression(ref)) { - var memo = this.scope.maybeGenerateMemoised(ref, true); - if (memo) { - this.nodes.push(this.buildVariableDeclaration(memo, ref)); - ref = memo; - } - } - - // - - this.push(pattern, ref); - - return this.nodes; - } -} diff --git a/packages/babel-core/src/transformation/transformers/es6/literals.js b/packages/babel-core/src/transformation/transformers/es6/literals.js deleted file mode 100644 index a4b80192c5..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/literals.js +++ /dev/null @@ -1,19 +0,0 @@ -export var metadata = { - group: "builtin-pre" -}; - -export var visitor = { - NumberLiteral(node) { - // number octal like 0b10 or 0o70 - if (/^0[ob]/i.test(node.raw)) { - node.raw = undefined; - } - }, - - StringLiteral(node) { - // unicode escape - if (/\\[u]/gi.test(node.raw)) { - node.raw = undefined; - } - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/parameters/default.js b/packages/babel-core/src/transformation/transformers/es6/parameters/default.js index 6ab7978e43..b3d87a6cbd 100644 --- a/packages/babel-core/src/transformation/transformers/es6/parameters/default.js +++ b/packages/babel-core/src/transformation/transformers/es6/parameters/default.js @@ -78,9 +78,9 @@ export var visitor = { param.traverse(iifeVisitor, state); } - if (file.transformers["es6.spec.blockScoping"].canTransform() && param.isIdentifier()) { - pushDefNode(param.node, t.identifier("undefined"), i); - } + //if (file.transformers["es6.spec.blockScoping"].canTransform() && param.isIdentifier()) { + // pushDefNode(param.node, t.identifier("undefined"), i); + //} continue; } diff --git a/packages/babel-core/src/transformation/transformers/es6/properties.computed.js b/packages/babel-core/src/transformation/transformers/es6/properties.computed.js deleted file mode 100644 index 72e5a65b03..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/properties.computed.js +++ /dev/null @@ -1,106 +0,0 @@ -import * as t from "babel-types"; - -function loose(node, body, objId) { - for (var prop of (node.properties: Array)) { - body.push(t.expressionStatement( - t.assignmentExpression( - "=", - t.memberExpression(objId, prop.key, prop.computed || t.isLiteral(prop.key)), - prop.value - ) - )); - } -} - -function spec(node, body, objId, initProps, file) { - // add a simple assignment for all Symbol member expressions due to symbol polyfill limitations - // otherwise use Object.defineProperty - - for (let prop of (node.properties: Array)) { - // this wont work with Object.defineProperty - if (t.isLiteral(t.toComputedKey(prop), { value: "__proto__" })) { - initProps.push(prop); - continue; - } - - let key = prop.key; - if (t.isIdentifier(key) && !prop.computed) { - key = t.stringLiteral(key.name); - } - - var bodyNode = t.callExpression(file.addHelper("define-property"), [objId, key, prop.value]); - - body.push(t.expressionStatement(bodyNode)); - } - - // only one node and it's a Object.defineProperty that returns the object - - if (body.length === 1) { - var first = body[0].expression; - - if (t.isCallExpression(first)) { - first.arguments[0] = t.objectExpression(initProps); - return first; - } - } -} - -export var visitor = { - ObjectExpression: { - exit(node, parent, scope, file) { - var hasComputed = false; - - for (let prop of (node.properties: Array)) { - hasComputed = t.isProperty(prop, { computed: true, kind: "init" }); - if (hasComputed) break; - } - - if (!hasComputed) return; - - // put all getters/setters into the first object expression as well as all initialisers up - // to the first computed property - - var initProps = []; - var stopInits = false; - - node.properties = node.properties.filter(function (prop) { - if (prop.computed) { - stopInits = true; - } - - if (prop.kind !== "init" || !stopInits) { - initProps.push(prop); - return false; - } else { - return true; - } - }); - - // - - var objId = scope.generateUidIdentifierBasedOnNode(parent); - - // - - var body = []; - - // - - 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.expressionStatement(objId)); - - return body; - } - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/properties.shorthand.js b/packages/babel-core/src/transformation/transformers/es6/properties.shorthand.js deleted file mode 100644 index a6029287b3..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/properties.shorthand.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * [Please add a description.] - */ - -export var visitor = { - Property(node) { - if (node.method) { - node.method = false; - } - - if (node.shorthand) { - node.shorthand = false; - } - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/spread.js b/packages/babel-core/src/transformation/transformers/es6/spread.js deleted file mode 100644 index a9e0c30ead..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/spread.js +++ /dev/null @@ -1,124 +0,0 @@ -import * as t from "babel-types"; - -function getSpreadLiteral(spread, scope) { - if (scope.hub.file.isLoose("es6.spread") && !t.isIdentifier(spread.argument, { name: "arguments" })) { - return spread.argument; - } else { - return scope.toArray(spread.argument, true); - } -} - -function hasSpread(nodes) { - for (var i = 0; i < nodes.length; i++) { - if (t.isSpreadElement(nodes[i])) { - return true; - } - } - return false; -} - -function build(props, scope) { - var nodes = []; - - var _props = []; - - var push = function () { - if (!_props.length) return; - nodes.push(t.arrayExpression(_props)); - _props = []; - }; - - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - if (t.isSpreadElement(prop)) { - push(); - nodes.push(getSpreadLiteral(prop, scope)); - } else { - _props.push(prop); - } - } - - push(); - - return nodes; -} - -export var metadata = { - group: "builtin-advanced" -}; - -export var visitor = { - ArrayExpression(node, parent, scope) { - var elements = node.elements; - if (!hasSpread(elements)) return; - - var nodes = build(elements, scope); - var first = nodes.shift(); - - if (!t.isArrayExpression(first)) { - nodes.unshift(first); - first = t.arrayExpression([]); - } - - return t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes); - }, - - CallExpression(node, parent, scope) { - var args = node.arguments; - if (!hasSpread(args)) return; - - var contextLiteral = t.identifier("undefined"); - - node.arguments = []; - - var nodes; - if (args.length === 1 && args[0].argument.name === "arguments") { - nodes = [args[0].argument]; - } else { - nodes = build(args, scope); - } - - var first = nodes.shift(); - if (nodes.length) { - node.arguments.push(t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes)); - } else { - node.arguments.push(first); - } - - var callee = node.callee; - - if (this.get("callee").isMemberExpression()) { - var temp = scope.maybeGenerateMemoised(callee.object); - if (temp) { - callee.object = t.assignmentExpression("=", temp, callee.object); - contextLiteral = temp; - } else { - contextLiteral = callee.object; - } - t.appendToMemberExpression(callee, t.identifier("apply")); - } else { - node.callee = t.memberExpression(node.callee, t.identifier("apply")); - } - - node.arguments.unshift(contextLiteral); - }, - - NewExpression(node, parent, scope, file) { - var args = node.arguments; - if (!hasSpread(args)) return; - - var nodes = build(args, scope); - - var context = t.arrayExpression([t.nullLiteral()]); - - args = t.callExpression(t.memberExpression(context, t.identifier("concat")), nodes); - - return t.newExpression( - t.callExpression( - t.memberExpression(file.addHelper("bind"), t.identifier("apply")), - [node.callee, args] - ), - [] - ); - } -}; diff --git a/packages/babel-core/src/transformation/transformers/es6/template-literals.js b/packages/babel-core/src/transformation/transformers/es6/template-literals.js deleted file mode 100644 index f9fd7ab33e..0000000000 --- a/packages/babel-core/src/transformation/transformers/es6/template-literals.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint no-unused-vars: 0 */ - -import * as t from "babel-types"; - -export var metadata = { - group: "builtin-pre" -}; - -function isString(node) { - return t.isLiteral(node) && typeof node.value === "string"; -} - -function buildBinaryExpression(left, right) { - var node = t.binaryExpression("+", left, right); - node._templateLiteralProduced = true; - return node; -} - -function crawl(path) { - if (path.is("_templateLiteralProduced")) { - crawl(path.get("left")); - crawl(path.get("right")); - } else if (!path.isBaseType("string") && !path.isBaseType("number")) { - path.replaceWith(t.callExpression(t.identifier("String"), [path.node])); - } -} - -export var visitor = { - TaggedTemplateExpression(node, parent, scope, file) { - var quasi = node.quasi; - var args = []; - - var strings = []; - var raw = []; - - for (var elem of (quasi.quasis: Array)) { - strings.push(t.stringLiteral(elem.value.cooked)); - raw.push(t.stringLiteral(elem.value.raw)); - } - - strings = t.arrayExpression(strings); - raw = t.arrayExpression(raw); - - var templateName = "tagged-template-literal"; - if (file.isLoose("es6.templateLiterals")) templateName += "-loose"; - - var templateObject = file.addTemplateObject(templateName, strings, raw); - args.push(templateObject); - - args = args.concat(quasi.expressions); - - return t.callExpression(node.tag, args); - }, - - TemplateLiteral(node, parent, scope, file) { - var nodes = []; - - for (let elem of (node.quasis: Array)) { - nodes.push(t.stringLiteral(elem.value.cooked)); - - var expr = node.expressions.shift(); - if (expr) nodes.push(expr); - } - - // filter out empty string literals - nodes = nodes.filter(n => !t.isLiteral(n, { value: "" })); - - // since `+` is left-to-right associative - // ensure the first node is a string if first/second isn't - if (!isString(nodes[0]) && !isString(nodes[1])) { - nodes.unshift(t.stringLiteral("")); - } - - if (nodes.length > 1) { - var root = buildBinaryExpression(nodes.shift(), nodes.shift()); - - for (let node of (nodes: Array)) { - root = buildBinaryExpression(root, node); - } - - this.replaceWith(root); - //crawl(this); - } else { - return nodes[0]; - } - } -}; diff --git a/packages/babel-core/src/transformation/transformers/index.js b/packages/babel-core/src/transformation/transformers/index.js index e9a3d7bf72..318732036d 100644 --- a/packages/babel-core/src/transformation/transformers/index.js +++ b/packages/babel-core/src/transformation/transformers/index.js @@ -28,9 +28,8 @@ export default { "es7.trailingFunctionCommas": require("./es7/trailing-function-commas"), "es7.asyncFunctions": require("./es7/async-functions"), "es7.decorators": require("./es7/decorators"), - "validation.react": require("./validation/react"), "es6.arrowFunctions": require("./es6/arrow-functions"), - "spec.blockScopedFunctions": require("./spec/block-scoped-functions"), + "spec.blockScopedFunctions": require("babel-plugin-es2015-block-scoped-functions"), "optimisation.react.constantElements": require("babel-plugin-react-constant-elements"), "optimisation.react.inlineElements": require("./optimisation/react.inline-elements"), "es7.comprehensions": require("./es7/comprehensions"), @@ -41,13 +40,13 @@ export default { "es7.objectRestSpread": require("./es7/object-rest-spread"), "es7.exponentiationOperator": require("./es7/exponentiation-operator"), "es5.properties.mutators": require("./es5/properties.mutators"), - "es6.properties.shorthand": require("./es6/properties.shorthand"), - "es6.properties.computed": require("./es6/properties.computed"), + "es6.properties.shorthand": require("babel-plugin-es2015-shorthand-properties"), + "es6.properties.computed": require("babel-plugin-es2015-computed-properties"), "optimisation.flow.forOf": require("./optimisation/flow.for-of"), - "es6.forOf": require("./es6/for-of"), - "es6.regex.sticky": require("./es6/regex.sticky"), - "es6.regex.unicode": require("./es6/regex.unicode"), - "es6.constants": require("./es6/constants"), + "es6.forOf": require("babel-plugin-es2015-for-of"), + "es6.regex.sticky": require("babel-plugin-es2015-sticky-regex"), + "es6.regex.unicode": require("babel-plugin-es2015-unicode-regex"), + "es6.constants": require("babel-plugin-es2015-constants"), "es7.exportExtensions": require("./es7/export-extensions"), "spec.protoToAssign": require("babel-plugin-proto-to-assign"), "es7.doExpressions": require("./es7/do-expressions"), @@ -56,10 +55,10 @@ export default { "spec.undefinedToVoid": require("babel-plugin-undefined-to-void"), //- builtin-advanced - "es6.spread": require("./es6/spread"), - "es6.parameters": require("./es6/parameters"), - "es6.destructuring": require("./es6/destructuring"), - "es6.blockScoping": require("./es6/block-scoping"), + "es6.spread": require("babel-plugin-es2015-spread"), + "es6.parameters": require("babel-plugin-es2015-parameters"), + "es6.destructuring": require("babel-plugin-es2015-destructuring"), + "es6.blockScoping": require("babel-plugin-es2015-block-scoping"), reactCompat: require("./other/react-compat"), react: require("./other/react"), regenerator: require("./other/regenerator"), @@ -76,14 +75,14 @@ export default { // these clean up the output and do finishing up transformations, it's important to note that by this // stage you can't import any new modules or insert new ES6 as all those transformers have already // been ran - "es6.tailCall": require("./es6/tail-call"), + "es6.tailCall": require("babel-plugin-es2015-tail-call"), _shadowFunctions: require("./internal/shadow-functions"), - "es3.propertyLiterals": require("./es3/property-literals"), - "es3.memberExpressionLiterals": require("./es3/member-expression-literals"), + "es3.propertyLiterals": require("babel-plugin-es3-property-literals"), + "es3.memberExpressionLiterals": require("babel-plugin-es3-member-expression-literals"), "minification.memberExpressionLiterals": require("babel-plugin-member-expression-literals"), "minification.propertyLiterals": require("babel-plugin-property-literals"), _blockHoist: require("./internal/block-hoist"), jscript: require("babel-plugin-jscript"), - flow: require("./other/flow"), + flow: require("babel-plugin-flow-strip-types"), "optimisation.modules.system": require("./optimisation/modules.system"), }; diff --git a/packages/babel-core/src/transformation/transformers/other/flow.js b/packages/babel-core/src/transformation/transformers/other/flow.js deleted file mode 100644 index 515294be53..0000000000 --- a/packages/babel-core/src/transformation/transformers/other/flow.js +++ /dev/null @@ -1,48 +0,0 @@ -import * as t from "babel-types"; - -export var metadata = { - group: "builtin-trailing" -}; - -const FLOW_DIRECTIVE = "@flow"; - -export var visitor = { - Program(node, parent, scope, file) { - for (var comment of (file.ast.comments: Array)) { - if (comment.value.indexOf(FLOW_DIRECTIVE) >= 0) { - // remove flow directive - comment.value = comment.value.replace(FLOW_DIRECTIVE, ""); - - // remove the comment completely if it only consists of whitespace and/or stars - if (!comment.value.replace(/\*/g, "").trim()) comment._displayed = true; - } - } - }, - - Flow() { - this.dangerouslyRemove(); - }, - - ClassProperty(node) { - node.typeAnnotation = null; - if (!node.value) this.dangerouslyRemove(); - }, - - Class(node) { - node.implements = null; - }, - - Function(node) { - for (var i = 0; i < node.params.length; i++) { - var param = node.params[i]; - param.optional = false; - } - }, - - TypeCastExpression(node) { - do { - node = node.expression; - } while(t.isTypeCastExpression(node)); - return node; - } -}; diff --git a/packages/babel-core/src/transformation/transformers/spec/block-scoped-functions.js b/packages/babel-core/src/transformation/transformers/spec/block-scoped-functions.js deleted file mode 100644 index 3f65ed0197..0000000000 --- a/packages/babel-core/src/transformation/transformers/spec/block-scoped-functions.js +++ /dev/null @@ -1,38 +0,0 @@ -import * as t from "babel-types"; - -function statementList(key, path) { - var paths = path.get(key); - - for (var i = 0; i < paths.length; i++) { - let path = paths[i]; - - var func = path.node; - if (!t.isFunctionDeclaration(func)) continue; - - var declar = t.variableDeclaration("let", [ - t.variableDeclarator(func.id, t.toExpression(func)) - ]); - - // hoist it up above everything else - declar._blockHoist = 2; - - // todo: name this - func.id = null; - - path.replaceWith(declar); - } -} - -export var visitor = { - BlockStatement(node, parent) { - if ((t.isFunction(parent) && parent.body === node) || t.isExportDeclaration(parent)) { - return; - } - - statementList("body", this); - }, - - SwitchCase() { - statementList("consequent", this); - } -}; diff --git a/packages/babel-core/src/transformation/transformers/validation/react.js b/packages/babel-core/src/transformation/transformers/validation/react.js deleted file mode 100644 index fa2103db7a..0000000000 --- a/packages/babel-core/src/transformation/transformers/validation/react.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as messages from "babel-messages"; -import * as t from "babel-types"; - -// check if the input Literal `source` is an alternate casing of "react" -function check(source, file) { - if (t.isLiteral(source)) { - var name = source.value; - var lower = name.toLowerCase(); - - if (lower === "react" && name !== lower) { - throw file.errorWithNode(source, messages.get("didYouMean", "react")); - } - } -} - -export var visitor = { - CallExpression(node, parent, scope, file) { - if (this.get("callee").isIdentifier({ name: "require" }) && node.arguments.length === 1) { - check(node.arguments[0], file); - } - }, - - ModuleDeclaration(node, parent, scope, file) { - check(node.source, file); - } -}; diff --git a/packages/babel-plugin-async-functions/.gitignore b/packages/babel-plugin-async-functions/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-async-functions/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-async-functions/.npmignore b/packages/babel-plugin-async-functions/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-async-functions/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-async-functions/README.md b/packages/babel-plugin-async-functions/README.md new file mode 100644 index 0000000000..2afc6fa67f --- /dev/null +++ b/packages/babel-plugin-async-functions/README.md @@ -0,0 +1,35 @@ +# babel-plugin-async-functions + +Compile async functions to ES5 + +## Installation + +```sh +$ npm install babel-plugin-async-functions +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["async-functions"] +} +``` + +### Via CLI + +```sh +$ babel --plugins async-functions script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["async-functions"] +}); +``` diff --git a/packages/babel-plugin-async-functions/package.json b/packages/babel-plugin-async-functions/package.json new file mode 100644 index 0000000000..cbf78e07d2 --- /dev/null +++ b/packages/babel-plugin-async-functions/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-async-functions", + "version": "1.0.0", + "description": "Compile async functions to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-async-functions/src/index.js b/packages/babel-plugin-async-functions/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-async-functions/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-async-to-bluebird-coroutines/.gitignore b/packages/babel-plugin-async-to-bluebird-coroutines/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-async-to-bluebird-coroutines/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-async-to-bluebird-coroutines/.npmignore b/packages/babel-plugin-async-to-bluebird-coroutines/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-async-to-bluebird-coroutines/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-async-to-bluebird-coroutines/README.md b/packages/babel-plugin-async-to-bluebird-coroutines/README.md new file mode 100644 index 0000000000..5f91ef8045 --- /dev/null +++ b/packages/babel-plugin-async-to-bluebird-coroutines/README.md @@ -0,0 +1,35 @@ +# babel-plugin-async-to-bluebird-coroutines + +Turn async functions into a Bluebird coroutine + +## Installation + +```sh +$ npm install babel-plugin-async-to-bluebird-coroutines +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["async-to-bluebird-coroutines"] +} +``` + +### Via CLI + +```sh +$ babel --plugins async-to-bluebird-coroutines script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["async-to-bluebird-coroutines"] +}); +``` diff --git a/packages/babel-plugin-async-to-bluebird-coroutines/package.json b/packages/babel-plugin-async-to-bluebird-coroutines/package.json new file mode 100644 index 0000000000..827967e422 --- /dev/null +++ b/packages/babel-plugin-async-to-bluebird-coroutines/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-async-to-bluebird-coroutines", + "version": "1.0.0", + "description": "Turn async functions into a Bluebird coroutine", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-async-to-bluebird-coroutines/src/index.js b/packages/babel-plugin-async-to-bluebird-coroutines/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-async-to-bluebird-coroutines/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-async-to-generator/.gitignore b/packages/babel-plugin-async-to-generator/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-async-to-generator/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-async-to-generator/.npmignore b/packages/babel-plugin-async-to-generator/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-async-to-generator/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-async-to-generator/README.md b/packages/babel-plugin-async-to-generator/README.md new file mode 100644 index 0000000000..c5a76edbff --- /dev/null +++ b/packages/babel-plugin-async-to-generator/README.md @@ -0,0 +1,35 @@ +# babel-plugin-async-to-generator + +Turn async functions into ES2015 generators + +## Installation + +```sh +$ npm install babel-plugin-async-to-generator +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["async-to-generator"] +} +``` + +### Via CLI + +```sh +$ babel --plugins async-to-generator script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["async-to-generator"] +}); +``` diff --git a/packages/babel-plugin-async-to-generator/package.json b/packages/babel-plugin-async-to-generator/package.json new file mode 100644 index 0000000000..2b306cb4c6 --- /dev/null +++ b/packages/babel-plugin-async-to-generator/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-async-to-generator", + "version": "1.0.0", + "description": "Turn async functions into ES2015 generators", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-async-to-generator/src/index.js b/packages/babel-plugin-async-to-generator/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-async-to-generator/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-class-properties/.gitignore b/packages/babel-plugin-class-properties/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-class-properties/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-class-properties/.npmignore b/packages/babel-plugin-class-properties/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-class-properties/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-class-properties/README.md b/packages/babel-plugin-class-properties/README.md new file mode 100644 index 0000000000..02487c6f48 --- /dev/null +++ b/packages/babel-plugin-class-properties/README.md @@ -0,0 +1,35 @@ +# babel-plugin-class-properties + + + +## Installation + +```sh +$ npm install babel-plugin-class-properties +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["class-properties"] +} +``` + +### Via CLI + +```sh +$ babel --plugins class-properties script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["class-properties"] +}); +``` diff --git a/packages/babel-plugin-class-properties/package.json b/packages/babel-plugin-class-properties/package.json new file mode 100644 index 0000000000..7563a01b87 --- /dev/null +++ b/packages/babel-plugin-class-properties/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-class-properties", + "version": "1.0.0", + "description": "", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-class-properties/src/index.js b/packages/babel-plugin-class-properties/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-class-properties/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-comprehensions/.gitignore b/packages/babel-plugin-comprehensions/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-comprehensions/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-comprehensions/.npmignore b/packages/babel-plugin-comprehensions/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-comprehensions/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-comprehensions/README.md b/packages/babel-plugin-comprehensions/README.md new file mode 100644 index 0000000000..53d1f3e140 --- /dev/null +++ b/packages/babel-plugin-comprehensions/README.md @@ -0,0 +1,35 @@ +# babel-plugin-comprehensions + +Compile array and generator comprehensions to ES5 + +## Installation + +```sh +$ npm install babel-plugin-comprehensions +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["comprehensions"] +} +``` + +### Via CLI + +```sh +$ babel --plugins comprehensions script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["comprehensions"] +}); +``` diff --git a/packages/babel-plugin-comprehensions/package.json b/packages/babel-plugin-comprehensions/package.json new file mode 100644 index 0000000000..870755f3c0 --- /dev/null +++ b/packages/babel-plugin-comprehensions/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-comprehensions", + "version": "1.0.0", + "description": "Compile array and generator comprehensions to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-comprehensions/src/index.js b/packages/babel-plugin-comprehensions/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-comprehensions/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-constant-folding/package.json b/packages/babel-plugin-constant-folding/package.json index e08254ff9e..583b981b9e 100644 --- a/packages/babel-plugin-constant-folding/package.json +++ b/packages/babel-plugin-constant-folding/package.json @@ -2,17 +2,9 @@ "name": "babel-plugin-constant-folding", "version": "1.0.1", "description": "Compile static constants (ie. code that we can statically determine to be constant at runtime)", - "repository": "babel-plugins/babel-plugin-constant-folding", + "repository": "babel/babelbabel-plugin-constant-folding", "license": "MIT", "main": "lib/index.js", - "devDependencies": { - "babel": "^5.6.0" - }, - "scripts": { - "build": "babel-plugin build", - "push": "babel-plugin publish", - "test": "babel-plugin test" - }, "keywords": [ "babel-plugin" ] diff --git a/packages/babel-plugin-constant-folding/src/index.js b/packages/babel-plugin-constant-folding/src/index.js index e610b8a7a5..32f26caa9a 100644 --- a/packages/babel-plugin-constant-folding/src/index.js +++ b/packages/babel-plugin-constant-folding/src/index.js @@ -1,10 +1,10 @@ export default function ({ Plugin, types: t }) { - return new Plugin("constant-folding", { + return { metadata: { group: "builtin-prepass", experimental: true }, - + visitor: { AssignmentExpression() { var left = this.get("left"); @@ -70,5 +70,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-dead-code-elimination/package.json b/packages/babel-plugin-dead-code-elimination/package.json index dd728a7545..ece753b8c7 100644 --- a/packages/babel-plugin-dead-code-elimination/package.json +++ b/packages/babel-plugin-dead-code-elimination/package.json @@ -2,17 +2,9 @@ "name": "babel-plugin-dead-code-elimination", "version": "1.0.2", "description": "Eliminate dead code", - "repository": "babel-plugins/babel-plugin-dead-code-elimination", + "repository": "babel/babelbabel-plugin-dead-code-elimination", "license": "MIT", "main": "lib/index.js", - "devDependencies": { - "babel": "^5.6.0" - }, - "scripts": { - "build": "babel-plugin build", - "push": "babel-plugin publish", - "test": "babel-plugin test" - }, "keywords": [ "babel-plugin" ] diff --git a/packages/babel-plugin-dead-code-elimination/src/index.js b/packages/babel-plugin-dead-code-elimination/src/index.js index c869422e75..98d0eb4d02 100644 --- a/packages/babel-plugin-dead-code-elimination/src/index.js +++ b/packages/babel-plugin-dead-code-elimination/src/index.js @@ -146,12 +146,12 @@ export default function ({ Plugin, types: t }) { } }; - return new Plugin("dead-code-elimination", { + return { metadata: { group: "builtin-pre", experimental: true }, visitor - }); + }; } diff --git a/packages/babel-plugin-decorators/.gitignore b/packages/babel-plugin-decorators/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-decorators/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-decorators/.npmignore b/packages/babel-plugin-decorators/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-decorators/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-decorators/README.md b/packages/babel-plugin-decorators/README.md new file mode 100644 index 0000000000..c06fd0b75b --- /dev/null +++ b/packages/babel-plugin-decorators/README.md @@ -0,0 +1,35 @@ +# babel-plugin-decorators + +Compile class and object decorators to ES5 + +## Installation + +```sh +$ npm install babel-plugin-decorators +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["decorators"] +} +``` + +### Via CLI + +```sh +$ babel --plugins decorators script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["decorators"] +}); +``` diff --git a/packages/babel-plugin-decorators/package.json b/packages/babel-plugin-decorators/package.json new file mode 100644 index 0000000000..fbf71128a6 --- /dev/null +++ b/packages/babel-plugin-decorators/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-decorators", + "version": "1.0.0", + "description": "Compile class and object decorators to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-decorators/src/index.js b/packages/babel-plugin-decorators/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-decorators/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-do-expressions/.gitignore b/packages/babel-plugin-do-expressions/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-do-expressions/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-do-expressions/.npmignore b/packages/babel-plugin-do-expressions/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-do-expressions/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-do-expressions/README.md b/packages/babel-plugin-do-expressions/README.md new file mode 100644 index 0000000000..62dd32cf8b --- /dev/null +++ b/packages/babel-plugin-do-expressions/README.md @@ -0,0 +1,35 @@ +# babel-plugin-do-expressions + +Compile do expressions to ES5 + +## Installation + +```sh +$ npm install babel-plugin-do-expressions +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["do-expressions"] +} +``` + +### Via CLI + +```sh +$ babel --plugins do-expressions script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["do-expressions"] +}); +``` diff --git a/packages/babel-plugin-do-expressions/package.json b/packages/babel-plugin-do-expressions/package.json new file mode 100644 index 0000000000..8572ad3331 --- /dev/null +++ b/packages/babel-plugin-do-expressions/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-do-expressions", + "version": "1.0.0", + "description": "Compile do expressions to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-do-expressions/src/index.js b/packages/babel-plugin-do-expressions/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-do-expressions/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-arrow-functions/.gitignore b/packages/babel-plugin-es2015-arrow-functions/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-arrow-functions/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-arrow-functions/.npmignore b/packages/babel-plugin-es2015-arrow-functions/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-arrow-functions/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-arrow-functions/README.md b/packages/babel-plugin-es2015-arrow-functions/README.md new file mode 100644 index 0000000000..8acd5de1b1 --- /dev/null +++ b/packages/babel-plugin-es2015-arrow-functions/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-arrow-functions + +Compile ES2015 arrow functions to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-arrow-functions +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-arrow-functions"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-arrow-functions script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-arrow-functions"] +}); +``` diff --git a/packages/babel-plugin-es2015-arrow-functions/package.json b/packages/babel-plugin-es2015-arrow-functions/package.json new file mode 100644 index 0000000000..9fe2dfcc8a --- /dev/null +++ b/packages/babel-plugin-es2015-arrow-functions/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-arrow-functions", + "version": "1.0.0", + "description": "Compile ES2015 arrow functions to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-arrow-functions/src/index.js b/packages/babel-plugin-es2015-arrow-functions/src/index.js new file mode 100644 index 0000000000..369977afe9 --- /dev/null +++ b/packages/babel-plugin-es2015-arrow-functions/src/index.js @@ -0,0 +1,12 @@ +export default function ({ types: t }) { + return { + visitor: { + ArrowFunctionExpression(node) { + this.ensureBlock(); + node.expression = false; + node.type = "FunctionExpression"; + node.shadow = node.shadow || true; + } + } + }; +} diff --git a/packages/babel-plugin-es2015-block-scoped-functions/.npmignore b/packages/babel-plugin-es2015-block-scoped-functions/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoped-functions/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-block-scoped-functions/README.md b/packages/babel-plugin-es2015-block-scoped-functions/README.md new file mode 100644 index 0000000000..494c432297 --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoped-functions/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-block-scoped-functions + +Babel plugin to ensure function declarations at the block level are block scoped. + +## Installation + +```sh +$ npm install babel-plugin-es2015-block-scoped-functions +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-block-scoped-functions"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-block-scoped-functions script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-block-scoped-functions"] +}); +``` diff --git a/packages/babel-plugin-es2015-block-scoped-functions/package.json b/packages/babel-plugin-es2015-block-scoped-functions/package.json new file mode 100644 index 0000000000..8f6bd76583 --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoped-functions/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-block-scoped-functions", + "version": "1.0.4", + "description": "Babel plugin to ensure function declarations at the block level are block scoped", + "repository": "babel/babelbabel-plugin-jscript", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-block-scoped-functions/src/index.js b/packages/babel-plugin-es2015-block-scoped-functions/src/index.js new file mode 100644 index 0000000000..a9b862b2e2 --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoped-functions/src/index.js @@ -0,0 +1,40 @@ +export default function ({ Plugin, types: t }) { + function statementList(key, path) { + var paths = path.get(key); + + for (var i = 0; i < paths.length; i++) { + let path = paths[i]; + + var func = path.node; + if (!t.isFunctionDeclaration(func)) continue; + + var declar = t.variableDeclaration("let", [ + t.variableDeclarator(func.id, t.toExpression(func)) + ]); + + // hoist it up above everything else + declar._blockHoist = 2; + + // todo: name this + func.id = null; + + path.replaceWith(declar); + } + } + + return { + visitor: { + BlockStatement(node, parent) { + if ((t.isFunction(parent) && parent.body === node) || t.isExportDeclaration(parent)) { + return; + } + + statementList("body", this); + }, + + SwitchCase() { + statementList("consequent", this); + } + } + }; +} diff --git a/packages/babel-plugin-es2015-block-scoping/.gitignore b/packages/babel-plugin-es2015-block-scoping/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoping/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-block-scoping/.npmignore b/packages/babel-plugin-es2015-block-scoping/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoping/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-block-scoping/README.md b/packages/babel-plugin-es2015-block-scoping/README.md new file mode 100644 index 0000000000..b93242e191 --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoping/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-block-scoping + +Compile ES2015 block scoping (const and let) to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-block-scoping +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-block-scoping"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-block-scoping script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-block-scoping"] +}); +``` diff --git a/packages/babel-plugin-es2015-block-scoping/package.json b/packages/babel-plugin-es2015-block-scoping/package.json new file mode 100644 index 0000000000..1d52749a03 --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoping/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-block-scoping", + "version": "1.0.0", + "description": "Compile ES2015 block scoping (const and let) to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-block-scoping/src/index.js b/packages/babel-plugin-es2015-block-scoping/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-block-scoping/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-classes/.gitignore b/packages/babel-plugin-es2015-classes/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-classes/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-classes/.npmignore b/packages/babel-plugin-es2015-classes/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-classes/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-classes/README.md b/packages/babel-plugin-es2015-classes/README.md new file mode 100644 index 0000000000..57b98364cf --- /dev/null +++ b/packages/babel-plugin-es2015-classes/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-classes + +Compile ES2015 classes to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-classes +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-classes"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-classes script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-classes"] +}); +``` diff --git a/packages/babel-plugin-es2015-classes/package.json b/packages/babel-plugin-es2015-classes/package.json new file mode 100644 index 0000000000..cf2e8e3b0a --- /dev/null +++ b/packages/babel-plugin-es2015-classes/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-classes", + "version": "1.0.0", + "description": "Compile ES2015 classes to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-classes/src/index.js b/packages/babel-plugin-es2015-classes/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-classes/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-computed-properties/.gitignore b/packages/babel-plugin-es2015-computed-properties/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-computed-properties/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-computed-properties/.npmignore b/packages/babel-plugin-es2015-computed-properties/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-computed-properties/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-computed-properties/README.md b/packages/babel-plugin-es2015-computed-properties/README.md new file mode 100644 index 0000000000..a26309d67e --- /dev/null +++ b/packages/babel-plugin-es2015-computed-properties/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-computed-properties + +Compile ES2015 computed properties to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-computed-properties +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-computed-properties"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-computed-properties script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-computed-properties"] +}); +``` diff --git a/packages/babel-plugin-es2015-computed-properties/package.json b/packages/babel-plugin-es2015-computed-properties/package.json new file mode 100644 index 0000000000..0732a5f5b4 --- /dev/null +++ b/packages/babel-plugin-es2015-computed-properties/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-computed-properties", + "version": "1.0.0", + "description": "Compile ES2015 computed properties to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-computed-properties/src/index.js b/packages/babel-plugin-es2015-computed-properties/src/index.js new file mode 100644 index 0000000000..52e34fae11 --- /dev/null +++ b/packages/babel-plugin-es2015-computed-properties/src/index.js @@ -0,0 +1,108 @@ +export default function ({ types: t }) { + function loose(node, body, objId) { + for (var prop of (node.properties: Array)) { + body.push(t.expressionStatement( + t.assignmentExpression( + "=", + t.memberExpression(objId, prop.key, prop.computed || t.isLiteral(prop.key)), + prop.value + ) + )); + } + } + + function spec(node, body, objId, initProps, file) { + // add a simple assignment for all Symbol member expressions due to symbol polyfill limitations + // otherwise use Object.defineProperty + + for (let prop of (node.properties: Array)) { + // this wont work with Object.defineProperty + if (t.isLiteral(t.toComputedKey(prop), { value: "__proto__" })) { + initProps.push(prop); + continue; + } + + let key = prop.key; + if (t.isIdentifier(key) && !prop.computed) { + key = t.stringLiteral(key.name); + } + + var bodyNode = t.callExpression(file.addHelper("define-property"), [objId, key, prop.value]); + + body.push(t.expressionStatement(bodyNode)); + } + + // only one node and it's a Object.defineProperty that returns the object + + if (body.length === 1) { + var first = body[0].expression; + + if (t.isCallExpression(first)) { + first.arguments[0] = t.objectExpression(initProps); + return first; + } + } + } + + return { + visitor: { + ObjectExpression: { + exit(node, parent, scope, file) { + var hasComputed = false; + + for (let prop of (node.properties: Array)) { + hasComputed = t.isProperty(prop, { computed: true, kind: "init" }); + if (hasComputed) break; + } + + if (!hasComputed) return; + + // put all getters/setters into the first object expression as well as all initialisers up + // to the first computed property + + var initProps = []; + var stopInits = false; + + node.properties = node.properties.filter(function (prop) { + if (prop.computed) { + stopInits = true; + } + + if (prop.kind !== "init" || !stopInits) { + initProps.push(prop); + return false; + } else { + return true; + } + }); + + // + + var objId = scope.generateUidIdentifierBasedOnNode(parent); + + // + + var body = []; + + // + + 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.expressionStatement(objId)); + + return body; + } + } + } + }; +} diff --git a/packages/babel-plugin-es2015-constants/.gitignore b/packages/babel-plugin-es2015-constants/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-constants/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-constants/.npmignore b/packages/babel-plugin-es2015-constants/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-constants/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-constants/README.md b/packages/babel-plugin-es2015-constants/README.md new file mode 100644 index 0000000000..d4b4666807 --- /dev/null +++ b/packages/babel-plugin-es2015-constants/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-constants + +Compile ES2015 constants to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-constants +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-constants"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-constants script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-constants"] +}); +``` diff --git a/packages/babel-plugin-es2015-constants/package.json b/packages/babel-plugin-es2015-constants/package.json new file mode 100644 index 0000000000..d27fbd4410 --- /dev/null +++ b/packages/babel-plugin-es2015-constants/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-constants", + "version": "1.0.0", + "description": "Compile ES2015 constants to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-constants/src/index.js b/packages/babel-plugin-es2015-constants/src/index.js new file mode 100644 index 0000000000..0a6b65c15c --- /dev/null +++ b/packages/babel-plugin-es2015-constants/src/index.js @@ -0,0 +1,22 @@ +export default function ({ messages }) { + return { + visitor: { + Scope(node, parent, scope) { + for (var name in scope.bindings) { + var binding = scope.bindings[name]; + + // not a constant + if (binding.kind !== "const" && binding.kind !== "module") continue; + + for (var violation of (binding.constantViolations: Array)) { + throw violation.errorWithNode(messages.get("readOnly", name)); + } + } + }, + + VariableDeclaration(node) { + if (node.kind === "const") node.kind = "let"; + } + } + }; +} diff --git a/packages/babel-plugin-es2015-destructuring/.npmignore b/packages/babel-plugin-es2015-destructuring/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-destructuring/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-destructuring/README.md b/packages/babel-plugin-es2015-destructuring/README.md new file mode 100644 index 0000000000..4813d210af --- /dev/null +++ b/packages/babel-plugin-es2015-destructuring/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-destructuring + +Compile ES2015 destructuring to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-destructuring +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-destructuring"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-destructuring script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-destructuring"] +}); +``` diff --git a/packages/babel-plugin-es2015-destructuring/package.json b/packages/babel-plugin-es2015-destructuring/package.json new file mode 100644 index 0000000000..a1be68e609 --- /dev/null +++ b/packages/babel-plugin-es2015-destructuring/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-destructuring", + "version": "1.0.0", + "description": "Compile ES2015 destructuring to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-destructuring/src/index.js b/packages/babel-plugin-es2015-destructuring/src/index.js new file mode 100644 index 0000000000..bcdb2113af --- /dev/null +++ b/packages/babel-plugin-es2015-destructuring/src/index.js @@ -0,0 +1,535 @@ +export default function ({ types: t, messages }) { + + /** + * Test if a VariableDeclaration's declarations contains any Patterns. + */ + + function variableDeclarationHasPattern(node) { + for (var i = 0; i < node.declarations.length; i++) { + if (t.isPattern(node.declarations[i].id)) { + return true; + } + } + return false; + } + + /** + * Test if an ArrayPattern's elements contain any RestElements. + */ + + function hasRest(pattern) { + for (var i = 0; i < pattern.elements.length; i++) { + if (t.isRestElement(pattern.elements[i])) { + return true; + } + } + return false; + } + + var arrayUnpackVisitor = { + ReferencedIdentifier(node, parent, scope, state) { + if (state.bindings[node.name]) { + state.deopt = true; + this.stop(); + } + } + }; + + class DestructuringTransformer { + constructor(opts) { + this.blockHoist = opts.blockHoist; + this.operator = opts.operator; + this.arrays = {}; + this.nodes = opts.nodes || []; + this.scope = opts.scope; + this.file = opts.file; + this.kind = opts.kind; + } + + buildVariableAssignment(id, init) { + var op = this.operator; + if (t.isMemberExpression(id)) op = "="; + + var node; + + if (op) { + node = t.expressionStatement(t.assignmentExpression(op, id, init)); + } else { + node = t.variableDeclaration(this.kind, [ + t.variableDeclarator(id, init) + ]); + } + + node._blockHoist = this.blockHoist; + + return node; + } + + buildVariableDeclaration(id, init) { + var declar = t.variableDeclaration("var", [ + t.variableDeclarator(id, init) + ]); + declar._blockHoist = this.blockHoist; + return declar; + } + + push(id, init) { + if (t.isObjectPattern(id)) { + this.pushObjectPattern(id, init); + } else if (t.isArrayPattern(id)) { + this.pushArrayPattern(id, init); + } else if (t.isAssignmentPattern(id)) { + this.pushAssignmentPattern(id, init); + } else { + this.nodes.push(this.buildVariableAssignment(id, init)); + } + } + + toArray(node, count) { + if (this.file.isLoose("es6.destructuring") || (t.isIdentifier(node) && this.arrays[node.name])) { + return node; + } else { + return this.scope.toArray(node, count); + } + } + + pushAssignmentPattern(pattern, valueRef) { + // we need to assign the current value of the assignment to avoid evaluating + // it more than once + + var tempValueRef = this.scope.generateUidIdentifierBasedOnNode(valueRef); + + var declar = t.variableDeclaration("var", [ + t.variableDeclarator(tempValueRef, valueRef) + ]); + declar._blockHoist = this.blockHoist; + this.nodes.push(declar); + + // + + var tempConditional = t.conditionalExpression( + t.binaryExpression("===", tempValueRef, t.identifier("undefined")), + pattern.right, + tempValueRef + ); + + var left = pattern.left; + if (t.isPattern(left)) { + var tempValueDefault = t.expressionStatement( + t.assignmentExpression("=", tempValueRef, tempConditional) + ); + tempValueDefault._blockHoist = this.blockHoist; + + this.nodes.push(tempValueDefault); + this.push(left, tempValueRef); + } else { + this.nodes.push(this.buildVariableAssignment(left, tempConditional)); + } + } + + pushObjectSpread(pattern, objRef, spreadProp, spreadPropIndex) { + // get all the keys that appear in this object before the current spread + + var keys = []; + + for (var i = 0; i < pattern.properties.length; i++) { + var prop = pattern.properties[i]; + + // we've exceeded the index of the spread property to all properties to the + // right need to be ignored + if (i >= spreadPropIndex) break; + + // ignore other spread properties + if (t.isSpreadProperty(prop)) continue; + + var key = prop.key; + if (t.isIdentifier(key) && !prop.computed) key = t.stringLiteral(prop.key.name); + keys.push(key); + } + + keys = t.arrayExpression(keys); + + // + + var value = t.callExpression(this.file.addHelper("object-without-properties"), [objRef, keys]); + this.nodes.push(this.buildVariableAssignment(spreadProp.argument, value)); + } + + pushObjectProperty(prop, propRef) { + if (t.isLiteral(prop.key)) prop.computed = true; + + var pattern = prop.value; + var objRef = t.memberExpression(propRef, prop.key, prop.computed); + + if (t.isPattern(pattern)) { + this.push(pattern, objRef); + } else { + this.nodes.push(this.buildVariableAssignment(pattern, objRef)); + } + } + + pushObjectPattern(pattern, objRef) { + // https://github.com/babel/babel/issues/681 + + if (!pattern.properties.length) { + this.nodes.push(t.expressionStatement( + t.callExpression(this.file.addHelper("object-destructuring-empty"), [objRef]) + )); + } + + // if we have more than one properties in this pattern and the objectRef is a + // member expression then we need to assign it to a temporary variable so it's + // only evaluated once + + if (pattern.properties.length > 1 && !this.scope.isStatic(objRef)) { + var temp = this.scope.generateUidIdentifierBasedOnNode(objRef); + this.nodes.push(this.buildVariableDeclaration(temp, objRef)); + objRef = temp; + } + + // + + for (var i = 0; i < pattern.properties.length; i++) { + var prop = pattern.properties[i]; + if (t.isSpreadProperty(prop)) { + this.pushObjectSpread(pattern, objRef, prop, i); + } else { + this.pushObjectProperty(prop, objRef); + } + } + } + + canUnpackArrayPattern(pattern, arr) { + // not an array so there's no way we can deal with this + if (!t.isArrayExpression(arr)) return false; + + // pattern has less elements than the array and doesn't have a rest so some + // elements wont be evaluated + if (pattern.elements.length > arr.elements.length) return; + if (pattern.elements.length < arr.elements.length && !hasRest(pattern)) return false; + + for (let elem of (pattern.elements: Array)) { + // deopt on holes + if (!elem) return false; + + // deopt on member expressions as they may be included in the RHS + if (t.isMemberExpression(elem)) return false; + } + + for (let elem of (arr.elements: Array)) { + // deopt on spread elements + if (t.isSpreadElement(elem)) return false; + } + + // deopt on reference to left side identifiers + var bindings = t.getBindingIdentifiers(pattern); + var state = { deopt: false, bindings }; + this.scope.traverse(arr, arrayUnpackVisitor, state); + return !state.deopt; + } + + pushUnpackedArrayPattern(pattern, arr) { + for (var i = 0; i < pattern.elements.length; i++) { + var elem = pattern.elements[i]; + if (t.isRestElement(elem)) { + this.push(elem.argument, t.arrayExpression(arr.elements.slice(i))); + } else { + this.push(elem, arr.elements[i]); + } + } + } + + pushArrayPattern(pattern, arrayRef) { + if (!pattern.elements) return; + + // optimise basic array destructuring of an array expression + // + // we can't do this to a pattern of unequal size to it's right hand + // array expression as then there will be values that wont be evaluated + // + // eg: var [a, b] = [1, 2]; + + if (this.canUnpackArrayPattern(pattern, arrayRef)) { + return this.pushUnpackedArrayPattern(pattern, arrayRef); + } + + // if we have a rest then we need all the elements so don't tell + // `scope.toArray` to only get a certain amount + + var count = !hasRest(pattern) && pattern.elements.length; + + // so we need to ensure that the `arrayRef` is an array, `scope.toArray` will + // return a locally bound identifier if it's been inferred to be an array, + // otherwise it'll be a call to a helper that will ensure it's one + + var toArray = this.toArray(arrayRef, count); + + if (t.isIdentifier(toArray)) { + // we've been given an identifier so it must have been inferred to be an + // array + arrayRef = toArray; + } else { + arrayRef = this.scope.generateUidIdentifierBasedOnNode(arrayRef); + this.arrays[arrayRef.name] = true; + this.nodes.push(this.buildVariableDeclaration(arrayRef, toArray)); + } + + // + + for (var i = 0; i < pattern.elements.length; i++) { + var elem = pattern.elements[i]; + + // hole + if (!elem) continue; + + var elemRef; + + if (t.isRestElement(elem)) { + elemRef = this.toArray(arrayRef); + + if (i > 0) { + elemRef = t.callExpression(t.memberExpression(elemRef, t.identifier("slice")), [t.numberLiteral(i)]); + } + + // set the element to the rest element argument since we've dealt with it + // being a rest already + elem = elem.argument; + } else { + elemRef = t.memberExpression(arrayRef, t.numberLiteral(i), true); + } + + this.push(elem, elemRef); + } + } + + init(pattern, ref) { + // trying to destructure a value that we can't evaluate more than once so we + // need to save it to a variable + + if (!t.isArrayExpression(ref) && !t.isMemberExpression(ref)) { + var memo = this.scope.maybeGenerateMemoised(ref, true); + if (memo) { + this.nodes.push(this.buildVariableDeclaration(memo, ref)); + ref = memo; + } + } + + // + + this.push(pattern, ref); + + return this.nodes; + } + } + + + return { + metadata: { + group: "builtin-advanced" + }, + + visitor: { + ForXStatement(node, parent, scope, file) { + var left = node.left; + + if (t.isPattern(left)) { + // for ({ length: k } in { abc: 3 }); + + var temp = scope.generateUidIdentifier("ref"); + + node.left = t.variableDeclaration("var", [ + t.variableDeclarator(temp) + ]); + + this.ensureBlock(); + + node.body.body.unshift(t.variableDeclaration("var", [ + t.variableDeclarator(left, temp) + ])); + + return; + } + + if (!t.isVariableDeclaration(left)) return; + + var pattern = left.declarations[0].id; + if (!t.isPattern(pattern)) return; + + var key = scope.generateUidIdentifier("ref"); + node.left = t.variableDeclaration(left.kind, [ + t.variableDeclarator(key, null) + ]); + + var nodes = []; + + var destructuring = new DestructuringTransformer({ + kind: left.kind, + file: file, + scope: scope, + nodes: nodes + }); + + destructuring.init(pattern, key); + + this.ensureBlock(); + + var block = node.body; + block.body = nodes.concat(block.body); + }, + + Function(node, parent, scope, file) { + var hasDestructuring = false; + for (let pattern of (node.params: Array)) { + if (t.isPattern(pattern)) { + hasDestructuring = true; + break; + } + } + if (!hasDestructuring) return; + + var nodes = []; + + for (var i = 0; i < node.params.length; i++) { + let pattern = node.params[i]; + if (!t.isPattern(pattern)) continue; + + var ref = scope.generateUidIdentifier("ref"); + if (t.isAssignmentPattern(pattern)) { + var _pattern = pattern; + pattern = pattern.left; + _pattern.left = ref; + } else { + node.params[i] = ref; + } + + t.inherits(ref, pattern); + + var destructuring = new DestructuringTransformer({ + blockHoist: node.params.length - i + 1, + nodes: nodes, + scope: scope, + file: file, + kind: "let" + }); + + destructuring.init(pattern, ref); + } + + this.ensureBlock(); + + var block = node.body; + block.body = nodes.concat(block.body); + }, + + CatchClause(node, parent, scope, file) { + var pattern = node.param; + if (!t.isPattern(pattern)) return; + + var ref = scope.generateUidIdentifier("ref"); + node.param = ref; + + var nodes = []; + + var destructuring = new DestructuringTransformer({ + kind: "let", + file: file, + scope: scope, + nodes: nodes + }); + destructuring.init(pattern, ref); + + node.body.body = nodes.concat(node.body.body); + }, + + AssignmentExpression(node, parent, scope, file) { + if (!t.isPattern(node.left)) return; + + var nodes = []; + + var destructuring = new DestructuringTransformer({ + operator: node.operator, + file: file, + scope: scope, + nodes: nodes + }); + + var ref; + if (this.isCompletionRecord() || !this.parentPath.isExpressionStatement()) { + ref = scope.generateUidIdentifierBasedOnNode(node.right, "ref"); + + nodes.push(t.variableDeclaration("var", [ + t.variableDeclarator(ref, node.right) + ])); + + if (t.isArrayExpression(node.right)) { + destructuring.arrays[ref.name] = true; + } + } + + destructuring.init(node.left, ref || node.right); + + if (ref) { + nodes.push(t.expressionStatement(ref)); + } + + return nodes; + }, + + VariableDeclaration(node, parent, scope, file) { + if (t.isForXStatement(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 destructuring = new DestructuringTransformer({ + nodes: nodes, + scope: scope, + kind: node.kind, + file: file + }); + + if (t.isPattern(pattern)) { + destructuring.init(pattern, patternId); + + if (+i !== node.declarations.length - 1) { + // we aren't the last declarator so let's just make the + // last transformed node inherit from us + t.inherits(nodes[nodes.length - 1], declar); + } + } else { + nodes.push(t.inherits(destructuring.buildVariableAssignment(declar.id, declar.init), declar)); + } + } + + if (!t.isProgram(parent) && !t.isBlockStatement(parent)) { + // https://github.com/babel/babel/issues/113 + // for (let [x] = [0]; false;) {} + + declar = null; + + for (i = 0; i < nodes.length; i++) { + node = nodes[i]; + declar = declar || t.variableDeclaration(node.kind, []); + + if (!t.isVariableDeclaration(node) && declar.kind !== node.kind) { + throw file.errorWithNode(node, messages.get("invalidParentForThisNode")); + } + + declar.declarations = declar.declarations.concat(node.declarations); + } + + return declar; + } + + return nodes; + } + } + }; +} diff --git a/packages/babel-plugin-es2015-for-of/.gitignore b/packages/babel-plugin-es2015-for-of/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-for-of/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-for-of/.npmignore b/packages/babel-plugin-es2015-for-of/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-for-of/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-for-of/README.md b/packages/babel-plugin-es2015-for-of/README.md new file mode 100644 index 0000000000..8fbbc0fbce --- /dev/null +++ b/packages/babel-plugin-es2015-for-of/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-for-of + +Compile ES2015 for...of to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-for-of +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-for-of"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-for-of script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-for-of"] +}); +``` diff --git a/packages/babel-plugin-es2015-for-of/package.json b/packages/babel-plugin-es2015-for-of/package.json new file mode 100644 index 0000000000..d668bd5617 --- /dev/null +++ b/packages/babel-plugin-es2015-for-of/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-for-of", + "version": "1.0.0", + "description": "Compile ES2015 for...of to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-for-of/src/index.js b/packages/babel-plugin-es2015-for-of/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-for-of/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-function-name/.gitignore b/packages/babel-plugin-es2015-function-name/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-function-name/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-function-name/.npmignore b/packages/babel-plugin-es2015-function-name/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-function-name/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-function-name/README.md b/packages/babel-plugin-es2015-function-name/README.md new file mode 100644 index 0000000000..83d7843ade --- /dev/null +++ b/packages/babel-plugin-es2015-function-name/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-function-name + +Apply ES2015 function.name semantics to all functions + +## Installation + +```sh +$ npm install babel-plugin-es2015-function-name +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-function-name"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-function-name script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-function-name"] +}); +``` diff --git a/packages/babel-plugin-es2015-function-name/package.json b/packages/babel-plugin-es2015-function-name/package.json new file mode 100644 index 0000000000..81137d3fca --- /dev/null +++ b/packages/babel-plugin-es2015-function-name/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-function-name", + "version": "1.0.0", + "description": "Apply ES2015 function.name semantics to all functions", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-function-name/src/index.js b/packages/babel-plugin-es2015-function-name/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-function-name/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-literals/.gitignore b/packages/babel-plugin-es2015-literals/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-literals/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-literals/.npmignore b/packages/babel-plugin-es2015-literals/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-literals/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-literals/README.md b/packages/babel-plugin-es2015-literals/README.md new file mode 100644 index 0000000000..3023552546 --- /dev/null +++ b/packages/babel-plugin-es2015-literals/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-literals + +Compile ES2015 unicode string and number literals to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-literals +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-literals"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-literals script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-literals"] +}); +``` diff --git a/packages/babel-plugin-es2015-literals/package.json b/packages/babel-plugin-es2015-literals/package.json new file mode 100644 index 0000000000..9bfc8c64e8 --- /dev/null +++ b/packages/babel-plugin-es2015-literals/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-literals", + "version": "1.0.0", + "description": "Compile ES2015 unicode string and number literals to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-literals/src/index.js b/packages/babel-plugin-es2015-literals/src/index.js new file mode 100644 index 0000000000..c848756657 --- /dev/null +++ b/packages/babel-plugin-es2015-literals/src/index.js @@ -0,0 +1,23 @@ +export default function () { + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + NumberLiteral(node) { + // number octal like 0b10 or 0o70 + if (/^0[ob]/i.test(node.raw)) { + node.raw = undefined; + } + }, + + StringLiteral(node) { + // unicode escape + if (/\\[u]/gi.test(node.raw)) { + node.raw = undefined; + } + } + } + }; +} diff --git a/packages/babel-plugin-es2015-object-super/.gitignore b/packages/babel-plugin-es2015-object-super/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-object-super/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-object-super/.npmignore b/packages/babel-plugin-es2015-object-super/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-object-super/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-object-super/README.md b/packages/babel-plugin-es2015-object-super/README.md new file mode 100644 index 0000000000..6e351e407e --- /dev/null +++ b/packages/babel-plugin-es2015-object-super/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-object-super + +Compile ES2015 object super to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-object-super +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-object-super"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-object-super script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-object-super"] +}); +``` diff --git a/packages/babel-plugin-es2015-object-super/package.json b/packages/babel-plugin-es2015-object-super/package.json new file mode 100644 index 0000000000..f035e06c25 --- /dev/null +++ b/packages/babel-plugin-es2015-object-super/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-object-super", + "version": "1.0.0", + "description": "Compile ES2015 object super to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-object-super/src/index.js b/packages/babel-plugin-es2015-object-super/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-object-super/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-parameters/.gitignore b/packages/babel-plugin-es2015-parameters/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-parameters/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-parameters/.npmignore b/packages/babel-plugin-es2015-parameters/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-parameters/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-parameters/README.md b/packages/babel-plugin-es2015-parameters/README.md new file mode 100644 index 0000000000..3e397f46eb --- /dev/null +++ b/packages/babel-plugin-es2015-parameters/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-parameters + +Compile ES2015 default and rest parameters to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-parameters +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-parameters"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-parameters script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-parameters"] +}); +``` diff --git a/packages/babel-plugin-es2015-parameters/package.json b/packages/babel-plugin-es2015-parameters/package.json new file mode 100644 index 0000000000..fa7eb2b45b --- /dev/null +++ b/packages/babel-plugin-es2015-parameters/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-parameters", + "version": "1.0.0", + "description": "Compile ES2015 default and rest parameters to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-parameters/src/index.js b/packages/babel-plugin-es2015-parameters/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-parameters/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-shorthand-properties/.gitignore b/packages/babel-plugin-es2015-shorthand-properties/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-shorthand-properties/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-shorthand-properties/.npmignore b/packages/babel-plugin-es2015-shorthand-properties/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-shorthand-properties/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-shorthand-properties/README.md b/packages/babel-plugin-es2015-shorthand-properties/README.md new file mode 100644 index 0000000000..6712c94a83 --- /dev/null +++ b/packages/babel-plugin-es2015-shorthand-properties/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-shorthand-properties + +Compile ES2015 shorthand properties to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-shorthand-properties +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-shorthand-properties"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-shorthand-properties script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-shorthand-properties"] +}); +``` diff --git a/packages/babel-plugin-es2015-shorthand-properties/package.json b/packages/babel-plugin-es2015-shorthand-properties/package.json new file mode 100644 index 0000000000..eea932732c --- /dev/null +++ b/packages/babel-plugin-es2015-shorthand-properties/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-shorthand-properties", + "version": "1.0.0", + "description": "Compile ES2015 shorthand properties to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-shorthand-properties/src/index.js b/packages/babel-plugin-es2015-shorthand-properties/src/index.js new file mode 100644 index 0000000000..d5b50326de --- /dev/null +++ b/packages/babel-plugin-es2015-shorthand-properties/src/index.js @@ -0,0 +1,15 @@ +export default function ({ types: t }) { + return { + visitor: { + Property(node) { + if (node.method) { + node.method = false; + } + + if (node.shorthand) { + node.shorthand = false; + } + } + } + }; +} diff --git a/packages/babel-plugin-es2015-spread/.gitignore b/packages/babel-plugin-es2015-spread/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-spread/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-spread/.npmignore b/packages/babel-plugin-es2015-spread/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-spread/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-spread/README.md b/packages/babel-plugin-es2015-spread/README.md new file mode 100644 index 0000000000..0f27269443 --- /dev/null +++ b/packages/babel-plugin-es2015-spread/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-spread + +Compile ES2015 spread to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-spread +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-spread"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-spread script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-spread"] +}); +``` diff --git a/packages/babel-plugin-es2015-spread/package.json b/packages/babel-plugin-es2015-spread/package.json new file mode 100644 index 0000000000..e405f07f7e --- /dev/null +++ b/packages/babel-plugin-es2015-spread/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-spread", + "version": "1.0.0", + "description": "Compile ES2015 spread to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-spread/src/index.js b/packages/babel-plugin-es2015-spread/src/index.js new file mode 100644 index 0000000000..eb3e26463e --- /dev/null +++ b/packages/babel-plugin-es2015-spread/src/index.js @@ -0,0 +1,126 @@ +export default function ({ types: t }) { + function getSpreadLiteral(spread, scope) { + if (scope.hub.file.isLoose("es6.spread") && !t.isIdentifier(spread.argument, { name: "arguments" })) { + return spread.argument; + } else { + return scope.toArray(spread.argument, true); + } + } + + function hasSpread(nodes) { + for (var i = 0; i < nodes.length; i++) { + if (t.isSpreadElement(nodes[i])) { + return true; + } + } + return false; + } + + function build(props, scope) { + var nodes = []; + + var _props = []; + + var push = function () { + if (!_props.length) return; + nodes.push(t.arrayExpression(_props)); + _props = []; + }; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (t.isSpreadElement(prop)) { + push(); + nodes.push(getSpreadLiteral(prop, scope)); + } else { + _props.push(prop); + } + } + + push(); + + return nodes; + } + + return { + metadata: { + group: "builtin-advanced" + }, + + visitor: { + ArrayExpression(node, parent, scope) { + var elements = node.elements; + if (!hasSpread(elements)) return; + + var nodes = build(elements, scope); + var first = nodes.shift(); + + if (!t.isArrayExpression(first)) { + nodes.unshift(first); + first = t.arrayExpression([]); + } + + return t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes); + }, + + CallExpression(node, parent, scope) { + var args = node.arguments; + if (!hasSpread(args)) return; + + var contextLiteral = t.identifier("undefined"); + + node.arguments = []; + + var nodes; + if (args.length === 1 && args[0].argument.name === "arguments") { + nodes = [args[0].argument]; + } else { + nodes = build(args, scope); + } + + var first = nodes.shift(); + if (nodes.length) { + node.arguments.push(t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes)); + } else { + node.arguments.push(first); + } + + var callee = node.callee; + + if (this.get("callee").isMemberExpression()) { + var temp = scope.maybeGenerateMemoised(callee.object); + if (temp) { + callee.object = t.assignmentExpression("=", temp, callee.object); + contextLiteral = temp; + } else { + contextLiteral = callee.object; + } + t.appendToMemberExpression(callee, t.identifier("apply")); + } else { + node.callee = t.memberExpression(node.callee, t.identifier("apply")); + } + + node.arguments.unshift(contextLiteral); + }, + + NewExpression(node, parent, scope, file) { + var args = node.arguments; + if (!hasSpread(args)) return; + + var nodes = build(args, scope); + + var context = t.arrayExpression([t.nullLiteral()]); + + args = t.callExpression(t.memberExpression(context, t.identifier("concat")), nodes); + + return t.newExpression( + t.callExpression( + t.memberExpression(file.addHelper("bind"), t.identifier("apply")), + [node.callee, args] + ), + [] + ); + } + } + }; +} diff --git a/packages/babel-plugin-es2015-sticky-regex/.gitignore b/packages/babel-plugin-es2015-sticky-regex/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-sticky-regex/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-sticky-regex/.npmignore b/packages/babel-plugin-es2015-sticky-regex/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-sticky-regex/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-sticky-regex/README.md b/packages/babel-plugin-es2015-sticky-regex/README.md new file mode 100644 index 0000000000..e06bef84f6 --- /dev/null +++ b/packages/babel-plugin-es2015-sticky-regex/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-sticky-regex + +Compile ES2015 sticky regex to an ES5 RegExp constructor + +## Installation + +```sh +$ npm install babel-plugin-es2015-sticky-regex +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-sticky-regex"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-sticky-regex script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-sticky-regex"] +}); +``` diff --git a/packages/babel-plugin-es2015-sticky-regex/package.json b/packages/babel-plugin-es2015-sticky-regex/package.json new file mode 100644 index 0000000000..462fb00a2a --- /dev/null +++ b/packages/babel-plugin-es2015-sticky-regex/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-sticky-regex", + "version": "1.0.0", + "description": "Compile ES2015 sticky regex to an ES5 RegExp constructor", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-sticky-regex/src/index.js b/packages/babel-plugin-es2015-sticky-regex/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-sticky-regex/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-tail-call/.gitignore b/packages/babel-plugin-es2015-tail-call/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-tail-call/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-tail-call/.npmignore b/packages/babel-plugin-es2015-tail-call/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-tail-call/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-tail-call/README.md b/packages/babel-plugin-es2015-tail-call/README.md new file mode 100644 index 0000000000..fa13bff71e --- /dev/null +++ b/packages/babel-plugin-es2015-tail-call/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-tail-call + +Compile ES2015 tail call to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-tail-call +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-tail-call"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-tail-call script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-tail-call"] +}); +``` diff --git a/packages/babel-plugin-es2015-tail-call/package.json b/packages/babel-plugin-es2015-tail-call/package.json new file mode 100644 index 0000000000..9e5d9acba9 --- /dev/null +++ b/packages/babel-plugin-es2015-tail-call/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-tail-call", + "version": "1.0.0", + "description": "Compile ES2015 tail call to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-tail-call/src/index.js b/packages/babel-plugin-es2015-tail-call/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-tail-call/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es2015-template-literals/.gitignore b/packages/babel-plugin-es2015-template-literals/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-template-literals/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-template-literals/.npmignore b/packages/babel-plugin-es2015-template-literals/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-template-literals/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-template-literals/README.md b/packages/babel-plugin-es2015-template-literals/README.md new file mode 100644 index 0000000000..f8d5f93194 --- /dev/null +++ b/packages/babel-plugin-es2015-template-literals/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-template-literals + +Compile ES2015 template literals to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-template-literals +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-template-literals"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-template-literals script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-template-literals"] +}); +``` diff --git a/packages/babel-plugin-es2015-template-literals/package.json b/packages/babel-plugin-es2015-template-literals/package.json new file mode 100644 index 0000000000..a79bd53657 --- /dev/null +++ b/packages/babel-plugin-es2015-template-literals/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-template-literals", + "version": "1.0.0", + "description": "Compile ES2015 template literals to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-template-literals/src/index.js b/packages/babel-plugin-es2015-template-literals/src/index.js new file mode 100644 index 0000000000..bd5692dc9a --- /dev/null +++ b/packages/babel-plugin-es2015-template-literals/src/index.js @@ -0,0 +1,87 @@ +export default function ({ types: t }) { + function isString(node) { + return t.isLiteral(node) && typeof node.value === "string"; + } + + function buildBinaryExpression(left, right) { + var node = t.binaryExpression("+", left, right); + node._templateLiteralProduced = true; + return node; + } + + function crawl(path) { + if (path.is("_templateLiteralProduced")) { + crawl(path.get("left")); + crawl(path.get("right")); + } else if (!path.isBaseType("string") && !path.isBaseType("number")) { + path.replaceWith(t.callExpression(t.identifier("String"), [path.node])); + } + } + + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + TaggedTemplateExpression(node, parent, scope, file) { + var quasi = node.quasi; + var args = []; + + var strings = []; + var raw = []; + + for (var elem of (quasi.quasis: Array)) { + strings.push(t.stringLiteral(elem.value.cooked)); + raw.push(t.stringLiteral(elem.value.raw)); + } + + strings = t.arrayExpression(strings); + raw = t.arrayExpression(raw); + + var templateName = "tagged-template-literal"; + if (file.isLoose("es6.templateLiterals")) templateName += "-loose"; + + var templateObject = file.addTemplateObject(templateName, strings, raw); + args.push(templateObject); + + args = args.concat(quasi.expressions); + + return t.callExpression(node.tag, args); + }, + + TemplateLiteral(node, parent, scope, file) { + var nodes = []; + + for (let elem of (node.quasis: Array)) { + nodes.push(t.stringLiteral(elem.value.cooked)); + + var expr = node.expressions.shift(); + if (expr) nodes.push(expr); + } + + // filter out empty string literals + nodes = nodes.filter(n => !t.isLiteral(n, { value: "" })); + + // since `+` is left-to-right associative + // ensure the first node is a string if first/second isn't + if (!isString(nodes[0]) && !isString(nodes[1])) { + nodes.unshift(t.stringLiteral("")); + } + + if (nodes.length > 1) { + var root = buildBinaryExpression(nodes.shift(), nodes.shift()); + + for (let node of (nodes: Array)) { + root = buildBinaryExpression(root, node); + } + + this.replaceWith(root); + crawl(this); + } else { + return nodes[0]; + } + } + } + }; +} diff --git a/packages/babel-plugin-es2015-unicode-regex/.gitignore b/packages/babel-plugin-es2015-unicode-regex/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es2015-unicode-regex/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es2015-unicode-regex/.npmignore b/packages/babel-plugin-es2015-unicode-regex/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es2015-unicode-regex/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es2015-unicode-regex/README.md b/packages/babel-plugin-es2015-unicode-regex/README.md new file mode 100644 index 0000000000..5e5fd22db0 --- /dev/null +++ b/packages/babel-plugin-es2015-unicode-regex/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es2015-unicode-regex + +Compile ES2015 unicode regex to ES5 + +## Installation + +```sh +$ npm install babel-plugin-es2015-unicode-regex +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es2015-unicode-regex"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es2015-unicode-regex script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es2015-unicode-regex"] +}); +``` diff --git a/packages/babel-plugin-es2015-unicode-regex/package.json b/packages/babel-plugin-es2015-unicode-regex/package.json new file mode 100644 index 0000000000..f1e8e8416a --- /dev/null +++ b/packages/babel-plugin-es2015-unicode-regex/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es2015-unicode-regex", + "version": "1.0.0", + "description": "Compile ES2015 unicode regex to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es2015-unicode-regex/src/index.js b/packages/babel-plugin-es2015-unicode-regex/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es2015-unicode-regex/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-es3-member-expression-literals/.gitignore b/packages/babel-plugin-es3-member-expression-literals/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es3-member-expression-literals/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es3-member-expression-literals/.npmignore b/packages/babel-plugin-es3-member-expression-literals/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es3-member-expression-literals/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es3-member-expression-literals/README.md b/packages/babel-plugin-es3-member-expression-literals/README.md new file mode 100644 index 0000000000..588911bf08 --- /dev/null +++ b/packages/babel-plugin-es3-member-expression-literals/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es3-member-expression-literals + +Ensure that reserved words are quoted in property accesses + +## Installation + +```sh +$ npm install babel-plugin-es3-member-expression-literals +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es3-member-expression-literals"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es3-member-expression-literals script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es3-member-expression-literals"] +}); +``` diff --git a/packages/babel-plugin-es3-member-expression-literals/package.json b/packages/babel-plugin-es3-member-expression-literals/package.json new file mode 100644 index 0000000000..81afa24aa2 --- /dev/null +++ b/packages/babel-plugin-es3-member-expression-literals/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es3-member-expression-literals", + "version": "1.0.0", + "description": "Ensure that reserved words are quoted in property accesses", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es3-member-expression-literals/src/index.js b/packages/babel-plugin-es3-member-expression-literals/src/index.js new file mode 100644 index 0000000000..759e274ccf --- /dev/null +++ b/packages/babel-plugin-es3-member-expression-literals/src/index.js @@ -0,0 +1,20 @@ +export default function ({ types: t }) { + return { + metadata: { + group: "builtin-trailing" + }, + + visitor: { + MemberExpression: { + exit(node) { + var prop = node.property; + if (!node.computed && t.isIdentifier(prop) && !t.isValidIdentifier(prop.name)) { + // foo.default -> foo["default"] + node.property = t.stringLiteral(prop.name); + node.computed = true; + } + } + } + } + }; +} diff --git a/packages/babel-plugin-es3-property-literals/.gitignore b/packages/babel-plugin-es3-property-literals/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es3-property-literals/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es3-property-literals/.npmignore b/packages/babel-plugin-es3-property-literals/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es3-property-literals/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es3-property-literals/README.md b/packages/babel-plugin-es3-property-literals/README.md new file mode 100644 index 0000000000..d8b916529d --- /dev/null +++ b/packages/babel-plugin-es3-property-literals/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es3-property-literals + +Ensure that reserved words are quoted in object property keys + +## Installation + +```sh +$ npm install babel-plugin-es3-property-literals +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es3-property-literals"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es3-property-literals script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es3-property-literals"] +}); +``` diff --git a/packages/babel-plugin-es3-property-literals/package.json b/packages/babel-plugin-es3-property-literals/package.json new file mode 100644 index 0000000000..c02edaaf9f --- /dev/null +++ b/packages/babel-plugin-es3-property-literals/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es3-property-literals", + "version": "1.0.0", + "description": "Ensure that reserved words are quoted in object property keys", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es3-property-literals/src/index.js b/packages/babel-plugin-es3-property-literals/src/index.js new file mode 100644 index 0000000000..d4b85f97f3 --- /dev/null +++ b/packages/babel-plugin-es3-property-literals/src/index.js @@ -0,0 +1,20 @@ +export default function ({ types: t }) { + return { + metadata: { + group: "builtin-trailing" + }, + + visitor: { + + Property: { + exit(node) { + var key = node.key; + if (!node.computed && t.isIdentifier(key) && !t.isValidIdentifier(key.name)) { + // default: "bar" -> "default": "bar" + node.key = t.stringLiteral(key.name); + } + } + } + } + }; +} diff --git a/packages/babel-plugin-es5-property-mutators/.gitignore b/packages/babel-plugin-es5-property-mutators/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-es5-property-mutators/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-es5-property-mutators/.npmignore b/packages/babel-plugin-es5-property-mutators/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-es5-property-mutators/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-es5-property-mutators/README.md b/packages/babel-plugin-es5-property-mutators/README.md new file mode 100644 index 0000000000..62612bc6ea --- /dev/null +++ b/packages/babel-plugin-es5-property-mutators/README.md @@ -0,0 +1,35 @@ +# babel-plugin-es5-property-mutators + +Compile ES5 property mutator shorthand syntax to Object.defineProperty + +## Installation + +```sh +$ npm install babel-plugin-es5-property-mutators +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["es5-property-mutators"] +} +``` + +### Via CLI + +```sh +$ babel --plugins es5-property-mutators script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["es5-property-mutators"] +}); +``` diff --git a/packages/babel-plugin-es5-property-mutators/package.json b/packages/babel-plugin-es5-property-mutators/package.json new file mode 100644 index 0000000000..ac2d197138 --- /dev/null +++ b/packages/babel-plugin-es5-property-mutators/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-es5-property-mutators", + "version": "1.0.0", + "description": "Compile ES5 property mutator shorthand syntax to Object.defineProperty", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-es5-property-mutators/src/index.js b/packages/babel-plugin-es5-property-mutators/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-es5-property-mutators/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-eval/package.json b/packages/babel-plugin-eval/package.json index 5eaddfdb57..e24ef75019 100644 --- a/packages/babel-plugin-eval/package.json +++ b/packages/babel-plugin-eval/package.json @@ -2,12 +2,9 @@ "name": "babel-plugin-eval", "version": "1.0.1", "description": "Compile eval calls with string literals", - "repository": "babel-plugins/babel-plugin-eval", + "repository": "babel/babelbabel-plugin-eval", "license": "MIT", "main": "lib/index.js", - "devDependencies": { - "babel": "^5.6.0" - }, "keywords": [ "babel-plugin" ] diff --git a/packages/babel-plugin-eval/src/index.js b/packages/babel-plugin-eval/src/index.js index 0066fd3d25..a4a4c116ca 100644 --- a/packages/babel-plugin-eval/src/index.js +++ b/packages/babel-plugin-eval/src/index.js @@ -1,5 +1,5 @@ -export default function ({ Plugin, parse, traverse }) { - return new Plugin("eval", { +export default function ({ parse, traverse }) { + return { metadata: { group: "builtin-pre", }, @@ -19,5 +19,5 @@ export default function ({ Plugin, parse, traverse }) { } } } - }); + }; } diff --git a/packages/babel-plugin-exponentiation-operator/.gitignore b/packages/babel-plugin-exponentiation-operator/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-exponentiation-operator/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-exponentiation-operator/.npmignore b/packages/babel-plugin-exponentiation-operator/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-exponentiation-operator/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-exponentiation-operator/README.md b/packages/babel-plugin-exponentiation-operator/README.md new file mode 100644 index 0000000000..39eeb12ed5 --- /dev/null +++ b/packages/babel-plugin-exponentiation-operator/README.md @@ -0,0 +1,35 @@ +# babel-plugin-exponentiation-operator + +Compile exponentiation operator to ES5 + +## Installation + +```sh +$ npm install babel-plugin-exponentiation-operator +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["exponentiation-operator"] +} +``` + +### Via CLI + +```sh +$ babel --plugins exponentiation-operator script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["exponentiation-operator"] +}); +``` diff --git a/packages/babel-plugin-exponentiation-operator/package.json b/packages/babel-plugin-exponentiation-operator/package.json new file mode 100644 index 0000000000..113c3a5f34 --- /dev/null +++ b/packages/babel-plugin-exponentiation-operator/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-exponentiation-operator", + "version": "1.0.0", + "description": "Compile exponentiation operator to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-exponentiation-operator/src/index.js b/packages/babel-plugin-exponentiation-operator/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-exponentiation-operator/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-export-extensions/.gitignore b/packages/babel-plugin-export-extensions/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-export-extensions/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-export-extensions/.npmignore b/packages/babel-plugin-export-extensions/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-export-extensions/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-export-extensions/README.md b/packages/babel-plugin-export-extensions/README.md new file mode 100644 index 0000000000..ab4ed89da8 --- /dev/null +++ b/packages/babel-plugin-export-extensions/README.md @@ -0,0 +1,35 @@ +# babel-plugin-export-extensions + +Compile export extensions to ES2015 + +## Installation + +```sh +$ npm install babel-plugin-export-extensions +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["export-extensions"] +} +``` + +### Via CLI + +```sh +$ babel --plugins export-extensions script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["export-extensions"] +}); +``` diff --git a/packages/babel-plugin-export-extensions/package.json b/packages/babel-plugin-export-extensions/package.json new file mode 100644 index 0000000000..df986a074d --- /dev/null +++ b/packages/babel-plugin-export-extensions/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-export-extensions", + "version": "1.0.0", + "description": "Compile export extensions to ES2015", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-export-extensions/src/index.js b/packages/babel-plugin-export-extensions/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-export-extensions/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-flow-strip-types/.npmignore b/packages/babel-plugin-flow-strip-types/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-flow-strip-types/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-flow-strip-types/README.md b/packages/babel-plugin-flow-strip-types/README.md new file mode 100644 index 0000000000..b4770bb4b4 --- /dev/null +++ b/packages/babel-plugin-flow-strip-types/README.md @@ -0,0 +1,35 @@ +# babel-plugin-flow-strip-types + +Strip flow type annotations from your output code. + +## Installation + +```sh +$ npm install babel-plugin-flow-strip-types +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["flow-strip-types"] +} +``` + +### Via CLI + +```sh +$ babel --plugins flow-strip-types script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["flow-strip-types"] +}); +``` diff --git a/packages/babel-plugin-flow-strip-types/package.json b/packages/babel-plugin-flow-strip-types/package.json new file mode 100644 index 0000000000..dce4c09171 --- /dev/null +++ b/packages/babel-plugin-flow-strip-types/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-flow-strip-types", + "version": "1.0.4", + "description": "Strip flow type annotations from your output code.", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-flow-strip-types/src/index.js b/packages/babel-plugin-flow-strip-types/src/index.js new file mode 100644 index 0000000000..a4b906d516 --- /dev/null +++ b/packages/babel-plugin-flow-strip-types/src/index.js @@ -0,0 +1,50 @@ +export default function ({ Plugin, types: t }) { + const FLOW_DIRECTIVE = "@flow"; + + return { + metadata: { + group: "builtin-trailing" + }, + + visitor: { + Program(node, parent, scope, file) { + for (var comment of (file.ast.comments: Array)) { + if (comment.value.indexOf(FLOW_DIRECTIVE) >= 0) { + // remove flow directive + comment.value = comment.value.replace(FLOW_DIRECTIVE, ""); + + // remove the comment completely if it only consists of whitespace and/or stars + if (!comment.value.replace(/\*/g, "").trim()) comment._displayed = true; + } + } + }, + + Flow() { + this.dangerouslyRemove(); + }, + + ClassProperty(node) { + node.typeAnnotation = null; + if (!node.value) this.dangerouslyRemove(); + }, + + Class(node) { + node.implements = null; + }, + + Function(node) { + for (var i = 0; i < node.params.length; i++) { + var param = node.params[i]; + param.optional = false; + } + }, + + TypeCastExpression(node) { + do { + node = node.expression; + } while(t.isTypeCastExpression(node)); + return node; + } + } + }; +} diff --git a/packages/babel-plugin-function-bind/.gitignore b/packages/babel-plugin-function-bind/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-function-bind/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-function-bind/.npmignore b/packages/babel-plugin-function-bind/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-function-bind/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-function-bind/README.md b/packages/babel-plugin-function-bind/README.md new file mode 100644 index 0000000000..fc015c8c19 --- /dev/null +++ b/packages/babel-plugin-function-bind/README.md @@ -0,0 +1,35 @@ +# babel-plugin-function-bind + +Compile function bind operator to ES5 + +## Installation + +```sh +$ npm install babel-plugin-function-bind +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["function-bind"] +} +``` + +### Via CLI + +```sh +$ babel --plugins function-bind script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["function-bind"] +}); +``` diff --git a/packages/babel-plugin-function-bind/package.json b/packages/babel-plugin-function-bind/package.json new file mode 100644 index 0000000000..23f0656cad --- /dev/null +++ b/packages/babel-plugin-function-bind/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-function-bind", + "version": "1.0.0", + "description": "Compile function bind operator to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-function-bind/src/index.js b/packages/babel-plugin-function-bind/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-function-bind/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-inline-environment-variables/package.json b/packages/babel-plugin-inline-environment-variables/package.json index 8691170cac..da3dc6af2a 100644 --- a/packages/babel-plugin-inline-environment-variables/package.json +++ b/packages/babel-plugin-inline-environment-variables/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-inline-environment-variables", "version": "1.0.1", "description": "Inline environment variables", - "repository": "babel-plugins/babel-plugin-inline-environment-variables", + "repository": "babel/babelbabel-plugin-inline-environment-variables", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-inline-environment-variables/src/index.js b/packages/babel-plugin-inline-environment-variables/src/index.js index 7425774dfb..1f37d9afa6 100644 --- a/packages/babel-plugin-inline-environment-variables/src/index.js +++ b/packages/babel-plugin-inline-environment-variables/src/index.js @@ -1,18 +1,18 @@ export default function ({ Plugin, types: t }) { - return new Plugin("inline-environment-variables", { + return { metadata: { group: "builtin-pre" }, - + visitor: { - MemberExpression(node) { + MemberExpression() { if (this.get("object").matchesPattern("process.env")) { var key = this.toComputedKey(); - if (t.isLiteral(key)) { + if (t.isStringLiteral(key)) { return t.valueToNode(process.env[key.value]); } } } } - }); + }; } diff --git a/packages/babel-plugin-jscript/package.json b/packages/babel-plugin-jscript/package.json index dbbe3846f0..9cab71d607 100644 --- a/packages/babel-plugin-jscript/package.json +++ b/packages/babel-plugin-jscript/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-jscript", "version": "1.0.4", "description": "Babel plugin to fix buggy JScript named function expressions", - "repository": "babel-plugins/babel-plugin-jscript", + "repository": "babel/babelbabel-plugin-jscript", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-jscript/src/index.js b/packages/babel-plugin-jscript/src/index.js index 4f7462a931..27512fb761 100644 --- a/packages/babel-plugin-jscript/src/index.js +++ b/packages/babel-plugin-jscript/src/index.js @@ -1,9 +1,9 @@ export default function ({ Plugin, types: t }) { - return new Plugin("jscript", { + return { metadata: { group: "builtin-trailing" }, - + visitor: { FunctionExpression: { exit(node) { @@ -20,5 +20,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-member-expression-literals/package.json b/packages/babel-plugin-member-expression-literals/package.json index e2338904d2..c468e0d967 100644 --- a/packages/babel-plugin-member-expression-literals/package.json +++ b/packages/babel-plugin-member-expression-literals/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-member-expression-literals", "version": "1.0.1", "description": "Turn valid member expression property literals into plain identifiers", - "repository": "babel-plugins/babel-plugin-member-expression-literals", + "repository": "babel/babelbabel-plugin-member-expression-literals", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-member-expression-literals/src/index.js b/packages/babel-plugin-member-expression-literals/src/index.js index 547dbe2c5d..33be68ec9f 100644 --- a/packages/babel-plugin-member-expression-literals/src/index.js +++ b/packages/babel-plugin-member-expression-literals/src/index.js @@ -1,9 +1,9 @@ -export default function ({ Plugin, types: t }) { - return new Plugin("member-expression-literals", { +export default function ({ types: t }) { + return { metadata: { group: "builtin-trailing" }, - + visitor: { MemberExpression: { exit(node) { @@ -16,5 +16,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-merge-sibling-variables/.npmignore b/packages/babel-plugin-merge-sibling-variables/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-merge-sibling-variables/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-merge-sibling-variables/README.md b/packages/babel-plugin-merge-sibling-variables/README.md new file mode 100644 index 0000000000..92b0678f56 --- /dev/null +++ b/packages/babel-plugin-merge-sibling-variables/README.md @@ -0,0 +1,53 @@ +# babel-plugin-merge-sibling-variables + +Merge sibling variables into one. + +## Example + +**In** + +```javascript +var foo = "bar"; +var bar = "foo"; +foobar(); +``` + +**Out** + +```javascript +var foo = "bar", + bar = "foo"; +foobar(); +``` + +## Installation + +```sh +$ npm install babel-plugin-merge-sibling-variables +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["merge-sibling-variables"] +} +``` + +### Via CLI + +```sh +$ babel --plugins merge-sibling-variables script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["merge-sibling-variables"] +}); +``` diff --git a/packages/babel-plugin-merge-sibling-variables/package.json b/packages/babel-plugin-merge-sibling-variables/package.json new file mode 100644 index 0000000000..2f62706048 --- /dev/null +++ b/packages/babel-plugin-merge-sibling-variables/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-merge-sibling-variables", + "version": "1.0.2", + "description": "Merge sibling variables into one.", + "repository": "babel-plugin-merge-sibling-variables", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-merge-sibling-variables/src/index.js b/packages/babel-plugin-merge-sibling-variables/src/index.js new file mode 100644 index 0000000000..4ceb72f163 --- /dev/null +++ b/packages/babel-plugin-merge-sibling-variables/src/index.js @@ -0,0 +1,21 @@ +export default function () { + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + VariableDeclaration(node) { + if (!this.inList) return; + + while (true) { + var sibling = this.getSibling(this.key + 1); + if (!sibling.isVariableDeclaration({ kind: node.kind })) break; + + node.declarations = node.declarations.concat(sibling.node.declarations); + sibling.dangerouslyRemove(); + } + } + } + }; +} diff --git a/packages/babel-plugin-minify-booleans/.npmignore b/packages/babel-plugin-minify-booleans/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-minify-booleans/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-minify-booleans/README.md b/packages/babel-plugin-minify-booleans/README.md new file mode 100644 index 0000000000..d40f0db7ed --- /dev/null +++ b/packages/babel-plugin-minify-booleans/README.md @@ -0,0 +1,35 @@ +# babel-plugin-minify-booleans + +Turn boolean literals into !0 for true and !1 for false. + +## Installation + +```sh +$ npm install babel-plugin-minify-booleans +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["minify-booleans"] +} +``` + +### Via CLI + +```sh +$ babel --plugins minify-booleans script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["minify-booleans"] +}); +``` diff --git a/packages/babel-plugin-minify-booleans/package.json b/packages/babel-plugin-minify-booleans/package.json new file mode 100644 index 0000000000..7540ae6f62 --- /dev/null +++ b/packages/babel-plugin-minify-booleans/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-minify-booleans", + "version": "1.0.2", + "description": "Turn boolean literals into !0 for true and !1 for false.", + "repository": "babel/babelbabel-plugin-minify-booleans", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-minify-booleans/src/index.js b/packages/babel-plugin-minify-booleans/src/index.js new file mode 100644 index 0000000000..be29f19853 --- /dev/null +++ b/packages/babel-plugin-minify-booleans/src/index.js @@ -0,0 +1,15 @@ +export default function ({ types: t }) { + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + Literal(node) { + if (typeof node.value === "boolean") { + return t.unaryExpression("!", t.literal(+!node.value), true); + } + } + } + }; +} diff --git a/packages/babel-plugin-node-env-inline/.npmignore b/packages/babel-plugin-node-env-inline/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-node-env-inline/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-node-env-inline/LICENSE b/packages/babel-plugin-node-env-inline/LICENSE new file mode 100644 index 0000000000..369e18d942 --- /dev/null +++ b/packages/babel-plugin-node-env-inline/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 Sebastian McKenzie + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/babel-plugin-node-env-inline/README.md b/packages/babel-plugin-node-env-inline/README.md new file mode 100644 index 0000000000..0527d74a09 --- /dev/null +++ b/packages/babel-plugin-node-env-inline/README.md @@ -0,0 +1,56 @@ +# babel-plugin-node-env-inline + +Inline the `NODE_ENV` environment variable and if it's a part of a binary expression +(eg. `process.env.NODE_ENV === "development"`) then statically evaluate and replace it. + +## Example + +**In** + +```javascript +process.env.NODE_ENV === "development"; +process.env.NODE_ENV === "production"; +``` + +**Out** + +```sh +$ NODE_ENV=development babel in.js --plugins node-env-inline +``` + +```javascript +true; +false; +``` + +## Installation + +```sh +$ npm install babel-plugin-node-env-inline +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["node-env-inline"] +} +``` + +### Via CLI + +```sh +$ babel --plugins node-env-inline script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["node-env-inline"] +}); +``` diff --git a/packages/babel-plugin-node-env-inline/package.json b/packages/babel-plugin-node-env-inline/package.json new file mode 100644 index 0000000000..af4810e8c1 --- /dev/null +++ b/packages/babel-plugin-node-env-inline/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-node-env-inline", + "version": "1.0.1", + "description": "", + "repository": "babel/babelbabel-plugin-node-env-inline", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-node-env-inline/src/index.js b/packages/babel-plugin-node-env-inline/src/index.js new file mode 100644 index 0000000000..3dadb8cf28 --- /dev/null +++ b/packages/babel-plugin-node-env-inline/src/index.js @@ -0,0 +1,22 @@ +export default function ({ types: t }) { + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + MemberExpression() { + if (this.matchesPattern("process.env.NODE_ENV")) { + this.replaceWith(t.valueToNode(process.env.NODE_ENV)); + + if (this.parentPath.isBinaryExpression()) { + var evaluated = this.parentPath.evaluate(); + if (evaluated.confident) { + this.parentPath.replaceWith(t.valueToNode(evaluated.value)); + } + } + } + } + } + }; +} diff --git a/packages/babel-plugin-object-assign/.npmignore b/packages/babel-plugin-object-assign/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-object-assign/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-object-assign/LICENSE b/packages/babel-plugin-object-assign/LICENSE new file mode 100644 index 0000000000..b9d8498106 --- /dev/null +++ b/packages/babel-plugin-object-assign/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Jed Watson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/packages/babel-plugin-object-assign/README.md b/packages/babel-plugin-object-assign/README.md new file mode 100644 index 0000000000..cb1ccad864 --- /dev/null +++ b/packages/babel-plugin-object-assign/README.md @@ -0,0 +1,51 @@ +# babel-plugin-object-assign + +Replace `Object.assign` with an inline helper. + +## Example + +**In** + +```javascript +Object.assign(a, b); +``` + +**Out** + +```javascript +var _extends = ...; + +_extends(a, b); +``` + +## Installation + +```sh +$ npm install babel-plugin-object-assign +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["object-assign"] +} +``` + +### Via CLI + +```sh +$ babel --plugins object-assign script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["object-assign"] +}); +``` diff --git a/packages/babel-plugin-object-assign/package.json b/packages/babel-plugin-object-assign/package.json new file mode 100644 index 0000000000..d6ec717ddf --- /dev/null +++ b/packages/babel-plugin-object-assign/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-object-assign", + "version": "5.0.0", + "description": "Replace Object.assign with an inline helper", + "author": "Jed Watson", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-object-assign/src/index.js b/packages/babel-plugin-object-assign/src/index.js new file mode 100644 index 0000000000..10581931af --- /dev/null +++ b/packages/babel-plugin-object-assign/src/index.js @@ -0,0 +1,15 @@ +export default function () { + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + CallExpression: function (node, parent, scope, file) { + if (this.get("callee").matchesPattern("Object.assign")) { + node.callee = file.addHelper("extends"); + } + } + } + }; +} diff --git a/packages/babel-plugin-object-rest-spread/.gitignore b/packages/babel-plugin-object-rest-spread/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-object-rest-spread/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-object-rest-spread/.npmignore b/packages/babel-plugin-object-rest-spread/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-object-rest-spread/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-object-rest-spread/README.md b/packages/babel-plugin-object-rest-spread/README.md new file mode 100644 index 0000000000..80928598a3 --- /dev/null +++ b/packages/babel-plugin-object-rest-spread/README.md @@ -0,0 +1,35 @@ +# babel-plugin-object-rest-spread + +Compile object rest and spread to ES5 + +## Installation + +```sh +$ npm install babel-plugin-object-rest-spread +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["object-rest-spread"] +} +``` + +### Via CLI + +```sh +$ babel --plugins object-rest-spread script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["object-rest-spread"] +}); +``` diff --git a/packages/babel-plugin-object-rest-spread/package.json b/packages/babel-plugin-object-rest-spread/package.json new file mode 100644 index 0000000000..2de0fc3894 --- /dev/null +++ b/packages/babel-plugin-object-rest-spread/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-object-rest-spread", + "version": "1.0.0", + "description": "Compile object rest and spread to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-object-rest-spread/src/index.js b/packages/babel-plugin-object-rest-spread/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-object-rest-spread/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-object-set-prototype-of-to-assign/.npmignore b/packages/babel-plugin-object-set-prototype-of-to-assign/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-object-set-prototype-of-to-assign/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-object-set-prototype-of-to-assign/LICENSE b/packages/babel-plugin-object-set-prototype-of-to-assign/LICENSE new file mode 100644 index 0000000000..369e18d942 --- /dev/null +++ b/packages/babel-plugin-object-set-prototype-of-to-assign/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 Sebastian McKenzie + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/babel-plugin-object-set-prototype-of-to-assign/README.md b/packages/babel-plugin-object-set-prototype-of-to-assign/README.md new file mode 100644 index 0000000000..4e3b5a1133 --- /dev/null +++ b/packages/babel-plugin-object-set-prototype-of-to-assign/README.md @@ -0,0 +1,54 @@ +# babel-plugin-object-set-prototype-of-to-assign + + +The `object-set-prototype-of-to-assign` plugin will transform all `Object.setPrototypeOf` calls to a method that will do a shallow defaults of all properties. + +**NOTE:** There are some caveats when using this plugin, see the [`babel-plugin-proto-to-assign` README](https://github.com/babel-plugins/babel-plugin-proto-to-assign) for more information.. + +## Example + +**In** + +```javascript +Object.setPrototypeOf(bar, foo); +``` + +**Out** + +```javascript +var _defaults = ...; + +_defaults(bar, foo); +``` + +## Installation + +```sh +$ npm install babel-plugin-object-set-prototype-of-to-assign +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["object-set-prototype-of-to-assign"] +} +``` + +### Via CLI + +```sh +$ babel --plugins object-set-prototype-of-to-assign script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["object-set-prototype-of-to-assign"] +}); +``` diff --git a/packages/babel-plugin-object-set-prototype-of-to-assign/package.json b/packages/babel-plugin-object-set-prototype-of-to-assign/package.json new file mode 100644 index 0000000000..b09df0753a --- /dev/null +++ b/packages/babel-plugin-object-set-prototype-of-to-assign/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-object-set-prototype-of-to-assign", + "version": "1.0.1", + "description": "Turn Object.setPrototypeOf to assignments", + "repository": "babel/babelbabel-plugin-object-set-prototype-of-to-assign", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-object-set-prototype-of-to-assign/src/index.js b/packages/babel-plugin-object-set-prototype-of-to-assign/src/index.js new file mode 100644 index 0000000000..db03a93c67 --- /dev/null +++ b/packages/babel-plugin-object-set-prototype-of-to-assign/src/index.js @@ -0,0 +1,11 @@ +export default function () { + return { + visitor: { + CallExpression(node, parent, scope, file) { + if (this.get("callee").matchesPattern("Object.setPrototypeOf")) { + node.callee = file.addHelper("defaults"); + } + } + } + }; +} diff --git a/packages/babel-plugin-property-literals/package.json b/packages/babel-plugin-property-literals/package.json index 22fb554ce6..8ab0454c4d 100644 --- a/packages/babel-plugin-property-literals/package.json +++ b/packages/babel-plugin-property-literals/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-property-literals", "version": "1.0.1", "description": "Turn valid property key literals to plain identifiers", - "repository": "babel-plugins/babel-plugin-property-literals", + "repository": "babel/babelbabel-plugin-property-literals", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-property-literals/src/index.js b/packages/babel-plugin-property-literals/src/index.js index b6c9b9520e..3b0c139fe2 100644 --- a/packages/babel-plugin-property-literals/src/index.js +++ b/packages/babel-plugin-property-literals/src/index.js @@ -1,9 +1,9 @@ -export default function ({ Plugin, types: t }) { - return new Plugin("property-literals", { +export default function ({ types: t }) { + return { metadata: { group: "builtin-trailing" }, - + visitor: { Property: { exit(node) { @@ -16,5 +16,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-proto-to-assign/package.json b/packages/babel-plugin-proto-to-assign/package.json index 038f7b7c91..8353b036f5 100644 --- a/packages/babel-plugin-proto-to-assign/package.json +++ b/packages/babel-plugin-proto-to-assign/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-proto-to-assign", "version": "1.0.4", "description": "Babel plugin for turning __proto__ into a shallow property clone", - "repository": "babel-plugins/babel-plugin-proto-to-assign", + "repository": "babel/babelbabel-plugin-proto-to-assign", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-proto-to-assign/src/index.js b/packages/babel-plugin-proto-to-assign/src/index.js index e172b71892..9654d17414 100644 --- a/packages/babel-plugin-proto-to-assign/src/index.js +++ b/packages/babel-plugin-proto-to-assign/src/index.js @@ -14,7 +14,7 @@ export default function ({ Plugin, types: t }) { return t.expressionStatement(t.callExpression(file.addHelper("defaults"), [ref, expr.right])); } - return new Plugin("proto-to-assign", { + return { metadata: { secondPass: true }, @@ -62,5 +62,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-react-compat-jsx/.gitignore b/packages/babel-plugin-react-compat-jsx/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-react-compat-jsx/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-react-compat-jsx/.npmignore b/packages/babel-plugin-react-compat-jsx/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-react-compat-jsx/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-react-compat-jsx/README.md b/packages/babel-plugin-react-compat-jsx/README.md new file mode 100644 index 0000000000..8356514585 --- /dev/null +++ b/packages/babel-plugin-react-compat-jsx/README.md @@ -0,0 +1,35 @@ +# babel-plugin-react-compat-jsx + +Turn JSX into React Pre-0.12 function calls + +## Installation + +```sh +$ npm install babel-plugin-react-compat-jsx +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["react-compat-jsx"] +} +``` + +### Via CLI + +```sh +$ babel --plugins react-compat-jsx script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["react-compat-jsx"] +}); +``` diff --git a/packages/babel-plugin-react-compat-jsx/package.json b/packages/babel-plugin-react-compat-jsx/package.json new file mode 100644 index 0000000000..cfee81e9c6 --- /dev/null +++ b/packages/babel-plugin-react-compat-jsx/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-react-compat-jsx", + "version": "1.0.0", + "description": "Turn JSX into React Pre-0.12 function calls", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-react-compat-jsx/src/index.js b/packages/babel-plugin-react-compat-jsx/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-react-compat-jsx/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-react-constant-elements/package.json b/packages/babel-plugin-react-constant-elements/package.json index ab31ef069d..dd03b76969 100644 --- a/packages/babel-plugin-react-constant-elements/package.json +++ b/packages/babel-plugin-react-constant-elements/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-react-constant-elements", "version": "1.0.3", "description": "Treat React JSX elements as value types and hoist them to the highest scope", - "repository": "babel-plugins/babel-plugin-react-constant-elements", + "repository": "babel/babelbabel-plugin-react-constant-elements", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-react-constant-elements/src/index.js b/packages/babel-plugin-react-constant-elements/src/index.js index f5dce29f65..e6b2505f78 100644 --- a/packages/babel-plugin-react-constant-elements/src/index.js +++ b/packages/babel-plugin-react-constant-elements/src/index.js @@ -1,4 +1,4 @@ -export default function ({ Plugin }) { +export default function () { var immutabilityVisitor = { enter(node, parent, scope, state) { var stop = () => { @@ -23,7 +23,7 @@ export default function ({ Plugin }) { } }; - return new Plugin("react-constant-elements", { + return { metadata: { group: "builtin-basic" }, @@ -42,5 +42,5 @@ export default function ({ Plugin }) { } } } - }); + }; } diff --git a/packages/babel-plugin-react-display-name/package.json b/packages/babel-plugin-react-display-name/package.json index 9909916661..b22a84cf20 100644 --- a/packages/babel-plugin-react-display-name/package.json +++ b/packages/babel-plugin-react-display-name/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-react-display-name", "version": "2.0.0", "description": "Add displayName to React.createClass calls", - "repository": "babel-plugins/babel-plugin-react-display-name", + "repository": "babel/babelbabel-plugin-react-display-name", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-react-display-name/src/index.js b/packages/babel-plugin-react-display-name/src/index.js index bc85364538..d057301f4f 100644 --- a/packages/babel-plugin-react-display-name/src/index.js +++ b/packages/babel-plugin-react-display-name/src/index.js @@ -1,6 +1,6 @@ import path from "path"; -export default function ({ Plugin, types: t }) { +export default function ({ types: t }) { function addDisplayName(id, call) { var props = call.arguments[0].properties; var safe = true; @@ -15,7 +15,7 @@ export default function ({ Plugin, types: t }) { } if (safe) { - props.unshift(t.property("init", t.identifier("displayName"), t.literal(id))); + props.unshift(t.property("init", t.identifier("displayName"), t.stringLiteral(id))); } } @@ -38,7 +38,7 @@ export default function ({ Plugin, types: t }) { return true; } - return new Plugin("react-display-name", { + return { metadata: { group: "builtin-pre" }, @@ -80,5 +80,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-react-inline-elements/.gitignore b/packages/babel-plugin-react-inline-elements/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-react-inline-elements/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-react-inline-elements/.npmignore b/packages/babel-plugin-react-inline-elements/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-react-inline-elements/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-react-inline-elements/README.md b/packages/babel-plugin-react-inline-elements/README.md new file mode 100644 index 0000000000..150e2ff60e --- /dev/null +++ b/packages/babel-plugin-react-inline-elements/README.md @@ -0,0 +1,35 @@ +# babel-plugin-react-inline-elements + +Turn JSX elements into exploded React objects + +## Installation + +```sh +$ npm install babel-plugin-react-inline-elements +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["react-inline-elements"] +} +``` + +### Via CLI + +```sh +$ babel --plugins react-inline-elements script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["react-inline-elements"] +}); +``` diff --git a/packages/babel-plugin-react-inline-elements/package.json b/packages/babel-plugin-react-inline-elements/package.json new file mode 100644 index 0000000000..2c015103e0 --- /dev/null +++ b/packages/babel-plugin-react-inline-elements/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-react-inline-elements", + "version": "1.0.0", + "description": "Turn JSX elements into exploded React objects", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-react-inline-elements/src/index.js b/packages/babel-plugin-react-inline-elements/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-react-inline-elements/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-react-jsx/.gitignore b/packages/babel-plugin-react-jsx/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-react-jsx/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-react-jsx/.npmignore b/packages/babel-plugin-react-jsx/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-react-jsx/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-react-jsx/README.md b/packages/babel-plugin-react-jsx/README.md new file mode 100644 index 0000000000..5e332b25ac --- /dev/null +++ b/packages/babel-plugin-react-jsx/README.md @@ -0,0 +1,35 @@ +# babel-plugin-react-jsx + +Turn JSX into React function calls + +## Installation + +```sh +$ npm install babel-plugin-react-jsx +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["react-jsx"] +} +``` + +### Via CLI + +```sh +$ babel --plugins react-jsx script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["react-jsx"] +}); +``` diff --git a/packages/babel-plugin-react-jsx/package.json b/packages/babel-plugin-react-jsx/package.json new file mode 100644 index 0000000000..4702727318 --- /dev/null +++ b/packages/babel-plugin-react-jsx/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-react-jsx", + "version": "1.0.0", + "description": "Turn JSX into React function calls", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-react-jsx/src/index.js b/packages/babel-plugin-react-jsx/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-react-jsx/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-remove-console/package.json b/packages/babel-plugin-remove-console/package.json index 6e8a11388f..a7a693bfc2 100644 --- a/packages/babel-plugin-remove-console/package.json +++ b/packages/babel-plugin-remove-console/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-remove-console", "version": "1.0.1", "description": "Remove console.* calls", - "repository": "babel-plugins/babel-plugin-remove-console", + "repository": "babel/babelbabel-plugin-remove-console", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-remove-console/src/index.js b/packages/babel-plugin-remove-console/src/index.js index ca73d14794..60a934e8db 100644 --- a/packages/babel-plugin-remove-console/src/index.js +++ b/packages/babel-plugin-remove-console/src/index.js @@ -1,5 +1,5 @@ -export default function ({ Plugin, types: t }) { - return new Plugin("remove-console", { +export default function () { + return { metadata: { group: "builtin-pre" }, @@ -11,5 +11,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-remove-debugger/package.json b/packages/babel-plugin-remove-debugger/package.json index ff05e23346..c133d2c378 100644 --- a/packages/babel-plugin-remove-debugger/package.json +++ b/packages/babel-plugin-remove-debugger/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-remove-debugger", "version": "1.0.1", "description": "Remove debugger statements", - "repository": "babel-plugins/babel-plugin-remove-debugger", + "repository": "babel/babelbabel-plugin-remove-debugger", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-remove-debugger/src/index.js b/packages/babel-plugin-remove-debugger/src/index.js index 62f6ca194c..c3ba51604d 100644 --- a/packages/babel-plugin-remove-debugger/src/index.js +++ b/packages/babel-plugin-remove-debugger/src/index.js @@ -1,5 +1,5 @@ -export default function ({ Plugin, types: t }) { - return new Plugin("remove-debugger", { +export default function () { + return { metadata: { group: "builtin-pre" }, @@ -9,5 +9,5 @@ export default function ({ Plugin, types: t }) { this.dangerouslyRemove(); } } - }); + }; } diff --git a/packages/babel-plugin-runtime/package.json b/packages/babel-plugin-runtime/package.json index 43432e30f4..d6a68bca0c 100644 --- a/packages/babel-plugin-runtime/package.json +++ b/packages/babel-plugin-runtime/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-runtime", "version": "1.0.7", "description": "Externalise references to helpers and builtins, automatically polyfilling your code without polluting globals", - "repository": "babel-plugins/babel-plugin-runtime", + "repository": "babel/babelbabel-plugin-runtime", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-runtime/src/index.js b/packages/babel-plugin-runtime/src/index.js index 8baba46ddb..1ba27f10eb 100644 --- a/packages/babel-plugin-runtime/src/index.js +++ b/packages/babel-plugin-runtime/src/index.js @@ -1,13 +1,13 @@ import definitions from "./definitions"; -export default function ({ Plugin, types: t }) { +export default function ({ types: t }) { const RUNTIME_MODULE_NAME = "babel-runtime"; function has(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); } - return new Plugin("runtime", { + return { metadata: { group: "builtin-post-modules" }, @@ -110,5 +110,5 @@ export default function ({ Plugin, types: t }) { } } } - }); + }; } diff --git a/packages/babel-plugin-simplify-comparison-operators/.npmignore b/packages/babel-plugin-simplify-comparison-operators/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-simplify-comparison-operators/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-simplify-comparison-operators/README.md b/packages/babel-plugin-simplify-comparison-operators/README.md new file mode 100644 index 0000000000..4475a3b839 --- /dev/null +++ b/packages/babel-plugin-simplify-comparison-operators/README.md @@ -0,0 +1,49 @@ +# babel-plugin-simplify-comparison-operators + +Convert `===` and `!==` to `==` and `!=` if their types are inferred to be the same. + +## Example + +**In** + +```javascript +typeof foo === "object"; +``` + +**Out** + +```javascript +typeof foo == "object"; +``` + +## Installation + +```sh +$ npm install babel-plugin-simplify-comparison-operators +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["simplify-comparison-operators"] +} +``` + +### Via CLI + +```sh +$ babel --plugins simplify-comparison-operators script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["simplify-comparison-operators"] +}); +``` diff --git a/packages/babel-plugin-simplify-comparison-operators/package.json b/packages/babel-plugin-simplify-comparison-operators/package.json new file mode 100644 index 0000000000..912f778ac5 --- /dev/null +++ b/packages/babel-plugin-simplify-comparison-operators/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-simplify-comparison-operators", + "version": "1.0.2", + "description": "Convert === and !== to == and != if their types are inferred to be the same.", + "repository": "babel/babelbabel-plugin-simplify-comparison-operators", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-simplify-comparison-operators/src/index.js b/packages/babel-plugin-simplify-comparison-operators/src/index.js new file mode 100644 index 0000000000..40b9b9e783 --- /dev/null +++ b/packages/babel-plugin-simplify-comparison-operators/src/index.js @@ -0,0 +1,20 @@ +export default function () { + return { + metadata: { + group: "builtin-pre" + }, + + visitor: { + BinaryExpression(node) { + var op = node.operator; + if (op !== "===" && op !== "!==") return; + + var left = this.get("left"); + var right = this.get("right"); + if (left.baseTypeStrictlyMatches(right)) { + node.operator = node.operator.slice(0, -1); + } + } + } + }; +} diff --git a/packages/babel-plugin-trailing-function-commas/.gitignore b/packages/babel-plugin-trailing-function-commas/.gitignore new file mode 100644 index 0000000000..45f7222308 --- /dev/null +++ b/packages/babel-plugin-trailing-function-commas/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +lib diff --git a/packages/babel-plugin-trailing-function-commas/.npmignore b/packages/babel-plugin-trailing-function-commas/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-trailing-function-commas/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-trailing-function-commas/README.md b/packages/babel-plugin-trailing-function-commas/README.md new file mode 100644 index 0000000000..e66d11c783 --- /dev/null +++ b/packages/babel-plugin-trailing-function-commas/README.md @@ -0,0 +1,35 @@ +# babel-plugin-trailing-function-commas + +Compile trailing function commas to ES5 + +## Installation + +```sh +$ npm install babel-plugin-trailing-function-commas +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["trailing-function-commas"] +} +``` + +### Via CLI + +```sh +$ babel --plugins trailing-function-commas script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["trailing-function-commas"] +}); +``` diff --git a/packages/babel-plugin-trailing-function-commas/package.json b/packages/babel-plugin-trailing-function-commas/package.json new file mode 100644 index 0000000000..f6217f7423 --- /dev/null +++ b/packages/babel-plugin-trailing-function-commas/package.json @@ -0,0 +1,11 @@ +{ + "name": "babel-plugin-trailing-function-commas", + "version": "1.0.0", + "description": "Compile trailing function commas to ES5", + "repository": "babel/babel", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ] +} diff --git a/packages/babel-plugin-trailing-function-commas/src/index.js b/packages/babel-plugin-trailing-function-commas/src/index.js new file mode 100644 index 0000000000..9e1abb71bf --- /dev/null +++ b/packages/babel-plugin-trailing-function-commas/src/index.js @@ -0,0 +1,7 @@ +export default function ({ types: t }) { + return { + visitor: { + // your visitor methods go here + } + }; +} diff --git a/packages/babel-plugin-undeclared-variables-check/package.json b/packages/babel-plugin-undeclared-variables-check/package.json index 5d8fcfffee..eab0ce08bc 100644 --- a/packages/babel-plugin-undeclared-variables-check/package.json +++ b/packages/babel-plugin-undeclared-variables-check/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-undeclared-variables-check", "version": "1.0.2", "description": "Throw a compile-time error on references to undeclared variables", - "repository": "babel-plugins/babel-plugin-undeclared-variables-check", + "repository": "babel/babelbabel-plugin-undeclared-variables-check", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-undeclared-variables-check/src/index.js b/packages/babel-plugin-undeclared-variables-check/src/index.js index 94178baafc..cd9cb5e56c 100644 --- a/packages/babel-plugin-undeclared-variables-check/src/index.js +++ b/packages/babel-plugin-undeclared-variables-check/src/index.js @@ -1,11 +1,11 @@ import levenshtein from "leven"; -export default function ({ Plugin, types: t, messages }) { - return new Plugin("undeclared-variables-check", { +export default function ({ messages }) { + return { metadata: { group: "builtin-pre" }, - + visitor: { ReferencedIdentifier(node, parent, scope) { var binding = scope.getBinding(node.name); @@ -44,5 +44,5 @@ export default function ({ Plugin, types: t, messages }) { throw this.errorWithNode(msg, ReferenceError); } } - }); + }; } diff --git a/packages/babel-plugin-undefined-to-void/package.json b/packages/babel-plugin-undefined-to-void/package.json index a26e5a108e..27d88a26c6 100644 --- a/packages/babel-plugin-undefined-to-void/package.json +++ b/packages/babel-plugin-undefined-to-void/package.json @@ -2,7 +2,7 @@ "name": "babel-plugin-undefined-to-void", "version": "1.1.6", "description": "Replace references to `undefined` with `void 0`", - "repository": "babel-plugins/babel-plugin-undefined-to-void", + "repository": "babel/babelbabel-plugin-undefined-to-void", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-undefined-to-void/src/index.js b/packages/babel-plugin-undefined-to-void/src/index.js index ddbf70be76..5b70388760 100644 --- a/packages/babel-plugin-undefined-to-void/src/index.js +++ b/packages/babel-plugin-undefined-to-void/src/index.js @@ -1,15 +1,15 @@ -export default function ({ Plugin, types: t }) { - return new Plugin("undefined-to-void", { +export default function ({ types: t }) { + return { metadata: { group: "builtin-basic" }, visitor: { - ReferencedIdentifier(node, parent) { + ReferencedIdentifier(node) { if (node.name === "undefined") { - return t.unaryExpression("void", t.literal(0), true); + return t.unaryExpression("void", t.numberLiteral(0), true); } } } - }); + }; }