123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- "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";
- }
|