From c8faab113f713978d23eb385038d4f74117c19e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 20 Feb 2021 22:48:28 +0100 Subject: [PATCH 1/4] Implement `importInterop: "node"` option for module transforms --- .../src/index.ts | 33 ++++++++--- .../src/normalize-and-load-metadata.ts | 56 ++++++++++++++++--- .../src/rewrite-live-references.ts | 4 ++ packages/babel-helpers/src/helpers.js | 18 +++--- .../package.json | 3 +- .../src/index.js | 9 ++- .../test/fixtures/amd/imports-glob/output.js | 7 ++- .../fixtures/amd/imports-mixing/output.js | 7 ++- .../test/fixtures/amd/overview/output.js | 7 ++- .../export-default-from/input.mjs | 1 + .../export-default-from/output.js | 8 +++ .../export-named-and-default-from/input.mjs | 1 + .../export-named-and-default-from/output.js | 20 +++++++ .../export-named-from/input.mjs | 1 + .../export-named-from/output.js | 13 +++++ .../import-default/input.mjs | 3 + .../import-default/output.js | 5 ++ .../import-named-and-default/input.mjs | 4 ++ .../import-named-and-default/output.js | 7 +++ .../importInterop-node/import-named/input.mjs | 3 + .../importInterop-node/import-named/output.js | 5 ++ .../import-wildcard/input.mjs | 4 ++ .../import-wildcard/output.js | 7 +++ .../fixtures/importInterop-node/options.json | 6 ++ .../importInterop-none/export-from/input.mjs | 1 + .../importInterop-none/export-from/output.js | 13 +++++ .../import-default-only/input.mjs | 3 + .../import-default-only/output.js | 5 ++ .../import-wildcard/input.mjs | 4 ++ .../import-wildcard/output.js | 6 ++ .../fixtures/importInterop-none/options.json | 6 ++ .../fixtures/loose/imports-glob/output.js | 7 ++- .../fixtures/loose/imports-mixing/output.js | 7 ++- .../test/fixtures/loose/overview/output.js | 7 ++- .../test/importInterop-function.js | 43 ++++++++++++++ .../package.json | 1 + .../src/index.js | 2 + .../fixtures/importInterop-node/exec/dep1.js | 1 + .../fixtures/importInterop-node/exec/dep2.js | 2 + .../fixtures/importInterop-node/exec/dep3.js | 1 + .../fixtures/importInterop-node/exec/dep4.js | 2 + .../fixtures/importInterop-node/exec/dep5.js | 2 + .../fixtures/importInterop-node/exec/dep6.js | 2 + .../fixtures/importInterop-node/exec/dep7.js | 2 + .../fixtures/importInterop-node/exec/dep8.js | 2 + .../fixtures/importInterop-node/exec/exec.js | 36 ++++++++++++ .../importInterop-node/exec/options.json | 3 + .../export-default-from/input.mjs | 1 + .../export-default-from/output.js | 8 +++ .../export-named-and-default-from/input.mjs | 1 + .../export-named-and-default-from/output.js | 19 +++++++ .../export-named-from/input.mjs | 1 + .../export-named-from/output.js | 13 +++++ .../import-default/input.mjs | 3 + .../import-default/output.js | 5 ++ .../import-named-and-default/input.mjs | 4 ++ .../import-named-and-default/output.js | 6 ++ .../importInterop-node/import-named/input.mjs | 3 + .../importInterop-node/import-named/output.js | 5 ++ .../import-wildcard/input.mjs | 4 ++ .../import-wildcard/output.js | 5 ++ .../fixtures/importInterop-node/options.json | 6 ++ .../importInterop-none/export-from/input.mjs | 1 + .../importInterop-none/export-from/output.js | 13 +++++ .../import-default-only/input.mjs | 3 + .../import-default-only/output.js | 5 ++ .../import-wildcard/input.mjs | 4 ++ .../import-wildcard/output.js | 6 ++ .../fixtures/importInterop-none/options.json | 6 ++ .../interop-loose/imports-glob/output.js | 6 +- .../interop-loose/imports-mixing/output.js | 6 +- .../fixtures/interop-loose/overview/output.js | 6 +- .../fixtures/interop/export-all/output.js | 7 ++- .../fixtures/interop/imports-glob/output.js | 6 +- .../fixtures/interop/imports-mixing/output.js | 6 +- .../test/fixtures/interop/overview/output.js | 6 +- .../misc/copy-getters-setters-star/output.js | 4 +- .../test/importInterop-function.js | 46 +++++++++++++++ .../package.json | 3 +- .../src/index.js | 2 + .../fixtures/importInterop-node/exec/dep1.js | 1 + .../fixtures/importInterop-node/exec/dep2.js | 2 + .../fixtures/importInterop-node/exec/dep3.js | 1 + .../fixtures/importInterop-node/exec/dep4.js | 2 + .../fixtures/importInterop-node/exec/dep5.js | 2 + .../fixtures/importInterop-node/exec/dep6.js | 2 + .../fixtures/importInterop-node/exec/dep7.js | 2 + .../fixtures/importInterop-node/exec/dep8.js | 2 + .../fixtures/importInterop-node/exec/exec.js | 36 ++++++++++++ .../importInterop-node/exec/options.json | 3 + .../export-default-from/input.mjs | 1 + .../export-default-from/output.js | 20 +++++++ .../export-named-and-default-from/input.mjs | 1 + .../export-named-and-default-from/output.js | 32 +++++++++++ .../export-named-from/input.mjs | 1 + .../export-named-from/output.js | 25 +++++++++ .../import-default/input.mjs | 3 + .../import-default/output.js | 17 ++++++ .../import-named-and-default/input.mjs | 4 ++ .../import-named-and-default/output.js | 19 +++++++ .../importInterop-node/import-named/input.mjs | 3 + .../importInterop-node/import-named/output.js | 17 ++++++ .../import-wildcard/input.mjs | 4 ++ .../import-wildcard/output.js | 19 +++++++ .../fixtures/importInterop-node/options.json | 6 ++ .../importInterop-none/export-from/input.mjs | 1 + .../importInterop-none/export-from/output.js | 25 +++++++++ .../import-default-only/input.mjs | 3 + .../import-default-only/output.js | 17 ++++++ .../import-wildcard/input.mjs | 4 ++ .../import-wildcard/output.js | 18 ++++++ .../fixtures/importInterop-none/options.json | 6 ++ .../test/importInterop-function.js | 55 ++++++++++++++++++ yarn.lock | 3 + 114 files changed, 922 insertions(+), 45 deletions(-) create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json create mode 100644 packages/babel-plugin-transform-modules-amd/test/importInterop-function.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep1.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep2.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep3.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep4.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep5.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep6.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep7.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep8.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/exec.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/options.json create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/importInterop-function.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep1.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep2.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep3.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep4.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep5.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep6.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep7.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep8.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/exec.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/options.json create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json create mode 100644 packages/babel-plugin-transform-modules-umd/test/importInterop-function.js diff --git a/packages/babel-helper-module-transforms/src/index.ts b/packages/babel-helper-module-transforms/src/index.ts index a22364b35a88..73899d6b8643 100644 --- a/packages/babel-helper-module-transforms/src/index.ts +++ b/packages/babel-helper-module-transforms/src/index.ts @@ -6,9 +6,10 @@ import { isModule } from "@babel/helper-module-imports"; import rewriteThis from "./rewrite-this"; import rewriteLiveReferences from "./rewrite-live-references"; -import normalizeAndLoadModuleMetadata, { +import normalizeModuleAndLoadMetadata, { hasExports, isSideEffectImport, + validateImportInteropOption, } from "./normalize-and-load-metadata"; import type { InteropType, @@ -38,6 +39,7 @@ export function rewriteModuleStatementsAndPrepareHeader( allowTopLevelThis, strictMode, noInterop, + importInterop = noInterop ? "none" : "babel", lazy, esNamespaceOnly, @@ -49,6 +51,7 @@ export function rewriteModuleStatementsAndPrepareHeader( allowTopLevelThis?; strictMode; loose?; + importInterop?: "none" | "babel" | "node"; noInterop?; lazy?; esNamespaceOnly?; @@ -56,11 +59,12 @@ export function rewriteModuleStatementsAndPrepareHeader( enumerableModuleMeta?; }, ) { + validateImportInteropOption(importInterop); assert(isModule(path), "Cannot process module statements in a script"); path.node.sourceType = "script"; - const meta = normalizeAndLoadModuleMetadata(path, exportName, { - noInterop, + const meta = normalizeModuleAndLoadMetadata(path, exportName, { + importInterop, initializeReexports: constantReexports, lazy, esNamespaceOnly, @@ -128,6 +132,15 @@ export function wrapInterop( return null; } + if (type === "node-namespace") { + return t.callExpression( + programPath.hub.addHelper("interopRequireWildcard"), + [expr, t.booleanLiteral(true)], + ); + } else if (type === "node-default") { + return null; + } + let helper; if (type === "default") { helper = "interopRequireDefault"; @@ -227,16 +240,18 @@ const buildReexportsFromMeta = ( const { stringSpecifiers } = meta; return Array.from(metadata.reexports, ([exportName, importName]) => { - let NAMESPACE_IMPORT; - if (stringSpecifiers.has(importName)) { + let NAMESPACE_IMPORT: t.Expression = t.cloneNode(namespace); + if (importName === "default" && metadata.interop === "node-default") { + // Nothing, it's ok as-is + } else if (stringSpecifiers.has(importName)) { NAMESPACE_IMPORT = t.memberExpression( - t.cloneNode(namespace), + NAMESPACE_IMPORT, t.stringLiteral(importName), true, ); } else { - NAMESPACE_IMPORT = NAMESPACE_IMPORT = t.memberExpression( - t.cloneNode(namespace), + NAMESPACE_IMPORT = t.memberExpression( + NAMESPACE_IMPORT, t.identifier(importName), ); } @@ -245,7 +260,7 @@ const buildReexportsFromMeta = ( EXPORT_NAME: exportName, NAMESPACE_IMPORT, }; - if (constantReexports) { + if (constantReexports || t.isIdentifier(NAMESPACE_IMPORT)) { if (stringSpecifiers.has(exportName)) { return ReexportTemplate.constantComputed(astNodes); } else { diff --git a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts index 1c1c7b2cd830..82d0a1986b0e 100644 --- a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts +++ b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts @@ -21,7 +21,12 @@ export interface ModuleMetadata { stringSpecifiers: Set; } -export type InteropType = "default" | "namespace" | "none"; +export type InteropType = + | "default" + | "namespace" + | "node-default" + | "node-namespace" + | "none"; export interface SourceModuleMetadata { // A unique variable name to use for this namespace object. Centralized for simplicity. @@ -68,19 +73,42 @@ export function isSideEffectImport(source: SourceModuleMetadata) { ); } +export function validateImportInteropOption( + importInterop: any, +): importInterop is "none" | "babel" | "node" | Function { + if ( + typeof importInterop !== "function" && + importInterop !== "none" && + importInterop !== "babel" && + importInterop !== "node" + ) { + throw new Error( + `.importInterop must be one of "none", "babel", "node", or a function returning one of those values (received ${importInterop}).`, + ); + } + return importInterop; +} + +function resolveImportInterop(importInterop, source) { + if (typeof importInterop === "function") { + return validateImportInteropOption(importInterop(source)); + } + return importInterop; +} + /** * Remove all imports and exports from the file, and return all metadata * needed to reconstruct the module's behavior. */ export default function normalizeModuleAndLoadMetadata( programPath: NodePath, - exportName?: string, + exportName: string, { - noInterop = false, + importInterop, initializeReexports = false, lazy = false, esNamespaceOnly = false, - } = {}, + }, ): ModuleMetadata { if (!exportName) { exportName = programPath.scope.generateUidIdentifier("exports").name; @@ -105,16 +133,24 @@ export default function normalizeModuleAndLoadMetadata( metadata.name = metadata.importsNamespace.values().next().value; } - if (noInterop) metadata.interop = "none"; - else if (esNamespaceOnly) { + const resolvedInterop = resolveImportInterop( + importInterop, + metadata.source, + ); + + if (resolvedInterop === "none") { + metadata.interop = "none"; + } else if (resolvedInterop === "node" && metadata.interop === "namespace") { + metadata.interop = "node-namespace"; + } else if (resolvedInterop === "node" && metadata.interop === "default") { + metadata.interop = "node-default"; + } else if (esNamespaceOnly && metadata.interop === "namespace") { // Both the default and namespace interops pass through __esModule // objects, but the namespace interop is used to enable Babel's // destructuring-like interop behavior for normal CommonJS. // Since some tooling has started to remove that behavior, we expose // it as the `esNamespace` option. - if (metadata.interop === "namespace") { - metadata.interop = "default"; - } + metadata.interop = "default"; } } @@ -199,6 +235,8 @@ function getModuleMetadata( reexportAll: null, lazy: false, + + source, }; sourceData.set(source, data); } diff --git a/packages/babel-helper-module-transforms/src/rewrite-live-references.ts b/packages/babel-helper-module-transforms/src/rewrite-live-references.ts index 0d80521d9c1d..210a63ab3030 100644 --- a/packages/babel-helper-module-transforms/src/rewrite-live-references.ts +++ b/packages/babel-helper-module-transforms/src/rewrite-live-references.ts @@ -96,6 +96,10 @@ export default function rewriteLiveReferences( let namespace: t.Expression = t.identifier(meta.name); if (meta.lazy) namespace = t.callExpression(namespace, []); + if (importName === "default" && meta.interop === "node-default") { + return namespace; + } + const computed = metadata.stringSpecifiers.has(importName); return t.memberExpression( diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index dbf457503cce..7f9ea7bdfe78 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -618,17 +618,17 @@ helpers.interopRequireDefault = helper("7.0.0-beta.0")` } `; -helpers.interopRequireWildcard = helper("7.0.0-beta.0")` - function _getRequireWildcardCache() { +helpers.interopRequireWildcard = helper("7.14.0")` + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; - var cache = new WeakMap(); - _getRequireWildcardCache = function () { return cache; }; - return cache; + var cache = [/* babel interop */ new WeakMap(), /* node interop */ new WeakMap()]; + _getRequireWildcardCache = function (i) { return cache[i]; }; + return cache[i]; } - export default function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { + export default function _interopRequireWildcard(obj, nodeInterop) { + if (!nodeInterop && obj && obj.__esModule) { return obj; } @@ -636,7 +636,7 @@ helpers.interopRequireWildcard = helper("7.0.0-beta.0")` return { default: obj } } - var cache = _getRequireWildcardCache(); + var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } @@ -644,7 +644,7 @@ helpers.interopRequireWildcard = helper("7.0.0-beta.0")` var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { + if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; diff --git a/packages/babel-plugin-transform-modules-amd/package.json b/packages/babel-plugin-transform-modules-amd/package.json index 39193c136b40..554359ceb884 100644 --- a/packages/babel-plugin-transform-modules-amd/package.json +++ b/packages/babel-plugin-transform-modules-amd/package.json @@ -26,6 +26,7 @@ }, "devDependencies": { "@babel/core": "workspace:*", - "@babel/helper-plugin-test-runner": "workspace:*" + "@babel/helper-plugin-test-runner": "workspace:*", + "@babel/plugin-external-helpers": "workspace:*" } } diff --git a/packages/babel-plugin-transform-modules-amd/src/index.js b/packages/babel-plugin-transform-modules-amd/src/index.js index 9d916292d8df..8abd469222d1 100644 --- a/packages/babel-plugin-transform-modules-amd/src/index.js +++ b/packages/babel-plugin-transform-modules-amd/src/index.js @@ -38,7 +38,13 @@ function injectWrapper(path, wrapper) { export default declare((api, options) => { api.assertVersion(7); - const { allowTopLevelThis, strict, strictMode, noInterop } = options; + const { + allowTopLevelThis, + strict, + strictMode, + importInterop, + noInterop, + } = options; const constantReexports = api.assumption("constantReexports") ?? options.loose; @@ -114,6 +120,7 @@ export default declare((api, options) => { strict, strictMode, allowTopLevelThis, + importInterop, noInterop, }, ); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js index c3a94a67fcc7..88c144d5ea25 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js @@ -1,6 +1,11 @@ define(["foo"], function (foo) { "use strict"; - foo = babelHelpers.interopRequireWildcard(foo); + foo = _interopRequireWildcard(foo); + + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + + function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + foo; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js index df85e22f86fd..724235d6eb11 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js @@ -1,7 +1,12 @@ define(["foo"], function (_foo) { "use strict"; - _foo = babelHelpers.interopRequireWildcard(_foo); + _foo = _interopRequireWildcard(_foo); + + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + + function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + _foo.default; _foo.baz; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js index 7b4a2b29561f..2f253a07616d 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js @@ -5,7 +5,12 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (_exports, value: true }); _exports.default = _exports.test2 = _exports.test = void 0; - foo2 = babelHelpers.interopRequireWildcard(foo2); + foo2 = _interopRequireWildcard(foo2); + + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + + function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + var test; _exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/input.mjs new file mode 100644 index 000000000000..34a68c744aa4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/input.mjs @@ -0,0 +1 @@ +export { default } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/output.js new file mode 100644 index 000000000000..1daa5724d147 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-default-from/output.js @@ -0,0 +1,8 @@ +define(["exports", "dep"], function (_exports, _dep) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.default = _dep; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs new file mode 100644 index 000000000000..0c86d18ead3c --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs @@ -0,0 +1 @@ +export { default, name } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/output.js new file mode 100644 index 000000000000..daedfbf25084 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-and-default-from/output.js @@ -0,0 +1,20 @@ +define(["exports", "dep"], function (_exports, _dep) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.defineProperty(_exports, "default", { + enumerable: true, + get: function () { + return _dep.default; + } + }); + Object.defineProperty(_exports, "name", { + enumerable: true, + get: function () { + return _dep.name; + } + }); + _dep = babelHelpers.interopRequireWildcard(_dep, true); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/input.mjs new file mode 100644 index 000000000000..5cfecdc21b67 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/input.mjs @@ -0,0 +1 @@ +export { name } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/output.js new file mode 100644 index 000000000000..ed1738afdb9d --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/export-named-from/output.js @@ -0,0 +1,13 @@ +define(["exports", "dep"], function (_exports, _dep) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.defineProperty(_exports, "name", { + enumerable: true, + get: function () { + return _dep.name; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/input.mjs new file mode 100644 index 000000000000..65b75b7293b4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/input.mjs @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/output.js new file mode 100644 index 000000000000..c385635d7e64 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-default/output.js @@ -0,0 +1,5 @@ +define(["foo"], function (_foo) { + "use strict"; + + _foo(); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/input.mjs new file mode 100644 index 000000000000..5521c517045c --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/input.mjs @@ -0,0 +1,4 @@ +import foo, { named } from "foo"; + +foo(); +named(); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/output.js new file mode 100644 index 000000000000..647660fe6384 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named-and-default/output.js @@ -0,0 +1,7 @@ +define(["foo"], function (_foo) { + "use strict"; + + _foo = babelHelpers.interopRequireWildcard(_foo, true); + (0, _foo.default)(); + (0, _foo.named)(); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/input.mjs new file mode 100644 index 000000000000..5f433d61119b --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/input.mjs @@ -0,0 +1,3 @@ +import { named } from "foo"; + +named(); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/output.js new file mode 100644 index 000000000000..083a8936bf8d --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-named/output.js @@ -0,0 +1,5 @@ +define(["foo"], function (_foo) { + "use strict"; + + (0, _foo.named)(); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/input.mjs new file mode 100644 index 000000000000..bf67ef46a2d0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/input.mjs @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/output.js new file mode 100644 index 000000000000..f55547134964 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/import-wildcard/output.js @@ -0,0 +1,7 @@ +define(["foo"], function (foo) { + "use strict"; + + foo = babelHelpers.interopRequireWildcard(foo, true); + foo.bar(); + foo.baz(); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json new file mode 100644 index 000000000000..c04a464b1cbf --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["transform-modules-amd", { "importInterop": "node" }] + ] +} diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/input.mjs new file mode 100644 index 000000000000..7d2c9b022e26 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/input.mjs @@ -0,0 +1 @@ +export { default } from 'foo'; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/output.js new file mode 100644 index 000000000000..16393ef8ede4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/export-from/output.js @@ -0,0 +1,13 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.defineProperty(_exports, "default", { + enumerable: true, + get: function () { + return _foo.default; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/input.mjs new file mode 100644 index 000000000000..65b75b7293b4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/input.mjs @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/output.js new file mode 100644 index 000000000000..d0a889d8f06d --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-default-only/output.js @@ -0,0 +1,5 @@ +define(["foo"], function (_foo) { + "use strict"; + + (0, _foo.default)(); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/input.mjs new file mode 100644 index 000000000000..bf67ef46a2d0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/input.mjs @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/output.js new file mode 100644 index 000000000000..437c04a842b8 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/import-wildcard/output.js @@ -0,0 +1,6 @@ +define(["foo"], function (foo) { + "use strict"; + + foo.bar(); + foo.baz(); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json new file mode 100644 index 000000000000..5dcf40fa20bc --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["transform-modules-amd", { "importInterop": "none" }] + ] +} diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js index c3a94a67fcc7..88c144d5ea25 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js @@ -1,6 +1,11 @@ define(["foo"], function (foo) { "use strict"; - foo = babelHelpers.interopRequireWildcard(foo); + foo = _interopRequireWildcard(foo); + + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + + function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + foo; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js index df85e22f86fd..724235d6eb11 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js @@ -1,7 +1,12 @@ define(["foo"], function (_foo) { "use strict"; - _foo = babelHelpers.interopRequireWildcard(_foo); + _foo = _interopRequireWildcard(_foo); + + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + + function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + _foo.default; _foo.baz; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js index f3942d53ae8f..2a3edaa5dae5 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js @@ -3,7 +3,12 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (_exports, _exports.__esModule = true; _exports.default = _exports.test2 = _exports.test = void 0; - foo2 = babelHelpers.interopRequireWildcard(foo2); + foo2 = _interopRequireWildcard(foo2); + + function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + + function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + var test; _exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-amd/test/importInterop-function.js b/packages/babel-plugin-transform-modules-amd/test/importInterop-function.js new file mode 100644 index 000000000000..9405a511e8bb --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/importInterop-function.js @@ -0,0 +1,43 @@ +import * as babel from "@babel/core"; +import transformAmd from "../lib"; +import externalHelpers from "@babel/plugin-external-helpers"; + +it("'importInterop' accepts a function", function () { + const code = ` + import a from "a"; + import b from "b"; + import c from "c"; + + a(); + b(); + c(); + `; + + const importInterop = source => { + if (source === "a") return "babel"; + else if (source === "b") return "node"; + else if (source === "c") return "none"; + }; + + const output = babel.transformSync(code, { + configFile: false, + ast: false, + plugins: [ + [externalHelpers, { helperVersion: "7.100.0" }], + [transformAmd, { importInterop }], + ], + }).code; + + expect(output).toMatchInlineSnapshot(` + "define([\\"a\\", \\"b\\", \\"c\\"], function (_a, _b, _c) { + \\"use strict\\"; + + _a = babelHelpers.interopRequireDefault(_a); + (0, _a.default)(); + + _b(); + + (0, _c.default)(); + });" + `); +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/package.json b/packages/babel-plugin-transform-modules-commonjs/package.json index e17a4d23eab2..58193a0ae9b3 100644 --- a/packages/babel-plugin-transform-modules-commonjs/package.json +++ b/packages/babel-plugin-transform-modules-commonjs/package.json @@ -27,6 +27,7 @@ "devDependencies": { "@babel/core": "workspace:*", "@babel/helper-plugin-test-runner": "workspace:*", + "@babel/plugin-external-helpers": "workspace:*", "@babel/plugin-syntax-object-rest-spread": "^7.8.3" }, "homepage": "https://babel.dev/docs/en/next/babel-plugin-transform-modules-commonjs" diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index 0004c3c773bc..d63c9b60f60b 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -30,6 +30,7 @@ export default declare((api, options) => { strict, strictMode, noInterop, + importInterop, lazy = false, // Defaulting to 'true' for now. May change before 7.x major. allowCommonJSExports = true, @@ -178,6 +179,7 @@ export default declare((api, options) => { strictMode, allowTopLevelThis, noInterop, + importInterop, lazy, esNamespaceOnly: typeof state.filename === "string" && diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep1.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep1.js new file mode 100644 index 000000000000..8a3a372d7936 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep1.js @@ -0,0 +1 @@ +module.exports = function () { return 1 }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep2.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep2.js new file mode 100644 index 000000000000..357662bf4dd1 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep2.js @@ -0,0 +1,2 @@ +module.exports = function () { return 2 }; +module.exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep3.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep3.js new file mode 100644 index 000000000000..fb0c33e31371 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep3.js @@ -0,0 +1 @@ +module.exports = function () { return 3 }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep4.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep4.js new file mode 100644 index 000000000000..593bd6c1de79 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep4.js @@ -0,0 +1,2 @@ +module.exports = function () { return 4 }; +module.exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep5.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep5.js new file mode 100644 index 000000000000..6b94cd70e2fa --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep5.js @@ -0,0 +1,2 @@ +exports.default = function () { return 5 }; + diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep6.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep6.js new file mode 100644 index 000000000000..abb56a970d5d --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep6.js @@ -0,0 +1,2 @@ +exports.default = function () { return 6 }; +exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep7.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep7.js new file mode 100644 index 000000000000..56270c9044cd --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep7.js @@ -0,0 +1,2 @@ +exports.named = function () { return 7 }; + diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep8.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep8.js new file mode 100644 index 000000000000..4982129d7eca --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/dep8.js @@ -0,0 +1,2 @@ +exports.named = function () { return 8 }; +exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/exec.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/exec.js new file mode 100644 index 000000000000..df5f00076e64 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/exec.js @@ -0,0 +1,36 @@ +import dep1 from "./dep1.js"; +import dep2 from "./dep2.js"; +import * as dep3 from "./dep3.js"; +import * as dep4 from "./dep4.js"; +import dep5 from "./dep5.js"; +import dep6 from "./dep6.js"; +import { named as dep7 } from "./dep7.js"; +import { named as dep8 } from "./dep8.js"; + +expect(typeof dep1).toBe("function"); +expect(dep1()).toBe(1); + +expect(typeof dep2).toBe("function"); +expect(dep2()).toBe(2); + +expect(typeof dep3).toBe("object"); +expect(typeof dep3.default).toBe("function"); +expect(dep3.default()).toBe(3); + +expect(typeof dep4).toBe("object"); +expect(typeof dep4.default).toBe("function"); +expect(dep4.default()).toBe(4); + +expect(typeof dep5).toBe("object"); +expect(typeof dep5.default).toBe("function"); +expect(dep5.default()).toBe(5); + +expect(typeof dep6).toBe("object"); +expect(typeof dep6.default).toBe("function"); +expect(dep6.default()).toBe(6); + +expect(typeof dep7).toBe("function"); +expect(dep7()).toBe(7); + +expect(typeof dep8).toBe("function"); +expect(dep8()).toBe(8); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/options.json new file mode 100644 index 000000000000..2104ca43283f --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/exec/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/input.mjs new file mode 100644 index 000000000000..34a68c744aa4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/input.mjs @@ -0,0 +1 @@ +export { default } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/output.js new file mode 100644 index 000000000000..26493f85836e --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-default-from/output.js @@ -0,0 +1,8 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _dep; + +var _dep = require("dep"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs new file mode 100644 index 000000000000..0c86d18ead3c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs @@ -0,0 +1 @@ +export { default, name } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/output.js new file mode 100644 index 000000000000..ad61cbd196f2 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-and-default-from/output.js @@ -0,0 +1,19 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "default", { + enumerable: true, + get: function () { + return _dep.default; + } +}); +Object.defineProperty(exports, "name", { + enumerable: true, + get: function () { + return _dep.name; + } +}); + +var _dep = babelHelpers.interopRequireWildcard(require("dep"), true); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/input.mjs new file mode 100644 index 000000000000..5cfecdc21b67 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/input.mjs @@ -0,0 +1 @@ +export { name } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/output.js new file mode 100644 index 000000000000..3a36c858ecfa --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/export-named-from/output.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "name", { + enumerable: true, + get: function () { + return _dep.name; + } +}); + +var _dep = require("dep"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/input.mjs new file mode 100644 index 000000000000..65b75b7293b4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/input.mjs @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/output.js new file mode 100644 index 000000000000..b210391c7078 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-default/output.js @@ -0,0 +1,5 @@ +"use strict"; + +var _foo = require("foo"); + +_foo(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/input.mjs new file mode 100644 index 000000000000..5521c517045c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/input.mjs @@ -0,0 +1,4 @@ +import foo, { named } from "foo"; + +foo(); +named(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/output.js new file mode 100644 index 000000000000..38636bca5ddf --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named-and-default/output.js @@ -0,0 +1,6 @@ +"use strict"; + +var _foo = babelHelpers.interopRequireWildcard(require("foo"), true); + +(0, _foo.default)(); +(0, _foo.named)(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/input.mjs new file mode 100644 index 000000000000..5f433d61119b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/input.mjs @@ -0,0 +1,3 @@ +import { named } from "foo"; + +named(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/output.js new file mode 100644 index 000000000000..47559b3828a8 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-named/output.js @@ -0,0 +1,5 @@ +"use strict"; + +var _foo = require("foo"); + +(0, _foo.named)(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/input.mjs new file mode 100644 index 000000000000..bf67ef46a2d0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/input.mjs @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/output.js new file mode 100644 index 000000000000..82765e6be3ff --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/import-wildcard/output.js @@ -0,0 +1,5 @@ +"use strict"; + +var foo = babelHelpers.interopRequireWildcard(require("foo"), true); +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json new file mode 100644 index 000000000000..9f388d06b745 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["transform-modules-commonjs", { "importInterop": "node" }] + ] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/input.mjs new file mode 100644 index 000000000000..7d2c9b022e26 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/input.mjs @@ -0,0 +1 @@ +export { default } from 'foo'; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/output.js new file mode 100644 index 000000000000..59daa20c9699 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/export-from/output.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "default", { + enumerable: true, + get: function () { + return _foo.default; + } +}); + +var _foo = require("foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/input.mjs new file mode 100644 index 000000000000..65b75b7293b4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/input.mjs @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/output.js new file mode 100644 index 000000000000..1bc59ef949a6 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-default-only/output.js @@ -0,0 +1,5 @@ +"use strict"; + +var _foo = require("foo"); + +(0, _foo.default)(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/input.mjs new file mode 100644 index 000000000000..bf67ef46a2d0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/input.mjs @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/output.js new file mode 100644 index 000000000000..d50fc39abc15 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/import-wildcard/output.js @@ -0,0 +1,6 @@ +"use strict"; + +var foo = require("foo"); + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json new file mode 100644 index 000000000000..6859308db422 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["transform-modules-commonjs", { "importInterop": "none" }] + ] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js index ee841e5215c3..4d49fdc6cba3 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js @@ -1,3 +1,7 @@ "use strict"; -var foo = babelHelpers.interopRequireWildcard(require("foo")); +var foo = _interopRequireWildcard(require("foo")); + +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js index 4e9428f6bdda..6d3079c94cf8 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js @@ -1,6 +1,10 @@ "use strict"; -var _foo = babelHelpers.interopRequireWildcard(require("foo")); +var _foo = _interopRequireWildcard(require("foo")); + +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } _foo.default; _foo.baz; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js index 22718b49a472..bf5a1b30e1f7 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js @@ -11,12 +11,16 @@ require("./directory/foo-bar"); var _foo2 = babelHelpers.interopRequireDefault(require("foo2")); -var foo2 = babelHelpers.interopRequireWildcard(require("foo3")); +var foo2 = _interopRequireWildcard(require("foo3")); var _foo4 = require("foo4"); var _foo5 = require("foo5"); +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + var test; exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js index 9f51a2747fb2..c253c3493867 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { var _exportNames = {}; exports.default = void 0; -var _react = babelHelpers.interopRequireWildcard(require("react")); +var _react = _interopRequireWildcard(require("react")); Object.keys(_react).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -19,6 +19,11 @@ Object.keys(_react).forEach(function (key) { } }); }); + +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + // The fact that this exports both a normal default, and all of the names via // re-export is an edge case that is important not to miss. See // https://github.com/babel/babel/issues/8306 as an example. diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js index ee841e5215c3..4d49fdc6cba3 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js @@ -1,3 +1,7 @@ "use strict"; -var foo = babelHelpers.interopRequireWildcard(require("foo")); +var foo = _interopRequireWildcard(require("foo")); + +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js index 4e9428f6bdda..6d3079c94cf8 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js @@ -1,6 +1,10 @@ "use strict"; -var _foo = babelHelpers.interopRequireWildcard(require("foo")); +var _foo = _interopRequireWildcard(require("foo")); + +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } _foo.default; _foo.baz; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js index 2c35e0ebc4f1..402d5cd921b2 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js @@ -13,12 +13,16 @@ require("./directory/foo-bar"); var _foo2 = babelHelpers.interopRequireDefault(require("foo2")); -var foo2 = babelHelpers.interopRequireWildcard(require("foo3")); +var foo2 = _interopRequireWildcard(require("foo3")); var _foo4 = require("foo4"); var _foo5 = require("foo5"); +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + var test; exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js index 015566b41f7a..48f966619b41 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js @@ -9,6 +9,6 @@ var foo = _interopRequireWildcard(require("./moduleWithGetter")); exports.foo = foo; -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } +function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/importInterop-function.js b/packages/babel-plugin-transform-modules-commonjs/test/importInterop-function.js new file mode 100644 index 000000000000..9f8c295cd06e --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/importInterop-function.js @@ -0,0 +1,46 @@ +import * as babel from "@babel/core"; +import transformCommonjs from "../lib"; +import externalHelpers from "@babel/plugin-external-helpers"; + +it("'importInterop' accepts a function", function () { + const code = ` + import a from "a"; + import b from "b"; + import c from "c"; + + a(); + b(); + c(); + `; + + const importInterop = source => { + if (source === "a") return "babel"; + else if (source === "b") return "node"; + else if (source === "c") return "none"; + }; + + const output = babel.transformSync(code, { + configFile: false, + ast: false, + plugins: [ + [externalHelpers, { helperVersion: "7.100.0" }], + [transformCommonjs, { importInterop }], + ], + }).code; + + expect(output).toMatchInlineSnapshot(` + "\\"use strict\\"; + + var _a = babelHelpers.interopRequireDefault(require(\\"a\\")); + + var _b = require(\\"b\\"); + + var _c = require(\\"c\\"); + + (0, _a.default)(); + + _b(); + + (0, _c.default)();" + `); +}); diff --git a/packages/babel-plugin-transform-modules-umd/package.json b/packages/babel-plugin-transform-modules-umd/package.json index bcfacc6b6481..bf14a06636ac 100644 --- a/packages/babel-plugin-transform-modules-umd/package.json +++ b/packages/babel-plugin-transform-modules-umd/package.json @@ -25,6 +25,7 @@ }, "devDependencies": { "@babel/core": "workspace:*", - "@babel/helper-plugin-test-runner": "workspace:*" + "@babel/helper-plugin-test-runner": "workspace:*", + "@babel/plugin-external-helpers": "workspace:*" } } diff --git a/packages/babel-plugin-transform-modules-umd/src/index.js b/packages/babel-plugin-transform-modules-umd/src/index.js index 4b1d69b63bdd..37a244b56cb2 100644 --- a/packages/babel-plugin-transform-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-modules-umd/src/index.js @@ -48,6 +48,7 @@ export default declare((api, options) => { strict, strictMode, noInterop, + importInterop, } = options; const constantReexports = @@ -157,6 +158,7 @@ export default declare((api, options) => { strictMode, allowTopLevelThis, noInterop, + importInterop, }, ); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep1.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep1.js new file mode 100644 index 000000000000..8a3a372d7936 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep1.js @@ -0,0 +1 @@ +module.exports = function () { return 1 }; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep2.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep2.js new file mode 100644 index 000000000000..357662bf4dd1 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep2.js @@ -0,0 +1,2 @@ +module.exports = function () { return 2 }; +module.exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep3.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep3.js new file mode 100644 index 000000000000..fb0c33e31371 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep3.js @@ -0,0 +1 @@ +module.exports = function () { return 3 }; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep4.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep4.js new file mode 100644 index 000000000000..593bd6c1de79 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep4.js @@ -0,0 +1,2 @@ +module.exports = function () { return 4 }; +module.exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep5.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep5.js new file mode 100644 index 000000000000..6b94cd70e2fa --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep5.js @@ -0,0 +1,2 @@ +exports.default = function () { return 5 }; + diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep6.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep6.js new file mode 100644 index 000000000000..abb56a970d5d --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep6.js @@ -0,0 +1,2 @@ +exports.default = function () { return 6 }; +exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep7.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep7.js new file mode 100644 index 000000000000..56270c9044cd --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep7.js @@ -0,0 +1,2 @@ +exports.named = function () { return 7 }; + diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep8.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep8.js new file mode 100644 index 000000000000..4982129d7eca --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/dep8.js @@ -0,0 +1,2 @@ +exports.named = function () { return 8 }; +exports.__esModule = true; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/exec.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/exec.js new file mode 100644 index 000000000000..df5f00076e64 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/exec.js @@ -0,0 +1,36 @@ +import dep1 from "./dep1.js"; +import dep2 from "./dep2.js"; +import * as dep3 from "./dep3.js"; +import * as dep4 from "./dep4.js"; +import dep5 from "./dep5.js"; +import dep6 from "./dep6.js"; +import { named as dep7 } from "./dep7.js"; +import { named as dep8 } from "./dep8.js"; + +expect(typeof dep1).toBe("function"); +expect(dep1()).toBe(1); + +expect(typeof dep2).toBe("function"); +expect(dep2()).toBe(2); + +expect(typeof dep3).toBe("object"); +expect(typeof dep3.default).toBe("function"); +expect(dep3.default()).toBe(3); + +expect(typeof dep4).toBe("object"); +expect(typeof dep4.default).toBe("function"); +expect(dep4.default()).toBe(4); + +expect(typeof dep5).toBe("object"); +expect(typeof dep5.default).toBe("function"); +expect(dep5.default()).toBe(5); + +expect(typeof dep6).toBe("object"); +expect(typeof dep6.default).toBe("function"); +expect(dep6.default()).toBe(6); + +expect(typeof dep7).toBe("function"); +expect(dep7()).toBe(7); + +expect(typeof dep8).toBe("function"); +expect(dep8()).toBe(8); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/options.json new file mode 100644 index 000000000000..2104ca43283f --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/exec/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/input.mjs new file mode 100644 index 000000000000..34a68c744aa4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/input.mjs @@ -0,0 +1 @@ +export { default } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/output.js new file mode 100644 index 000000000000..caf7d532a9c4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-default-from/output.js @@ -0,0 +1,20 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports", "dep"], factory); + } else if (typeof exports !== "undefined") { + factory(exports, require("dep")); + } else { + var mod = { + exports: {} + }; + factory(mod.exports, global.dep); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _dep) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.default = _dep; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs new file mode 100644 index 000000000000..0c86d18ead3c --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/input.mjs @@ -0,0 +1 @@ +export { default, name } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/output.js new file mode 100644 index 000000000000..acc336ddbc6d --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-and-default-from/output.js @@ -0,0 +1,32 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports", "dep"], factory); + } else if (typeof exports !== "undefined") { + factory(exports, require("dep")); + } else { + var mod = { + exports: {} + }; + factory(mod.exports, global.dep); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _dep) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.defineProperty(_exports, "default", { + enumerable: true, + get: function () { + return _dep.default; + } + }); + Object.defineProperty(_exports, "name", { + enumerable: true, + get: function () { + return _dep.name; + } + }); + _dep = babelHelpers.interopRequireWildcard(_dep, true); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/input.mjs new file mode 100644 index 000000000000..5cfecdc21b67 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/input.mjs @@ -0,0 +1 @@ +export { name } from 'dep'; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/output.js new file mode 100644 index 000000000000..f602a17e9b40 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/export-named-from/output.js @@ -0,0 +1,25 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports", "dep"], factory); + } else if (typeof exports !== "undefined") { + factory(exports, require("dep")); + } else { + var mod = { + exports: {} + }; + factory(mod.exports, global.dep); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _dep) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.defineProperty(_exports, "name", { + enumerable: true, + get: function () { + return _dep.name; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/input.mjs new file mode 100644 index 000000000000..65b75b7293b4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/input.mjs @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/output.js new file mode 100644 index 000000000000..b4bc1a6314b7 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-default/output.js @@ -0,0 +1,17 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo")); + } else { + var mod = { + exports: {} + }; + factory(global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_foo) { + "use strict"; + + _foo(); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/input.mjs new file mode 100644 index 000000000000..5521c517045c --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/input.mjs @@ -0,0 +1,4 @@ +import foo, { named } from "foo"; + +foo(); +named(); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/output.js new file mode 100644 index 000000000000..48f72b94eae5 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named-and-default/output.js @@ -0,0 +1,19 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo")); + } else { + var mod = { + exports: {} + }; + factory(global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_foo) { + "use strict"; + + _foo = babelHelpers.interopRequireWildcard(_foo, true); + (0, _foo.default)(); + (0, _foo.named)(); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/input.mjs new file mode 100644 index 000000000000..5f433d61119b --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/input.mjs @@ -0,0 +1,3 @@ +import { named } from "foo"; + +named(); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/output.js new file mode 100644 index 000000000000..f393aff90435 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-named/output.js @@ -0,0 +1,17 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo")); + } else { + var mod = { + exports: {} + }; + factory(global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_foo) { + "use strict"; + + (0, _foo.named)(); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/input.mjs new file mode 100644 index 000000000000..bf67ef46a2d0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/input.mjs @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/output.js new file mode 100644 index 000000000000..293727d82bbd --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/import-wildcard/output.js @@ -0,0 +1,19 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo")); + } else { + var mod = { + exports: {} + }; + factory(global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (foo) { + "use strict"; + + foo = babelHelpers.interopRequireWildcard(foo, true); + foo.bar(); + foo.baz(); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json new file mode 100644 index 000000000000..96b92d7c7832 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["transform-modules-umd", { "importInterop": "node" }] + ] +} diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/input.mjs new file mode 100644 index 000000000000..7d2c9b022e26 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/input.mjs @@ -0,0 +1 @@ +export { default } from 'foo'; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/output.js new file mode 100644 index 000000000000..479f52e0bc72 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/export-from/output.js @@ -0,0 +1,25 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports", "foo"], factory); + } else if (typeof exports !== "undefined") { + factory(exports, require("foo")); + } else { + var mod = { + exports: {} + }; + factory(mod.exports, global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.defineProperty(_exports, "default", { + enumerable: true, + get: function () { + return _foo.default; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/input.mjs new file mode 100644 index 000000000000..65b75b7293b4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/input.mjs @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/output.js new file mode 100644 index 000000000000..de4ed1668c26 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-default-only/output.js @@ -0,0 +1,17 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo")); + } else { + var mod = { + exports: {} + }; + factory(global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_foo) { + "use strict"; + + (0, _foo.default)(); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/input.mjs new file mode 100644 index 000000000000..bf67ef46a2d0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/input.mjs @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/output.js new file mode 100644 index 000000000000..2eb56599654e --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/import-wildcard/output.js @@ -0,0 +1,18 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo")); + } else { + var mod = { + exports: {} + }; + factory(global.foo); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (foo) { + "use strict"; + + foo.bar(); + foo.baz(); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json new file mode 100644 index 000000000000..a9a38dded87f --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["transform-modules-umd", { "importInterop": "none" }] + ] +} diff --git a/packages/babel-plugin-transform-modules-umd/test/importInterop-function.js b/packages/babel-plugin-transform-modules-umd/test/importInterop-function.js new file mode 100644 index 000000000000..2c1337597e5b --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/importInterop-function.js @@ -0,0 +1,55 @@ +import * as babel from "@babel/core"; +import transformUmd from "../lib"; +import externalHelpers from "@babel/plugin-external-helpers"; + +it("'importInterop' accepts a function", function () { + const code = ` + import a from "a"; + import b from "b"; + import c from "c"; + + a(); + b(); + c(); + `; + + const importInterop = source => { + if (source === "a") return "babel"; + else if (source === "b") return "node"; + else if (source === "c") return "none"; + }; + + const output = babel.transformSync(code, { + configFile: false, + ast: false, + plugins: [ + [externalHelpers, { helperVersion: "7.100.0" }], + [transformUmd, { importInterop }], + ], + }).code; + + expect(output).toMatchInlineSnapshot(` + "(function (global, factory) { + if (typeof define === \\"function\\" && define.amd) { + define([\\"a\\", \\"b\\", \\"c\\"], factory); + } else if (typeof exports !== \\"undefined\\") { + factory(require(\\"a\\"), require(\\"b\\"), require(\\"c\\")); + } else { + var mod = { + exports: {} + }; + factory(global.a, global.b, global.c); + global.unknown = mod.exports; + } + })(typeof globalThis !== \\"undefined\\" ? globalThis : typeof self !== \\"undefined\\" ? self : this, function (_a, _b, _c) { + \\"use strict\\"; + + _a = babelHelpers.interopRequireDefault(_a); + (0, _a.default)(); + + _b(); + + (0, _c.default)(); + });" + `); +}); diff --git a/yarn.lock b/yarn.lock index 605fda1024e0..3721a53d266d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2348,6 +2348,7 @@ __metadata: "@babel/helper-module-transforms": "workspace:^7.13.0" "@babel/helper-plugin-test-runner": "workspace:*" "@babel/helper-plugin-utils": "workspace:^7.13.0" + "@babel/plugin-external-helpers": "workspace:*" babel-plugin-dynamic-import-node: ^2.3.3 peerDependencies: "@babel/core": ^7.0.0-0 @@ -2377,6 +2378,7 @@ __metadata: "@babel/helper-plugin-test-runner": "workspace:*" "@babel/helper-plugin-utils": "workspace:^7.13.0" "@babel/helper-simple-access": "workspace:^7.12.13" + "@babel/plugin-external-helpers": "workspace:*" "@babel/plugin-syntax-object-rest-spread": ^7.8.3 babel-plugin-dynamic-import-node: ^2.3.3 peerDependencies: @@ -2436,6 +2438,7 @@ __metadata: "@babel/helper-module-transforms": "workspace:^7.13.0" "@babel/helper-plugin-test-runner": "workspace:*" "@babel/helper-plugin-utils": "workspace:^7.13.0" + "@babel/plugin-external-helpers": "workspace:*" peerDependencies: "@babel/core": ^7.0.0-0 languageName: unknown From a53ad677759301f11fd93a533f4c53ce5699f219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 20 Feb 2021 22:52:55 +0100 Subject: [PATCH 2/4] Update fixtures --- .../test/fixtures/amd/imports-glob/output.js | 7 +------ .../test/fixtures/amd/imports-mixing/output.js | 7 +------ .../test/fixtures/amd/overview/output.js | 7 +------ .../test/fixtures/loose/imports-glob/output.js | 7 +------ .../test/fixtures/loose/imports-mixing/output.js | 7 +------ .../test/fixtures/loose/overview/output.js | 7 +------ .../test/fixtures/interop-loose/imports-glob/output.js | 6 +----- .../test/fixtures/interop-loose/imports-mixing/output.js | 6 +----- .../test/fixtures/interop-loose/overview/output.js | 6 +----- .../test/fixtures/interop/export-all/output.js | 7 +------ .../test/fixtures/interop/imports-glob/output.js | 6 +----- .../test/fixtures/interop/imports-mixing/output.js | 6 +----- .../test/fixtures/interop/overview/output.js | 6 +----- 13 files changed, 13 insertions(+), 72 deletions(-) diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js index 88c144d5ea25..c3a94a67fcc7 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-glob/output.js @@ -1,11 +1,6 @@ define(["foo"], function (foo) { "use strict"; - foo = _interopRequireWildcard(foo); - - function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - - function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - + foo = babelHelpers.interopRequireWildcard(foo); foo; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js index 724235d6eb11..df85e22f86fd 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/imports-mixing/output.js @@ -1,12 +1,7 @@ define(["foo"], function (_foo) { "use strict"; - _foo = _interopRequireWildcard(_foo); - - function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - - function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - + _foo = babelHelpers.interopRequireWildcard(_foo); _foo.default; _foo.baz; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js index 2f253a07616d..7b4a2b29561f 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/overview/output.js @@ -5,12 +5,7 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (_exports, value: true }); _exports.default = _exports.test2 = _exports.test = void 0; - foo2 = _interopRequireWildcard(foo2); - - function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - - function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - + foo2 = babelHelpers.interopRequireWildcard(foo2); var test; _exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js index 88c144d5ea25..c3a94a67fcc7 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-glob/output.js @@ -1,11 +1,6 @@ define(["foo"], function (foo) { "use strict"; - foo = _interopRequireWildcard(foo); - - function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - - function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - + foo = babelHelpers.interopRequireWildcard(foo); foo; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js index 724235d6eb11..df85e22f86fd 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/imports-mixing/output.js @@ -1,12 +1,7 @@ define(["foo"], function (_foo) { "use strict"; - _foo = _interopRequireWildcard(_foo); - - function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - - function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - + _foo = babelHelpers.interopRequireWildcard(_foo); _foo.default; _foo.baz; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js index 2a3edaa5dae5..f3942d53ae8f 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/loose/overview/output.js @@ -3,12 +3,7 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (_exports, _exports.__esModule = true; _exports.default = _exports.test2 = _exports.test = void 0; - foo2 = _interopRequireWildcard(foo2); - - function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - - function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - + foo2 = babelHelpers.interopRequireWildcard(foo2); var test; _exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js index 4d49fdc6cba3..ee841e5215c3 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/output.js @@ -1,7 +1,3 @@ "use strict"; -var foo = _interopRequireWildcard(require("foo")); - -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +var foo = babelHelpers.interopRequireWildcard(require("foo")); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js index 6d3079c94cf8..4e9428f6bdda 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/output.js @@ -1,10 +1,6 @@ "use strict"; -var _foo = _interopRequireWildcard(require("foo")); - -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +var _foo = babelHelpers.interopRequireWildcard(require("foo")); _foo.default; _foo.baz; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js index bf5a1b30e1f7..22718b49a472 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/output.js @@ -11,16 +11,12 @@ require("./directory/foo-bar"); var _foo2 = babelHelpers.interopRequireDefault(require("foo2")); -var foo2 = _interopRequireWildcard(require("foo3")); +var foo2 = babelHelpers.interopRequireWildcard(require("foo3")); var _foo4 = require("foo4"); var _foo5 = require("foo5"); -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - var test; exports.test = test; var test2 = 5; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js index c253c3493867..9f51a2747fb2 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-all/output.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { var _exportNames = {}; exports.default = void 0; -var _react = _interopRequireWildcard(require("react")); +var _react = babelHelpers.interopRequireWildcard(require("react")); Object.keys(_react).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -19,11 +19,6 @@ Object.keys(_react).forEach(function (key) { } }); }); - -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - // The fact that this exports both a normal default, and all of the names via // re-export is an edge case that is important not to miss. See // https://github.com/babel/babel/issues/8306 as an example. diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js index 4d49fdc6cba3..ee841e5215c3 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/output.js @@ -1,7 +1,3 @@ "use strict"; -var foo = _interopRequireWildcard(require("foo")); - -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +var foo = babelHelpers.interopRequireWildcard(require("foo")); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js index 6d3079c94cf8..4e9428f6bdda 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/output.js @@ -1,10 +1,6 @@ "use strict"; -var _foo = _interopRequireWildcard(require("foo")); - -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +var _foo = babelHelpers.interopRequireWildcard(require("foo")); _foo.default; _foo.baz; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js index 402d5cd921b2..2c35e0ebc4f1 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/output.js @@ -13,16 +13,12 @@ require("./directory/foo-bar"); var _foo2 = babelHelpers.interopRequireDefault(require("foo2")); -var foo2 = _interopRequireWildcard(require("foo3")); +var foo2 = babelHelpers.interopRequireWildcard(require("foo3")); var _foo4 = require("foo4"); var _foo5 = require("foo5"); -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - var test; exports.test = test; var test2 = 5; From e0039100739867a170c6808d4ffe92ec050391e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sun, 28 Mar 2021 00:09:32 +0100 Subject: [PATCH 3/4] Fix after rebase --- .../test/fixtures/importInterop-node/options.json | 5 +---- .../test/fixtures/importInterop-none/options.json | 5 +---- .../test/fixtures/importInterop-node/options.json | 5 +---- .../test/fixtures/importInterop-none/options.json | 5 +---- .../test/fixtures/importInterop-node/options.json | 5 +---- .../test/fixtures/importInterop-none/options.json | 5 +---- 6 files changed, 6 insertions(+), 24 deletions(-) diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json index c04a464b1cbf..555bb4a2ba64 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-node/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - ["external-helpers", { "helperVersion": "7.100.0" }], - ["transform-modules-amd", { "importInterop": "node" }] - ] + "plugins": [["transform-modules-amd", { "importInterop": "node" }]] } diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json index 5dcf40fa20bc..68e3bb5cdced 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/importInterop-none/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - ["external-helpers", { "helperVersion": "7.100.0" }], - ["transform-modules-amd", { "importInterop": "none" }] - ] + "plugins": [["transform-modules-amd", { "importInterop": "none" }]] } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json index 9f388d06b745..ce7be447fe5e 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-node/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - ["external-helpers", { "helperVersion": "7.100.0" }], - ["transform-modules-commonjs", { "importInterop": "node" }] - ] + "plugins": [["transform-modules-commonjs", { "importInterop": "node" }]] } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json index 6859308db422..b4307f82eeb7 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/importInterop-none/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - ["external-helpers", { "helperVersion": "7.100.0" }], - ["transform-modules-commonjs", { "importInterop": "none" }] - ] + "plugins": [["transform-modules-commonjs", { "importInterop": "none" }]] } diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json index 96b92d7c7832..bd30db5576ee 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-node/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - ["external-helpers", { "helperVersion": "7.100.0" }], - ["transform-modules-umd", { "importInterop": "node" }] - ] + "plugins": [["transform-modules-umd", { "importInterop": "node" }]] } diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json index a9a38dded87f..f43fcb4d4283 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/importInterop-none/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - ["external-helpers", { "helperVersion": "7.100.0" }], - ["transform-modules-umd", { "importInterop": "none" }] - ] + "plugins": [["transform-modules-umd", { "importInterop": "none" }]] } From d195510c236e28c1dc80db8028ef840a8978e7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 6 Apr 2021 11:42:00 +0200 Subject: [PATCH 4/4] Review --- .../src/normalize-and-load-metadata.ts | 10 +++++----- packages/babel-helpers/src/helpers.js | 14 ++++++++------ .../misc/copy-getters-setters-star/output.js | 4 ++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts index 82d0a1986b0e..45046e0bc0f1 100644 --- a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts +++ b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.ts @@ -22,11 +22,11 @@ export interface ModuleMetadata { } export type InteropType = - | "default" - | "namespace" - | "node-default" - | "node-namespace" - | "none"; + | "default" // Babel interop for default-only imports + | "namespace" // Babel interop for namespace or default+named imports + | "node-default" // Node.js interop for default-only imports + | "node-namespace" // Node.js interop for namespace or default+named imports + | "none"; // No interop, or named-only imports export interface SourceModuleMetadata { // A unique variable name to use for this namespace object. Centralized for simplicity. diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 7f9ea7bdfe78..0ef7de23e046 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -619,12 +619,14 @@ helpers.interopRequireDefault = helper("7.0.0-beta.0")` `; helpers.interopRequireWildcard = helper("7.14.0")` - function _getRequireWildcardCache(i) { + function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; - var cache = [/* babel interop */ new WeakMap(), /* node interop */ new WeakMap()]; - _getRequireWildcardCache = function (i) { return cache[i]; }; - return cache[i]; + var cacheBabelInterop = new WeakMap(); + var cacheNodeInterop = new WeakMap(); + return (_getRequireWildcardCache = function (nodeInterop) { + return nodeInterop ? cacheNodeInterop : cacheBabelInterop; + })(nodeInterop); } export default function _interopRequireWildcard(obj, nodeInterop) { @@ -636,7 +638,7 @@ helpers.interopRequireWildcard = helper("7.14.0")` return { default: obj } } - var cache = _getRequireWildcardCache(+!!nodeInterop); + var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } @@ -644,7 +646,7 @@ helpers.interopRequireWildcard = helper("7.14.0")` var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { + if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js index 48f966619b41..a838e5797a95 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/output.js @@ -9,6 +9,6 @@ var foo = _interopRequireWildcard(require("./moduleWithGetter")); exports.foo = foo; -function _getRequireWildcardCache(i) { if (typeof WeakMap !== "function") return null; var cache = [new WeakMap(), new WeakMap()]; _getRequireWildcardCache = function (i) { return cache[i]; }; return cache[i]; } +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(+!!nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key) && key !== "default") { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }