"use strict"; exports.__esModule = true; exports.default = function (_ref) { var t = _ref.types; function createImportDeclaration(polyfill) { var declar = t.importDeclaration([], t.stringLiteral(polyfill)); declar._blockHoist = 3; return declar; } function createRequireStatement(polyfill) { return t.expressionStatement(t.callExpression(t.identifier("require"), [t.stringLiteral(polyfill)])); } function isRequire(path) { return t.isExpressionStatement(path.node) && t.isCallExpression(path.node.expression) && t.isIdentifier(path.node.expression.callee) && path.node.expression.callee.name === "require" && path.node.expression.arguments.length === 1 && t.isStringLiteral(path.node.expression.arguments[0]) && isPolyfillSource(path.node.expression.arguments[0].value); } function createImport(polyfill, requireType, core) { if (core) { polyfill = "core-js/modules/" + polyfill; } if (requireType === "import") { return createImportDeclaration(polyfill); } else { return createRequireStatement(polyfill); } } function createImports(polyfills, requireType, regenerator) { var imports = polyfills.filter(function (el, i, arr) { return arr.indexOf(el) === i; }).map(function (polyfill) { return createImport(polyfill, requireType, true); }); return [].concat(imports, [regenerator && createImport("regenerator-runtime/runtime", requireType)]).filter(Boolean); } var isPolyfillImport = { ImportDeclaration: function ImportDeclaration(path, state) { if (path.node.specifiers.length === 0 && isPolyfillSource(path.node.source.value)) { this.numPolyfillImports++; if (this.numPolyfillImports > 1) { path.remove(); return; } path.replaceWithMultiple(createImports(state.opts.polyfills, "import", state.opts.regenerator)); } }, Program: function Program(path, state) { var _this = this; if (!state.opts.polyfills) { throw path.buildCodeFrameError("\nThere was an issue in \"babel-preset-env\" such that\nthe \"polyfills\" option was not correctly passed\nto the \"transform-polyfill-require\" plugin\n"); } path.get("body").forEach(function (bodyPath) { if (isRequire(bodyPath)) { _this.numPolyfillImports++; if (_this.numPolyfillImports > 1) { path.remove(); return; } bodyPath.replaceWithMultiple(createImports(state.opts.polyfills, "require", state.opts.regenerator)); } }); } }; return { name: "transform-polyfill-require", visitor: isPolyfillImport, pre: function pre() { this.numPolyfillImports = 0; } }; }; function isPolyfillSource(value) { return value === "babel-polyfill" || value === "core-js"; }