From a6602f8cf7b2ac96429ddc83831f75d2e41caa99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 12 Jan 2021 18:30:51 +0100 Subject: [PATCH 1/3] Implement `constantReexports` assumption --- .../src/config/validation/options.js | 1 + .../src/index.js | 40 +++++++++++-------- .../src/index.js | 11 ++++- .../export-from-2/input.mjs | 1 + .../export-from-2/output.js | 8 ++++ .../export-from-3/input.mjs | 1 + .../export-from-3/output.js | 9 +++++ .../export-from-4/input.mjs | 1 + .../export-from-4/output.js | 8 ++++ .../export-from-5/input.mjs | 1 + .../export-from-5/output.js | 9 +++++ .../export-from-6/input.mjs | 1 + .../export-from-6/output.js | 12 ++++++ .../export-from/input.mjs | 1 + .../export-from/output.js | 8 ++++ .../import-export/input.mjs | 3 ++ .../import-export/output.js | 8 ++++ .../assumption-constantReexports/options.json | 6 +++ .../src/index.js | 10 ++++- .../export-from-2/input.mjs | 1 + .../export-from-2/output.js | 9 +++++ .../export-from-3/input.mjs | 1 + .../export-from-3/output.js | 10 +++++ .../export-from-4/input.mjs | 1 + .../export-from-4/output.js | 9 +++++ .../export-from-5/input.mjs | 1 + .../export-from-5/output.js | 10 +++++ .../export-from-6/input.mjs | 1 + .../export-from-6/output.js | 13 ++++++ .../export-from/input.mjs | 1 + .../export-from/output.js | 9 +++++ .../import-export/input.mjs | 3 ++ .../import-export/output.js | 9 +++++ .../assumption-constantReexports/options.json | 6 +++ .../src/index.js | 10 ++++- .../export-from-2/input.mjs | 1 + .../export-from-2/output.js | 20 ++++++++++ .../export-from-3/input.mjs | 1 + .../export-from-3/output.js | 21 ++++++++++ .../export-from-4/input.mjs | 1 + .../export-from-4/output.js | 20 ++++++++++ .../export-from-5/input.mjs | 1 + .../export-from-5/output.js | 21 ++++++++++ .../export-from-6/input.mjs | 1 + .../export-from-6/output.js | 24 +++++++++++ .../export-from/input.mjs | 1 + .../export-from/output.js | 20 ++++++++++ .../import-export/input.mjs | 3 ++ .../import-export/output.js | 20 ++++++++++ .../assumption-constantReexports/options.json | 6 +++ 50 files changed, 374 insertions(+), 20 deletions(-) create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/options.json create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/options.json create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/options.json diff --git a/packages/babel-core/src/config/validation/options.js b/packages/babel-core/src/config/validation/options.js index 5b45a0dcbd74..b19ea6c7d6b8 100644 --- a/packages/babel-core/src/config/validation/options.js +++ b/packages/babel-core/src/config/validation/options.js @@ -333,6 +333,7 @@ export type NestingPath = RootPath | OverridesPath | EnvPath; export const assumptionsNames = new Set([ "arrayLikeIsIterable", + "constantReexports", "ignoreFunctionLength", "ignoreToPrimitiveHint", "iterableIsArray", diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index 164462ee0450..458b7e43b01b 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -27,14 +27,18 @@ export { hasExports, isSideEffectImport, isModule, rewriteThis }; export function rewriteModuleStatementsAndPrepareHeader( path: NodePath, { + // TODO(Babel 8): Remove this + loose, + exportName, strict, allowTopLevelThis, strictMode, - loose, noInterop, lazy, esNamespaceOnly, + + constantReexports = loose, }, ) { assert(isModule(path), "Cannot process module statements in a script"); @@ -78,7 +82,9 @@ export function rewriteModuleStatementsAndPrepareHeader( } // Create all of the statically known named exports. - headers.push(...buildExportInitializationStatements(path, meta, loose)); + headers.push( + ...buildExportInitializationStatements(path, meta, constantReexports), + ); return { meta, headers }; } @@ -128,7 +134,7 @@ export function wrapInterop( export function buildNamespaceInitStatements( metadata: ModuleMetadata, sourceMetadata: SourceModuleMetadata, - loose: boolean = false, + constantReexports: boolean = false, ) { const statements = []; @@ -146,8 +152,8 @@ export function buildNamespaceInitStatements( }), ); } - if (loose) { - statements.push(...buildReexportsFromMeta(metadata, sourceMetadata, loose)); + if (constantReexports) { + statements.push(...buildReexportsFromMeta(metadata, sourceMetadata, true)); } for (const exportName of sourceMetadata.reexportNamespace) { // Assign export to namespace object. @@ -172,7 +178,7 @@ export function buildNamespaceInitStatements( const statement = buildNamespaceReexport( metadata, t.cloneNode(srcNamespace), - loose, + constantReexports, ); statement.loc = sourceMetadata.reexportAll.loc; @@ -183,8 +189,8 @@ export function buildNamespaceInitStatements( } const ReexportTemplate = { - loose: template.statement`EXPORTS.EXPORT_NAME = NAMESPACE_IMPORT;`, - looseComputed: template.statement`EXPORTS["EXPORT_NAME"] = NAMESPACE_IMPORT;`, + constant: template.statement`EXPORTS.EXPORT_NAME = NAMESPACE_IMPORT;`, + constantComputed: template.statement`EXPORTS["EXPORT_NAME"] = NAMESPACE_IMPORT;`, spec: template` Object.defineProperty(EXPORTS, "EXPORT_NAME", { enumerable: true, @@ -198,7 +204,7 @@ const ReexportTemplate = { const buildReexportsFromMeta = ( meta: ModuleMetadata, metadata: SourceModuleMetadata, - loose, + constantReexports: boolean, ) => { const namespace = metadata.lazy ? t.callExpression(t.identifier(metadata.name), []) @@ -224,11 +230,11 @@ const buildReexportsFromMeta = ( EXPORT_NAME: exportName, NAMESPACE_IMPORT, }; - if (loose) { + if (constantReexports) { if (stringSpecifiers.has(exportName)) { - return ReexportTemplate.looseComputed(astNodes); + return ReexportTemplate.constantComputed(astNodes); } else { - return ReexportTemplate.loose(astNodes); + return ReexportTemplate.constant(astNodes); } } else { return ReexportTemplate.spec(astNodes); @@ -257,8 +263,8 @@ function buildESModuleHeader( /** * Create a re-export initialization loop for a specific imported namespace. */ -function buildNamespaceReexport(metadata, namespace, loose) { - return (loose +function buildNamespaceReexport(metadata, namespace, constantReexports) { + return (constantReexports ? template.statement` Object.keys(NAMESPACE).forEach(function(key) { if (key === "default" || key === "__esModule") return; @@ -347,7 +353,7 @@ function buildExportNameListDeclaration( function buildExportInitializationStatements( programPath: NodePath, metadata: ModuleMetadata, - loose: boolean = false, + constantReexports: boolean = false, ) { const initStatements = []; @@ -365,8 +371,8 @@ function buildExportInitializationStatements( } for (const data of metadata.source.values()) { - if (!loose) { - initStatements.push(...buildReexportsFromMeta(metadata, data, loose)); + if (!constantReexports) { + initStatements.push(...buildReexportsFromMeta(metadata, data, false)); } for (const exportName of data.reexportNamespace) { exportNames.push(exportName); diff --git a/packages/babel-plugin-transform-modules-amd/src/index.js b/packages/babel-plugin-transform-modules-amd/src/index.js index 7ea2b150f04b..e8c9865779fc 100644 --- a/packages/babel-plugin-transform-modules-amd/src/index.js +++ b/packages/babel-plugin-transform-modules-amd/src/index.js @@ -39,6 +39,10 @@ export default declare((api, options) => { api.assertVersion(7); const { loose, allowTopLevelThis, strict, strictMode, noInterop } = options; + + const constantReexports = + api.assumption("constantReexports") ?? options.loose; + return { name: "transform-modules-amd", @@ -104,6 +108,7 @@ export default declare((api, options) => { path, { loose, + constantReexports, strict, strictMode, allowTopLevelThis, @@ -141,7 +146,11 @@ export default declare((api, options) => { } headers.push( - ...buildNamespaceInitStatements(meta, metadata, loose), + ...buildNamespaceInitStatements( + meta, + metadata, + constantReexports, + ), ); } diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs new file mode 100644 index 000000000000..5be9a685aabd --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs @@ -0,0 +1 @@ +export {foo as default} from "foo"; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js new file mode 100644 index 000000000000..b12bf17e5371 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js @@ -0,0 +1,8 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.default = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs new file mode 100644 index 000000000000..4461d79e3bf3 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs @@ -0,0 +1 @@ +export {foo as default, bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js new file mode 100644 index 000000000000..ae0ad933acdd --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js @@ -0,0 +1,9 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.default = _foo.foo; + _exports.bar = _foo.bar; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs new file mode 100644 index 000000000000..9fff903bd969 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs @@ -0,0 +1 @@ +export {foo as bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js new file mode 100644 index 000000000000..accaf5cced80 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js @@ -0,0 +1,8 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.bar = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs new file mode 100644 index 000000000000..35c2762a2954 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs @@ -0,0 +1 @@ +export {foo, bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js new file mode 100644 index 000000000000..a307d4f9af59 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js @@ -0,0 +1,9 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.foo = _foo.foo; + _exports.bar = _foo.bar; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs new file mode 100644 index 000000000000..9ec8f63ab2fd --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs @@ -0,0 +1 @@ +export * from "foo"; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/output.js new file mode 100644 index 000000000000..e7988a807f00 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-6/output.js @@ -0,0 +1,12 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + Object.keys(_foo).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in _exports && _exports[key] === _foo[key]) return; + _exports[key] = _foo[key]; + }); +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/input.mjs new file mode 100644 index 000000000000..83b7b67c51ce --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/input.mjs @@ -0,0 +1 @@ +export {foo} from "foo"; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js new file mode 100644 index 000000000000..22a5d3001891 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js @@ -0,0 +1,8 @@ +define(["exports", "foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.foo = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/input.mjs new file mode 100644 index 000000000000..b9e4c92265a4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/input.mjs @@ -0,0 +1,3 @@ +import { foo } from "./foo"; + +export { foo }; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/output.js new file mode 100644 index 000000000000..4b3c1b13a220 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/import-export/output.js @@ -0,0 +1,8 @@ +define(["exports", "./foo"], function (_exports, _foo) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.foo = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/options.json b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/options.json new file mode 100644 index 000000000000..6687fc23f80a --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "constantReexports": true + }, + "plugins": ["external-helpers", "transform-modules-amd"] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index de9274d890f7..c4514c9a8d95 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -37,6 +37,9 @@ export default declare((api, options) => { allowCommonJSExports = true, } = options; + const constantReexports = + api.assumption("constantReexports") ?? options.loose; + if ( typeof lazy !== "boolean" && typeof lazy !== "function" && @@ -169,6 +172,7 @@ export default declare((api, options) => { path, { exportName: "exports", + constantReexports, loose, strict, strictMode, @@ -215,7 +219,11 @@ export default declare((api, options) => { headers.push(header); headers.push( - ...buildNamespaceInitStatements(meta, metadata, loose), + ...buildNamespaceInitStatements( + meta, + metadata, + constantReexports, + ), ); } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/input.mjs new file mode 100644 index 000000000000..5be9a685aabd --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/input.mjs @@ -0,0 +1 @@ +export {foo as default} from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js new file mode 100644 index 000000000000..32bc9d41c736 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +exports.default = _foo.foo; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/input.mjs new file mode 100644 index 000000000000..4461d79e3bf3 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/input.mjs @@ -0,0 +1 @@ +export {foo as default, bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js new file mode 100644 index 000000000000..b5dd8ac45228 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +exports.default = _foo.foo; +exports.bar = _foo.bar; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/input.mjs new file mode 100644 index 000000000000..9fff903bd969 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/input.mjs @@ -0,0 +1 @@ +export {foo as bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js new file mode 100644 index 000000000000..9e24d1c7bd81 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +exports.bar = _foo.foo; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/input.mjs new file mode 100644 index 000000000000..35c2762a2954 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/input.mjs @@ -0,0 +1 @@ +export {foo, bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js new file mode 100644 index 000000000000..920361babd52 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +exports.foo = _foo.foo; +exports.bar = _foo.bar; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/input.mjs new file mode 100644 index 000000000000..9ec8f63ab2fd --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/input.mjs @@ -0,0 +1 @@ +export * from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/output.js new file mode 100644 index 000000000000..8eba9a5ceeca --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-6/output.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +Object.keys(_foo).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _foo[key]) return; + exports[key] = _foo[key]; +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/input.mjs new file mode 100644 index 000000000000..83b7b67c51ce --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/input.mjs @@ -0,0 +1 @@ +export {foo} from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js new file mode 100644 index 000000000000..4917249d66c4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +exports.foo = _foo.foo; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/input.mjs new file mode 100644 index 000000000000..b9e4c92265a4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/input.mjs @@ -0,0 +1,3 @@ +import { foo } from "./foo"; + +export { foo }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/output.js new file mode 100644 index 000000000000..8e12703582dc --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/import-export/output.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("./foo"); + +exports.foo = _foo.foo; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/options.json new file mode 100644 index 000000000000..d795b6de6c28 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "constantReexports": true + }, + "plugins": ["external-helpers", "transform-modules-commonjs"] +} diff --git a/packages/babel-plugin-transform-modules-umd/src/index.js b/packages/babel-plugin-transform-modules-umd/src/index.js index 0f85d5f9a324..b61fd1ab4e68 100644 --- a/packages/babel-plugin-transform-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-modules-umd/src/index.js @@ -51,6 +51,9 @@ export default declare((api, options) => { noInterop, } = options; + const constantReexports = + api.assumption("constantReexports") ?? options.loose; + /** * Build the assignment statements that initialize the UMD global. */ @@ -148,6 +151,7 @@ export default declare((api, options) => { path, { loose, + constantReexports, strict, strictMode, allowTopLevelThis, @@ -201,7 +205,11 @@ export default declare((api, options) => { } headers.push( - ...buildNamespaceInitStatements(meta, metadata, loose), + ...buildNamespaceInitStatements( + meta, + metadata, + constantReexports, + ), ); } diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs new file mode 100644 index 000000000000..5be9a685aabd --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/input.mjs @@ -0,0 +1 @@ +export {foo as default} from "foo"; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js new file mode 100644 index 000000000000..371f7a0b7a0b --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js @@ -0,0 +1,20 @@ +(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 + }); + _exports.default = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs new file mode 100644 index 000000000000..4461d79e3bf3 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/input.mjs @@ -0,0 +1 @@ +export {foo as default, bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js new file mode 100644 index 000000000000..78ce9d743799 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js @@ -0,0 +1,21 @@ +(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 + }); + _exports.default = _foo.foo; + _exports.bar = _foo.bar; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs new file mode 100644 index 000000000000..9fff903bd969 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/input.mjs @@ -0,0 +1 @@ +export {foo as bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js new file mode 100644 index 000000000000..ad1fae16b22f --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js @@ -0,0 +1,20 @@ +(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 + }); + _exports.bar = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs new file mode 100644 index 000000000000..35c2762a2954 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/input.mjs @@ -0,0 +1 @@ +export {foo, bar} from "foo"; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js new file mode 100644 index 000000000000..c4eef4d4ad88 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js @@ -0,0 +1,21 @@ +(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 + }); + _exports.foo = _foo.foo; + _exports.bar = _foo.bar; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs new file mode 100644 index 000000000000..9ec8f63ab2fd --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/input.mjs @@ -0,0 +1 @@ +export * from "foo"; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/output.js new file mode 100644 index 000000000000..2ce869023290 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-6/output.js @@ -0,0 +1,24 @@ +(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.keys(_foo).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in _exports && _exports[key] === _foo[key]) return; + _exports[key] = _foo[key]; + }); +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/input.mjs new file mode 100644 index 000000000000..83b7b67c51ce --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/input.mjs @@ -0,0 +1 @@ +export {foo} from "foo"; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js new file mode 100644 index 000000000000..14cd5dab5252 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js @@ -0,0 +1,20 @@ +(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 + }); + _exports.foo = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/input.mjs new file mode 100644 index 000000000000..b9e4c92265a4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/input.mjs @@ -0,0 +1,3 @@ +import { foo } from "./foo"; + +export { foo }; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/output.js new file mode 100644 index 000000000000..b1b0636d9e00 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/import-export/output.js @@ -0,0 +1,20 @@ +(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 + }); + _exports.foo = _foo.foo; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/options.json new file mode 100644 index 000000000000..1a3f6d1a0d60 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "constantReexports": true + }, + "plugins": ["external-helpers", "transform-modules-umd"] +} From ab856b18461deae09e8ffbb087b0fd184ccff441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 12 Jan 2021 18:40:52 +0100 Subject: [PATCH 2/3] Implement `enumerableModuleMeta` assumption --- .../src/config/validation/options.js | 1 + .../src/index.js | 7 ++++--- .../src/index.js | 3 +++ .../export/input.mjs | 1 + .../export/output.js | 8 ++++++++ .../options.json | 6 ++++++ .../src/index.js | 3 +++ .../export/input.mjs | 1 + .../export/output.js | 6 ++++++ .../options.json | 6 ++++++ .../src/index.js | 3 +++ .../export/input.mjs | 1 + .../export/output.js | 20 +++++++++++++++++++ .../options.json | 6 ++++++ 14 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/output.js create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/options.json create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/options.json create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/options.json diff --git a/packages/babel-core/src/config/validation/options.js b/packages/babel-core/src/config/validation/options.js index b19ea6c7d6b8..ff011b61227f 100644 --- a/packages/babel-core/src/config/validation/options.js +++ b/packages/babel-core/src/config/validation/options.js @@ -334,6 +334,7 @@ export type NestingPath = RootPath | OverridesPath | EnvPath; export const assumptionsNames = new Set([ "arrayLikeIsIterable", "constantReexports", + "enumerableModuleMeta", "ignoreFunctionLength", "ignoreToPrimitiveHint", "iterableIsArray", diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index 458b7e43b01b..e431900a6b85 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -39,6 +39,7 @@ export function rewriteModuleStatementsAndPrepareHeader( esNamespaceOnly, constantReexports = loose, + enumerableModuleMeta = loose, }, ) { assert(isModule(path), "Cannot process module statements in a script"); @@ -71,7 +72,7 @@ export function rewriteModuleStatementsAndPrepareHeader( const headers = []; if (hasExports(meta) && !strict) { - headers.push(buildESModuleHeader(meta, loose /* enumerable */)); + headers.push(buildESModuleHeader(meta, enumerableModuleMeta)); } const nameList = buildExportNameListDeclaration(path, meta); @@ -247,9 +248,9 @@ const buildReexportsFromMeta = ( */ function buildESModuleHeader( metadata: ModuleMetadata, - enumerable: boolean = false, + enumerableModuleMeta: boolean = false, ) { - return (enumerable + return (enumerableModuleMeta ? template.statement` EXPORTS.__esModule = true; ` diff --git a/packages/babel-plugin-transform-modules-amd/src/index.js b/packages/babel-plugin-transform-modules-amd/src/index.js index e8c9865779fc..e16441eb3a3c 100644 --- a/packages/babel-plugin-transform-modules-amd/src/index.js +++ b/packages/babel-plugin-transform-modules-amd/src/index.js @@ -42,6 +42,8 @@ export default declare((api, options) => { const constantReexports = api.assumption("constantReexports") ?? options.loose; + const enumerableModuleMeta = + api.assumption("enumerableModuleMeta") ?? options.loose; return { name: "transform-modules-amd", @@ -108,6 +110,7 @@ export default declare((api, options) => { path, { loose, + enumerableModuleMeta, constantReexports, strict, strictMode, diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs new file mode 100644 index 000000000000..2263b5a27c28 --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs @@ -0,0 +1 @@ +export var foo = 2; diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/output.js new file mode 100644 index 000000000000..06ac96c4985d --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/export/output.js @@ -0,0 +1,8 @@ +define(["exports"], function (_exports) { + "use strict"; + + _exports.__esModule = true; + _exports.foo = void 0; + var foo = 2; + _exports.foo = foo; +}); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/options.json b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/options.json new file mode 100644 index 000000000000..7f92d5a3c9ea --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-enumerableModuleMeta/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "enumerableModuleMeta": true + }, + "plugins": ["external-helpers", "transform-modules-amd"] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index c4514c9a8d95..42e40a63a310 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -39,6 +39,8 @@ export default declare((api, options) => { const constantReexports = api.assumption("constantReexports") ?? options.loose; + const enumerableModuleMeta = + api.assumption("enumerableModuleMeta") ?? options.loose; if ( typeof lazy !== "boolean" && @@ -173,6 +175,7 @@ export default declare((api, options) => { { exportName: "exports", constantReexports, + enumerableModuleMeta, loose, strict, strictMode, diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs new file mode 100644 index 000000000000..2263b5a27c28 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs @@ -0,0 +1 @@ +export var foo = 2; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/output.js new file mode 100644 index 000000000000..5429b31f4ce8 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/export/output.js @@ -0,0 +1,6 @@ +"use strict"; + +exports.__esModule = true; +exports.foo = void 0; +var foo = 2; +exports.foo = foo; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/options.json new file mode 100644 index 000000000000..7b20177727bd --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-enumerableModuleMeta/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "enumerableModuleMeta": true + }, + "plugins": ["external-helpers", "transform-modules-commonjs"] +} diff --git a/packages/babel-plugin-transform-modules-umd/src/index.js b/packages/babel-plugin-transform-modules-umd/src/index.js index b61fd1ab4e68..26324893dbf1 100644 --- a/packages/babel-plugin-transform-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-modules-umd/src/index.js @@ -53,6 +53,8 @@ export default declare((api, options) => { const constantReexports = api.assumption("constantReexports") ?? options.loose; + const enumerableModuleMeta = + api.assumption("enumerableModuleMeta") ?? options.loose; /** * Build the assignment statements that initialize the UMD global. @@ -152,6 +154,7 @@ export default declare((api, options) => { { loose, constantReexports, + enumerableModuleMeta, strict, strictMode, allowTopLevelThis, diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs new file mode 100644 index 000000000000..2263b5a27c28 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/input.mjs @@ -0,0 +1 @@ +export var foo = 2; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/output.js new file mode 100644 index 000000000000..e80e1fe59ee3 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/export/output.js @@ -0,0 +1,20 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports"], factory); + } else if (typeof exports !== "undefined") { + factory(exports); + } else { + var mod = { + exports: {} + }; + factory(mod.exports); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports) { + "use strict"; + + _exports.__esModule = true; + _exports.foo = void 0; + var foo = 2; + _exports.foo = foo; +}); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/options.json b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/options.json new file mode 100644 index 000000000000..56bfa8f269a6 --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-enumerableModuleMeta/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "enumerableModuleMeta": true + }, + "plugins": ["external-helpers", "transform-modules-umd"] +} From e521f6e277841583585508a3079c6e51e88b645f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 12 Jan 2021 19:00:30 +0100 Subject: [PATCH 3/3] Fix --- .../src/index.js | 2 +- .../src/normalize-and-load-metadata.js | 23 +++++++++++-------- .../src/index.js | 3 +-- .../export-from-2/output.js | 1 + .../export-from-3/output.js | 1 + .../export-from-4/output.js | 1 + .../export-from-5/output.js | 1 + .../export-from/output.js | 1 + .../src/index.js | 3 --- .../export-from-2/output.js | 1 + .../export-from-3/output.js | 1 + .../export-from-4/output.js | 1 + .../export-from-5/output.js | 1 + .../export-from/output.js | 1 + .../src/index.js | 2 -- .../export-from-2/output.js | 1 + .../export-from-3/output.js | 1 + .../export-from-4/output.js | 1 + .../export-from-5/output.js | 1 + .../export-from/output.js | 1 + 20 files changed, 30 insertions(+), 18 deletions(-) diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index e431900a6b85..5e244e2ab2f1 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -47,7 +47,7 @@ export function rewriteModuleStatementsAndPrepareHeader( const meta = normalizeAndLoadModuleMetadata(path, exportName, { noInterop, - loose, + initializeReexports: constantReexports, lazy, esNamespaceOnly, }); diff --git a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js index c95e0b188cb2..84bac99f3ce0 100644 --- a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js +++ b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js @@ -86,7 +86,7 @@ export default function normalizeModuleAndLoadMetadata( exportName?: string, { noInterop = false, - loose = false, + initializeReexports = false, lazy = false, esNamespaceOnly = false, } = {}, @@ -100,10 +100,7 @@ export default function normalizeModuleAndLoadMetadata( const { local, source, hasExports } = getModuleMetadata( programPath, - { - loose, - lazy, - }, + { initializeReexports, lazy }, stringSpecifiers, ); @@ -170,12 +167,15 @@ function getExportSpecifierName( */ function getModuleMetadata( programPath: NodePath, - { loose, lazy }: { loose: boolean, lazy: boolean }, + { + lazy, + initializeReexports, + }: { lazy: boolean, initializeReexports: boolean }, stringSpecifiers: Set, ) { const localData = getLocalExportMetadata( programPath, - loose, + initializeReexports, stringSpecifiers, ); @@ -361,7 +361,7 @@ function getModuleMetadata( */ function getLocalExportMetadata( programPath: NodePath, - loose: boolean, + initializeReexports: boolean, stringSpecifiers: Set, ): Map { const bindingKindLookup = new Map(); @@ -376,7 +376,7 @@ function getLocalExportMetadata( if (child.node.declaration) { child = child.get("declaration"); } else if ( - loose && + initializeReexports && child.node.source && child.get("source").isStringLiteral() ) { @@ -429,7 +429,10 @@ function getLocalExportMetadata( }; programPath.get("body").forEach(child => { - if (child.isExportNamedDeclaration() && (loose || !child.node.source)) { + if ( + child.isExportNamedDeclaration() && + (initializeReexports || !child.node.source) + ) { if (child.node.declaration) { const declaration = child.get("declaration"); const ids = declaration.getOuterBindingIdentifierPaths(); diff --git a/packages/babel-plugin-transform-modules-amd/src/index.js b/packages/babel-plugin-transform-modules-amd/src/index.js index e16441eb3a3c..9d916292d8df 100644 --- a/packages/babel-plugin-transform-modules-amd/src/index.js +++ b/packages/babel-plugin-transform-modules-amd/src/index.js @@ -38,7 +38,7 @@ function injectWrapper(path, wrapper) { export default declare((api, options) => { api.assertVersion(7); - const { loose, allowTopLevelThis, strict, strictMode, noInterop } = options; + const { allowTopLevelThis, strict, strictMode, noInterop } = options; const constantReexports = api.assumption("constantReexports") ?? options.loose; @@ -109,7 +109,6 @@ export default declare((api, options) => { const { meta, headers } = rewriteModuleStatementsAndPrepareHeader( path, { - loose, enumerableModuleMeta, constantReexports, strict, diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js index b12bf17e5371..c4d089259801 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-2/output.js @@ -4,5 +4,6 @@ define(["exports", "foo"], function (_exports, _foo) { Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.default = void 0; _exports.default = _foo.foo; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js index ae0ad933acdd..0497fcd36acb 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-3/output.js @@ -4,6 +4,7 @@ define(["exports", "foo"], function (_exports, _foo) { Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.bar = _exports.default = void 0; _exports.default = _foo.foo; _exports.bar = _foo.bar; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js index accaf5cced80..ee86c9ebeb3a 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-4/output.js @@ -4,5 +4,6 @@ define(["exports", "foo"], function (_exports, _foo) { Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.bar = void 0; _exports.bar = _foo.foo; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js index a307d4f9af59..64d68cdbf862 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from-5/output.js @@ -4,6 +4,7 @@ define(["exports", "foo"], function (_exports, _foo) { Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.bar = _exports.foo = void 0; _exports.foo = _foo.foo; _exports.bar = _foo.bar; }); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js index 22a5d3001891..6fb67b7327a9 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/assumption-constantReexports/export-from/output.js @@ -4,5 +4,6 @@ define(["exports", "foo"], function (_exports, _foo) { Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.foo = void 0; _exports.foo = _foo.foo; }); diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index 42e40a63a310..0004c3c773bc 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -19,8 +19,6 @@ export default declare((api, options) => { const transformImportCall = createDynamicImportTransform(api); const { - loose, - // 'true' for non-mjs files to strictly have .default, instead of having // destructuring-like behavior for their properties. strictNamespace = false, @@ -176,7 +174,6 @@ export default declare((api, options) => { exportName: "exports", constantReexports, enumerableModuleMeta, - loose, strict, strictMode, allowTopLevelThis, diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js index 32bc9d41c736..efa99139e82e 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-2/output.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = void 0; var _foo = require("foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js index b5dd8ac45228..aef9e075e34e 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-3/output.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.bar = exports.default = void 0; var _foo = require("foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js index 9e24d1c7bd81..7c4b8590b769 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-4/output.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.bar = void 0; var _foo = require("foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js index 920361babd52..f9446e04700f 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from-5/output.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.bar = exports.foo = void 0; var _foo = require("foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js index 4917249d66c4..9902d90fc95f 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/assumption-constantReexports/export-from/output.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.foo = void 0; var _foo = require("foo"); diff --git a/packages/babel-plugin-transform-modules-umd/src/index.js b/packages/babel-plugin-transform-modules-umd/src/index.js index 26324893dbf1..4b1d69b63bdd 100644 --- a/packages/babel-plugin-transform-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-modules-umd/src/index.js @@ -44,7 +44,6 @@ export default declare((api, options) => { const { globals, exactGlobals, - loose, allowTopLevelThis, strict, strictMode, @@ -152,7 +151,6 @@ export default declare((api, options) => { const { meta, headers } = rewriteModuleStatementsAndPrepareHeader( path, { - loose, constantReexports, enumerableModuleMeta, strict, diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js index 371f7a0b7a0b..88d339f99e7c 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-2/output.js @@ -16,5 +16,6 @@ Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.default = void 0; _exports.default = _foo.foo; }); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js index 78ce9d743799..6a46f9585f99 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-3/output.js @@ -16,6 +16,7 @@ Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.bar = _exports.default = void 0; _exports.default = _foo.foo; _exports.bar = _foo.bar; }); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js index ad1fae16b22f..de25f98ea8a6 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-4/output.js @@ -16,5 +16,6 @@ Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.bar = void 0; _exports.bar = _foo.foo; }); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js index c4eef4d4ad88..ebcd9bd3ef61 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from-5/output.js @@ -16,6 +16,7 @@ Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.bar = _exports.foo = void 0; _exports.foo = _foo.foo; _exports.bar = _foo.bar; }); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js index 14cd5dab5252..4e921805b159 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/assumption-constantReexports/export-from/output.js @@ -16,5 +16,6 @@ Object.defineProperty(_exports, "__esModule", { value: true }); + _exports.foo = void 0; _exports.foo = _foo.foo; });