You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.8 KiB
87 lines
2.8 KiB
"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"; |
|
} |