diff --git a/src/Module.ts b/src/Module.ts index d493125f40e..d112cc5a398 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -1277,10 +1277,14 @@ export default class Module { } private includeVariable(variable: Variable): void { - if (!variable.included) { + const variableModule = variable.module; + if (variable.included) { + if (variableModule instanceof Module && variableModule !== this) { + getAndExtendSideEffectModules(variable, this); + } + } else { variable.include(); this.graph.needsTreeshakingPass = true; - const variableModule = variable.module; if (variableModule instanceof Module) { if (!variableModule.isExecuted) { markModuleAndImpureDependenciesAsExecuted(variableModule); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_config.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_config.js new file mode 100644 index 00000000000..51f8ded2009 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_config.js @@ -0,0 +1,21 @@ +const path = require('node:path'); +const commonjs = require('@rollup/plugin-commonjs'); + +module.exports = defineTest({ + description: 'the content of c.js is complete', + options: { + plugins: [ + commonjs(), + { + resolveId(id) { + if (id === './c.js') { + return { + id: path.resolve('./c.js'), + moduleSideEffects: false + }; + } + } + } + ] + } +}); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-a.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-a.js new file mode 100644 index 00000000000..4766a0a0a48 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-a.js @@ -0,0 +1,9 @@ +define(['exports', './generated-c'], (function (exports, c) { 'use strict'; + + function A() { + return { icon: c.c.faPrint }; + } + + exports.A = A; + +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-b.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-b.js new file mode 100644 index 00000000000..ef1aab78965 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-b.js @@ -0,0 +1,9 @@ +define(['exports', './generated-c'], (function (exports, c) { 'use strict'; + + function B() { + return { icon: c.c.faPrint }; + } + + exports.B = B; + +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-c.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-c.js new file mode 100644 index 00000000000..588a986aa91 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/generated-c.js @@ -0,0 +1,15 @@ +define(['exports'], (function (exports) { 'use strict'; + + var c = {}; + + (function (exports) { + exports.preFaPrint = { + foo: 1 + }; + + exports.faPrint = exports.preFaPrint; + } (c)); + + exports.c = c; + +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/main.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/main.js new file mode 100644 index 00000000000..c7d1bb41894 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/amd/main.js @@ -0,0 +1,8 @@ +define(['require'], (function (require) { 'use strict'; + + const importA = () => new Promise(function (resolve, reject) { require(['./generated-a'], resolve, reject); }); + const importB = () => new Promise(function (resolve, reject) { require(['./generated-b'], resolve, reject); }); + + console.log(importA, importB); + +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-a.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-a.js new file mode 100644 index 00000000000..bd5f318f3bc --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-a.js @@ -0,0 +1,9 @@ +'use strict'; + +var c = require('./generated-c.js'); + +function A() { + return { icon: c.c.faPrint }; +} + +exports.A = A; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-b.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-b.js new file mode 100644 index 00000000000..5ca715cafa8 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-b.js @@ -0,0 +1,9 @@ +'use strict'; + +var c = require('./generated-c.js'); + +function B() { + return { icon: c.c.faPrint }; +} + +exports.B = B; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-c.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-c.js new file mode 100644 index 00000000000..7dacd8395be --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/generated-c.js @@ -0,0 +1,13 @@ +'use strict'; + +var c = {}; + +(function (exports) { + exports.preFaPrint = { + foo: 1 + }; + + exports.faPrint = exports.preFaPrint; +} (c)); + +exports.c = c; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/main.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/main.js new file mode 100644 index 00000000000..90831d35d8a --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/cjs/main.js @@ -0,0 +1,6 @@ +'use strict'; + +const importA = () => Promise.resolve().then(function () { return require('./generated-a.js'); }); +const importB = () => Promise.resolve().then(function () { return require('./generated-b.js'); }); + +console.log(importA, importB); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-a.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-a.js new file mode 100644 index 00000000000..55a6eaa4904 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-a.js @@ -0,0 +1,7 @@ +import { c } from './generated-c.js'; + +function A() { + return { icon: c.faPrint }; +} + +export { A }; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-b.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-b.js new file mode 100644 index 00000000000..4f88a796cba --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-b.js @@ -0,0 +1,7 @@ +import { c } from './generated-c.js'; + +function B() { + return { icon: c.faPrint }; +} + +export { B }; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-c.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-c.js new file mode 100644 index 00000000000..712ccd9092d --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/generated-c.js @@ -0,0 +1,11 @@ +var c = {}; + +(function (exports) { + exports.preFaPrint = { + foo: 1 + }; + + exports.faPrint = exports.preFaPrint; +} (c)); + +export { c }; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/main.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/main.js new file mode 100644 index 00000000000..c4861967ba3 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/es/main.js @@ -0,0 +1,4 @@ +const importA = () => import('./generated-a.js'); +const importB = () => import('./generated-b.js'); + +console.log(importA, importB); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-a.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-a.js new file mode 100644 index 00000000000..3c0565a6b5d --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-a.js @@ -0,0 +1,18 @@ +System.register(['./generated-c.js'], (function (exports) { + 'use strict'; + var c; + return { + setters: [function (module) { + c = module.c; + }], + execute: (function () { + + exports('A', A); + + function A() { + return { icon: c.faPrint }; + } + + }) + }; +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-b.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-b.js new file mode 100644 index 00000000000..1927cef94ce --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-b.js @@ -0,0 +1,18 @@ +System.register(['./generated-c.js'], (function (exports) { + 'use strict'; + var c; + return { + setters: [function (module) { + c = module.c; + }], + execute: (function () { + + exports('B', B); + + function B() { + return { icon: c.faPrint }; + } + + }) + }; +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-c.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-c.js new file mode 100644 index 00000000000..0562ee17ce3 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/generated-c.js @@ -0,0 +1,18 @@ +System.register([], (function (exports) { + 'use strict'; + return { + execute: (function () { + + var c = exports('c', {}); + + (function (exports) { + exports.preFaPrint = { + foo: 1 + }; + + exports.faPrint = exports.preFaPrint; + } (c)); + + }) + }; +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/main.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/main.js new file mode 100644 index 00000000000..bc199a45949 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/_expected/system/main.js @@ -0,0 +1,13 @@ +System.register([], (function (exports, module) { + 'use strict'; + return { + execute: (function () { + + const importA = () => module.import('./generated-a.js'); + const importB = () => module.import('./generated-b.js'); + + console.log(importA, importB); + + }) + }; +})); diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/a.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/a.js new file mode 100644 index 00000000000..aff72490c7e --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/a.js @@ -0,0 +1,5 @@ +import { faPrint } from './c.js'; + +export function A() { + return { icon: faPrint }; +} diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/b.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/b.js new file mode 100644 index 00000000000..63d37d9cf24 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/b.js @@ -0,0 +1,5 @@ +import { faPrint } from './c.js'; + +export function B() { + return { icon: faPrint }; +} diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/c.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/c.js new file mode 100644 index 00000000000..3e801a6fba0 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/c.js @@ -0,0 +1,5 @@ +exports.preFaPrint = { + foo: 1 +}; + +exports.faPrint = exports.preFaPrint; diff --git a/test/chunking-form/samples/chunk-assigment-in-dynamic/main.js b/test/chunking-form/samples/chunk-assigment-in-dynamic/main.js new file mode 100644 index 00000000000..2a9821bbeb7 --- /dev/null +++ b/test/chunking-form/samples/chunk-assigment-in-dynamic/main.js @@ -0,0 +1,4 @@ +const importA = () => import('./a.js'); +const importB = () => import('./b.js'); + +console.log(importA, importB);