From 27d560ed30438cbb1fae18d3fa131233eb744cf5 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 27 May 2021 13:10:30 +0200 Subject: [PATCH] Fix crash when using inlineDynamicImports with no-treeshake (#4104) --- src/Module.ts | 17 ++++++----- .../inline-dynamic-no-treeshake/_config.js | 29 +++++++++++++++++++ .../inline-dynamic-no-treeshake/dep.js | 1 + .../inline-dynamic-no-treeshake/reexport.js | 1 + 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 test/function/samples/inline-dynamic-no-treeshake/_config.js create mode 100644 test/function/samples/inline-dynamic-no-treeshake/dep.js create mode 100644 test/function/samples/inline-dynamic-no-treeshake/reexport.js diff --git a/src/Module.ts b/src/Module.ts index a58525fb93f..0755ba90e23 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -362,17 +362,18 @@ export default class Module { } necessaryDependencies.add(variable.module!); } - if (this.options.treeshake && this.info.hasModuleSideEffects !== 'no-treeshake') { - this.addRelevantSideEffectDependencies( - relevantDependencies, - necessaryDependencies, - alwaysCheckedDependencies - ); - } else { + if (!this.options.treeshake || this.info.hasModuleSideEffects === 'no-treeshake') { for (const dependency of this.dependencies) { - relevantDependencies.add(dependency); + if (dependency instanceof ExternalModule || dependency.isIncluded()) { + relevantDependencies.add(dependency); + } } } + this.addRelevantSideEffectDependencies( + relevantDependencies, + necessaryDependencies, + alwaysCheckedDependencies + ); for (const dependency of necessaryDependencies) { relevantDependencies.add(dependency); } diff --git a/test/function/samples/inline-dynamic-no-treeshake/_config.js b/test/function/samples/inline-dynamic-no-treeshake/_config.js new file mode 100644 index 00000000000..326238d2f61 --- /dev/null +++ b/test/function/samples/inline-dynamic-no-treeshake/_config.js @@ -0,0 +1,29 @@ +const MAGIC_ENTRY = 'main'; + +module.exports = { + description: 'handles inlining dynamic imports when treeshaking is disabled for modules (#4098)', + options: { + input: MAGIC_ENTRY, + output: { + inlineDynamicImports: true + }, + plugins: [ + { + name: 'magic-modules', + buildStart() { + this.emitFile({ type: 'chunk', id: './dep.js' }); + }, + async resolveId(source) { + if (source === MAGIC_ENTRY) { + return { id: source, moduleSideEffects: 'no-treeshake' }; + } + return null; + }, + async load(id) { + if (id !== MAGIC_ENTRY) return null; + return `import {foo} from './reexport.js';assert.strictEqual(foo, 1);`; + } + } + ] + } +}; diff --git a/test/function/samples/inline-dynamic-no-treeshake/dep.js b/test/function/samples/inline-dynamic-no-treeshake/dep.js new file mode 100644 index 00000000000..bb1843d113a --- /dev/null +++ b/test/function/samples/inline-dynamic-no-treeshake/dep.js @@ -0,0 +1 @@ +export const foo = 1; diff --git a/test/function/samples/inline-dynamic-no-treeshake/reexport.js b/test/function/samples/inline-dynamic-no-treeshake/reexport.js new file mode 100644 index 00000000000..67f8e3c5192 --- /dev/null +++ b/test/function/samples/inline-dynamic-no-treeshake/reexport.js @@ -0,0 +1 @@ +export * from './dep.js';