( entries: readonly Module[], manualChunkModules: Module[][], manualChunkModulesByModule: Map<Module, Module[]> )
| 289 | } |
| 290 | |
| 291 | function analyzeModuleGraph( |
| 292 | entries: readonly Module[], |
| 293 | manualChunkModules: Module[][], |
| 294 | manualChunkModulesByModule: Map<Module, Module[]> |
| 295 | ): { |
| 296 | awaitedDynamicImportsByEntry: readonly ReadonlySet<number>[]; |
| 297 | dependentEntriesByModule: Map<Module, Set<number>>; |
| 298 | dynamicImportsByEntry: readonly ReadonlySet<number>[]; |
| 299 | dynamicallyDependentEntriesByAwaitedDynamicEntry: Map<number, Set<number>>; |
| 300 | dynamicallyDependentEntriesByDynamicEntry: Map<number, Set<number>>; |
| 301 | entriesAndManualChunksCount: number; |
| 302 | } { |
| 303 | const dynamicEntryModules = new Set<Module>(); |
| 304 | const awaitedDynamicEntryModules = new Set<Module>(); |
| 305 | const dependentEntriesByModule = new Map<Module, Set<number>>(); |
| 306 | const allEntriesSet = new Set<Module>(entries); |
| 307 | // Each entry is defined by its position in this array |
| 308 | const allEntriesAndManualChunks = entries.map(module => [module]).concat(manualChunkModules); |
| 309 | const dynamicImportModulesByEntry: Set<Module>[] = new Array(allEntriesAndManualChunks.length); |
| 310 | const awaitedDynamicImportModulesByEntry: Set<Module>[] = new Array( |
| 311 | allEntriesAndManualChunks.length |
| 312 | ); |
| 313 | let entryOrManualChunkIndex = 0; |
| 314 | for (const currentEntryModules of allEntriesAndManualChunks) { |
| 315 | const dynamicImportsForCurrentEntry = new Set<Module>(); |
| 316 | const awaitedDynamicImportsForCurrentEntry = new Set<Module>(); |
| 317 | dynamicImportModulesByEntry[entryOrManualChunkIndex] = dynamicImportsForCurrentEntry; |
| 318 | awaitedDynamicImportModulesByEntry[entryOrManualChunkIndex] = |
| 319 | awaitedDynamicImportsForCurrentEntry; |
| 320 | const staticDependencies = new Set(currentEntryModules); |
| 321 | // If we have a very large manual chunk, tracking if it is already added to the dependencies will improve performance |
| 322 | const addedManualChunks = new Set<Module[]>(); |
| 323 | for (const module of staticDependencies) { |
| 324 | getOrCreate(dependentEntriesByModule, module, getNewSet<number>).add(entryOrManualChunkIndex); |
| 325 | const manualChunkMembers = manualChunkModulesByModule.get(module); |
| 326 | if (manualChunkMembers && !addedManualChunks.has(manualChunkMembers)) { |
| 327 | addedManualChunks.add(manualChunkMembers); |
| 328 | for (const manualChunkMember of manualChunkMembers) { |
| 329 | staticDependencies.add(manualChunkMember); |
| 330 | } |
| 331 | } |
| 332 | for (const dependency of module.getDependenciesToBeIncluded()) { |
| 333 | if (!(dependency instanceof ExternalModule)) { |
| 334 | staticDependencies.add(dependency); |
| 335 | } |
| 336 | } |
| 337 | for (const { |
| 338 | node: { resolution } |
| 339 | } of module.dynamicImports) { |
| 340 | if ( |
| 341 | resolution instanceof Module && |
| 342 | resolution.includedDynamicImporters.length > 0 && |
| 343 | !allEntriesSet.has(resolution) |
| 344 | ) { |
| 345 | dynamicEntryModules.add(resolution); |
| 346 | allEntriesSet.add(resolution); |
| 347 | allEntriesAndManualChunks.push([resolution]); |
| 348 | dynamicImportsForCurrentEntry.add(resolution); |
no test coverage detected
searching dependent graphs…