(count)
| 488 | * @returns {{ modules: InstanceType<typeof NormalModule>[], moduleGraph: ModuleGraph }} chain |
| 489 | */ |
| 490 | const buildChain = (count) => { |
| 491 | const modules = []; |
| 492 | for (let i = 0; i < count; i++) { |
| 493 | const mod = new NormalModule( |
| 494 | /** @type {import("../lib/NormalModule").NormalModuleCreateData} */ ( |
| 495 | /** @type {unknown} */ ({ |
| 496 | type: "javascript/auto", |
| 497 | request: `/m${i}`, |
| 498 | userRequest: `/m${i}`, |
| 499 | rawRequest: `m${i}`, |
| 500 | loaders: [], |
| 501 | resource: `/m${i}`, |
| 502 | parser: { parse() {} }, |
| 503 | generator: null, |
| 504 | resolveOptions: {} |
| 505 | }) |
| 506 | ) |
| 507 | ); |
| 508 | mod.buildMeta = { sideEffectFree: true }; |
| 509 | modules.push(mod); |
| 510 | } |
| 511 | const depToModule = new Map(); |
| 512 | for (let i = 0; i < count - 1; i++) { |
| 513 | const dep = new HarmonyImportSideEffectDependency( |
| 514 | `m${i + 1}`, |
| 515 | 0, |
| 516 | /** @type {ImportPhaseType} */ (/** @type {unknown} */ ("evaluation")) |
| 517 | ); |
| 518 | modules[i].dependencies = [dep]; |
| 519 | depToModule.set(dep, modules[i + 1]); |
| 520 | } |
| 521 | modules[count - 1].dependencies = []; |
| 522 | const moduleGraph = /** @type {ModuleGraph} */ ( |
| 523 | /** @type {unknown} */ ({ |
| 524 | /** |
| 525 | * @param {import("../lib/Dependency")} dep dependency |
| 526 | * @returns {import("../lib/Module") | null} module |
| 527 | */ |
| 528 | getModule: (dep) => depToModule.get(dep), |
| 529 | getOptimizationBailout: () => [] |
| 530 | }) |
| 531 | ); |
| 532 | return { modules, moduleGraph }; |
| 533 | }; |
| 534 | |
| 535 | it("handles deep linear chains without overflowing the stack", () => { |
| 536 | const { modules, moduleGraph } = buildChain(20000); |
no test coverage detected