From 3a1c3356fc52bc9f232518cc4a621f1e29568c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 13 May 2019 21:22:26 +0200 Subject: [PATCH] Use airbnb/babel-plugin-dynamic-import-node Do not duplicate code, which will unavoidably lead to bugs being fixed in one plugin and not in the other. --- .../src/dynamic-import.js | 22 --------------- .../src/index.js | 2 -- .../test/fixtures/commonjs/module/output.js | 2 +- .../fixtures/commonjs/no-interop/output.js | 2 +- .../test/fixtures/commonjs/script/output.js | 2 +- .../commonjs/shadowed-require/output.js | 2 +- .../test/fixtures/commonjs/to-string/input.js | 1 + .../fixtures/commonjs/to-string/output.js | 1 + .../src/index.js | 27 ++++++++++++------- .../package.json | 3 ++- .../src/index.js | 21 ++++++++------- 11 files changed, 36 insertions(+), 49 deletions(-) delete mode 100644 packages/babel-helper-module-transforms/src/dynamic-import.js create mode 100644 packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/input.js create mode 100644 packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/output.js diff --git a/packages/babel-helper-module-transforms/src/dynamic-import.js b/packages/babel-helper-module-transforms/src/dynamic-import.js deleted file mode 100644 index 90865180466f..000000000000 --- a/packages/babel-helper-module-transforms/src/dynamic-import.js +++ /dev/null @@ -1,22 +0,0 @@ -import * as t from "@babel/types"; -import template from "@babel/template"; -import { wrapInterop } from "./index"; - -export function rewriteDynamicImport( - path: NodePath, - wrap: (source: Node, resolve: (Node) => Node) => Node, - { noInterop }, -) { - const resolveId = path.scope.generateUidIdentifier("resolve"); - - const _resolve = node => t.callExpression(t.cloneNode(resolveId), [node]); - const resolve = noInterop - ? _resolve - : node => _resolve(wrapInterop(path, node, "namespace")); - - const wrapped = wrap(path.node.arguments[0], resolve); - - path.replaceWith( - template.expression.ast`new Promise(${resolveId} => ${wrapped})`, - ); -} diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index 4c7ec18d7115..5735ad951e8d 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -14,8 +14,6 @@ import normalizeAndLoadModuleMetadata, { export { hasExports, isSideEffectImport, isModule }; -export { rewriteDynamicImport } from "./dynamic-import"; - /** * Perform all of the generic ES6 module rewriting needed to handle initial * module processing. This function will rewrite the majority of the given diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/module/output.js b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/module/output.js index 0f3aaa584b0f..2c4c89f6cf46 100644 --- a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/module/output.js +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/module/output.js @@ -1,3 +1,3 @@ "use strict"; -var modP = new Promise(_resolve => _resolve(babelHelpers.interopRequireWildcard(require("mod")))); +var modP = Promise.resolve().then(() => babelHelpers.interopRequireWildcard(require("mod"))); diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/no-interop/output.js b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/no-interop/output.js index 2d6d45b7aebc..0eee33867600 100644 --- a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/no-interop/output.js +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/no-interop/output.js @@ -1 +1 @@ -var modP = new Promise(_resolve => _resolve(require("mod"))); +var modP = Promise.resolve().then(() => require("mod")); diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/script/output.js b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/script/output.js index 50ac627d3884..c1ee2ebe7ebf 100644 --- a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/script/output.js +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/script/output.js @@ -1 +1 @@ -var modP = new Promise(_resolve => _resolve(babelHelpers.interopRequireWildcard(require("mod")))); +var modP = Promise.resolve().then(() => babelHelpers.interopRequireWildcard(require("mod"))); diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/shadowed-require/output.js b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/shadowed-require/output.js index 007193374f32..21529855028f 100644 --- a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/shadowed-require/output.js +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/shadowed-require/output.js @@ -2,5 +2,5 @@ var _require2 = "foo"; (async function () { var _require = "bar"; - await new Promise(_resolve => _resolve(babelHelpers.interopRequireWildcard(require("./mod")))); + await Promise.resolve().then(() => babelHelpers.interopRequireWildcard(require("./mod"))); })(); diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/input.js b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/input.js new file mode 100644 index 000000000000..130d3cafa5cb --- /dev/null +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/input.js @@ -0,0 +1 @@ +import(2); diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/output.js b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/output.js new file mode 100644 index 000000000000..1babb42d8cec --- /dev/null +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/commonjs/to-string/output.js @@ -0,0 +1 @@ +Promise.resolve().then(() => babelHelpers.interopRequireWildcard(require(`${2}`))); diff --git a/packages/babel-plugin-transform-modules-amd/src/index.js b/packages/babel-plugin-transform-modules-amd/src/index.js index aa7649625fc3..2118ad5e9035 100644 --- a/packages/babel-plugin-transform-modules-amd/src/index.js +++ b/packages/babel-plugin-transform-modules-amd/src/index.js @@ -7,7 +7,6 @@ import { buildNamespaceInitStatements, ensureStatementsHoisted, wrapInterop, - rewriteDynamicImport, } from "@babel/helper-module-transforms"; import { template, types as t } from "@babel/core"; @@ -50,18 +49,26 @@ export default declare((api, options) => { if (!this.file.has("@babel/plugin-proposal-dynamic-import")) return; if (!path.get("callee").isImport()) return; - if (!state.requireId) { - state.requireId = path.scope.generateUidIdentifier("require"); + let { requireId, resolveId } = state; + if (!requireId) { + requireId = path.scope.generateUidIdentifier("require"); + state.requireId = requireId; } + if (!resolveId) { + resolveId = path.scope.generateUidIdentifier("resolve"); + state.resolveId = resolveId; + } + + let result = t.identifier("imported"); + if (!noInterop) result = wrapInterop(path, result, "namespace"); - rewriteDynamicImport( - path, - (source, resolve) => - template.expression.ast`${state.requireId}( - [${source}], - imported => ${resolve(t.identifier("imported"))} + path.replaceWith( + template.expression.ast` + new Promise((${resolveId}) => + ${requireId}([${path.node.arguments[0]}], imported => + ${resolveId}(${result}) + ) )`, - { noInterop }, ); }, diff --git a/packages/babel-plugin-transform-modules-commonjs/package.json b/packages/babel-plugin-transform-modules-commonjs/package.json index c43d45687f01..a29d9578f35d 100644 --- a/packages/babel-plugin-transform-modules-commonjs/package.json +++ b/packages/babel-plugin-transform-modules-commonjs/package.json @@ -11,7 +11,8 @@ "dependencies": { "@babel/helper-module-transforms": "^7.4.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.2.0" }, "keywords": [ "babel-plugin" diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index 2baf6fc9ed24..52e6ca613aa2 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -6,14 +6,20 @@ import { buildNamespaceInitStatements, ensureStatementsHoisted, wrapInterop, - rewriteDynamicImport, } from "@babel/helper-module-transforms"; import simplifyAccess from "@babel/helper-simple-access"; import { template, types as t } from "@babel/core"; +import babelPluginDynamicImportNode from "babel-plugin-dynamic-import-node"; + export default declare((api, options) => { api.assertVersion(7); + // TODO: expose a better interface + const transformImportCall = Function.call.bind( + babelPluginDynamicImportNode(api).visitor.Import, + ); + const { loose, @@ -57,9 +63,6 @@ export default declare((api, options) => { })() `; - const getRequire = source => - t.callExpression(t.identifier("require"), [source]); - const moduleExportsVisitor = { ReferencedIdentifier(path) { const localName = path.node.name; @@ -136,11 +139,7 @@ export default declare((api, options) => { scope.rename("require"); } while ((scope = scope.parent)); - rewriteDynamicImport( - path, - (source, resolve) => resolve(getRequire(source)), - { noInterop }, - ); + transformImportCall(this, path.get("callee")); }, Program: { @@ -187,7 +186,9 @@ export default declare((api, options) => { ); for (const [source, metadata] of meta.source) { - const loadExpr = getRequire(t.stringLiteral(source)); + const loadExpr = t.callExpression(t.identifier("require"), [ + t.stringLiteral(source), + ]); let header; if (isSideEffectImport(metadata)) {