diff options
Diffstat (limited to 'node_modules/babel-plugin-transform-es2015-for-of')
4 files changed, 390 insertions, 0 deletions
diff --git a/node_modules/babel-plugin-transform-es2015-for-of/.npmignore b/node_modules/babel-plugin-transform-es2015-for-of/.npmignore new file mode 100644 index 0000000..3185290 --- /dev/null +++ b/node_modules/babel-plugin-transform-es2015-for-of/.npmignore @@ -0,0 +1,4 @@ +node_modules +*.log +src +test diff --git a/node_modules/babel-plugin-transform-es2015-for-of/README.md b/node_modules/babel-plugin-transform-es2015-for-of/README.md new file mode 100644 index 0000000..7aff9a0 --- /dev/null +++ b/node_modules/babel-plugin-transform-es2015-for-of/README.md @@ -0,0 +1,142 @@ +# babel-plugin-transform-es2015-for-of + +> Compile ES2015 for...of to ES5 + +## Example + +**In** + +```js +for (var i of foo) {} +``` + +**Out** + +```js +var _iteratorNormalCompletion = true; +var _didIteratorError = false; +var _iteratorError = undefined; + +try { + for (var _iterator = foo[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var i = _step.value; + } +} catch (err) { + _didIteratorError = true; + _iteratorError = err; +} finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } +} +``` + +## Installation + +```sh +npm install --save-dev babel-plugin-transform-es2015-for-of +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```js +// without options +{ + "plugins": ["transform-es2015-for-of"] +} + +// with options +{ + "plugins": [ + ["transform-es2015-for-of", { + "loose": true + }] + ] +} +``` + +### Via CLI + +```sh +babel --plugins transform-es2015-for-of script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["transform-es2015-for-of"] +}); +``` + +## Options + +### `loose` + +`boolean`, defaults to `false` + +In loose mode, arrays are put in a fast path, thus heavily increasing performance. +All other iterables will continue to work fine. + +#### Example + +**In** + +```js +for (var i of foo) {} +``` + +**Out** + +```js +for (var _iterator = foo, _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; + } + + var i = _ref; +} +``` + +#### Abrupt completions + +In loose mode an iterator's `return` method will not be called on abrupt completions caused by thrown errors. + +Please see [google/traceur-compiler#1773](https://github.com/google/traceur-compiler/issues/1773) and +[babel/babel#838](https://github.com/babel/babel/issues/838) for more information. + +### Optimization + +If a basic array is used, Babel will compile the for-of loop down to a regular for loop. + +**In** + +```js +for (let a of [1,2,3]) {} +``` + +**Out** + +```js +var _arr = [1, 2, 3]; +for (var _i = 0; _i < _arr.length; _i++) { + var a = _arr[_i]; +} +``` diff --git a/node_modules/babel-plugin-transform-es2015-for-of/lib/index.js b/node_modules/babel-plugin-transform-es2015-for-of/lib/index.js new file mode 100644 index 0000000..056600d --- /dev/null +++ b/node_modules/babel-plugin-transform-es2015-for-of/lib/index.js @@ -0,0 +1,199 @@ +"use strict"; + +exports.__esModule = true; + +exports.default = function (_ref) { + var messages = _ref.messages, + template = _ref.template, + t = _ref.types; + + var buildForOfArray = template("\n for (var KEY = 0; KEY < ARR.length; KEY++) BODY;\n "); + + var buildForOfLoose = template("\n for (var LOOP_OBJECT = OBJECT,\n IS_ARRAY = Array.isArray(LOOP_OBJECT),\n INDEX = 0,\n LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {\n var ID;\n if (IS_ARRAY) {\n if (INDEX >= LOOP_OBJECT.length) break;\n ID = LOOP_OBJECT[INDEX++];\n } else {\n INDEX = LOOP_OBJECT.next();\n if (INDEX.done) break;\n ID = INDEX.value;\n }\n }\n "); + + var buildForOf = template("\n var ITERATOR_COMPLETION = true;\n var ITERATOR_HAD_ERROR_KEY = false;\n var ITERATOR_ERROR_KEY = undefined;\n try {\n for (var ITERATOR_KEY = OBJECT[Symbol.iterator](), STEP_KEY; !(ITERATOR_COMPLETION = (STEP_KEY = ITERATOR_KEY.next()).done); ITERATOR_COMPLETION = true) {\n }\n } catch (err) {\n ITERATOR_HAD_ERROR_KEY = true;\n ITERATOR_ERROR_KEY = err;\n } finally {\n try {\n if (!ITERATOR_COMPLETION && ITERATOR_KEY.return) {\n ITERATOR_KEY.return();\n }\n } finally {\n if (ITERATOR_HAD_ERROR_KEY) {\n throw ITERATOR_ERROR_KEY;\n }\n }\n }\n "); + + + function _ForOfStatementArray(path) { + var node = path.node, + scope = path.scope; + + var nodes = []; + var right = node.right; + + if (!t.isIdentifier(right) || !scope.hasBinding(right.name)) { + var uid = scope.generateUidIdentifier("arr"); + nodes.push(t.variableDeclaration("var", [t.variableDeclarator(uid, right)])); + right = uid; + } + + var iterationKey = scope.generateUidIdentifier("i"); + + var loop = buildForOfArray({ + BODY: node.body, + KEY: iterationKey, + ARR: right + }); + + t.inherits(loop, node); + t.ensureBlock(loop); + + var iterationValue = t.memberExpression(right, iterationKey, true); + + var left = node.left; + if (t.isVariableDeclaration(left)) { + left.declarations[0].init = iterationValue; + loop.body.body.unshift(left); + } else { + loop.body.body.unshift(t.expressionStatement(t.assignmentExpression("=", left, iterationValue))); + } + + if (path.parentPath.isLabeledStatement()) { + loop = t.labeledStatement(path.parentPath.node.label, loop); + } + + nodes.push(loop); + + return nodes; + } + + return { + visitor: { + ForOfStatement: function ForOfStatement(path, state) { + if (path.get("right").isArrayExpression()) { + if (path.parentPath.isLabeledStatement()) { + return path.parentPath.replaceWithMultiple(_ForOfStatementArray(path)); + } else { + return path.replaceWithMultiple(_ForOfStatementArray(path)); + } + } + + var callback = spec; + if (state.opts.loose) callback = loose; + + var node = path.node; + + var build = callback(path, state); + var declar = build.declar; + var loop = build.loop; + var block = loop.body; + + path.ensureBlock(); + + if (declar) { + block.body.push(declar); + } + + block.body = block.body.concat(node.body.body); + + t.inherits(loop, node); + t.inherits(loop.body, node.body); + + if (build.replaceParent) { + path.parentPath.replaceWithMultiple(build.node); + path.remove(); + } else { + path.replaceWithMultiple(build.node); + } + } + } + }; + + function loose(path, file) { + var node = path.node, + scope = path.scope, + parent = path.parent; + var left = node.left; + + var declar = void 0, + id = void 0; + + if (t.isIdentifier(left) || t.isPattern(left) || t.isMemberExpression(left)) { + id = left; + } else if (t.isVariableDeclaration(left)) { + id = scope.generateUidIdentifier("ref"); + declar = t.variableDeclaration(left.kind, [t.variableDeclarator(left.declarations[0].id, id)]); + } else { + throw file.buildCodeFrameError(left, messages.get("unknownForHead", left.type)); + } + + var iteratorKey = scope.generateUidIdentifier("iterator"); + var isArrayKey = scope.generateUidIdentifier("isArray"); + + var loop = buildForOfLoose({ + LOOP_OBJECT: iteratorKey, + IS_ARRAY: isArrayKey, + OBJECT: node.right, + INDEX: scope.generateUidIdentifier("i"), + ID: id + }); + + if (!declar) { + loop.body.body.shift(); + } + + var isLabeledParent = t.isLabeledStatement(parent); + var labeled = void 0; + + if (isLabeledParent) { + labeled = t.labeledStatement(parent.label, loop); + } + + return { + replaceParent: isLabeledParent, + declar: declar, + node: labeled || loop, + loop: loop + }; + } + + function spec(path, file) { + var node = path.node, + scope = path.scope, + parent = path.parent; + + var left = node.left; + var declar = void 0; + + var stepKey = scope.generateUidIdentifier("step"); + var stepValue = t.memberExpression(stepKey, t.identifier("value")); + + if (t.isIdentifier(left) || t.isPattern(left) || t.isMemberExpression(left)) { + declar = t.expressionStatement(t.assignmentExpression("=", left, stepValue)); + } else if (t.isVariableDeclaration(left)) { + declar = t.variableDeclaration(left.kind, [t.variableDeclarator(left.declarations[0].id, stepValue)]); + } else { + throw file.buildCodeFrameError(left, messages.get("unknownForHead", left.type)); + } + + var iteratorKey = scope.generateUidIdentifier("iterator"); + + var template = buildForOf({ + ITERATOR_HAD_ERROR_KEY: scope.generateUidIdentifier("didIteratorError"), + ITERATOR_COMPLETION: scope.generateUidIdentifier("iteratorNormalCompletion"), + ITERATOR_ERROR_KEY: scope.generateUidIdentifier("iteratorError"), + ITERATOR_KEY: iteratorKey, + STEP_KEY: stepKey, + OBJECT: node.right, + BODY: null + }); + + var isLabeledParent = t.isLabeledStatement(parent); + + var tryBody = template[3].block.body; + var loop = tryBody[0]; + + if (isLabeledParent) { + tryBody[0] = t.labeledStatement(parent.label, loop); + } + + return { + replaceParent: isLabeledParent, + declar: declar, + loop: loop, + node: template + }; + } +}; + +module.exports = exports["default"];
\ No newline at end of file diff --git a/node_modules/babel-plugin-transform-es2015-for-of/package.json b/node_modules/babel-plugin-transform-es2015-for-of/package.json new file mode 100644 index 0000000..80edee4 --- /dev/null +++ b/node_modules/babel-plugin-transform-es2015-for-of/package.json @@ -0,0 +1,45 @@ +{ + "_from": "babel-plugin-transform-es2015-for-of@^6.22.0", + "_id": "babel-plugin-transform-es2015-for-of@6.23.0", + "_inBundle": false, + "_integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "_location": "/babel-plugin-transform-es2015-for-of", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "babel-plugin-transform-es2015-for-of@^6.22.0", + "name": "babel-plugin-transform-es2015-for-of", + "escapedName": "babel-plugin-transform-es2015-for-of", + "rawSpec": "^6.22.0", + "saveSpec": null, + "fetchSpec": "^6.22.0" + }, + "_requiredBy": [ + "/babel-preset-es2015" + ], + "_resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "_shasum": "f47c95b2b613df1d3ecc2fdb7573623c75248691", + "_spec": "babel-plugin-transform-es2015-for-of@^6.22.0", + "_where": "/home/pruss/Dev/3-minute-website/node_modules/babel-preset-es2015", + "bundleDependencies": false, + "dependencies": { + "babel-runtime": "^6.22.0" + }, + "deprecated": false, + "description": "Compile ES2015 for...of to ES5", + "devDependencies": { + "babel-helper-plugin-test-runner": "^6.22.0" + }, + "keywords": [ + "babel-plugin" + ], + "license": "MIT", + "main": "lib/index.js", + "name": "babel-plugin-transform-es2015-for-of", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-for-of" + }, + "version": "6.23.0" +} |