diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index 522a1438dc..0f4d160f30 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -22,7 +22,7 @@ export { hasExports, isSideEffectImport, isModule }; */ export function rewriteModuleStatementsAndPrepareHeader( path: NodePath, - { exportName, strict, allowTopLevelThis, strictMode, loose, noInterop }, + { exportName, strict, allowTopLevelThis, strictMode, loose, noInterop, lazy }, ) { assert(isModule(path), "Cannot process module statements in a script"); path.node.sourceType = "script"; @@ -30,6 +30,7 @@ export function rewriteModuleStatementsAndPrepareHeader( const meta = normalizeAndLoadModuleMetadata(path, exportName, { noInterop, loose, + lazy, }); if (!allowTopLevelThis) { @@ -117,6 +118,9 @@ export function buildNamespaceInitStatements( ) { const statements = []; + let srcNamespace = t.identifier(sourceMetadata.name); + if (sourceMetadata.lazy) srcNamespace = t.callExpression(srcNamespace, []); + for (const localName of sourceMetadata.importsNamespace) { if (localName === sourceMetadata.name) continue; @@ -124,7 +128,7 @@ export function buildNamespaceInitStatements( statements.push( template.statement`var NAME = SOURCE;`({ NAME: localName, - SOURCE: sourceMetadata.name, + SOURCE: t.cloneDeep(srcNamespace), }), ); } @@ -134,17 +138,26 @@ export function buildNamespaceInitStatements( for (const exportName of sourceMetadata.reexportNamespace) { // Assign export to namespace object. statements.push( - template.statement`EXPORTS.NAME = NAMESPACE;`({ + (sourceMetadata.lazy + ? template.statement` + Object.defineProperty(EXPORTS, "NAME", { + enumerable: true, + get: function() { + return NAMESPACE; + } + }); + ` + : template.statement`EXPORTS.NAME = NAMESPACE;`)({ EXPORTS: metadata.exportName, NAME: exportName, - NAMESPACE: sourceMetadata.name, + NAMESPACE: t.cloneDeep(srcNamespace), }), ); } if (sourceMetadata.reexportAll) { const statement = buildNamespaceReexport( metadata, - sourceMetadata.name, + t.cloneDeep(srcNamespace), loose, ); statement.loc = sourceMetadata.reexportAll.loc; @@ -169,12 +182,16 @@ const getTemplateForReexport = loose => { }; const buildReexportsFromMeta = (meta, metadata, loose) => { + const namespace = metadata.lazy + ? t.callExpression(t.identifier(metadata.name), []) + : t.identifier(metadata.name); + const templateForCurrentMode = getTemplateForReexport(loose); return Array.from(metadata.reexports, ([exportName, importName]) => templateForCurrentMode({ EXPORTS: meta.exportName, EXPORT_NAME: exportName, - NAMESPACE: metadata.name, + NAMESPACE: t.cloneDeep(namespace), IMPORT_NAME: importName, }), ); 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 2e5f254474..c937ab5e61 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 function isSideEffectImport(source: SourceModuleMetadata) { export default function normalizeModuleAndLoadMetadata( programPath: NodePath, exportName?: string, - { noInterop = false, loose = false } = {}, + { noInterop = false, loose = false, lazy = false } = {}, ): ModuleMetadata { if (!exportName) { exportName = programPath.scope.generateUidIdentifier("exports").name; @@ -94,7 +94,7 @@ export default function normalizeModuleAndLoadMetadata( nameAnonymousExports(programPath); - const { local, source } = getModuleMetadata(programPath, loose); + const { local, source } = getModuleMetadata(programPath, { loose, lazy }); removeModuleDeclarations(programPath); @@ -120,7 +120,10 @@ export default function normalizeModuleAndLoadMetadata( /** * Get metadata about the imports and exports present in this module. */ -function getModuleMetadata(programPath: NodePath, loose: boolean) { +function getModuleMetadata( + programPath: NodePath, + { loose, lazy }: { loose: boolean, lazy: boolean }, +) { const localData = getLocalExportMetadata(programPath, loose); const sourceData = new Map(); @@ -146,6 +149,8 @@ function getModuleMetadata(programPath: NodePath, loose: boolean) { reexports: new Map(), reexportNamespace: new Set(), reexportAll: null, + + lazy: false, }; sourceData.set(source, data); } @@ -249,6 +254,25 @@ function getModuleMetadata(programPath: NodePath, loose: boolean) { } } + for (const [source, metadata] of sourceData) { + if ( + lazy !== false && + !(isSideEffectImport(metadata) || metadata.reexportAll) + ) { + if (lazy === true) { + // 'true' means that local relative files are eagerly loaded and + // dependency modules are loaded lazily. + metadata.lazy = !/\./.test(source); + } else if (Array.isArray(lazy)) { + metadata.lazy = lazy.indexOf(source); + } else if (typeof lazy === "function") { + metadata.lazy = lazy(source); + } else { + throw new Error(`.lazy must be a boolean, string array, or function`); + } + } + } + return { local: localData, source: sourceData, diff --git a/packages/babel-helper-module-transforms/src/rewrite-live-references.js b/packages/babel-helper-module-transforms/src/rewrite-live-references.js index a1dc3e6bfc..484633d75a 100644 --- a/packages/babel-helper-module-transforms/src/rewrite-live-references.js +++ b/packages/babel-helper-module-transforms/src/rewrite-live-references.js @@ -61,11 +61,17 @@ export default function rewriteLiveReferences( imported, // local / import exported, // local name => exported name list buildImportReference: ([source, importName, localName], identNode) => { - if (localName) return identNode; + const meta = metadata.source.get(source); - const name = metadata.source.get(source).name; + if (localName) { + if (meta.lazy) identNode = t.callExpression(identNode, []); + return identNode; + } - return t.memberExpression(t.identifier(name), t.identifier(importName)); + let namespace = t.identifier(meta.name); + if (meta.lazy) namespace = t.callExpression(namespace, []); + + return t.memberExpression(namespace, t.identifier(importName)); }, }); } diff --git a/packages/babel-plugin-transform-modules-commonjs/README.md b/packages/babel-plugin-transform-modules-commonjs/README.md index 8de45003ff..397965b7d7 100644 --- a/packages/babel-plugin-transform-modules-commonjs/README.md +++ b/packages/babel-plugin-transform-modules-commonjs/README.md @@ -130,3 +130,37 @@ function _interopRequireDefault(obj) { In cases where the auto-unwrapping of `default` is not needed, you can set the `noInterop` option to `true` to avoid the usage of the `interopRequireDefault` helper (shown in inline form above). + +### `lazy` + +`boolean`, `Array`, or `(string) => boolean`, defaults to `false` + +Changes Babel's compiled `import` statements to be lazily evaluated when their +imported bindings are used for the first time. + +This can improve initial load time of your module because evaluating +dependencies up front is sometimes entirely un-necessary. This is especially +the case when implementing a library module. + +The value of `lazy` has a few possible effects: + +* `false` - No lazy initialization of any imported module. +* `true` - Do not lazy-initialize local `./foo` imports, but lazy-init `foo` dependencies. + + Local paths are much more likely to have circular dependencies, which may break if loaded lazily, + so they are not lazy by default, whereas dependencies between independent modules are rarely cyclical. + +* `Array` - Lazy-initialize all imports with source matching one of the given strings. +* `(string) => boolean` - Pass a callback that will be called to decide if a given source string should be lazy-loaded. + +The two cases where imports can never be lazy are: + +* `import "foo";` + + Side-effect imports are automatically non-lazy since their very existence means + that there is no binding to later kick off initialization. + +* `export * from "foo"` + + Re-exporting all names requires up-front execution because otherwise there is no + way to know what names need to be exported. diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index b6607a8144..30adf43142 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -16,9 +16,19 @@ export default function(api, options) { strict, strictMode, noInterop, + lazy = false, // Defaulting to 'true' for now. May change before 7.x major. allowCommonJSExports = true, } = options; + + if ( + typeof lazy !== "boolean" && + typeof lazy !== "function" && + (!Array.isArray(lazy) || !lazy.every(item => typeof item === "string")) + ) { + throw new Error(`.lazy must be a boolean, array of strings, or a function`); + } + const getAssertion = localName => template.expression.ast` (function(){ throw new Error("The CommonJS '" + "${localName}" + "' variable is not available in ES6 modules."); @@ -122,6 +132,7 @@ export default function(api, options) { strictMode, allowTopLevelThis, noInterop, + lazy, }, ); @@ -132,14 +143,26 @@ export default function(api, options) { let header; if (isSideEffectImport(metadata)) { + if (metadata.lazy) throw new Error("Assertion failure"); + header = t.expressionStatement(loadExpr); } else { - header = t.variableDeclaration("var", [ - t.variableDeclarator( - t.identifier(metadata.name), - wrapInterop(path, loadExpr, metadata.interop) || loadExpr, - ), - ]); + const init = + wrapInterop(path, loadExpr, metadata.interop) || loadExpr; + + if (metadata.lazy) { + header = template.ast` + function ${metadata.name}() { + const data = ${init}; + ${metadata.name} = function(){ return data; }; + return data; + } + `; + } else { + header = template.ast` + var ${metadata.name} = ${init}; + `; + } } header.loc = metadata.loc; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-default/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-default/actual.js new file mode 100644 index 0000000000..4ab969f1ae --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-default/actual.js @@ -0,0 +1,3 @@ +import foo from "foo"; + +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-default/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-default/expected.js new file mode 100644 index 0000000000..3ec822017b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-default/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +function _foo() { + const data = babelHelpers.interopRequireDefault(require("foo")); + + _foo = function () { + return data; + }; + + return data; +} + +console.log(_foo().default); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-named/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-named/actual.js new file mode 100644 index 0000000000..2d7225900f --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-named/actual.js @@ -0,0 +1,3 @@ +import { foo } from "foo"; + +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-named/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-named/expected.js new file mode 100644 index 0000000000..10761e65a8 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-named/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +function _foo() { + const data = require("foo"); + + _foo = function () { + return data; + }; + + return data; +} + +console.log(_foo().foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/actual.js new file mode 100644 index 0000000000..20374a9bd7 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/actual.js @@ -0,0 +1,3 @@ +import * as foo from "foo"; + +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/expected.js new file mode 100644 index 0000000000..e720a87205 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +function foo() { + const data = babelHelpers.interopRequireWildcard(require("foo")); + + foo = function () { + return data; + }; + + return data; +} + +console.log(foo()); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/options.json new file mode 100644 index 0000000000..edcd5f7c4c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "external-helpers", + ["transform-modules-commonjs", { "lazy": true }] + ] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-all/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-all/actual.js new file mode 100644 index 0000000000..9ec8f63ab2 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-all/actual.js @@ -0,0 +1 @@ +export * from "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-all/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-all/expected.js new file mode 100644 index 0000000000..2c7b3bc5c6 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-all/expected.js @@ -0,0 +1,17 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("foo"); + +Object.keys(_foo).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _foo[key]; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-default/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-default/actual.js new file mode 100644 index 0000000000..e69b23b83b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-default/actual.js @@ -0,0 +1,2 @@ +import foo from "foo"; +export { foo as default }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-default/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-default/expected.js new file mode 100644 index 0000000000..d1041b73a5 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-default/expected.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "default", { + enumerable: true, + get: function () { + return _foo().default; + } +}); + +function _foo() { + const data = babelHelpers.interopRequireDefault(require("foo")); + + _foo = function () { + return data; + }; + + return data; +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-named/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-named/actual.js new file mode 100644 index 0000000000..f799a47e3b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-named/actual.js @@ -0,0 +1,2 @@ +import { named } from "foo"; +export { named }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-named/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-named/expected.js new file mode 100644 index 0000000000..bdb45a3d04 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-named/expected.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "named", { + enumerable: true, + get: function () { + return _foo().named; + } +}); + +function _foo() { + const data = require("foo"); + + _foo = function () { + return data; + }; + + return data; +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/actual.js new file mode 100644 index 0000000000..c10ecafc51 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/actual.js @@ -0,0 +1,2 @@ +import * as namespace from "foo"; +export { namespace }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/expected.js new file mode 100644 index 0000000000..239f67e25a --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/expected.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.namespace = void 0; + +function namespace() { + const data = babelHelpers.interopRequireWildcard(require("foo")); + + namespace = function () { + return data; + }; + + return data; +} + +Object.defineProperty(exports, "namespace", { + enumerable: true, + get: function () { + return namespace(); + } +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/sideeffect/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/sideeffect/actual.js new file mode 100644 index 0000000000..c0748305d5 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/sideeffect/actual.js @@ -0,0 +1 @@ +import "foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/sideeffect/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/sideeffect/expected.js new file mode 100644 index 0000000000..dd9a2dce26 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/sideeffect/expected.js @@ -0,0 +1,3 @@ +"use strict"; + +require("foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-default/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-default/actual.js new file mode 100644 index 0000000000..4ff175b498 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-default/actual.js @@ -0,0 +1,3 @@ +import foo from "./foo"; + +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-default/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-default/expected.js new file mode 100644 index 0000000000..4e744585c8 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-default/expected.js @@ -0,0 +1,5 @@ +"use strict"; + +var _foo = babelHelpers.interopRequireDefault(require("./foo")); + +console.log(_foo.default); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-named/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-named/actual.js new file mode 100644 index 0000000000..0fe883ae12 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-named/actual.js @@ -0,0 +1,3 @@ +import { foo } from "./foo"; + +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-named/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-named/expected.js new file mode 100644 index 0000000000..c3db1307f1 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-named/expected.js @@ -0,0 +1,5 @@ +"use strict"; + +var _foo = require("./foo"); + +console.log(_foo.foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/actual.js new file mode 100644 index 0000000000..3ed8b5bd70 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/actual.js @@ -0,0 +1,3 @@ +import * as foo from "./foo"; + +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/expected.js new file mode 100644 index 0000000000..d041921ee4 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/expected.js @@ -0,0 +1,4 @@ +"use strict"; + +var foo = babelHelpers.interopRequireWildcard(require("./foo")); +console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/options.json new file mode 100644 index 0000000000..edcd5f7c4c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "external-helpers", + ["transform-modules-commonjs", { "lazy": true }] + ] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-all/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-all/actual.js new file mode 100644 index 0000000000..5567e8d73a --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-all/actual.js @@ -0,0 +1 @@ +export * from "./foo"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-all/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-all/expected.js new file mode 100644 index 0000000000..9f28bb1142 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-all/expected.js @@ -0,0 +1,17 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require("./foo"); + +Object.keys(_foo).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _foo[key]; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-default/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-default/actual.js new file mode 100644 index 0000000000..2aede48ba8 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-default/actual.js @@ -0,0 +1,2 @@ +import foo from "./foo"; +export { foo as default }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-default/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-default/expected.js new file mode 100644 index 0000000000..533346be97 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-default/expected.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 = babelHelpers.interopRequireDefault(require("./foo")); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-named/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-named/actual.js new file mode 100644 index 0000000000..7855dc48bf --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-named/actual.js @@ -0,0 +1,2 @@ +import { named } from "./foo"; +export { named }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-named/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-named/expected.js new file mode 100644 index 0000000000..1de1c1ebd7 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-named/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "named", { + enumerable: true, + get: function () { + return _foo.named; + } +}); + +var _foo = require("./foo"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/actual.js new file mode 100644 index 0000000000..b44913ff89 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/actual.js @@ -0,0 +1,2 @@ +import * as namespace from "./foo"; +export { namespace }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/expected.js new file mode 100644 index 0000000000..6aad5e4726 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/expected.js @@ -0,0 +1,8 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.namespace = void 0; +var namespace = babelHelpers.interopRequireWildcard(require("./foo")); +exports.namespace = namespace; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/sideeffect/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/sideeffect/actual.js new file mode 100644 index 0000000000..3a0ce29651 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/sideeffect/actual.js @@ -0,0 +1 @@ +import "./a"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/sideeffect/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/sideeffect/expected.js new file mode 100644 index 0000000000..d9c50859c3 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/sideeffect/expected.js @@ -0,0 +1,3 @@ +"use strict"; + +require("./a"); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-default/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-default/actual.js new file mode 100644 index 0000000000..d82c2f5f59 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-default/actual.js @@ -0,0 +1,7 @@ +import foo1 from "white"; + +console.log(foo1); + +import foo2 from "black"; + +console.log(foo2); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-default/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-default/expected.js new file mode 100644 index 0000000000..a8f74edadb --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-default/expected.js @@ -0,0 +1,16 @@ +"use strict"; + +var _white = babelHelpers.interopRequireDefault(require("white")); + +function _black() { + const data = babelHelpers.interopRequireDefault(require("black")); + + _black = function () { + return data; + }; + + return data; +} + +console.log(_white.default); +console.log(_black().default); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-named/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-named/actual.js new file mode 100644 index 0000000000..4fc06ffa52 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-named/actual.js @@ -0,0 +1,7 @@ +import { foo1 } from "white"; + +console.log(foo1); + +import { foo2 } from "black"; + +console.log(foo2); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-named/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-named/expected.js new file mode 100644 index 0000000000..839569975a --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-named/expected.js @@ -0,0 +1,16 @@ +"use strict"; + +var _white = require("white"); + +function _black() { + const data = require("black"); + + _black = function () { + return data; + }; + + return data; +} + +console.log(_white.foo1); +console.log(_black().foo2); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/actual.js new file mode 100644 index 0000000000..20c0457ede --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/actual.js @@ -0,0 +1,7 @@ +import * as foo1 from "white"; + +console.log(foo1); + +import * as foo2 from "black"; + +console.log(foo2); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/expected.js new file mode 100644 index 0000000000..703d0cdd86 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/expected.js @@ -0,0 +1,16 @@ +"use strict"; + +var foo1 = babelHelpers.interopRequireWildcard(require("white")); + +function foo2() { + const data = babelHelpers.interopRequireWildcard(require("black")); + + foo2 = function () { + return data; + }; + + return data; +} + +console.log(foo1); +console.log(foo2()); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/options.json new file mode 100644 index 0000000000..ac2f03bf91 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "external-helpers", + ["transform-modules-commonjs", { "lazy": ["white"] }] + ] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-all/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-all/actual.js new file mode 100644 index 0000000000..c70969c6ae --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-all/actual.js @@ -0,0 +1,3 @@ +export * from "white"; + +export * from "black"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-all/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-all/expected.js new file mode 100644 index 0000000000..bc299957cb --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-all/expected.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _white = require("white"); + +Object.keys(_white).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _white[key]; + } + }); +}); + +var _black = require("black"); + +Object.keys(_black).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _black[key]; + } + }); +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-default/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-default/actual.js new file mode 100644 index 0000000000..1aade34dee --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-default/actual.js @@ -0,0 +1,2 @@ +import foo from "white"; +export { foo as default }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-default/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-default/expected.js new file mode 100644 index 0000000000..4286297a7d --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-default/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "default", { + enumerable: true, + get: function () { + return _white.default; + } +}); + +var _white = babelHelpers.interopRequireDefault(require("white")); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-named/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-named/actual.js new file mode 100644 index 0000000000..d119bdd215 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-named/actual.js @@ -0,0 +1,5 @@ +import { named1 } from "white"; +export { named1 }; + +import { named2 } from "black"; +export { named2 }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-named/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-named/expected.js new file mode 100644 index 0000000000..5ef2c0f7bf --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-named/expected.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "named1", { + enumerable: true, + get: function () { + return _white.named1; + } +}); +Object.defineProperty(exports, "named2", { + enumerable: true, + get: function () { + return _black().named2; + } +}); + +var _white = require("white"); + +function _black() { + const data = require("black"); + + _black = function () { + return data; + }; + + return data; +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/actual.js new file mode 100644 index 0000000000..608fac6689 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/actual.js @@ -0,0 +1,5 @@ +import * as namespace1 from "white"; +export { namespace1 }; + +import * as namespace2 from "black"; +export { namespace2 }; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/expected.js new file mode 100644 index 0000000000..7e52454406 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/expected.js @@ -0,0 +1,25 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.namespace2 = exports.namespace1 = void 0; +var namespace1 = babelHelpers.interopRequireWildcard(require("white")); +exports.namespace1 = namespace1; + +function namespace2() { + const data = babelHelpers.interopRequireWildcard(require("black")); + + namespace2 = function () { + return data; + }; + + return data; +} + +Object.defineProperty(exports, "namespace2", { + enumerable: true, + get: function () { + return namespace2(); + } +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/sideeffect/actual.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/sideeffect/actual.js new file mode 100644 index 0000000000..88280a2368 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/sideeffect/actual.js @@ -0,0 +1,2 @@ +import "white"; +import "black"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/sideeffect/expected.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/sideeffect/expected.js new file mode 100644 index 0000000000..1f8ffe799d --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/sideeffect/expected.js @@ -0,0 +1,5 @@ +"use strict"; + +require("white"); + +require("black");