MCPcopy Index your code
hub / github.com/rollup/rollup / analyzeModuleGraph

Function analyzeModuleGraph

src/utils/chunkAssignment.ts:291–398  ·  view source on GitHub ↗
(
	entries: readonly Module[],
	manualChunkModules: Module[][],
	manualChunkModulesByModule: Map<Module, Module[]>
)

Source from the content-addressed store, hash-verified

289}
290
291function 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);

Callers 1

getChunkAssignmentsFunction · 0.85

Calls 8

getOrCreateFunction · 0.90
getDynamicEntriesFunction · 0.85
addMethod · 0.80
getMethod · 0.80
pushMethod · 0.80
hasMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…