/* eslint max-len: 0 */ "use strict"; var _Symbol = require("babel-runtime/core-js/symbol")["default"]; var _getIterator = require("babel-runtime/core-js/get-iterator")["default"]; var _Object$create = require("babel-runtime/core-js/object/create")["default"]; var _Object$keys = require("babel-runtime/core-js/object/keys")["default"]; var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; exports.__esModule = true; var _path2 = require("path"); var _babelTemplate = require("babel-template"); var _babelTemplate2 = _interopRequireDefault(_babelTemplate); var _babelTypes = require("babel-types"); var t = _interopRequireWildcard(_babelTypes); var buildRequire = _babelTemplate2["default"]("\n require($0);\n"); var buildExportsModuleDeclaration = _babelTemplate2["default"]("\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n"); var buildExportsFrom = _babelTemplate2["default"]("\n Object.defineProperty(exports, $0, {\n enumerable: true,\n get: function () {\n return $1;\n }\n });\n"); var buildLooseExportsModuleDeclaration = _babelTemplate2["default"]("\n exports.__esModule = true;\n"); var buildExportsAssignment = _babelTemplate2["default"]("\n exports.$0 = $1;\n"); var buildExportAll = _babelTemplate2["default"]("\n Object.keys(OBJECT).forEach(function (key) {\n if (key === \"default\") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return OBJECT[key];\n }\n });\n });\n"); var THIS_BREAK_KEYS = ["FunctionExpression", "FunctionDeclaration", "ClassProperty", "ClassMethod", "ObjectMethod"]; exports["default"] = function () { var REASSIGN_REMAP_SKIP = _Symbol(); var reassignmentVisitor = { ReferencedIdentifier: function ReferencedIdentifier(path) { var name = path.node.name; var remap = this.remaps[name]; if (!remap) return; // redeclared in this scope if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; if (path.parentPath.isCallExpression({ callee: path.node })) { path.replaceWith(t.sequenceExpression([t.numericLiteral(0), remap])); } else { path.replaceWith(remap); } this.requeueInParent(path); }, AssignmentExpression: function AssignmentExpression(path) { var node = path.node; if (node[REASSIGN_REMAP_SKIP]) return; var left = path.get("left"); if (!left.isIdentifier()) return; var name = left.node.name; var exports = this.exports[name]; if (!exports) return; // redeclared in this scope if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; node[REASSIGN_REMAP_SKIP] = true; for (var _iterator = exports, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_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 reid = _ref; node = buildExportsAssignment(reid, node).expression; } path.replaceWith(node); this.requeueInParent(path); }, UpdateExpression: function UpdateExpression(path) { var arg = path.get("argument"); if (!arg.isIdentifier()) return; var name = arg.node.name; var exports = this.exports[name]; if (!exports) return; // redeclared in this scope if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; var node = t.assignmentExpression(path.node.operator[0] + "=", arg.node, t.numericLiteral(1)); if (path.parentPath.isExpressionStatement() && !path.isCompletionRecord() || path.node.prefix) { path.replaceWith(node); this.requeueInParent(path); return; } var nodes = []; nodes.push(node); var operator = undefined; if (path.node.operator === "--") { operator = "+"; } else { // "++" operator = "-"; } nodes.push(t.binaryExpression(operator, arg.node, t.numericLiteral(1))); var newPaths = path.replaceWithMultiple(t.sequenceExpression(nodes)); for (var _iterator2 = newPaths, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var newPath = _ref2; this.requeueInParent(newPath); } } }; return { inherits: require("babel-plugin-transform-strict-mode"), visitor: { ThisExpression: function ThisExpression(path, state) { // If other plugins run after this plugin's Program#exit handler, we allow them to // insert top-level `this` values. This allows the AMD and UMD plugins to // function properly. if (this.ranCommonJS) return; if (state.opts.allowTopLevelThis !== true && !path.findParent(function (path) { return !path.is("shadow") && THIS_BREAK_KEYS.indexOf(path.type) >= 0; })) { path.replaceWith(t.identifier("undefined")); } }, Program: { exit: function exit(path) { this.ranCommonJS = true; var strict = !!this.opts.strict; var scope = path.scope; // rename these commonjs variables if they're declared in the file scope.rename("module"); scope.rename("exports"); scope.rename("require"); var hasExports = false; var hasImports = false; var body = path.get("body"); var imports = _Object$create(null); var exports = _Object$create(null); var nonHoistedExportNames = _Object$create(null); var topNodes = []; var remaps = _Object$create(null); var requires = _Object$create(null); function addRequire(source, blockHoist) { var cached = requires[source]; if (cached) return cached; var ref = path.scope.generateUidIdentifier(_path2.basename(source, _path2.extname(source))); var varDecl = t.variableDeclaration("var", [t.variableDeclarator(ref, buildRequire(t.stringLiteral(source)).expression)]); // Copy location from the original import statement for sourcemap // generation. if (imports[source]) { varDecl.loc = imports[source].loc; } if (typeof blockHoist === "number" && blockHoist > 0) { varDecl._blockHoist = blockHoist; } topNodes.push(varDecl); return requires[source] = ref; } function addTo(obj, key, arr) { var existing = obj[key] || []; obj[key] = existing.concat(arr); } for (var _i3 = 0; _i3 < body.length; _i3++) { var _path = body[_i3]; if (_path.isExportDeclaration()) { hasExports = true; var specifiers = [].concat(_path.get("declaration"), _path.get("specifiers")); for (var _iterator4 = specifiers, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) { var _ref4; if (_isArray4) { if (_i5 >= _iterator4.length) break; _ref4 = _iterator4[_i5++]; } else { _i5 = _iterator4.next(); if (_i5.done) break; _ref4 = _i5.value; } var specifier = _ref4; var ids = specifier.getBindingIdentifiers(); if (ids.__esModule) { throw specifier.buildCodeFrameError("Illegal export \"__esModule\""); } } } if (_path.isImportDeclaration()) { // istanbul ignore next var _importsEntry$specifiers; hasImports = true; var key = _path.node.source.value; var importsEntry = imports[key] || { specifiers: [], maxBlockHoist: 0, loc: _path.node.loc }; (_importsEntry$specifiers = importsEntry.specifiers).push.apply(_importsEntry$specifiers, _path.node.specifiers); if (typeof _path.node._blockHoist === "number") { importsEntry.maxBlockHoist = Math.max(_path.node._blockHoist, importsEntry.maxBlockHoist); } imports[key] = importsEntry; _path.remove(); } else if (_path.isExportDefaultDeclaration()) { var declaration = _path.get("declaration"); if (declaration.isFunctionDeclaration()) { var id = declaration.node.id; var defNode = t.identifier("default"); if (id) { addTo(exports, id.name, defNode); topNodes.push(buildExportsAssignment(defNode, id)); _path.replaceWith(declaration.node); } else { topNodes.push(buildExportsAssignment(defNode, t.toExpression(declaration.node))); _path.remove(); } } else if (declaration.isClassDeclaration()) { var id = declaration.node.id; var defNode = t.identifier("default"); if (id) { addTo(exports, id.name, defNode); _path.replaceWithMultiple([declaration.node, buildExportsAssignment(defNode, id)]); } else { _path.replaceWith(buildExportsAssignment(defNode, t.toExpression(declaration.node))); } } else { _path.replaceWith(buildExportsAssignment(t.identifier("default"), declaration.node)); // Manualy re-queue `export default foo;` expressions so that the ES3 transform // has an opportunity to convert them. Ideally this would happen automatically from the // replaceWith above. See T7166 for more info. _path.parentPath.requeue(_path.get("expression.left")); } } else if (_path.isExportNamedDeclaration()) { var declaration = _path.get("declaration"); if (declaration.node) { if (declaration.isFunctionDeclaration()) { var id = declaration.node.id; addTo(exports, id.name, id); topNodes.push(buildExportsAssignment(id, id)); _path.replaceWith(declaration.node); } else if (declaration.isClassDeclaration()) { var id = declaration.node.id; addTo(exports, id.name, id); _path.replaceWithMultiple([declaration.node, buildExportsAssignment(id, id)]); nonHoistedExportNames[id.name] = true; } else if (declaration.isVariableDeclaration()) { var declarators = declaration.get("declarations"); for (var _iterator5 = declarators, _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) { var _ref5; if (_isArray5) { if (_i6 >= _iterator5.length) break; _ref5 = _iterator5[_i6++]; } else { _i6 = _iterator5.next(); if (_i6.done) break; _ref5 = _i6.value; } var decl = _ref5; var id = decl.get("id"); var init = decl.get("init"); if (!init.node) init.replaceWith(t.identifier("undefined")); if (id.isIdentifier()) { addTo(exports, id.node.name, id.node); init.replaceWith(buildExportsAssignment(id.node, init.node).expression); nonHoistedExportNames[id.node.name] = true; } else { // todo } } _path.replaceWith(declaration.node); } continue; } var specifiers = _path.get("specifiers"); if (specifiers.length) { var nodes = []; var source = _path.node.source; if (source) { var ref = addRequire(source.value, _path.node._blockHoist); for (var _iterator6 = specifiers, _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) { var _ref6; if (_isArray6) { if (_i7 >= _iterator6.length) break; _ref6 = _iterator6[_i7++]; } else { _i7 = _iterator6.next(); if (_i7.done) break; _ref6 = _i7.value; } var specifier = _ref6; if (specifier.isExportNamespaceSpecifier()) { // todo } else if (specifier.isExportDefaultSpecifier()) { // todo } else if (specifier.isExportSpecifier()) { if (specifier.node.local.name === "default") { topNodes.push(buildExportsFrom(t.stringLiteral(specifier.node.exported.name), t.memberExpression(t.callExpression(this.addHelper("interopRequireDefault"), [ref]), specifier.node.local))); } else { topNodes.push(buildExportsFrom(t.stringLiteral(specifier.node.exported.name), t.memberExpression(ref, specifier.node.local))); } nonHoistedExportNames[specifier.node.exported.name] = true; } } } else { for (var _iterator7 = specifiers, _isArray7 = Array.isArray(_iterator7), _i8 = 0, _iterator7 = _isArray7 ? _iterator7 : _getIterator(_iterator7);;) { var _ref7; if (_isArray7) { if (_i8 >= _iterator7.length) break; _ref7 = _iterator7[_i8++]; } else { _i8 = _iterator7.next(); if (_i8.done) break; _ref7 = _i8.value; } var specifier = _ref7; if (specifier.isExportSpecifier()) { addTo(exports, specifier.node.local.name, specifier.node.exported); nonHoistedExportNames[specifier.node.exported.name] = true; nodes.push(buildExportsAssignment(specifier.node.exported, specifier.node.local)); } } } _path.replaceWithMultiple(nodes); } } else if (_path.isExportAllDeclaration()) { var exportNode = buildExportAll({ OBJECT: addRequire(_path.node.source.value, _path.node._blockHoist) }); exportNode.loc = _path.node.loc; topNodes.push(exportNode); _path.remove(); } } for (var source in imports) { var _imports$source = imports[source]; var specifiers = _imports$source.specifiers; var maxBlockHoist = _imports$source.maxBlockHoist; if (specifiers.length) { var uid = addRequire(source, maxBlockHoist); var wildcard = undefined; for (var i = 0; i < specifiers.length; i++) { var specifier = specifiers[i]; if (t.isImportNamespaceSpecifier(specifier)) { if (strict) { remaps[specifier.local.name] = uid; } else { var varDecl = t.variableDeclaration("var", [t.variableDeclarator(specifier.local, t.callExpression(this.addHelper("interopRequireWildcard"), [uid]))]); if (maxBlockHoist > 0) { varDecl._blockHoist = maxBlockHoist; } topNodes.push(varDecl); } wildcard = specifier.local; } else if (t.isImportDefaultSpecifier(specifier)) { specifiers[i] = t.importSpecifier(specifier.local, t.identifier("default")); } } for (var _iterator3 = specifiers, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) { var _ref3; if (_isArray3) { if (_i4 >= _iterator3.length) break; _ref3 = _iterator3[_i4++]; } else { _i4 = _iterator3.next(); if (_i4.done) break; _ref3 = _i4.value; } var specifier = _ref3; if (t.isImportSpecifier(specifier)) { var target = uid; if (specifier.imported.name === "default") { if (wildcard) { target = wildcard; } else { target = wildcard = path.scope.generateUidIdentifier(uid.name); var varDecl = t.variableDeclaration("var", [t.variableDeclarator(target, t.callExpression(this.addHelper("interopRequireDefault"), [uid]))]); if (maxBlockHoist > 0) { varDecl._blockHoist = maxBlockHoist; } topNodes.push(varDecl); } } remaps[specifier.local.name] = t.memberExpression(target, t.cloneWithoutLoc(specifier.imported)); } } } else { // bare import var requireNode = buildRequire(t.stringLiteral(source)); requireNode.loc = imports[source].loc; topNodes.push(requireNode); } } if (hasImports && _Object$keys(nonHoistedExportNames).length) { var hoistedExportsNode = t.identifier("undefined"); for (var _name in nonHoistedExportNames) { hoistedExportsNode = buildExportsAssignment(t.identifier(_name), hoistedExportsNode).expression; } var node = t.expressionStatement(hoistedExportsNode); node._blockHoist = 3; topNodes.unshift(node); } // add __esModule declaration if this file has any exports if (hasExports && !strict) { var buildTemplate = buildExportsModuleDeclaration; if (this.opts.loose) buildTemplate = buildLooseExportsModuleDeclaration; var declar = buildTemplate(); declar._blockHoist = 3; topNodes.unshift(declar); } path.unshiftContainer("body", topNodes); path.traverse(reassignmentVisitor, { remaps: remaps, scope: scope, exports: exports, requeueInParent: function requeueInParent(newPath) { return path.requeue(newPath); } }); } } } }; }; module.exports = exports["default"];