diff --git a/cli/run/batchWarnings.ts b/cli/run/batchWarnings.ts index f394ea5d534..00fbf12798a 100644 --- a/cli/run/batchWarnings.ts +++ b/cli/run/batchWarnings.ts @@ -1,6 +1,6 @@ import type { RollupWarning } from '../../src/rollup/types'; import { bold, gray, yellow } from '../../src/utils/colors'; -import { getOrCreate } from '../../src/utils/getOrCreate'; +import { getNewArray, getOrCreate } from '../../src/utils/getOrCreate'; import { printQuotedStringList } from '../../src/utils/printStringList'; import relativeId from '../../src/utils/relativeId'; import { stderr } from '../logging'; @@ -23,7 +23,7 @@ export default function batchWarnings(): BatchWarnings { warningOccurred = true; if (warning.code! in deferredHandlers) { - getOrCreate(deferredWarnings, warning.code!, () => []).push(warning); + getOrCreate(deferredWarnings, warning.code!, getNewArray).push(warning); } else if (warning.code! in immediateHandlers) { immediateHandlers[warning.code!](warning); } else { @@ -220,7 +220,7 @@ const deferredHandlers: { const dependencies = new Map(); for (const warning of warnings) { - getOrCreate(dependencies, relativeId(warning.exporter!), () => []).push( + getOrCreate(dependencies, relativeId(warning.exporter!), getNewArray).push( relativeId(warning.id!) ); } diff --git a/src/Chunk.ts b/src/Chunk.ts index 88574c17152..2685737a9de 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -41,7 +41,7 @@ import { assignExportsToMangledNames, assignExportsToNames } from './utils/expor import type { GenerateCodeSnippets } from './utils/generateCodeSnippets'; import getExportMode from './utils/getExportMode'; import getIndentString from './utils/getIndentString'; -import { getOrCreate } from './utils/getOrCreate'; +import { getNewArray, getOrCreate } from './utils/getOrCreate'; import { getStaticDependencies } from './utils/getStaticDependencies'; import type { HashPlaceholderGenerator } from './utils/hashPlaceholders'; import { replacePlaceholders } from './utils/hashPlaceholders'; @@ -911,7 +911,7 @@ export default class Chunk { dependency = this.chunkByModule.get(module)!; imported = dependency.getVariableExportName(variable); } - getOrCreate(importsByDependency, dependency, () => []).push({ + getOrCreate(importsByDependency, dependency, getNewArray).push({ imported, local: variable.getName(this.snippets.getPropertyAccess) }); @@ -1023,7 +1023,7 @@ export default class Chunk { (imported !== 'default' || isDefaultAProperty(interop(module.id), true)); } } - getOrCreate(reexportSpecifiers, dependency, () => []).push({ + getOrCreate(reexportSpecifiers, dependency, getNewArray).push({ imported, needsLiveBinding, reexported: exportName diff --git a/src/Module.ts b/src/Module.ts index 173ce7f4125..4fdd738f3c3 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -63,7 +63,7 @@ import { warnDeprecation } from './utils/error'; import { getId } from './utils/getId'; -import { getOrCreate } from './utils/getOrCreate'; +import { getNewSet, getOrCreate } from './utils/getOrCreate'; import { getOriginalLocation } from './utils/getOriginalLocation'; import { makeLegal } from './utils/identifierHelpers'; import { @@ -164,10 +164,10 @@ function getVariableForExportNameRecursive( } function getAndExtendSideEffectModules(variable: Variable, module: Module): Set { - const sideEffectModules = getOrCreate( + const sideEffectModules = getOrCreate>( module.sideEffectDependenciesByVariable, variable, - () => new Set() + getNewSet ); let currentVariable: Variable | null = variable; const referencedVariables = new Set([currentVariable]); @@ -613,7 +613,7 @@ export default class Module { getOrCreate( importerForSideEffects.sideEffectDependenciesByVariable, variable, - () => new Set() + getNewSet ).add(this); setAlternativeExporterIfCyclic(variable, importerForSideEffects, this); } diff --git a/src/ast/utils/PathTracker.ts b/src/ast/utils/PathTracker.ts index e91742152ec..5c8aa4b5219 100644 --- a/src/ast/utils/PathTracker.ts +++ b/src/ast/utils/PathTracker.ts @@ -1,4 +1,4 @@ -import { getOrCreate } from '../../utils/getOrCreate'; +import { getNewSet, getOrCreate } from '../../utils/getOrCreate'; import type { Entity } from '../Entity'; export const UnknownKey = Symbol('Unknown Key'); @@ -98,7 +98,7 @@ export class DiscriminatedPathTracker { currentPaths[pathSegment] || Object.create(null, { [EntitiesKey]: { value: new Map>() } }); } - const trackedEntities = getOrCreate(currentPaths[EntitiesKey], discriminator, () => new Set()); + const trackedEntities = getOrCreate(currentPaths[EntitiesKey], discriminator, getNewSet); if (trackedEntities.has(entity)) return true; trackedEntities.add(entity); return false; diff --git a/src/utils/chunkAssignment.ts b/src/utils/chunkAssignment.ts index 945a7393b7f..45b43fc776c 100644 --- a/src/utils/chunkAssignment.ts +++ b/src/utils/chunkAssignment.ts @@ -1,14 +1,16 @@ import ExternalModule from '../ExternalModule'; import Module from '../Module'; -import { getOrCreate } from './getOrCreate'; +import { EMPTY_ARRAY } from './blank'; +import { getNewSet, getOrCreate } from './getOrCreate'; import { concatLazy } from './iterators'; import { timeEnd, timeStart } from './timers'; type DependentModuleMap = Map>; +type ReadonlyDependentModuleMap = ReadonlyMap>; type ChunkDefinitions = { alias: string | null; modules: Module[] }[]; export function getChunkAssignments( - entryModules: readonly Module[], + entries: readonly Module[], manualChunkAliasByEntry: ReadonlyMap, minChunkSize: number ): ChunkDefinitions { @@ -26,78 +28,26 @@ export function getChunkAssignments( chunkDefinitions.push({ alias, modules }); } - const assignedEntryPointsByModule: DependentModuleMap = new Map(); - const { dependentEntryPointsByModule, dynamicEntryModules } = analyzeModuleGraph(entryModules); - const dynamicallyDependentEntryPointsByDynamicEntry: DependentModuleMap = - getDynamicDependentEntryPoints(dependentEntryPointsByModule, dynamicEntryModules); - const staticEntries = new Set(entryModules); + const { allEntries, dependentEntriesByModule, dynamicallyDependentEntriesByDynamicEntry } = + analyzeModuleGraph(entries); - function assignEntryToStaticDependencies( - entry: Module, - dynamicDependentEntryPoints: ReadonlySet | null - ) { - const modulesToHandle = new Set([entry]); - for (const module of modulesToHandle) { - const assignedEntryPoints = getOrCreate(assignedEntryPointsByModule, module, () => new Set()); - if ( - dynamicDependentEntryPoints && - areEntryPointsContainedOrDynamicallyDependent( - dynamicDependentEntryPoints, - dependentEntryPointsByModule.get(module)! - ) - ) { - continue; - } else { - assignedEntryPoints.add(entry); - } - for (const dependency of module.getDependenciesToBeIncluded()) { - if (!(dependency instanceof ExternalModule || modulesInManualChunks.has(dependency))) { - modulesToHandle.add(dependency); - } - } - } - } - - function areEntryPointsContainedOrDynamicallyDependent( - entryPoints: ReadonlySet, - containedIn: ReadonlySet - ): boolean { - const entriesToCheck = new Set(entryPoints); - for (const entry of entriesToCheck) { - if (!containedIn.has(entry)) { - if (staticEntries.has(entry)) return false; - const dynamicallyDependentEntryPoints = - dynamicallyDependentEntryPointsByDynamicEntry.get(entry)!; - for (const dependentEntry of dynamicallyDependentEntryPoints) { - entriesToCheck.add(dependentEntry); - } - } - } - return true; - } - - for (const entry of entryModules) { - if (!modulesInManualChunks.has(entry)) { - assignEntryToStaticDependencies(entry, null); - } - } + const staticEntries = new Set(entries); + const assignedEntriesByModule: DependentModuleMap = new Map(); - for (const entry of dynamicEntryModules) { + for (const entry of allEntries) { if (!modulesInManualChunks.has(entry)) { assignEntryToStaticDependencies( entry, - dynamicallyDependentEntryPointsByDynamicEntry.get(entry)! + dependentEntriesByModule, + assignedEntriesByModule, + modulesInManualChunks, + staticEntries, + dynamicallyDependentEntriesByDynamicEntry ); } } - chunkDefinitions.push( - ...createChunks( - [...entryModules, ...dynamicEntryModules], - assignedEntryPointsByModule, - minChunkSize - ) - ); + chunkDefinitions.push(...createChunks(allEntries, assignedEntriesByModule, minChunkSize)); return chunkDefinitions; } @@ -118,60 +68,142 @@ function addStaticDependenciesToManualChunk( } } -function analyzeModuleGraph(entryModules: readonly Module[]): { - dependentEntryPointsByModule: DependentModuleMap; - dynamicEntryModules: Set; +function analyzeModuleGraph(entries: Iterable): { + allEntries: Iterable; + dependentEntriesByModule: DependentModuleMap; + dynamicallyDependentEntriesByDynamicEntry: DependentModuleMap; } { - const dynamicEntryModules = new Set(); - const dependentEntryPointsByModule: DependentModuleMap = new Map(); - const entriesToHandle = new Set(entryModules); - for (const currentEntry of entriesToHandle) { + const dynamicEntries = new Set(); + const dependentEntriesByModule: DependentModuleMap = new Map(); + const allEntries = new Set(entries); + for (const currentEntry of allEntries) { const modulesToHandle = new Set([currentEntry]); for (const module of modulesToHandle) { - getOrCreate(dependentEntryPointsByModule, module, () => new Set()).add(currentEntry); + getOrCreate(dependentEntriesByModule, module, getNewSet).add(currentEntry); for (const dependency of module.getDependenciesToBeIncluded()) { if (!(dependency instanceof ExternalModule)) { modulesToHandle.add(dependency); } } for (const { resolution } of module.dynamicImports) { - if (resolution instanceof Module && resolution.includedDynamicImporters.length > 0) { - dynamicEntryModules.add(resolution); - entriesToHandle.add(resolution); + if ( + resolution instanceof Module && + resolution.includedDynamicImporters.length > 0 && + !allEntries.has(resolution) + ) { + dynamicEntries.add(resolution); + allEntries.add(resolution); } } for (const dependency of module.implicitlyLoadedBefore) { - dynamicEntryModules.add(dependency); - entriesToHandle.add(dependency); + if (!allEntries.has(dependency)) { + dynamicEntries.add(dependency); + allEntries.add(dependency); + } } } } - return { dependentEntryPointsByModule, dynamicEntryModules }; + return { + allEntries, + dependentEntriesByModule, + dynamicallyDependentEntriesByDynamicEntry: getDynamicallyDependentEntriesByDynamicEntry( + dependentEntriesByModule, + dynamicEntries + ) + }; } -function getDynamicDependentEntryPoints( - dependentEntryPointsByModule: DependentModuleMap, - dynamicEntryModules: ReadonlySet +function getDynamicallyDependentEntriesByDynamicEntry( + dependentEntriesByModule: ReadonlyDependentModuleMap, + dynamicEntries: ReadonlySet ): DependentModuleMap { - const dynamicallyDependentEntryPointsByDynamicEntry: DependentModuleMap = new Map(); - for (const dynamicEntry of dynamicEntryModules) { - const dynamicDependentEntryPoints = getOrCreate( - dynamicallyDependentEntryPointsByDynamicEntry, + const dynamicallyDependentEntriesByDynamicEntry: DependentModuleMap = new Map(); + for (const dynamicEntry of dynamicEntries) { + const dynamicallyDependentEntries = getOrCreate( + dynamicallyDependentEntriesByDynamicEntry, dynamicEntry, - () => new Set() + getNewSet ); for (const importer of [ ...dynamicEntry.includedDynamicImporters, ...dynamicEntry.implicitlyLoadedAfter ]) { - for (const entryPoint of dependentEntryPointsByModule.get(importer)!) { - dynamicDependentEntryPoints.add(entryPoint); + for (const entry of dependentEntriesByModule.get(importer)!) { + dynamicallyDependentEntries.add(entry); } } } - return dynamicallyDependentEntryPointsByDynamicEntry; + return dynamicallyDependentEntriesByDynamicEntry; } +function assignEntryToStaticDependencies( + entry: Module, + dependentEntriesByModule: ReadonlyDependentModuleMap, + assignedEntriesByModule: DependentModuleMap, + modulesInManualChunks: ReadonlySet, + staticEntries: ReadonlySet, + dynamicallyDependentEntriesByDynamicEntry: ReadonlyDependentModuleMap +) { + const dynamicallyDependentEntries = dynamicallyDependentEntriesByDynamicEntry.get(entry); + const modulesToHandle = new Set([entry]); + for (const module of modulesToHandle) { + const assignedEntries = getOrCreate(assignedEntriesByModule, module, getNewSet); + if ( + dynamicallyDependentEntries && + isModuleAlreadyLoaded( + dynamicallyDependentEntries, + dependentEntriesByModule.get(module)!, + staticEntries, + dynamicallyDependentEntriesByDynamicEntry + ) + ) { + continue; + } else { + assignedEntries.add(entry); + } + for (const dependency of module.getDependenciesToBeIncluded()) { + if (!(dependency instanceof ExternalModule || modulesInManualChunks.has(dependency))) { + modulesToHandle.add(dependency); + } + } + } +} + +const MAX_ENTRIES_TO_CHECK_FOR_SHARED_DEPENDENCIES = 3; + +// An approach to further speed this up might be +// - first, create chunks without looking for modules already in memory +// - all modules that are in the same chunk after this will behave the same +// -> Do not iterate by module but by equivalence group and merge chunks +function isModuleAlreadyLoaded( + dynamicallyDependentEntries: ReadonlySet, + containedIn: ReadonlySet, + staticEntries: ReadonlySet, + dynamicallyDependentEntriesByDynamicEntry: ReadonlyDependentModuleMap +): boolean { + if (dynamicallyDependentEntries.size > MAX_ENTRIES_TO_CHECK_FOR_SHARED_DEPENDENCIES) { + return false; + } + const entriesToCheck = new Set(dynamicallyDependentEntries); + for (const entry of entriesToCheck) { + if (!containedIn.has(entry)) { + if (staticEntries.has(entry)) { + return false; + } + const dynamicallyDependentEntries = dynamicallyDependentEntriesByDynamicEntry.get(entry)!; + if (dynamicallyDependentEntries.size > MAX_ENTRIES_TO_CHECK_FOR_SHARED_DEPENDENCIES) { + return false; + } + for (const dependentEntry of dynamicallyDependentEntries) { + entriesToCheck.add(dependentEntry); + } + } + } + return true; +} + +EMPTY_ARRAY; + interface ChunkDescription { alias: null; modules: Module[]; @@ -184,14 +216,11 @@ interface MergeableChunkDescription extends ChunkDescription { } function createChunks( - allEntryPoints: readonly Module[], - assignedEntryPointsByModule: DependentModuleMap, + allEntries: Iterable, + assignedEntriesByModule: DependentModuleMap, minChunkSize: number ): ChunkDefinitions { - const chunkModulesBySignature = getChunkModulesBySignature( - assignedEntryPointsByModule, - allEntryPoints - ); + const chunkModulesBySignature = getChunkModulesBySignature(assignedEntriesByModule, allEntries); return minChunkSize === 0 ? Object.values(chunkModulesBySignature).map(modules => ({ alias: null, @@ -251,14 +280,14 @@ const CHAR_INDEPENDENT = '_'; const CHAR_CODE_DEPENDENT = CHAR_DEPENDENT.charCodeAt(0); function getChunkModulesBySignature( - assignedEntryPointsByModule: Map>, - allEntryPoints: readonly Module[] + assignedEntriesByModule: ReadonlyDependentModuleMap, + allEntries: Iterable ) { const chunkModules: { [chunkSignature: string]: Module[] } = Object.create(null); - for (const [module, assignedEntryPoints] of assignedEntryPointsByModule) { + for (const [module, assignedEntries] of assignedEntriesByModule) { let chunkSignature = ''; - for (const entry of allEntryPoints) { - chunkSignature += assignedEntryPoints.has(entry) ? CHAR_DEPENDENT : CHAR_INDEPENDENT; + for (const entry of allEntries) { + chunkSignature += assignedEntries.has(entry) ? CHAR_DEPENDENT : CHAR_INDEPENDENT; } const chunk = chunkModules[chunkSignature]; if (chunk) { diff --git a/src/utils/getOrCreate.ts b/src/utils/getOrCreate.ts index 8fbf119f4fb..ef75a8b4bd2 100644 --- a/src/utils/getOrCreate.ts +++ b/src/utils/getOrCreate.ts @@ -1,9 +1,17 @@ export function getOrCreate(map: Map, key: K, init: () => V): V { const existing = map.get(key); - if (existing) { + if (existing !== undefined) { return existing; } const value = init(); map.set(key, value); return value; } + +export function getNewSet() { + return new Set(); +} + +export function getNewArray(): T[] { + return []; +} diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_config.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_config.js new file mode 100644 index 00000000000..c576b1c3250 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'does not avoid separate chunks if too many modules dynamically import the same chunk', + options: { + input: ['main1', 'main2', 'main3', 'main4'] + } +}; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dep.js new file mode 100644 index 00000000000..2338648d763 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dep.js @@ -0,0 +1,7 @@ +define(['exports'], (function (exports) { 'use strict'; + + const value = 'shared'; + + exports.value = value; + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic1.js new file mode 100644 index 00000000000..0521001fece --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic1.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('dynamic1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic2'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic2.js new file mode 100644 index 00000000000..7e1d9ca3c22 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/generated-dynamic2.js @@ -0,0 +1,5 @@ +define(['./generated-dep'], (function (dep) { 'use strict'; + + console.log('dynamic2', dep.value); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main1.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main1.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main2.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main2.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main3.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main3.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main4.js new file mode 100644 index 00000000000..eed65cfcb79 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/amd/main4.js @@ -0,0 +1,6 @@ +define(['require', './generated-dep'], (function (require, dep) { 'use strict'; + + console.log('main1', dep.value); + new Promise(function (resolve, reject) { require(['./generated-dynamic1'], resolve, reject); }); + +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dep.js new file mode 100644 index 00000000000..31a412b6dc4 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dep.js @@ -0,0 +1,5 @@ +'use strict'; + +const value = 'shared'; + +exports.value = value; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic1.js new file mode 100644 index 00000000000..bc0ad9f1c2a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic1.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('dynamic1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic2.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic2.js new file mode 100644 index 00000000000..af07a8e556a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/generated-dynamic2.js @@ -0,0 +1,5 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('dynamic2', dep.value); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main1.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main1.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main2.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main2.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main3.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main3.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main4.js new file mode 100644 index 00000000000..5d139ba4b8d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/cjs/main4.js @@ -0,0 +1,6 @@ +'use strict'; + +var dep = require('./generated-dep.js'); + +console.log('main1', dep.value); +Promise.resolve().then(function () { return require('./generated-dynamic1.js'); }); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dep.js new file mode 100644 index 00000000000..27b7b7de159 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dep.js @@ -0,0 +1,3 @@ +const value = 'shared'; + +export { value as v }; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic1.js new file mode 100644 index 00000000000..67428789ad0 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic1.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('dynamic1', value); +import('./generated-dynamic2.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic2.js new file mode 100644 index 00000000000..0c2d81a045a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/generated-dynamic2.js @@ -0,0 +1,3 @@ +import { v as value } from './generated-dep.js'; + +console.log('dynamic2', value); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main1.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main1.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main2.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main2.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main3.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main3.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main4.js new file mode 100644 index 00000000000..40e11af6e3d --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/es/main4.js @@ -0,0 +1,4 @@ +import { v as value } from './generated-dep.js'; + +console.log('main1', value); +import('./generated-dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dep.js new file mode 100644 index 00000000000..a8d6d67aa46 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dep.js @@ -0,0 +1,10 @@ +System.register([], (function (exports) { + 'use strict'; + return { + execute: (function () { + + const value = exports('v', 'shared'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic1.js new file mode 100644 index 00000000000..57cef271845 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic1.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('dynamic1', value); + module.import('./generated-dynamic2.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic2.js new file mode 100644 index 00000000000..ba93f808068 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/generated-dynamic2.js @@ -0,0 +1,14 @@ +System.register(['./generated-dep.js'], (function () { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('dynamic2', value); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main1.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main1.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main2.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main2.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main3.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main3.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main4.js new file mode 100644 index 00000000000..a469eaf5724 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/_expected/system/main4.js @@ -0,0 +1,15 @@ +System.register(['./generated-dep.js'], (function (exports, module) { + 'use strict'; + var value; + return { + setters: [function (module) { + value = module.v; + }], + execute: (function () { + + console.log('main1', value); + module.import('./generated-dynamic1.js'); + + }) + }; +})); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dep.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dep.js new file mode 100644 index 00000000000..1d4be9c15d0 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dep.js @@ -0,0 +1 @@ +export const value = 'shared'; diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic1.js new file mode 100644 index 00000000000..58d0327fc60 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic1.js @@ -0,0 +1,4 @@ +import { value } from './dep.js'; +console.log('dynamic1', value); +import('./dynamic2.js'); + diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic2.js new file mode 100644 index 00000000000..daf24d9c4d3 --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/dynamic2.js @@ -0,0 +1,2 @@ +import { value } from './dep.js'; +console.log('dynamic2', value); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main1.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main1.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main1.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main2.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main2.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main2.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main3.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main3.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main3.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main4.js b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main4.js new file mode 100644 index 00000000000..170c4e5d89a --- /dev/null +++ b/test/chunking-form/samples/improved-dynamic-chunks/cut-off/main4.js @@ -0,0 +1,3 @@ +import { value } from './dep.js'; +console.log('main1', value); +import('./dynamic1.js'); diff --git a/test/hooks/index.js b/test/hooks/index.js index a5d52d0cdb5..f4a9aa71c7c 100644 --- a/test/hooks/index.js +++ b/test/hooks/index.js @@ -7,6 +7,8 @@ const { loader, wait } = require('../utils.js'); const TEMP_DIR = path.join(__dirname, 'tmp'); describe('hooks', () => { + before(() => remove(TEMP_DIR)); + it('allows to replace file with dir in the outputOptions hook', async () => { const bundle = await rollup.rollup({ input: 'input',