From 75ac320cf7b763a438afabb354820fe4806d5df4 Mon Sep 17 00:00:00 2001 From: james kyle Date: Thu, 9 Feb 2017 16:45:38 -0800 Subject: [PATCH 01/19] Add new flow preset (#5288) --- packages/babel-preset-flow/.npmignore | 3 ++ packages/babel-preset-flow/README.md | 53 ++++++++++++++++++++++++ packages/babel-preset-flow/package.json | 18 ++++++++ packages/babel-preset-flow/src/index.js | 7 ++++ packages/babel-preset-react/README.md | 5 +-- packages/babel-preset-react/package.json | 3 +- packages/babel-preset-react/src/index.js | 8 ++-- 7 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 packages/babel-preset-flow/.npmignore create mode 100644 packages/babel-preset-flow/README.md create mode 100644 packages/babel-preset-flow/package.json create mode 100644 packages/babel-preset-flow/src/index.js diff --git a/packages/babel-preset-flow/.npmignore b/packages/babel-preset-flow/.npmignore new file mode 100644 index 0000000000..47cdd2c655 --- /dev/null +++ b/packages/babel-preset-flow/.npmignore @@ -0,0 +1,3 @@ +src +test +node_modules diff --git a/packages/babel-preset-flow/README.md b/packages/babel-preset-flow/README.md new file mode 100644 index 0000000000..26593bd878 --- /dev/null +++ b/packages/babel-preset-flow/README.md @@ -0,0 +1,53 @@ +# babel-preset-flow + +> Babel preset for all Flow plugins. + +This preset includes the following plugins: + +- [transform-flow-strip-types](https://babeljs.io/docs/plugins/transform-flow-strip-types/) + +## Example + +**In** + +```javascript +function foo(one: any, two: number, three?): string {} +``` + +**Out** + +```javascript +function foo(one, two, three) {} +``` + +## Installation + +```sh +npm install --save-dev babel-preset-flow +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "presets": ["flow"] +} +``` + +### Via CLI + +```sh +babel --presets flow script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + presets: ["flow"] +}); +``` diff --git a/packages/babel-preset-flow/package.json b/packages/babel-preset-flow/package.json new file mode 100644 index 0000000000..c5503cf2d1 --- /dev/null +++ b/packages/babel-preset-flow/package.json @@ -0,0 +1,18 @@ +{ + "name": "babel-preset-flow", + "version": "6.22.2", + "description": "Babel preset for all Flow plugins.", + "author": "James Kyle ", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-flow", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-preset", + "flowtype", + "flow", + "types" + ], + "dependencies": { + "babel-plugin-transform-flow-strip-types": "^6.22.0" + } +} diff --git a/packages/babel-preset-flow/src/index.js b/packages/babel-preset-flow/src/index.js new file mode 100644 index 0000000000..8251ca8270 --- /dev/null +++ b/packages/babel-preset-flow/src/index.js @@ -0,0 +1,7 @@ +import transformFlowStripTypes from "babel-plugin-transform-flow-strip-types"; + +export default { + plugins: [ + transformFlowStripTypes + ] +}; diff --git a/packages/babel-preset-react/README.md b/packages/babel-preset-react/README.md index aceb108aff..591a59547b 100644 --- a/packages/babel-preset-react/README.md +++ b/packages/babel-preset-react/README.md @@ -2,11 +2,10 @@ > Babel preset for all React plugins. -This preset includes the following plugins: +This preset includes the following plugins/presets: -- [syntax-flow](https://babeljs.io/docs/plugins/syntax-flow/) +- [preset-flow](https://babeljs.io/docs/plugins/preset-flow/) - [syntax-jsx](https://babeljs.io/docs/plugins/syntax-jsx/) -- [transform-flow-strip-types](https://babeljs.io/docs/plugins/transform-flow-strip-types/) - [transform-react-jsx](https://babeljs.io/docs/plugins/transform-react-jsx/) - [transform-react-display-name](https://babeljs.io/docs/plugins/transform-react-display-name/) diff --git a/packages/babel-preset-react/package.json b/packages/babel-preset-react/package.json index 378b3a0456..30a0158521 100644 --- a/packages/babel-preset-react/package.json +++ b/packages/babel-preset-react/package.json @@ -8,9 +8,8 @@ "repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-react", "main": "lib/index.js", "dependencies": { - "babel-plugin-syntax-flow": "^6.3.13", + "babel-preset-flow": "^6.22.2", "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-flow-strip-types": "^6.22.0", "babel-plugin-transform-react-display-name": "^6.22.0", "babel-plugin-transform-react-jsx": "^6.22.0", "babel-plugin-transform-react-jsx-source": "^6.22.0", diff --git a/packages/babel-preset-react/src/index.js b/packages/babel-preset-react/src/index.js index 55dd6bbd8d..361238658e 100644 --- a/packages/babel-preset-react/src/index.js +++ b/packages/babel-preset-react/src/index.js @@ -1,6 +1,5 @@ +import presetFlow from "babel-preset-flow"; import transformReactJSX from "babel-plugin-transform-react-jsx"; -import transformFlowStripTypes from "babel-plugin-transform-flow-strip-types"; -import transformSyntaxFlow from "babel-plugin-syntax-flow"; import transformSyntaxJSX from "babel-plugin-syntax-jsx"; import transformReactDisplayName from "babel-plugin-transform-react-display-name"; @@ -9,10 +8,11 @@ import transformReactDisplayName from "babel-plugin-transform-react-display-name // import transformReactJSXSelf from "babel-plugin-transform-react-jsx-self"; export default { + presets: [ + presetFlow + ], plugins: [ transformReactJSX, - transformFlowStripTypes, - transformSyntaxFlow, transformSyntaxJSX, transformReactDisplayName ], From eb91bd831c05443e3ad34b83ad405b9d8137c09a Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Mon, 13 Feb 2017 09:34:07 +0700 Subject: [PATCH 02/19] Fix PathHoister hoisting JSX member expressions on "this". (#5143) The PathHoister ignored member references on "this", causing it to potentially hoist an expression above its function scope. This patch tells the hoister to watch for "this", and if seen, mark the nearest non-arrow function scope as the upper limit for hoistng. This fixes #4397 and is an alternative to #4787. --- .../member-expression-constant/actual.js | 4 ++++ .../member-expression-constant/expected.js | 7 +++++++ .../member-expression-this/actual.js | 5 +++++ .../member-expression-this/expected.js | 12 ++++++++++++ .../member-expression-this/options.json | 3 +++ .../member-expression/actual.js | 6 ++++++ .../member-expression/expected.js | 16 ++++++++++++++++ .../member-expression/options.json | 3 +++ packages/babel-traverse/src/path/lib/hoister.js | 14 +++++++++++++- 9 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/options.json create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/options.json diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/actual.js new file mode 100644 index 0000000000..a6c1f9b6ec --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/actual.js @@ -0,0 +1,4 @@ +function render() { + this.component = "div"; + return () => ; +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/expected.js new file mode 100644 index 0000000000..aa7a9994ba --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-constant/expected.js @@ -0,0 +1,7 @@ +function render() { + this.component = "div"; + + var _ref = ; + + return () => _ref; +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/actual.js new file mode 100644 index 0000000000..bdc61d684a --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/actual.js @@ -0,0 +1,5 @@ +class Component extends React.Component { + subComponent = () => Sub Component + + render = () => +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/expected.js new file mode 100644 index 0000000000..9ce3a08e74 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/expected.js @@ -0,0 +1,12 @@ +var _ref = Sub Component; + +class Component extends React.Component { + constructor(...args) { + var _temp; + + var _ref2 = ; + + return _temp = super(...args), this.subComponent = () => _ref, this.render = () => _ref2, _temp; + } + +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/options.json b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/options.json new file mode 100644 index 0000000000..d4789bbda3 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression-this/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["syntax-jsx", "transform-react-constant-elements", "transform-class-properties"] +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/actual.js new file mode 100644 index 0000000000..2ab59df97b --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/actual.js @@ -0,0 +1,6 @@ +const els = { + subComponent: () => Sub Component +}; +class Component extends React.Component { + render = () => +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/expected.js new file mode 100644 index 0000000000..fe12eb988d --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/expected.js @@ -0,0 +1,16 @@ +var _ref = Sub Component; + +const els = { + subComponent: () => _ref +}; + +var _ref2 = ; + +class Component extends React.Component { + constructor(...args) { + var _temp; + + return _temp = super(...args), this.render = () => _ref2, _temp; + } + +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/options.json b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/options.json new file mode 100644 index 0000000000..d4789bbda3 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/member-expression/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["syntax-jsx", "transform-react-constant-elements", "transform-class-properties"] +} diff --git a/packages/babel-traverse/src/path/lib/hoister.js b/packages/babel-traverse/src/path/lib/hoister.js index 93b9323bd3..c7dbf5cf73 100644 --- a/packages/babel-traverse/src/path/lib/hoister.js +++ b/packages/babel-traverse/src/path/lib/hoister.js @@ -2,11 +2,23 @@ import { react } from "babel-types"; import * as t from "babel-types"; const referenceVisitor = { + // This visitor looks for bindings to establish a topmost scope for hoisting. ReferencedIdentifier(path, state) { - if (path.isJSXIdentifier() && react.isCompatTag(path.node.name)) { + // Don't hoist regular JSX identifiers ('div', 'span', etc). + // We do have to consider member expressions for hoisting (e.g. `this.component`) + if (path.isJSXIdentifier() && react.isCompatTag(path.node.name) && !path.parentPath.isJSXMemberExpression()) { return; } + // If the identifier refers to `this`, we need to break on the closest non-arrow scope. + if (path.node.name === "this") { + let scope = path.scope; + do { + if (scope.path.isFunction() && !scope.path.isArrowFunctionExpression()) break; + } while (scope = scope.parent); + if (scope) state.breakOnScopePaths.push(scope.path); + } + // direct references that we need to track to hoist this to the highest scope we can const binding = path.scope.getBinding(path.node.name); if (!binding) return; From f4e3dfee74e3160277c248c40f0b505ef04a7006 Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Mon, 13 Feb 2017 09:35:08 +0700 Subject: [PATCH 03/19] Fix PathHoister hoisting before bindings. (#5153) Fixes #5149 and enables a few additional safe hoists. --- .../expected.js | 17 ++--- .../expected.js | 18 +++--- .../dont-hoist-before-class/actual.js | 15 +++++ .../dont-hoist-before-class/expected.js | 13 ++++ .../dont-hoist-before-declaration/expected.js | 5 +- .../dont-hoist-before-hoc/actual.js | 18 ++++++ .../dont-hoist-before-hoc/expected.js | 18 ++++++ .../babel-traverse/src/path/lib/hoister.js | 62 ++++++++++++------- 8 files changed, 125 insertions(+), 41 deletions(-) create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/expected.js diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope-3/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope-3/expected.js index cceca3a5e8..46849febf6 100644 --- a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope-3/expected.js +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope-3/expected.js @@ -1,18 +1,19 @@ -var _ref =

Parent

; - var _ref2 =
child
; +var _ref3 =

Parent

; + (function () { class App extends React.Component { render() { - return
- {_ref} - -
; + return _ref; } } const AppItem = () => { return _ref2; - }; -}); + }, + _ref =
+ {_ref3} + +
; +}); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope/expected.js index 5fc8260845..fe04d4853f 100644 --- a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope/expected.js +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/append-to-end-when-declared-in-scope/expected.js @@ -1,16 +1,14 @@ -var _ref =

Parent

; - export default class App extends React.Component { render() { - return
- {_ref} - -
; + return _ref; } } -var _ref2 =
child
; - -const AppItem = () => { +const _ref2 =
child
, + AppItem = () => { return _ref2; -}; +}, + _ref =
+

Parent

+ +
; \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/actual.js new file mode 100644 index 0000000000..0bcdd9ef7c --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/actual.js @@ -0,0 +1,15 @@ +import React from "react"; + +const Parent = ({}) => ( +
+ +
+); + +export default Parent; + +let Child = () => ( +
+ ChildTextContent +
+); diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/expected.js new file mode 100644 index 0000000000..6bcd6e0ffb --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-class/expected.js @@ -0,0 +1,13 @@ +import React from "react"; + +const Parent = ({}) => _ref; + +export default Parent; + +let _ref2 =
+ ChildTextContent +
, + Child = () => _ref2, + _ref =
+ +
; diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-declaration/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-declaration/expected.js index d85f9f3244..45b91bd296 100644 --- a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-declaration/expected.js +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-declaration/expected.js @@ -8,8 +8,9 @@ function render() { function render() { const bar = "bar", - renderFoo = () => , - baz = "baz"; + renderFoo = () => _ref2, + baz = "baz", + _ref2 = ; return renderFoo(); } \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/actual.js new file mode 100644 index 0000000000..21f7b2ed90 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/actual.js @@ -0,0 +1,18 @@ +import React from "react"; + +const HOC = component => component; + +const Parent = ({}) => ( +
+ +
+); + +export default Parent; + +let Child = () => ( +
+ ChildTextContent +
+); +Child = HOC(Child); diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/expected.js new file mode 100644 index 0000000000..8da0cc5ad1 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-hoc/expected.js @@ -0,0 +1,18 @@ +import React from "react"; + +const HOC = component => component; + +const Parent = ({}) => _ref; + +export default Parent; + +var _ref2 =
+ ChildTextContent +
; + +let Child = () => _ref2; +Child = HOC(Child); + +var _ref =
+ +
; \ No newline at end of file diff --git a/packages/babel-traverse/src/path/lib/hoister.js b/packages/babel-traverse/src/path/lib/hoister.js index c7dbf5cf73..d39dcba7c0 100644 --- a/packages/babel-traverse/src/path/lib/hoister.js +++ b/packages/babel-traverse/src/path/lib/hoister.js @@ -27,25 +27,27 @@ const referenceVisitor = { // eg. it's in a closure etc if (binding !== state.scope.getBinding(path.node.name)) return; - if (binding.constant) { - state.bindings[path.node.name] = binding; - } else { - for (const violationPath of (binding.constantViolations: Array)) { - state.breakOnScopePaths = state.breakOnScopePaths.concat(violationPath.getAncestry()); - } - } + state.bindings[path.node.name] = binding; } }; export default class PathHoister { constructor(path, scope) { + // Storage for scopes we can't hoist above. this.breakOnScopePaths = []; + // Storage for bindings that may affect what path we can hoist to. this.bindings = {}; + // Storage for eligible scopes. this.scopes = []; + // Our original scope and path. this.scope = scope; this.path = path; + // By default, we attach as far up as we can; but if we're trying + // to avoid referencing a binding, we may have to go after. + this.attachAfter = false; } + // A scope is compatible if all required bindings are reachable. isCompatibleScope(scope) { for (const key in this.bindings) { const binding = this.bindings[key]; @@ -57,6 +59,7 @@ export default class PathHoister { return true; } + // Look through all scopes and push compatible ones. getCompatibleScopes() { let scope = this.path.scope; do { @@ -66,6 +69,7 @@ export default class PathHoister { break; } + // deopt: These scopes are set in the visitor on const violations if (this.breakOnScopePaths.indexOf(scope.path) >= 0) { break; } @@ -73,7 +77,7 @@ export default class PathHoister { } getAttachmentPath() { - const path = this._getAttachmentPath(); + let path = this._getAttachmentPath(); if (!path) return; let targetScope = path.scope; @@ -94,8 +98,18 @@ export default class PathHoister { // allow parameter references if (binding.kind === "param") continue; - // if this binding appears after our attachment point then don't hoist it - if (this.getAttachmentParentForPath(binding.path).key > path.key) return; + // if this binding appears after our attachment point, then we move after it. + if (this.getAttachmentParentForPath(binding.path).key > path.key) { + this.attachAfter = true; + path = binding.path; + + // We also move past any constant violations. + for (const violationPath of (binding.constantViolations: Array)) { + if (this.getAttachmentParentForPath(violationPath).key > path.key) { + path = violationPath; + } + } + } } } @@ -106,11 +120,12 @@ export default class PathHoister { const scopes = this.scopes; const scope = scopes.pop(); + // deopt: no compatible scopes if (!scope) return; if (scope.path.isFunction()) { if (this.hasOwnParamBindings(scope)) { - // should ignore this scope since it's ourselves + // deopt: should ignore this scope since it's ourselves if (this.scope === scope) return; // needs to be attached to the body @@ -129,26 +144,30 @@ export default class PathHoister { if (scope) return this.getAttachmentParentForPath(scope.path); } + // Find an attachment for this path. getAttachmentParentForPath(path) { do { - if (!path.parentPath || - (Array.isArray(path.container) && path.isStatement()) || - ( - path.isVariableDeclarator() && - path.parentPath.node !== null && - path.parentPath.node.declarations.length > 1 - ) - ) + if ( + // Beginning of the scope + !path.parentPath || + // Has siblings and is a statement + (Array.isArray(path.container) && path.isStatement()) || + // Is part of multiple var declarations + (path.isVariableDeclarator() && + path.parentPath.node !== null && + path.parentPath.node.declarations.length > 1)) return path; } while ((path = path.parentPath)); } + // Returns true if a scope has param bindings. hasOwnParamBindings(scope) { for (const name in this.bindings) { if (!scope.hasOwnBinding(name)) continue; const binding = this.bindings[name]; - if (binding.kind === "param") return true; + // Ensure constant; without it we could place behind a reassignment + if (binding.kind === "param" && binding.constant) return true; } return false; } @@ -173,7 +192,8 @@ export default class PathHoister { let uid = attachTo.scope.generateUidIdentifier("ref"); const declarator = t.variableDeclarator(uid, this.path.node); - attachTo.insertBefore([ + const insertFn = this.attachAfter ? "insertAfter" : "insertBefore"; + attachTo[insertFn]([ attachTo.isVariableDeclarator() ? declarator : t.variableDeclaration("var", [declarator]) ]); From 4edcd0296520197997699f4b6caa498937dd2d51 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Sun, 12 Feb 2017 18:48:07 -0800 Subject: [PATCH 04/19] Fix linting error --- packages/babel-traverse/src/path/lib/hoister.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/lib/hoister.js b/packages/babel-traverse/src/path/lib/hoister.js index d39dcba7c0..69154bbc2d 100644 --- a/packages/babel-traverse/src/path/lib/hoister.js +++ b/packages/babel-traverse/src/path/lib/hoister.js @@ -6,7 +6,11 @@ const referenceVisitor = { ReferencedIdentifier(path, state) { // Don't hoist regular JSX identifiers ('div', 'span', etc). // We do have to consider member expressions for hoisting (e.g. `this.component`) - if (path.isJSXIdentifier() && react.isCompatTag(path.node.name) && !path.parentPath.isJSXMemberExpression()) { + if ( + path.isJSXIdentifier() && + react.isCompatTag(path.node.name) && + !path.parentPath.isJSXMemberExpression() + ) { return; } From 2aa2de8c6f8ace49ab5a83a7cbab82dea90036a1 Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Mon, 13 Feb 2017 11:02:38 +0700 Subject: [PATCH 05/19] feature: Support pure expressions in transform-react-constant-elements (#4812) --- .../src/index.js | 28 +++++++++++++++++-- .../constant-elements/pure-deopt/actual.js | 5 ++++ .../constant-elements/pure-deopt/expected.js | 5 ++++ .../pure-expression-2/actual.js | 5 ++++ .../pure-expression-2/expected.js | 8 ++++++ .../pure-expression-3/actual.js | 10 +++++++ .../pure-expression-3/expected.js | 10 +++++++ .../pure-expression/actual.js | 11 ++++++++ .../pure-expression/expected.js | 8 ++++++ 9 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/expected.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/actual.js create mode 100644 packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/expected.js diff --git a/packages/babel-plugin-transform-react-constant-elements/src/index.js b/packages/babel-plugin-transform-react-constant-elements/src/index.js index a25fb67e6c..b38f2008d1 100644 --- a/packages/babel-plugin-transform-react-constant-elements/src/index.js +++ b/packages/babel-plugin-transform-react-constant-elements/src/index.js @@ -1,4 +1,4 @@ -export default function () { +export default function ({ types: t }) { const immutabilityVisitor = { enter(path, state) { const stop = () => { @@ -11,15 +11,39 @@ export default function () { return; } + // Elements with refs are not safe to hoist. if (path.isJSXIdentifier({ name: "ref" }) && path.parentPath.isJSXAttribute({ name: path.node })) { return stop(); } + // Ignore identifiers & JSX expressions. if (path.isJSXIdentifier() || path.isIdentifier() || path.isJSXMemberExpression()) { return; } - if (!path.isImmutable()) stop(); + if (!path.isImmutable()) { + // If it's not immutable, it may still be a pure expression, such as string concatenation. + // It is still safe to hoist that, so long as its result is immutable. + // If not, it is not safe to replace as mutable values (like objects) could be mutated after render. + // https://github.com/facebook/react/issues/3226 + if (path.isPure()) { + const expressionResult = path.evaluate(); + if (expressionResult.confident) { + // We know the result; check its mutability. + const { value } = expressionResult; + const isMutable = (value && typeof value === "object") || (typeof value === "function"); + if (!isMutable) { + // It evaluated to an immutable value, so we can hoist it. + return; + } + } else if (t.isIdentifier(expressionResult.deopt)) { + // It's safe to hoist here if the deopt reason is an identifier (e.g. func param). + // The hoister will take care of how high up it can be hoisted. + return; + } + } + stop(); + } } }; diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/actual.js new file mode 100644 index 0000000000..4df51832c7 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/actual.js @@ -0,0 +1,5 @@ +// https://github.com/facebook/react/issues/3226 +// Not safe to reuse because it is mutable +function render() { + return
; +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/expected.js new file mode 100644 index 0000000000..4df51832c7 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-deopt/expected.js @@ -0,0 +1,5 @@ +// https://github.com/facebook/react/issues/3226 +// Not safe to reuse because it is mutable +function render() { + return
; +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/actual.js new file mode 100644 index 0000000000..0acb75cfaf --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/actual.js @@ -0,0 +1,5 @@ +function render(offset) { + return function () { + return
; + }; +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/expected.js new file mode 100644 index 0000000000..65df627806 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-2/expected.js @@ -0,0 +1,8 @@ +function render(offset) { + var _ref =
; + + return function () { + return _ref; + }; +} + diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/actual.js new file mode 100644 index 0000000000..c6b89c77fd --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/actual.js @@ -0,0 +1,10 @@ +const OFFSET = 3; + +var Foo = React.createClass({ + render: function () { + return ( +
+ ); + } +}); + diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/expected.js new file mode 100644 index 0000000000..e709176c48 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression-3/expected.js @@ -0,0 +1,10 @@ +const OFFSET = 3; + +var _ref =
; + +var Foo = React.createClass({ + render: function () { + return _ref; + } +}); + diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/actual.js new file mode 100644 index 0000000000..5131c83989 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/actual.js @@ -0,0 +1,11 @@ +var Foo = React.createClass({ + render: function () { + return ( +
+ ); + } +}); + diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/expected.js new file mode 100644 index 0000000000..a7afcb1d6e --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/pure-expression/expected.js @@ -0,0 +1,8 @@ +var _ref =
; + +var Foo = React.createClass({ + render: function () { + return _ref; + } +}); + From ca45904a45e60fe4ebebeb4d0038041bb616f3c7 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 13 Feb 2017 10:30:36 -0500 Subject: [PATCH 06/19] Fix loose for-of with label (#5298) --- .../src/index.js | 18 +++++++---- .../loose/nested-label-for-of/actual.js | 5 +++ .../loose/nested-label-for-of/expected.js | 31 +++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/actual.js create mode 100644 packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/expected.js diff --git a/packages/babel-plugin-transform-es2015-for-of/src/index.js b/packages/babel-plugin-transform-es2015-for-of/src/index.js index 958eae6bce..b0b3a6bcbf 100644 --- a/packages/babel-plugin-transform-es2015-for-of/src/index.js +++ b/packages/babel-plugin-transform-es2015-for-of/src/index.js @@ -135,9 +135,8 @@ export default function ({ messages, template, types: t }) { }; function loose(path, file) { - const { node, scope } = path; - - const left = node.left; + const { node, scope, parent } = path; + const { left } = node; let declar, id; if (t.isIdentifier(left) || t.isPattern(left) || t.isMemberExpression(left)) { @@ -171,11 +170,18 @@ export default function ({ messages, template, types: t }) { } // + const isLabeledParent = t.isLabeledStatement(parent); + let labeled; + + if (isLabeledParent) { + labeled = t.labeledStatement(parent.label, loop); + } return { - declar: declar, - node: loop, - loop: loop + replaceParent: isLabeledParent, + declar: declar, + node: labeled || loop, + loop: loop }; } diff --git a/packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/actual.js b/packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/actual.js new file mode 100644 index 0000000000..73c8203449 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/actual.js @@ -0,0 +1,5 @@ +b: for (let c of d()) { + for (let e of f()) { + continue b; + } +} diff --git a/packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/expected.js b/packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/expected.js new file mode 100644 index 0000000000..e3e9396649 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-for-of/test/fixtures/loose/nested-label-for-of/expected.js @@ -0,0 +1,31 @@ +b: for (var _iterator = d(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + let c = _ref; + + for (var _iterator2 = f(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + let e = _ref2; + + continue b; + } +} From 2985597d40339daccd7cf7a2682c61e066a34c21 Mon Sep 17 00:00:00 2001 From: Yongxu Ren Date: Mon, 13 Feb 2017 15:49:10 -0500 Subject: [PATCH 07/19] Rewrite Hub as interface #5047 (#5050) * Rewrite Hub as interface #5047 * Update index.js --- .../src/transformation/file/index.js | 21 ++++++++++++++++--- packages/babel-traverse/src/hub.js | 14 ++++++++++--- packages/babel-traverse/src/index.js | 16 +++++++------- packages/babel-traverse/src/path/index.js | 10 ++++----- .../babel-traverse/src/path/introspection.js | 8 ++++--- packages/babel-traverse/src/scope/index.js | 9 ++++---- packages/babel-traverse/test/hub.js | 13 ++++++++++++ 7 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 packages/babel-traverse/test/hub.js diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 50b641c194..9866b147a8 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -6,7 +6,8 @@ import convertSourceMap from "convert-source-map"; import OptionManager from "./options/option-manager"; import type Pipeline from "../pipeline"; import PluginPass from "../plugin-pass"; -import { NodePath, Hub, Scope } from "babel-traverse"; +import { NodePath, Scope } from "babel-traverse"; +import type { HubInterface } from "babel-traverse"; import sourceMap from "source-map"; import generate from "babel-generator"; import codeFrame from "babel-code-frame"; @@ -98,7 +99,21 @@ export default class File extends Store { this.code = ""; this.shebang = ""; - this.hub = new Hub(this); + this.hub = { + // keep it for the usage in babel-core, ex: path.hub.file.opts.filename + file: this, + mark: (type: string, message: string, loc: Object) => { + this.metadata.marked.push({ + type, + message, + loc + }); + }, + addHelper: this.addHelper.bind(this), + getCode: () => this.code, + getScope: () => this.scope, + buildError: this.buildCodeFrameError.bind(this) + }; } static helpers: Array; @@ -118,7 +133,7 @@ export default class File extends Store { ast: Object; scope: Scope; metadata: BabelFileMetadata; - hub: Hub; + hub: HubInterface; code: string; shebang: string; diff --git a/packages/babel-traverse/src/hub.js b/packages/babel-traverse/src/hub.js index f05eaa8136..d4151a16ed 100644 --- a/packages/babel-traverse/src/hub.js +++ b/packages/babel-traverse/src/hub.js @@ -1,6 +1,14 @@ +import Scope from "./scope"; +export interface HubInterface { + mark?: (type: string, message: string) => void; + addHelper?: (name: string) => Object; + getScope?: () => Scope; + getCode?: () => string; + buildError:(node: Object, msg: string, Error: Error) => Error; +} + export default class Hub { - constructor(file, options) { - this.file = file; - this.options = options; + buildError(node, msg, BuildError = TypeError): Error { + return new BuildError(msg); } } diff --git a/packages/babel-traverse/src/index.js b/packages/babel-traverse/src/index.js index 1c5c96b58c..6d6215e308 100644 --- a/packages/babel-traverse/src/index.js +++ b/packages/babel-traverse/src/index.js @@ -5,10 +5,12 @@ import includes from "lodash/includes"; import * as t from "babel-types"; import * as cache from "./cache"; -export { default as NodePath } from "./path"; -export { default as Scope } from "./scope"; -export { default as Hub } from "./hub"; -export { visitors }; +import NodePath from "./path"; +import Scope from "./scope"; +import Hub from "./hub"; + +export { visitors, NodePath, Scope, Hub }; +export type { HubInterface } from "./hub"; export default function traverse( parent: Object | Array, @@ -35,9 +37,9 @@ traverse.visitors = visitors; traverse.verify = visitors.verify; traverse.explode = visitors.explode; -traverse.NodePath = require("./path"); -traverse.Scope = require("./scope"); -traverse.Hub = require("./hub"); +traverse.NodePath = NodePath; +traverse.Scope = Scope; +traverse.Hub = Hub; traverse.cheap = function (node, enter) { return t.traverseFast(node, enter); diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index c66d0e8482..41d60c3e47 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -114,7 +114,7 @@ export default class NodePath { } buildCodeFrameError(msg: string, Error: typeof Error = SyntaxError): Error { - return this.hub.file.buildCodeFrameError(this.node, msg, Error); + return this.hub.buildError(this.node, msg, Error); } traverse(visitor: Object, state?: any) { @@ -122,11 +122,9 @@ export default class NodePath { } mark(type: string, message: string) { - this.hub.file.metadata.marked.push({ - type, - message, - loc: this.node.loc - }); + if (this.hub.mark) { + this.hub.mark(type, message, this.node.loc); + } } set(key: string, node: Object) { diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index e8e54f18c0..0a722e61be 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -235,10 +235,12 @@ export function referencesImport(moduleSource, importName) { export function getSource() { const node = this.node; if (node.end) { - return this.hub.file.code.slice(node.start, node.end); - } else { - return ""; + const code = this.hub.getCode(); + if (code) { + return code.slice(node.start, node.end); + } } + return ""; } export function willIMaybeExecuteBefore(target) { diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index a0b26bc573..1df4c8e485 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -346,7 +346,8 @@ export default class Scope { local.kind === "param" && (kind === "let" || kind === "const"); if (duplicate) { - throw this.hub.file.buildCodeFrameError(id, messages.get("scopeDuplicateDeclaration", name), TypeError); + const errorMsg = messages.get("scopeDuplicateDeclaration", name); + throw this.hub.buildError ? this.hub.buildError(id, errorMsg, TypeError) : new TypeError(errorMsg); } } @@ -385,8 +386,6 @@ export default class Scope { } toArray(node: Object, i?: number) { - const file = this.hub.file; - if (t.isIdentifier(node)) { const binding = this.getBinding(node.name); if (binding && binding.constant && binding.path.isGenericType("Array")) return node; @@ -419,9 +418,9 @@ export default class Scope { } else if (i) { args.push(t.numericLiteral(i)); helperName = "slicedToArray"; - // TODO if (this.hub.file.isLoose("es6.forOf")) helperName += "-loose"; + // TODO if (this.hub.isLoose("es6.forOf")) helperName += "-loose"; } - return t.callExpression(file.addHelper(helperName), args); + return t.callExpression(this.hub.addHelper(helperName), args); } hasLabel(name: string) { diff --git a/packages/babel-traverse/test/hub.js b/packages/babel-traverse/test/hub.js new file mode 100644 index 0000000000..a3d67bb9d8 --- /dev/null +++ b/packages/babel-traverse/test/hub.js @@ -0,0 +1,13 @@ +const assert = require("assert"); +const Hub = require("../lib").default.Hub; + +describe("hub", function () { + it("default buildError should return TypeError", function () { + const hub = new Hub(); + const msg = "test_msg"; + assert.deepEqual( + hub.buildError(null, msg), + new TypeError(msg) + ); + }); +}); From 14d3c2e256246c306d916a171c2d1301c9b7989c Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Mon, 13 Feb 2017 13:46:00 -0800 Subject: [PATCH 08/19] Avoid adding unnecessary closure for block scoping (#5246) When you write ``` for (const x of l) { setTimeout(() => x); } ``` we need to add a closure because the variable is meant to be block-scoped and recreated each time the block runs. We do this. However, we also add the closure when no loop is present. This isn't necessary, because if no loop is present then each piece of code runs at most once. I changed the transform to only add a closure if a variable is referenced from within a loop. --- .../misc/regression-2364/actual.js | 2 +- .../misc/regression-2364/expected.js | 22 ++++---- .../src/index.js | 27 +++++++++- .../fixtures/general/issue-2174/expected.js | 14 +++--- .../general/loops-and-no-loops/actual.js | 34 +++++++++++++ .../general/loops-and-no-loops/expected.js | 42 ++++++++++++++++ .../fixtures/general/sibling-scopes/actual.js | 11 ++++ .../general/sibling-scopes/expected.js | 15 ++++++ .../fixtures/general/superswitch/actual.js | 24 +++++---- .../fixtures/general/superswitch/expected.js | 50 ++++++++++--------- .../general/switch-callbacks/actual.js | 14 +++--- .../general/switch-callbacks/expected.js | 26 +++++----- .../for-const-closure/expected.js | 6 +++ .../superswitch/actual.js | 16 ------ .../superswitch/options.json | 3 -- .../expected.js | 14 ++---- 16 files changed, 217 insertions(+), 103 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/actual.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/expected.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/actual.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/expected.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/for-const-closure/expected.js delete mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/actual.js delete mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/options.json diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-2364/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-2364/actual.js index e995e0d234..c2ae386b34 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-2364/actual.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-2364/actual.js @@ -1,6 +1,6 @@ function wrapper(fn) { return (...args) => { - if (someCondition) { + while (someCondition) { const val = fn(...args); return val.test(() => { console.log(val); diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-2364/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-2364/expected.js index ae32dbb4d3..c1079c01cb 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-2364/expected.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-2364/expected.js @@ -2,17 +2,19 @@ function wrapper(fn) { return function () { var _arguments = arguments; - if (someCondition) { - var _ret = function () { - var val = fn(..._arguments); - return { - v: val.test(function () { - console.log(val); - }) - }; - }(); + var _loop = function () { + var val = fn(..._arguments); + return { + v: val.test(function () { + console.log(val); + }) + }; + }; + + while (someCondition) { + var _ret = _loop(); if (typeof _ret === "object") return _ret.v; } }; -} \ No newline at end of file +} diff --git a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js index b1227d3a52..f633054622 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js @@ -112,8 +112,21 @@ function isVar(node) { } const letReferenceBlockVisitor = traverse.visitors.merge([{ + Loop: { + enter(path, state) { + state.loopDepth++; + }, + exit(path, state) { + state.loopDepth--; + }, + }, Function(path, state) { - path.traverse(letReferenceFunctionVisitor, state); + // References to block-scoped variables only require added closures if it's + // possible for the code to run more than once -- otherwise it is safe to + // simply rename the variables. + if (state.loopDepth > 0) { + path.traverse(letReferenceFunctionVisitor, state); + } return path.skip(); } }, tdzVisitor]); @@ -549,9 +562,19 @@ class BlockScoping { const state = { letReferences: this.letReferences, closurify: false, - file: this.file + file: this.file, + loopDepth: 0, }; + const loopOrFunctionParent = this.blockPath.find( + (path) => path.isLoop() || path.isFunction() + ); + if (loopOrFunctionParent && loopOrFunctionParent.isLoop()) { + // There is a loop ancestor closer than the closest function, so we + // consider ourselves to be in a loop. + state.loopDepth++; + } + // traverse through this block, stopping on functions and checking if they // contain any local let references this.blockPath.traverse(letReferenceBlockVisitor, state); diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-2174/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-2174/expected.js index 1dce9c4c17..9efbc1091f 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-2174/expected.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-2174/expected.js @@ -1,11 +1,9 @@ if (true) { - var x; + var foo = function () {}; - (function () { - function foo() {} - function bar() { - return foo; - } - for (x in {}) {} - })(); + var bar = function () { + return foo; + }; + + for (var x in {}) {} } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/actual.js new file mode 100644 index 0000000000..f030ac811d --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/actual.js @@ -0,0 +1,34 @@ +function foo() { + const x = 5; + console.log(x); + + { + const x = 7; + setTimeout(() => x, 0); + } +} + +function bar() { + const x = 5; + console.log(x); + + for (let i = 0; i < 7; i++) { + { + const x = i; + setTimeout(() => x, 0); + } + } +} + +function baz() { + const x = 5; + console.log(x); + + for (let i = 0; i < 7; i++) { + var qux = function qux(y) { + const x = y; + setTimeout(() => x, 0); + }; + qux(i); + } +} diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/expected.js new file mode 100644 index 0000000000..a86a2e4811 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/loops-and-no-loops/expected.js @@ -0,0 +1,42 @@ +function foo() { + var x = 5; + console.log(x); + + { + var _x = 7; + setTimeout(function () { + return _x; + }, 0); + } +} + +function bar() { + var x = 5; + console.log(x); + + for (var i = 0; i < 7; i++) { + { + (function () { + var x = i; + setTimeout(function () { + return x; + }, 0); + })(); + } + } +} + +function baz() { + var x = 5; + console.log(x); + + for (var i = 0; i < 7; i++) { + var qux = function qux(y) { + var x = y; + setTimeout(function () { + return x; + }, 0); + }; + qux(i); + } +} diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/actual.js new file mode 100644 index 0000000000..e3020dada7 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/actual.js @@ -0,0 +1,11 @@ +var f1, f2; +{ + let z = 'z1 value'; + f1 = function() { return z; }; +} +{ + let z = 'z2 value'; + f2 = function() { return z; }; +} +f1(); +f2(); diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/expected.js new file mode 100644 index 0000000000..8bbdfc7ddf --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/sibling-scopes/expected.js @@ -0,0 +1,15 @@ +var f1, f2; +{ + var z = 'z1 value'; + f1 = function () { + return z; + }; +} +{ + var _z = 'z2 value'; + f2 = function () { + return _z; + }; +} +f1(); +f2(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js index 857b8641f4..5dedf9a592 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js @@ -1,16 +1,18 @@ function foo() { - switch (2) { - case 0: { - if (true) { - return; - } + while (true) { + switch (2) { + case 0: { + if (true) { + return; + } - const stuff = new Map(); - const data = 0; - stuff.forEach(() => { - const d = data; - }); - break; + const stuff = new Map(); + const data = 0; + stuff.forEach(() => { + const d = data; + }); + break; + } } } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js index 05d7afe3d9..80b21eba9c 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js @@ -1,29 +1,31 @@ function foo() { - switch (2) { - case 0: - { - var _ret = function () { - if (true) { - return { - v: void 0 - }; + while (true) { + switch (2) { + case 0: + { + var _ret = function () { + if (true) { + return { + v: void 0 + }; + } + + var stuff = new Map(); + var data = 0; + stuff.forEach(function () { + var d = data; + }); + return "break"; + }(); + + switch (_ret) { + case "break": + break; + + default: + if (typeof _ret === "object") return _ret.v; } - - var stuff = new Map(); - var data = 0; - stuff.forEach(function () { - var d = data; - }); - return "break"; - }(); - - switch (_ret) { - case "break": - break; - - default: - if (typeof _ret === "object") return _ret.v; } - } + } } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/actual.js index c57bdc6e51..99f8726f05 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/actual.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/actual.js @@ -1,10 +1,12 @@ function fn() { - switch (true) { - default: - let foo = 4; - if (true) { - let bar = () => foo; - console.log(bar()); + while (true) { + switch (true) { + default: + let foo = 4; + if (true) { + let bar = () => foo; + console.log(bar()); + } } } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/expected.js index 2efd145af3..40f23daea6 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/expected.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/switch-callbacks/expected.js @@ -1,14 +1,16 @@ function fn() { - (function () { - switch (true) { - default: - var foo = 4; - if (true) { - var bar = function () { - return foo; - }; - console.log(bar()); - } - } - })(); + while (true) { + (function () { + switch (true) { + default: + var foo = 4; + if (true) { + var bar = function () { + return foo; + }; + console.log(bar()); + } + } + })(); + } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/for-const-closure/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/for-const-closure/expected.js new file mode 100644 index 0000000000..c28cb3bf74 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/for-const-closure/expected.js @@ -0,0 +1,6 @@ +for (var i = 0; i < 5; i++) { + var l = i; + setTimeout(function () { + console.log(l); + }, 1); +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/actual.js deleted file mode 100644 index 857b8641f4..0000000000 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/actual.js +++ /dev/null @@ -1,16 +0,0 @@ -function foo() { - switch (2) { - case 0: { - if (true) { - return; - } - - const stuff = new Map(); - const data = 0; - stuff.forEach(() => { - const d = data; - }); - break; - } - } -} diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/options.json b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/options.json deleted file mode 100644 index d210fdebfc..0000000000 --- a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/throwIfClosureRequired/superswitch/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Compiling let/const in this block would add a closure (throwIfClosureRequired)." -} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-block-scoped-variables/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-block-scoped-variables/expected.js index 9618e6da02..ab6ad7d4c4 100644 --- a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-block-scoped-variables/expected.js +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-block-scoped-variables/expected.js @@ -1,17 +1,11 @@ function render(flag) { if (flag) { - var _ret = function () { - var bar = "bar"; + var bar = "bar"; - [].map(() => bar); + [].map(() => bar); - return { - v: - }; - }(); - - if (typeof _ret === "object") return _ret.v; + return ; } return null; -} \ No newline at end of file +} From 6522a255d9bddf5bb925c6303c33df304803c4d3 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Mon, 13 Feb 2017 15:56:12 -0600 Subject: [PATCH 09/19] Add greenkeeperio-bot to mention-bot blacklist (#5301) [skip ci] --- .mention-bot | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.mention-bot b/.mention-bot index 32b2d0479e..671103a31c 100644 --- a/.mention-bot +++ b/.mention-bot @@ -1,5 +1,11 @@ { - "userBlacklist": [ "amasad", "thejameskyle", "jmm", "kittens" ], + "userBlacklist": [ + "amasad", + "greenkeeperio-bot", + "jmm", + "kittens", + "thejameskyle" + ], "fileBlacklist": ["*.md"], "skipAlreadyAssignedPR": true, "createReviewRequest": true From 8a28c07d20b90e421ec930b74f71946b205aff4f Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 14:01:57 -0800 Subject: [PATCH 10/19] Upgrade lerna to current beta. (#5300) --- lerna.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lerna.json b/lerna.json index 2858f12c31..90806c2590 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "lerna": "2.0.0-beta.23", + "lerna": "2.0.0-beta.37", "version": "6.22.2", "changelog": { "repo": "babel/babel", diff --git a/package.json b/package.json index 90db588cb8..240cdb5bec 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "gulp-plumber": "^1.0.1", "gulp-util": "^3.0.7", "gulp-watch": "^4.3.5", - "lerna": "2.0.0-beta.23", + "lerna": "2.0.0-beta.37", "lerna-changelog": "^0.2.0", "lodash": "^4.2.0", "mocha": "^3.0.0", From 1c1e9c764b2e92e708156ef1e5941f991bdcc8e6 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 14:20:10 -0800 Subject: [PATCH 11/19] Revert "Upgrade lerna to current beta." (#5303) --- lerna.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lerna.json b/lerna.json index 90806c2590..2858f12c31 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "lerna": "2.0.0-beta.37", + "lerna": "2.0.0-beta.23", "version": "6.22.2", "changelog": { "repo": "babel/babel", diff --git a/package.json b/package.json index 240cdb5bec..90db588cb8 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "gulp-plumber": "^1.0.1", "gulp-util": "^3.0.7", "gulp-watch": "^4.3.5", - "lerna": "2.0.0-beta.37", + "lerna": "2.0.0-beta.23", "lerna-changelog": "^0.2.0", "lodash": "^4.2.0", "mocha": "^3.0.0", From e1fee21529f89cf773fcbfa3063db357a6a0fda3 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 14:37:41 -0800 Subject: [PATCH 12/19] Add charset so tests work with convert-source-map@>1.4 (#5302) --- .../test/fixtures/transformation/source-maps/inline/expected.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js b/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js index 00ae47b875..991056b8bf 100644 --- a/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js +++ b/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js @@ -1,4 +1,4 @@ arr.map(function (x) { return x * x; }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvdXJjZS1tYXBzL2lubGluZS9hY3R1YWwuanMiXSwibmFtZXMiOlsiYXJyIiwibWFwIiwieCJdLCJtYXBwaW5ncyI6IkFBQUFBLElBQUlDLEdBQUosQ0FBUTtBQUFBLFNBQUtDLElBQUlBLENBQVQ7QUFBQSxDQUFSIiwiZmlsZSI6InNvdXJjZS1tYXBzL2lubGluZS9leHBlY3RlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImFyci5tYXAoeCA9PiB4ICogeCk7Il19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvdXJjZS1tYXBzL2lubGluZS9hY3R1YWwuanMiXSwibmFtZXMiOlsiYXJyIiwibWFwIiwieCJdLCJtYXBwaW5ncyI6IkFBQUFBLElBQUlDLEdBQUosQ0FBUTtBQUFBLFNBQUtDLElBQUlBLENBQVQ7QUFBQSxDQUFSIiwiZmlsZSI6InNvdXJjZS1tYXBzL2lubGluZS9leHBlY3RlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImFyci5tYXAoeCA9PiB4ICogeCk7Il19 From cc5750d151780e50421db0bdd00da12896e83086 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 14:57:26 -0800 Subject: [PATCH 13/19] Add CHANGELOG for 6.23.0 [skip ci] (#5304) --- CHANGELOG.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ff3de0e51..96d28278e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,96 @@ _Note: Gaps between patch versions are faulty, broken or test releases._ See [CHANGELOG - 6to5](CHANGELOG-6to5.md) for the pre-4.0.0 version changelog. +## 6.23.0 (2017-02-13) + +#### :rocket: New Feature +* `babel-plugin-transform-react-constant-elements` + * [#4812](https://github.com/babel/babel/pull/4812) feature: Support pure expressions in transform-react-constant-elements. ([@STRML](https://github.com/STRML)) +* `babel-preset-flow`, `babel-preset-react` + * [#5288](https://github.com/babel/babel/pull/5288) Add new flow preset. ([@thejameskyle](https://github.com/thejameskyle)) +* `babel-traverse` + * [#5230](https://github.com/babel/babel/pull/5230) Add path/family sibling traversal methods. ([@chitchu](https://github.com/chitchu)) +* `babel-plugin-transform-es2015-block-scoping` + * [#5236](https://github.com/babel/babel/pull/5236) Add option to block-scoping to throw on slow code. ([@spicyj](https://github.com/spicyj)) + +#### :bug: Bug Fix +* `babel-core`, `babel-traverse` + * [#5050](https://github.com/babel/babel/pull/5050) Rewrite Hub as interface #5047. ([@yongxu](https://github.com/yongxu)) +* `babel-plugin-transform-es2015-for-of` + * [#5298](https://github.com/babel/babel/pull/5298) Fix loose for-of with label. ([@jridgewell](https://github.com/jridgewell)) +* `babel-plugin-transform-react-constant-elements`, `babel-traverse` + * [#5153](https://github.com/babel/babel/pull/5153) Fix react constant elements bindings. ([@STRML](https://github.com/STRML)) + * [#5143](https://github.com/babel/babel/pull/5143) Fix PathHoister hoisting JSX member expressions on "this".. ([@STRML](https://github.com/STRML)) +* `babel-plugin-transform-do-expressions`, `babel-traverse` + * [#5030](https://github.com/babel/babel/pull/5030) Prevent multiple return statements in a loop when replacing expressions. ([@existentialism](https://github.com/existentialism)) +* `babel-register` + * [#5260](https://github.com/babel/babel/pull/5260) Fix TypeError with babel-register's cache. ([@xtuc](https://github.com/xtuc)) +* `babel-traverse` + * [#5206](https://github.com/babel/babel/pull/5206) Deopt evaluation of undefined with a local binding. Closes [#5204](https://github.com/babel/babel/issues/5204). ([@boopathi](https://github.com/boopathi)) +* `babel-plugin-transform-runtime` + * [#5195](https://github.com/babel/babel/pull/5195) Don't transpile ES7 symbol properties. ([@taion](https://github.com/taion)) +* `babel` + * [#5258](https://github.com/babel/babel/pull/5258) checks if babel is installed globally and displays correct cli message. ([@xtina-starr](https://github.com/xtina-starr)) +* `babel-generator` + * [#5270](https://github.com/babel/babel/pull/5270) Emit parens for await of ternary expressions. ([@erikdesjardins](https://github.com/erikdesjardins)) + * [#5193](https://github.com/babel/babel/pull/5193) Fix missing parens when function expressions is tag. ([@existentialism](https://github.com/existentialism)) +* `babel-plugin-transform-es2015-modules-commonjs` + * [#5235](https://github.com/babel/babel/pull/5235) Limit export node default assignment stack size #4323. ([@mattste](https://github.com/mattste)) + +#### :memo: Documentation +* `babel-*` + * [#5244](https://github.com/babel/babel/pull/5244) Normalize options sections in docs [skip ci]. ([@existentialism](https://github.com/existentialism)) + * [#5216](https://github.com/babel/babel/pull/5216) Remove link to REPL. ([@xtuc](https://github.com/xtuc)) +* Other + * [#5242](https://github.com/babel/babel/pull/5242) Add our business model [skip ci]. ([@hzoo](https://github.com/hzoo)) +* `babel-plugin-transform-es2015-spread` + * [#5227](https://github.com/babel/babel/pull/5227) Add example to spread README [skip ci]. ([@finkef](https://github.com/finkef)) +* `babel-plugin-transform-flow-strip-types` + * [#5212](https://github.com/babel/babel/pull/5212) Remove REPL link transform-flow-strip-types doc. ([@xtuc](https://github.com/xtuc)) +* `babel-plugin-transform-regenerator` + * [#5202](https://github.com/babel/babel/pull/5202) Fix transform-regenerator README. ([@xtuc](https://github.com/xtuc)) +* `babel-plugin-transform-es2015-arrow-functions` + * [#5200](https://github.com/babel/babel/pull/5200) Fix transform-es2015-arrow-functions code blocks on the website. ([@xtuc](https://github.com/xtuc)) + * [#5194](https://github.com/babel/babel/pull/5194) Fix transform-es2015-arrow-functions README. ([@xtuc](https://github.com/xtuc)) + +#### :house: Internal +* `babel-core` + * [#5302](https://github.com/babel/babel/pull/5302) Add charset so tests work with convert-source-map@>1.4. ([@loganfsmyth](https://github.com/loganfsmyth)) +* `babel-core`, `babel-traverse` + * [#5050](https://github.com/babel/babel/pull/5050) Rewrite Hub as interface #5047. ([@yongxu](https://github.com/yongxu)) +* `babel-generator` + * [#5255](https://github.com/babel/babel/pull/5255) codegen performance: use trim instead of lodash/trimEnd. ([@jwbay](https://github.com/jwbay)) +* `babel-types` + * [#5181](https://github.com/babel/babel/pull/5181) Remove uses of lodash/compact. ([@zertosh](https://github.com/zertosh)) +* `babel-*` + * [#5265](https://github.com/babel/babel/pull/5265) Re-enable the max-len ESLint rule.. ([@loganfsmyth](https://github.com/loganfsmyth)) +* Other + * [#5264](https://github.com/babel/babel/pull/5264) Add a sublime project file. ([@loganfsmyth](https://github.com/loganfsmyth)) + * [#5182](https://github.com/babel/babel/pull/5182) Run coverage only once. ([@existentialism](https://github.com/existentialism)) + * [#5165](https://github.com/babel/babel/pull/5165) Add Node 7 to CI. ([@chicoxyzzy](https://github.com/chicoxyzzy)) + +#### Committers: 20 +- Andres Suarez ([zertosh](https://github.com/zertosh)) +- Ben Alpert ([spicyj](https://github.com/spicyj)) +- Boopathi Rajaa ([boopathi](https://github.com/boopathi)) +- Brian Ng ([existentialism](https://github.com/existentialism)) +- Christina ([xtina-starr](https://github.com/xtina-starr)) +- Erik Desjardins ([erikdesjardins](https://github.com/erikdesjardins)) +- Fabian Finke ([finkef](https://github.com/finkef)) +- Henry Zhu ([hzoo](https://github.com/hzoo)) +- Jimmy Jia ([taion](https://github.com/taion)) +- Justin Ridgewell ([jridgewell](https://github.com/jridgewell)) +- Logan Smyth ([loganfsmyth](https://github.com/loganfsmyth)) +- Matt Stewart ([mattste](https://github.com/mattste)) +- Samuel Reed ([STRML](https://github.com/STRML)) +- Sergey Rubanov ([chicoxyzzy](https://github.com/chicoxyzzy)) +- Sven SAULEAU ([xtuc](https://github.com/xtuc)) +- Vicente Jr Yuchitcho ([chitchu](https://github.com/chitchu)) +- Yongxu Ren ([yongxu](https://github.com/yongxu)) +- [jwbay](https://github.com/jwbay) +- james kyle ([thejameskyle](https://github.com/thejameskyle)) +- Łukasz Lityński ([hex13](https://github.com/hex13)) + ## 6.22.2 (2017-01-19) #### :bug: Bug Fix From 24400c5b66d002945739e90197ee1ab6cec5ce25 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 15:00:37 -0800 Subject: [PATCH 14/19] Update babel-types README from script. --- packages/babel-types/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/babel-types/README.md b/packages/babel-types/README.md index 13b2ec3a5a..6833883629 100644 --- a/packages/babel-types/README.md +++ b/packages/babel-types/README.md @@ -930,6 +930,7 @@ Aliases: `ModuleSpecifier` - `local`: `Identifier` (required) - `imported`: `Identifier` (required) + - `importKind`: `null | 'type' | 'typeof'` (default: `null`) --- From 48573f1fb4e632add2c000bec3f95d88ebea4440 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 17:14:12 -0800 Subject: [PATCH 15/19] v6.23.0 --- lerna.json | 4 ++-- packages/babel-cli/package.json | 8 ++++---- packages/babel-core/package.json | 20 +++++++++---------- packages/babel-generator/package.json | 6 +++--- .../package.json | 4 ++-- packages/babel-helper-define-map/package.json | 6 +++--- .../babel-helper-function-name/package.json | 8 ++++---- .../package.json | 4 ++-- .../babel-helper-replace-supers/package.json | 12 +++++------ .../package.json | 6 +++--- packages/babel-helpers/package.json | 4 ++-- packages/babel-messages/package.json | 2 +- .../package.json | 6 +++--- .../package.json | 8 ++++---- .../package.json | 18 ++++++++--------- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 6 +++--- .../package.json | 4 ++-- .../package.json | 4 ++-- .../package.json | 8 ++++---- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 4 ++-- .../package.json | 2 +- packages/babel-polyfill/package.json | 2 +- packages/babel-preset-flow/package.json | 2 +- packages/babel-preset-react/package.json | 8 ++++---- packages/babel-register/package.json | 4 ++-- packages/babel-template/package.json | 6 +++--- packages/babel-traverse/package.json | 8 ++++---- packages/babel-types/package.json | 2 +- packages/babel/package.json | 2 +- 36 files changed, 96 insertions(+), 96 deletions(-) diff --git a/lerna.json b/lerna.json index 2858f12c31..bbf4c7ff5b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { - "lerna": "2.0.0-beta.23", - "version": "6.22.2", + "lerna": "2.0.0-beta.37", + "version": "6.23.0", "changelog": { "repo": "babel/babel", "labels": { diff --git a/packages/babel-cli/package.json b/packages/babel-cli/package.json index f06fccc0be..b2f56d6cfa 100644 --- a/packages/babel-cli/package.json +++ b/packages/babel-cli/package.json @@ -1,6 +1,6 @@ { "name": "babel-cli", - "version": "6.22.2", + "version": "6.23.0", "description": "Babel command line.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -16,9 +16,9 @@ "compiler" ], "dependencies": { - "babel-core": "^6.22.1", - "babel-register": "^6.22.0", - "babel-polyfill": "^6.22.0", + "babel-core": "^6.23.0", + "babel-register": "^6.23.0", + "babel-polyfill": "^6.23.0", "babel-runtime": "^6.22.0", "commander": "^2.8.1", "convert-source-map": "^1.1.0", diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index a9cbeb1f8b..bc6c623098 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -1,6 +1,6 @@ { "name": "babel-core", - "version": "6.22.1", + "version": "6.23.0", "description": "Babel compiler core.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -27,14 +27,14 @@ }, "dependencies": { "babel-code-frame": "^6.22.0", - "babel-generator": "^6.22.0", - "babel-helpers": "^6.22.0", - "babel-messages": "^6.22.0", - "babel-template": "^6.22.0", + "babel-generator": "^6.23.0", + "babel-helpers": "^6.23.0", + "babel-messages": "^6.23.0", + "babel-template": "^6.23.0", "babel-runtime": "^6.22.0", - "babel-register": "^6.22.0", - "babel-traverse": "^6.22.1", - "babel-types": "^6.22.0", + "babel-register": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0", "babylon": "^6.11.0", "convert-source-map": "^1.1.0", "debug": "^2.1.1", @@ -48,7 +48,7 @@ }, "devDependencies": { "babel-helper-fixtures": "^6.22.0", - "babel-helper-transform-fixture-test-runner": "^6.22.0", - "babel-polyfill": "^6.22.0" + "babel-helper-transform-fixture-test-runner": "^6.23.0", + "babel-polyfill": "^6.23.0" } } diff --git a/packages/babel-generator/package.json b/packages/babel-generator/package.json index c55b973d6d..0212353f43 100644 --- a/packages/babel-generator/package.json +++ b/packages/babel-generator/package.json @@ -1,6 +1,6 @@ { "name": "babel-generator", - "version": "6.22.0", + "version": "6.23.0", "description": "Turns an AST into code.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -11,9 +11,9 @@ "lib" ], "dependencies": { - "babel-messages": "^6.22.0", + "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", - "babel-types": "^6.22.0", + "babel-types": "^6.23.0", "detect-indent": "^4.0.0", "jsesc": "^1.3.0", "lodash": "^4.2.0", diff --git a/packages/babel-helper-builder-react-jsx/package.json b/packages/babel-helper-builder-react-jsx/package.json index 96eda6166a..6fed8d9b0d 100644 --- a/packages/babel-helper-builder-react-jsx/package.json +++ b/packages/babel-helper-builder-react-jsx/package.json @@ -1,13 +1,13 @@ { "name": "babel-helper-builder-react-jsx", - "version": "6.22.0", + "version": "6.23.0", "description": "Helper function to build react jsx", "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-builder-react-jsx", "license": "MIT", "main": "lib/index.js", "dependencies": { "babel-runtime": "^6.22.0", - "babel-types": "^6.22.0", + "babel-types": "^6.23.0", "esutils": "^2.0.0", "lodash": "^4.2.0" } diff --git a/packages/babel-helper-define-map/package.json b/packages/babel-helper-define-map/package.json index 615b8f7a05..d90b57f8b8 100644 --- a/packages/babel-helper-define-map/package.json +++ b/packages/babel-helper-define-map/package.json @@ -1,6 +1,6 @@ { "name": "babel-helper-define-map", - "version": "6.22.0", + "version": "6.23.0", "description": "Helper function to define a map", "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-define-map", "license": "MIT", @@ -8,7 +8,7 @@ "dependencies": { "babel-runtime": "^6.22.0", "lodash": "^4.2.0", - "babel-types": "^6.22.0", - "babel-helper-function-name": "^6.22.0" + "babel-types": "^6.23.0", + "babel-helper-function-name": "^6.23.0" } } diff --git a/packages/babel-helper-function-name/package.json b/packages/babel-helper-function-name/package.json index a6482601d9..d131f2e387 100644 --- a/packages/babel-helper-function-name/package.json +++ b/packages/babel-helper-function-name/package.json @@ -1,15 +1,15 @@ { "name": "babel-helper-function-name", - "version": "6.22.0", + "version": "6.23.0", "description": "Helper function to change the property 'name' of every function", "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-function-name", "license": "MIT", "main": "lib/index.js", "dependencies": { "babel-runtime": "^6.22.0", - "babel-types": "^6.22.0", - "babel-traverse": "^6.22.0", + "babel-types": "^6.23.0", + "babel-traverse": "^6.23.0", "babel-helper-get-function-arity": "^6.22.0", - "babel-template": "^6.22.0" + "babel-template": "^6.23.0" } } diff --git a/packages/babel-helper-optimise-call-expression/package.json b/packages/babel-helper-optimise-call-expression/package.json index a033ad6dd9..888f412beb 100644 --- a/packages/babel-helper-optimise-call-expression/package.json +++ b/packages/babel-helper-optimise-call-expression/package.json @@ -1,12 +1,12 @@ { "name": "babel-helper-optimise-call-expression", - "version": "6.22.0", + "version": "6.23.0", "description": "Helper function to optimise call expression", "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-optimise-call-expression", "license": "MIT", "main": "lib/index.js", "dependencies": { "babel-runtime": "^6.22.0", - "babel-types": "^6.22.0" + "babel-types": "^6.23.0" } } diff --git a/packages/babel-helper-replace-supers/package.json b/packages/babel-helper-replace-supers/package.json index e9fd9c65eb..2401573e5d 100644 --- a/packages/babel-helper-replace-supers/package.json +++ b/packages/babel-helper-replace-supers/package.json @@ -1,16 +1,16 @@ { "name": "babel-helper-replace-supers", - "version": "6.22.0", + "version": "6.23.0", "description": "Helper function to replace supers", "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-replace-supers", "license": "MIT", "main": "lib/index.js", "dependencies": { - "babel-helper-optimise-call-expression": "^6.22.0", + "babel-helper-optimise-call-expression": "^6.23.0", "babel-runtime": "^6.22.0", - "babel-traverse": "^6.22.0", - "babel-messages": "^6.22.0", - "babel-template": "^6.22.0", - "babel-types": "^6.22.0" + "babel-traverse": "^6.23.0", + "babel-messages": "^6.23.0", + "babel-template": "^6.23.0", + "babel-types": "^6.23.0" } } diff --git a/packages/babel-helper-transform-fixture-test-runner/package.json b/packages/babel-helper-transform-fixture-test-runner/package.json index 61e7603096..6b4b60f922 100644 --- a/packages/babel-helper-transform-fixture-test-runner/package.json +++ b/packages/babel-helper-transform-fixture-test-runner/package.json @@ -1,6 +1,6 @@ { "name": "babel-helper-transform-fixture-test-runner", - "version": "6.22.0", + "version": "6.23.0", "description": "Transform test runner for babel-helper-fixtures module", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -9,8 +9,8 @@ "main": "lib/index.js", "dependencies": { "babel-runtime": "^6.22.0", - "babel-core": "^6.22.0", - "babel-polyfill": "^6.22.0", + "babel-core": "^6.23.0", + "babel-polyfill": "^6.23.0", "babel-helper-fixtures": "^6.22.0", "source-map": "^0.5.0", "babel-code-frame": "^6.22.0", diff --git a/packages/babel-helpers/package.json b/packages/babel-helpers/package.json index a88c869426..15172747db 100644 --- a/packages/babel-helpers/package.json +++ b/packages/babel-helpers/package.json @@ -1,6 +1,6 @@ { "name": "babel-helpers", - "version": "6.22.0", + "version": "6.23.0", "description": "Collection of helper functions used by Babel transforms.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -9,6 +9,6 @@ "main": "lib/index.js", "dependencies": { "babel-runtime": "^6.22.0", - "babel-template": "^6.22.0" + "babel-template": "^6.23.0" } } diff --git a/packages/babel-messages/package.json b/packages/babel-messages/package.json index 13f11c756a..348dc5ee01 100644 --- a/packages/babel-messages/package.json +++ b/packages/babel-messages/package.json @@ -1,6 +1,6 @@ { "name": "babel-messages", - "version": "6.22.0", + "version": "6.23.0", "description": "Collection of debug messages used by Babel.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", diff --git a/packages/babel-plugin-transform-class-properties/package.json b/packages/babel-plugin-transform-class-properties/package.json index 6bb3fd5012..6b7df0db15 100644 --- a/packages/babel-plugin-transform-class-properties/package.json +++ b/packages/babel-plugin-transform-class-properties/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-class-properties", - "version": "6.22.0", + "version": "6.23.0", "description": "This plugin transforms static class properties as well as properties declared with the property initializer syntax", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-class-properties", "license": "MIT", @@ -9,10 +9,10 @@ "babel-plugin" ], "dependencies": { - "babel-helper-function-name": "^6.22.0", + "babel-helper-function-name": "^6.23.0", "babel-plugin-syntax-class-properties": "^6.8.0", "babel-runtime": "^6.22.0", - "babel-template": "^6.22.0" + "babel-template": "^6.23.0" }, "devDependencies": { "babel-helper-plugin-test-runner": "^6.22.0" diff --git a/packages/babel-plugin-transform-es2015-block-scoping/package.json b/packages/babel-plugin-transform-es2015-block-scoping/package.json index 15bedf9241..df7f3c7875 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/package.json +++ b/packages/babel-plugin-transform-es2015-block-scoping/package.json @@ -1,14 +1,14 @@ { "name": "babel-plugin-transform-es2015-block-scoping", - "version": "6.22.0", + "version": "6.23.0", "description": "Compile ES2015 block scoping (const and let) to ES5", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-block-scoping", "license": "MIT", "main": "lib/index.js", "dependencies": { - "babel-traverse": "^6.22.0", - "babel-types": "^6.22.0", - "babel-template": "^6.22.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0", + "babel-template": "^6.23.0", "lodash": "^4.2.0", "babel-runtime": "^6.22.0" }, diff --git a/packages/babel-plugin-transform-es2015-classes/package.json b/packages/babel-plugin-transform-es2015-classes/package.json index 7288800d7e..d07efab036 100644 --- a/packages/babel-plugin-transform-es2015-classes/package.json +++ b/packages/babel-plugin-transform-es2015-classes/package.json @@ -1,20 +1,20 @@ { "name": "babel-plugin-transform-es2015-classes", - "version": "6.22.0", + "version": "6.23.0", "description": "Compile ES2015 classes to ES5", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-classes", "license": "MIT", "main": "lib/index.js", "dependencies": { - "babel-helper-optimise-call-expression": "^6.22.0", - "babel-helper-function-name": "^6.22.0", - "babel-helper-replace-supers": "^6.22.0", - "babel-template": "^6.22.0", - "babel-traverse": "^6.22.0", - "babel-helper-define-map": "^6.22.0", - "babel-messages": "^6.22.0", + "babel-helper-optimise-call-expression": "^6.23.0", + "babel-helper-function-name": "^6.23.0", + "babel-helper-replace-supers": "^6.23.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-helper-define-map": "^6.23.0", + "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", - "babel-types": "^6.22.0" + "babel-types": "^6.23.0" }, "keywords": [ "babel-plugin" diff --git a/packages/babel-plugin-transform-es2015-destructuring/package.json b/packages/babel-plugin-transform-es2015-destructuring/package.json index 1eb1c832d7..93ab9d2b84 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/package.json +++ b/packages/babel-plugin-transform-es2015-destructuring/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-es2015-destructuring", - "version": "6.22.0", + "version": "6.23.0", "description": "Compile ES2015 destructuring to ES5", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-destructuring", "license": "MIT", diff --git a/packages/babel-plugin-transform-es2015-for-of/package.json b/packages/babel-plugin-transform-es2015-for-of/package.json index 5c1aa3b7e4..470a7f998b 100644 --- a/packages/babel-plugin-transform-es2015-for-of/package.json +++ b/packages/babel-plugin-transform-es2015-for-of/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-es2015-for-of", - "version": "6.22.0", + "version": "6.23.0", "description": "Compile ES2015 for...of to ES5", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-for-of", "license": "MIT", diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/package.json b/packages/babel-plugin-transform-es2015-modules-commonjs/package.json index d27c57c5af..574befaf5f 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/package.json +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/package.json @@ -1,14 +1,14 @@ { "name": "babel-plugin-transform-es2015-modules-commonjs", - "version": "6.22.0", + "version": "6.23.0", "description": "This plugin transforms ES2015 modules to CommonJS", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-modules-commonjs", "license": "MIT", "main": "lib/index.js", "dependencies": { - "babel-types": "^6.22.0", + "babel-types": "^6.23.0", "babel-runtime": "^6.22.0", - "babel-template": "^6.22.0", + "babel-template": "^6.23.0", "babel-plugin-transform-strict-mode": "^6.22.0" }, "keywords": [ diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/package.json b/packages/babel-plugin-transform-es2015-modules-systemjs/package.json index 4a2955ebfc..a4d7b43764 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/package.json +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/package.json @@ -1,12 +1,12 @@ { "name": "babel-plugin-transform-es2015-modules-systemjs", - "version": "6.22.0", + "version": "6.23.0", "description": "This plugin transforms ES2015 modules to SystemJS", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-modules-systemjs", "license": "MIT", "main": "lib/index.js", "dependencies": { - "babel-template": "^6.22.0", + "babel-template": "^6.23.0", "babel-helper-hoist-variables": "^6.22.0", "babel-runtime": "^6.22.0" }, diff --git a/packages/babel-plugin-transform-es2015-modules-umd/package.json b/packages/babel-plugin-transform-es2015-modules-umd/package.json index 1fc3b03b9b..8c424e9f1e 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/package.json +++ b/packages/babel-plugin-transform-es2015-modules-umd/package.json @@ -1,13 +1,13 @@ { "name": "babel-plugin-transform-es2015-modules-umd", - "version": "6.22.0", + "version": "6.23.0", "description": "This plugin transforms ES2015 modules to UMD", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-modules-umd", "license": "MIT", "main": "lib/index.js", "dependencies": { "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-template": "^6.22.0", + "babel-template": "^6.23.0", "babel-runtime": "^6.22.0" }, "keywords": [ diff --git a/packages/babel-plugin-transform-es2015-parameters/package.json b/packages/babel-plugin-transform-es2015-parameters/package.json index 4715c8086b..f88d30c684 100644 --- a/packages/babel-plugin-transform-es2015-parameters/package.json +++ b/packages/babel-plugin-transform-es2015-parameters/package.json @@ -1,16 +1,16 @@ { "name": "babel-plugin-transform-es2015-parameters", - "version": "6.22.0", + "version": "6.23.0", "description": "Compile ES2015 default and rest parameters to ES5", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-parameters", "license": "MIT", "main": "lib/index.js", "dependencies": { - "babel-traverse": "^6.22.0", + "babel-traverse": "^6.23.0", "babel-helper-call-delegate": "^6.22.0", "babel-helper-get-function-arity": "^6.22.0", - "babel-template": "^6.22.0", - "babel-types": "^6.22.0", + "babel-template": "^6.23.0", + "babel-types": "^6.23.0", "babel-runtime": "^6.22.0" }, "keywords": [ diff --git a/packages/babel-plugin-transform-es2015-typeof-symbol/package.json b/packages/babel-plugin-transform-es2015-typeof-symbol/package.json index db7ba27eb0..7a4f28427f 100644 --- a/packages/babel-plugin-transform-es2015-typeof-symbol/package.json +++ b/packages/babel-plugin-transform-es2015-typeof-symbol/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-es2015-typeof-symbol", - "version": "6.22.0", + "version": "6.23.0", "description": "This transformer wraps all typeof expressions with a method that replicates native behaviour. (ie. returning “symbol” for symbols)", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-typeof-symbol", "license": "MIT", diff --git a/packages/babel-plugin-transform-object-rest-spread/package.json b/packages/babel-plugin-transform-object-rest-spread/package.json index 9052c3e695..adb9254d9a 100644 --- a/packages/babel-plugin-transform-object-rest-spread/package.json +++ b/packages/babel-plugin-transform-object-rest-spread/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-object-rest-spread", - "version": "6.22.0", + "version": "6.23.0", "description": "Compile object rest and spread to ES5", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-object-rest-spread", "license": "MIT", diff --git a/packages/babel-plugin-transform-proto-to-assign/package.json b/packages/babel-plugin-transform-proto-to-assign/package.json index e26181cc7b..565d5620f4 100644 --- a/packages/babel-plugin-transform-proto-to-assign/package.json +++ b/packages/babel-plugin-transform-proto-to-assign/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-proto-to-assign", - "version": "6.22.0", + "version": "6.23.0", "description": "Babel plugin for turning __proto__ into a shallow property clone", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-proto-to-assign", "license": "MIT", diff --git a/packages/babel-plugin-transform-react-constant-elements/package.json b/packages/babel-plugin-transform-react-constant-elements/package.json index fe30acd07f..da8f1e9894 100644 --- a/packages/babel-plugin-transform-react-constant-elements/package.json +++ b/packages/babel-plugin-transform-react-constant-elements/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-react-constant-elements", - "version": "6.22.0", + "version": "6.23.0", "description": "Treat React JSX elements as value types and hoist them to the highest scope", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-react-constant-elements", "license": "MIT", diff --git a/packages/babel-plugin-transform-react-display-name/package.json b/packages/babel-plugin-transform-react-display-name/package.json index 150a8e3f2f..ecabbc98c3 100644 --- a/packages/babel-plugin-transform-react-display-name/package.json +++ b/packages/babel-plugin-transform-react-display-name/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-react-display-name", - "version": "6.22.0", + "version": "6.23.0", "description": "Add displayName to React.createClass calls", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-react-display-name", "license": "MIT", diff --git a/packages/babel-plugin-transform-react-jsx/package.json b/packages/babel-plugin-transform-react-jsx/package.json index 0b242a701e..b6a25a2dc5 100644 --- a/packages/babel-plugin-transform-react-jsx/package.json +++ b/packages/babel-plugin-transform-react-jsx/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-react-jsx", - "version": "6.22.0", + "version": "6.23.0", "description": "Turn JSX into React function calls", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-react-jsx", "license": "MIT", @@ -10,7 +10,7 @@ ], "dependencies": { "babel-runtime": "^6.22.0", - "babel-helper-builder-react-jsx": "^6.22.0", + "babel-helper-builder-react-jsx": "^6.23.0", "babel-plugin-syntax-jsx": "^6.8.0" }, "devDependencies": { diff --git a/packages/babel-plugin-transform-runtime/package.json b/packages/babel-plugin-transform-runtime/package.json index 9f01577ebd..4ca28143bf 100644 --- a/packages/babel-plugin-transform-runtime/package.json +++ b/packages/babel-plugin-transform-runtime/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-transform-runtime", - "version": "6.22.0", + "version": "6.23.0", "description": "Externalise references to helpers and builtins, automatically polyfilling your code without polluting globals", "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-runtime", "license": "MIT", diff --git a/packages/babel-polyfill/package.json b/packages/babel-polyfill/package.json index 5e74561a7a..377f0b1601 100644 --- a/packages/babel-polyfill/package.json +++ b/packages/babel-polyfill/package.json @@ -1,6 +1,6 @@ { "name": "babel-polyfill", - "version": "6.22.0", + "version": "6.23.0", "description": "Provides polyfills necessary for a full ES2015+ environment", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", diff --git a/packages/babel-preset-flow/package.json b/packages/babel-preset-flow/package.json index c5503cf2d1..e9f4cb5979 100644 --- a/packages/babel-preset-flow/package.json +++ b/packages/babel-preset-flow/package.json @@ -1,6 +1,6 @@ { "name": "babel-preset-flow", - "version": "6.22.2", + "version": "6.23.0", "description": "Babel preset for all Flow plugins.", "author": "James Kyle ", "repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-flow", diff --git a/packages/babel-preset-react/package.json b/packages/babel-preset-react/package.json index 30a0158521..1a4bf7c55d 100644 --- a/packages/babel-preset-react/package.json +++ b/packages/babel-preset-react/package.json @@ -1,6 +1,6 @@ { "name": "babel-preset-react", - "version": "6.22.0", + "version": "6.23.0", "description": "Babel preset for all React plugins.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -8,10 +8,10 @@ "repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-react", "main": "lib/index.js", "dependencies": { - "babel-preset-flow": "^6.22.2", + "babel-preset-flow": "^6.23.0", "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.22.0", - "babel-plugin-transform-react-jsx": "^6.22.0", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.23.0", "babel-plugin-transform-react-jsx-source": "^6.22.0", "babel-plugin-transform-react-jsx-self": "^6.22.0" } diff --git a/packages/babel-register/package.json b/packages/babel-register/package.json index 1bef5676c5..762d9a3360 100644 --- a/packages/babel-register/package.json +++ b/packages/babel-register/package.json @@ -1,6 +1,6 @@ { "name": "babel-register", - "version": "6.22.0", + "version": "6.23.0", "description": "babel require hook", "license": "MIT", "repository": "https://github.com/babel/babel/tree/master/packages/babel-register", @@ -8,7 +8,7 @@ "main": "lib/node.js", "browser": "lib/browser.js", "dependencies": { - "babel-core": "^6.22.0", + "babel-core": "^6.23.0", "babel-runtime": "^6.22.0", "core-js": "^2.4.0", "home-or-tmp": "^2.0.0", diff --git a/packages/babel-template/package.json b/packages/babel-template/package.json index 956384f9ee..4de89280f4 100644 --- a/packages/babel-template/package.json +++ b/packages/babel-template/package.json @@ -1,6 +1,6 @@ { "name": "babel-template", - "version": "6.22.0", + "version": "6.23.0", "description": "Generate an AST from a string template.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -9,8 +9,8 @@ "main": "lib/index.js", "dependencies": { "babylon": "^6.11.0", - "babel-traverse": "^6.22.0", - "babel-types": "^6.22.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0", "babel-runtime": "^6.22.0", "lodash": "^4.2.0" } diff --git a/packages/babel-traverse/package.json b/packages/babel-traverse/package.json index 8066c617a8..96beac15ee 100644 --- a/packages/babel-traverse/package.json +++ b/packages/babel-traverse/package.json @@ -1,6 +1,6 @@ { "name": "babel-traverse", - "version": "6.22.1", + "version": "6.23.0", "description": "The Babel Traverse module maintains the overall tree state, and is responsible for replacing, removing, and adding nodes", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -9,9 +9,9 @@ "main": "lib/index.js", "dependencies": { "babel-code-frame": "^6.22.0", - "babel-messages": "^6.22.0", + "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", - "babel-types": "^6.22.0", + "babel-types": "^6.23.0", "babylon": "^6.15.0", "debug": "^2.2.0", "globals": "^9.0.0", @@ -19,6 +19,6 @@ "lodash": "^4.2.0" }, "devDependencies": { - "babel-generator": "^6.22.0" + "babel-generator": "^6.23.0" } } diff --git a/packages/babel-types/package.json b/packages/babel-types/package.json index 0f8cb8565d..5a3001f1e7 100644 --- a/packages/babel-types/package.json +++ b/packages/babel-types/package.json @@ -1,6 +1,6 @@ { "name": "babel-types", - "version": "6.22.0", + "version": "6.23.0", "description": "Babel Types is a Lodash-esque utility library for AST nodes", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", diff --git a/packages/babel/package.json b/packages/babel/package.json index 4c03e3eb51..f278b5b05e 100644 --- a/packages/babel/package.json +++ b/packages/babel/package.json @@ -1,6 +1,6 @@ { "name": "babel", - "version": "6.5.2", + "version": "6.23.0", "description": "Turn ES6 code into readable vanilla ES5 with source maps", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", From 48709e9fa45532f2de7775e5c7fbe2c185c23b83 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 17:20:18 -0800 Subject: [PATCH 16/19] Revert change that lerna force-committed. --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index bbf4c7ff5b..022a98cd2e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "lerna": "2.0.0-beta.37", + "lerna": "2.0.0-beta.23", "version": "6.23.0", "changelog": { "repo": "babel/babel", From 454933ef7643dd30b625992cddc8420887cf510e Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 18:15:50 -0800 Subject: [PATCH 17/19] Revert "Rewrite Hub as interface #5047" (#5306) --- .../src/transformation/file/index.js | 21 +++---------------- packages/babel-traverse/src/hub.js | 14 +++---------- packages/babel-traverse/src/index.js | 16 +++++++------- packages/babel-traverse/src/path/index.js | 10 +++++---- .../babel-traverse/src/path/introspection.js | 8 +++---- packages/babel-traverse/src/scope/index.js | 9 ++++---- packages/babel-traverse/test/hub.js | 13 ------------ 7 files changed, 27 insertions(+), 64 deletions(-) delete mode 100644 packages/babel-traverse/test/hub.js diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 9866b147a8..50b641c194 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -6,8 +6,7 @@ import convertSourceMap from "convert-source-map"; import OptionManager from "./options/option-manager"; import type Pipeline from "../pipeline"; import PluginPass from "../plugin-pass"; -import { NodePath, Scope } from "babel-traverse"; -import type { HubInterface } from "babel-traverse"; +import { NodePath, Hub, Scope } from "babel-traverse"; import sourceMap from "source-map"; import generate from "babel-generator"; import codeFrame from "babel-code-frame"; @@ -99,21 +98,7 @@ export default class File extends Store { this.code = ""; this.shebang = ""; - this.hub = { - // keep it for the usage in babel-core, ex: path.hub.file.opts.filename - file: this, - mark: (type: string, message: string, loc: Object) => { - this.metadata.marked.push({ - type, - message, - loc - }); - }, - addHelper: this.addHelper.bind(this), - getCode: () => this.code, - getScope: () => this.scope, - buildError: this.buildCodeFrameError.bind(this) - }; + this.hub = new Hub(this); } static helpers: Array; @@ -133,7 +118,7 @@ export default class File extends Store { ast: Object; scope: Scope; metadata: BabelFileMetadata; - hub: HubInterface; + hub: Hub; code: string; shebang: string; diff --git a/packages/babel-traverse/src/hub.js b/packages/babel-traverse/src/hub.js index d4151a16ed..f05eaa8136 100644 --- a/packages/babel-traverse/src/hub.js +++ b/packages/babel-traverse/src/hub.js @@ -1,14 +1,6 @@ -import Scope from "./scope"; -export interface HubInterface { - mark?: (type: string, message: string) => void; - addHelper?: (name: string) => Object; - getScope?: () => Scope; - getCode?: () => string; - buildError:(node: Object, msg: string, Error: Error) => Error; -} - export default class Hub { - buildError(node, msg, BuildError = TypeError): Error { - return new BuildError(msg); + constructor(file, options) { + this.file = file; + this.options = options; } } diff --git a/packages/babel-traverse/src/index.js b/packages/babel-traverse/src/index.js index 6d6215e308..1c5c96b58c 100644 --- a/packages/babel-traverse/src/index.js +++ b/packages/babel-traverse/src/index.js @@ -5,12 +5,10 @@ import includes from "lodash/includes"; import * as t from "babel-types"; import * as cache from "./cache"; -import NodePath from "./path"; -import Scope from "./scope"; -import Hub from "./hub"; - -export { visitors, NodePath, Scope, Hub }; -export type { HubInterface } from "./hub"; +export { default as NodePath } from "./path"; +export { default as Scope } from "./scope"; +export { default as Hub } from "./hub"; +export { visitors }; export default function traverse( parent: Object | Array, @@ -37,9 +35,9 @@ traverse.visitors = visitors; traverse.verify = visitors.verify; traverse.explode = visitors.explode; -traverse.NodePath = NodePath; -traverse.Scope = Scope; -traverse.Hub = Hub; +traverse.NodePath = require("./path"); +traverse.Scope = require("./scope"); +traverse.Hub = require("./hub"); traverse.cheap = function (node, enter) { return t.traverseFast(node, enter); diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index 41d60c3e47..c66d0e8482 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -114,7 +114,7 @@ export default class NodePath { } buildCodeFrameError(msg: string, Error: typeof Error = SyntaxError): Error { - return this.hub.buildError(this.node, msg, Error); + return this.hub.file.buildCodeFrameError(this.node, msg, Error); } traverse(visitor: Object, state?: any) { @@ -122,9 +122,11 @@ export default class NodePath { } mark(type: string, message: string) { - if (this.hub.mark) { - this.hub.mark(type, message, this.node.loc); - } + this.hub.file.metadata.marked.push({ + type, + message, + loc: this.node.loc + }); } set(key: string, node: Object) { diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index 0a722e61be..e8e54f18c0 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -235,12 +235,10 @@ export function referencesImport(moduleSource, importName) { export function getSource() { const node = this.node; if (node.end) { - const code = this.hub.getCode(); - if (code) { - return code.slice(node.start, node.end); - } + return this.hub.file.code.slice(node.start, node.end); + } else { + return ""; } - return ""; } export function willIMaybeExecuteBefore(target) { diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 1df4c8e485..a0b26bc573 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -346,8 +346,7 @@ export default class Scope { local.kind === "param" && (kind === "let" || kind === "const"); if (duplicate) { - const errorMsg = messages.get("scopeDuplicateDeclaration", name); - throw this.hub.buildError ? this.hub.buildError(id, errorMsg, TypeError) : new TypeError(errorMsg); + throw this.hub.file.buildCodeFrameError(id, messages.get("scopeDuplicateDeclaration", name), TypeError); } } @@ -386,6 +385,8 @@ export default class Scope { } toArray(node: Object, i?: number) { + const file = this.hub.file; + if (t.isIdentifier(node)) { const binding = this.getBinding(node.name); if (binding && binding.constant && binding.path.isGenericType("Array")) return node; @@ -418,9 +419,9 @@ export default class Scope { } else if (i) { args.push(t.numericLiteral(i)); helperName = "slicedToArray"; - // TODO if (this.hub.isLoose("es6.forOf")) helperName += "-loose"; + // TODO if (this.hub.file.isLoose("es6.forOf")) helperName += "-loose"; } - return t.callExpression(this.hub.addHelper(helperName), args); + return t.callExpression(file.addHelper(helperName), args); } hasLabel(name: string) { diff --git a/packages/babel-traverse/test/hub.js b/packages/babel-traverse/test/hub.js deleted file mode 100644 index a3d67bb9d8..0000000000 --- a/packages/babel-traverse/test/hub.js +++ /dev/null @@ -1,13 +0,0 @@ -const assert = require("assert"); -const Hub = require("../lib").default.Hub; - -describe("hub", function () { - it("default buildError should return TypeError", function () { - const hub = new Hub(); - const msg = "test_msg"; - assert.deepEqual( - hub.buildError(null, msg), - new TypeError(msg) - ); - }); -}); From 9cae61911d458973c0f424ce06ca0fd820c47345 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 18:18:17 -0800 Subject: [PATCH 18/19] v6.23.1 --- lerna.json | 4 ++-- packages/babel-core/package.json | 4 ++-- packages/babel-traverse/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lerna.json b/lerna.json index 022a98cd2e..9d72463292 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { - "lerna": "2.0.0-beta.23", - "version": "6.23.0", + "lerna": "2.0.0-beta.37", + "version": "6.23.1", "changelog": { "repo": "babel/babel", "labels": { diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index bc6c623098..f9eecdac84 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -1,6 +1,6 @@ { "name": "babel-core", - "version": "6.23.0", + "version": "6.23.1", "description": "Babel compiler core.", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", @@ -33,7 +33,7 @@ "babel-template": "^6.23.0", "babel-runtime": "^6.22.0", "babel-register": "^6.23.0", - "babel-traverse": "^6.23.0", + "babel-traverse": "^6.23.1", "babel-types": "^6.23.0", "babylon": "^6.11.0", "convert-source-map": "^1.1.0", diff --git a/packages/babel-traverse/package.json b/packages/babel-traverse/package.json index 96beac15ee..f884ed2d8b 100644 --- a/packages/babel-traverse/package.json +++ b/packages/babel-traverse/package.json @@ -1,6 +1,6 @@ { "name": "babel-traverse", - "version": "6.23.0", + "version": "6.23.1", "description": "The Babel Traverse module maintains the overall tree state, and is responsible for replacing, removing, and adding nodes", "author": "Sebastian McKenzie ", "homepage": "https://babeljs.io/", From 11cf0e0b501357d1e87a4b108b0130e2a212c68d Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 13 Feb 2017 18:18:45 -0800 Subject: [PATCH 19/19] Revert lerna again --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 9d72463292..169db035c1 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "lerna": "2.0.0-beta.37", + "lerna": "2.0.0-beta.23", "version": "6.23.1", "changelog": { "repo": "babel/babel",