@depup/webpack 5.106.1-depup.0 → 5.109.2-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. package/README.md +9 -11
  2. package/bin/webpack.js +12 -0
  3. package/changes.json +16 -24
  4. package/hot/dev-server.js +2 -0
  5. package/lib/APIPlugin.js +60 -35
  6. package/lib/AsyncDependenciesBlock.js +3 -0
  7. package/lib/AutomaticPrefetchPlugin.js +6 -1
  8. package/lib/BannerPlugin.js +13 -5
  9. package/lib/Cache.js +27 -5
  10. package/lib/CacheFacade.js +41 -0
  11. package/lib/Chunk.js +71 -25
  12. package/lib/ChunkGraph.js +153 -19
  13. package/lib/ChunkGroup.js +115 -28
  14. package/lib/ChunkTemplate.js +9 -0
  15. package/lib/CircularModulesPlugin.js +190 -0
  16. package/lib/CleanPlugin.js +27 -28
  17. package/lib/CodeGenerationResults.js +19 -0
  18. package/lib/CompatibilityPlugin.js +85 -37
  19. package/lib/Compilation.js +656 -112
  20. package/lib/Compiler.js +109 -35
  21. package/lib/ConcatenationScope.js +34 -4
  22. package/lib/ConditionalInitFragment.js +6 -0
  23. package/lib/ConstPlugin.js +15 -12
  24. package/lib/ContextExclusionPlugin.js +3 -1
  25. package/lib/ContextModule.js +345 -55
  26. package/lib/ContextModuleFactory.js +193 -51
  27. package/lib/ContextReplacementPlugin.js +8 -1
  28. package/lib/DefinePlugin.js +537 -139
  29. package/lib/DependenciesBlock.js +6 -1
  30. package/lib/Dependency.js +159 -11
  31. package/lib/DependencyTemplate.js +7 -1
  32. package/lib/DependencyTemplates.js +4 -0
  33. package/lib/DotenvPlugin.js +3 -0
  34. package/lib/DynamicEntryPlugin.js +3 -1
  35. package/lib/EntryOptionPlugin.js +42 -2
  36. package/lib/EntryPlugin.js +4 -1
  37. package/lib/Entrypoint.js +5 -1
  38. package/lib/EnvironmentPlugin.js +3 -2
  39. package/lib/ErrorHelpers.js +7 -0
  40. package/lib/EvalDevToolModulePlugin.js +3 -1
  41. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  42. package/lib/ExportsInfo.js +421 -113
  43. package/lib/ExportsInfoApiPlugin.js +4 -3
  44. package/lib/ExternalModule.js +381 -80
  45. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  46. package/lib/ExternalsPlugin.js +3 -1
  47. package/lib/FileSystemInfo.js +701 -175
  48. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  49. package/lib/FlagDependencyExportsPlugin.js +82 -9
  50. package/lib/FlagDependencyUsagePlugin.js +115 -8
  51. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  52. package/lib/Generator.js +24 -3
  53. package/lib/HotModuleReplacementPlugin.js +110 -44
  54. package/lib/IgnorePlugin.js +5 -2
  55. package/lib/IgnoreWarningsPlugin.js +2 -1
  56. package/lib/InitFragment.js +33 -30
  57. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  58. package/lib/LazyBarrel.js +389 -0
  59. package/lib/LibraryTemplatePlugin.js +2 -1
  60. package/lib/LoaderOptionsPlugin.js +3 -1
  61. package/lib/LoaderTargetPlugin.js +3 -1
  62. package/lib/MainTemplate.js +15 -0
  63. package/lib/ManifestPlugin.js +9 -2
  64. package/lib/Module.js +121 -57
  65. package/lib/ModuleFactory.js +6 -1
  66. package/lib/ModuleFilenameHelpers.js +18 -4
  67. package/lib/ModuleGraph.js +69 -2
  68. package/lib/ModuleGraphConnection.js +9 -0
  69. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  70. package/lib/ModuleNotFoundError.js +3 -83
  71. package/lib/ModuleProfile.js +27 -1
  72. package/lib/ModuleSourceTypeConstants.js +52 -19
  73. package/lib/ModuleTemplate.js +10 -0
  74. package/lib/ModuleTypeConstants.js +20 -4
  75. package/lib/MultiCompiler.js +59 -4
  76. package/lib/MultiStats.js +9 -0
  77. package/lib/MultiWatching.js +6 -0
  78. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  79. package/lib/NodeStuffPlugin.js +78 -46
  80. package/lib/NormalModule.js +519 -206
  81. package/lib/NormalModuleFactory.js +156 -31
  82. package/lib/NormalModuleReplacementPlugin.js +3 -1
  83. package/lib/NullFactory.js +1 -0
  84. package/lib/OptionsApply.js +1 -0
  85. package/lib/Parser.js +3 -1
  86. package/lib/PlatformPlugin.js +2 -1
  87. package/lib/PrefetchPlugin.js +4 -1
  88. package/lib/ProgressPlugin.js +351 -161
  89. package/lib/ProvidePlugin.js +6 -3
  90. package/lib/RawModule.js +32 -16
  91. package/lib/RecordIdsPlugin.js +9 -0
  92. package/lib/RequestShortener.js +8 -0
  93. package/lib/ResolverFactory.js +5 -0
  94. package/lib/RuntimeGlobals.js +58 -5
  95. package/lib/RuntimeModule.js +22 -7
  96. package/lib/RuntimePlugin.js +123 -118
  97. package/lib/RuntimeTemplate.js +616 -37
  98. package/lib/SelfModuleFactory.js +3 -0
  99. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  100. package/lib/SourceMapDevToolPlugin.js +341 -63
  101. package/lib/Stats.js +6 -0
  102. package/lib/Template.js +52 -6
  103. package/lib/TemplatedPathPlugin.js +505 -138
  104. package/lib/UseStrictPlugin.js +3 -2
  105. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  106. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  107. package/lib/WarnNoModeSetPlugin.js +18 -2
  108. package/lib/WatchIgnorePlugin.js +5 -1
  109. package/lib/Watching.js +25 -3
  110. package/lib/WebpackError.js +3 -74
  111. package/lib/WebpackIsIncludedPlugin.js +4 -2
  112. package/lib/WebpackOptionsApply.js +88 -25
  113. package/lib/WebpackOptionsDefaulter.js +1 -0
  114. package/lib/asset/AssetBytesGenerator.js +28 -10
  115. package/lib/asset/AssetBytesParser.js +1 -0
  116. package/lib/asset/AssetGenerator.js +199 -60
  117. package/lib/asset/AssetModule.js +47 -0
  118. package/lib/asset/AssetModulesPlugin.js +115 -24
  119. package/lib/asset/AssetParser.js +4 -2
  120. package/lib/asset/AssetSourceGenerator.js +26 -8
  121. package/lib/asset/AssetSourceParser.js +1 -0
  122. package/lib/asset/RawDataUrlModule.js +23 -13
  123. package/lib/asset/WebManifestGenerator.js +164 -0
  124. package/lib/asset/WebManifestParser.js +130 -0
  125. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  126. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  127. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  128. package/lib/async-modules/isGeneratorLowered.js +26 -0
  129. package/lib/buildChunkGraph.js +107 -15
  130. package/lib/bun/BunTargetPlugin.js +42 -0
  131. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  132. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  133. package/lib/cache/IdleFileCachePlugin.js +6 -1
  134. package/lib/cache/MemoryCachePlugin.js +1 -1
  135. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  136. package/lib/cache/PackFileCacheStrategy.js +302 -12
  137. package/lib/cache/ResolverCachePlugin.js +12 -1
  138. package/lib/cache/getLazyHashedEtag.js +13 -2
  139. package/lib/cache/mergeEtags.js +4 -0
  140. package/lib/cli.js +142 -20
  141. package/lib/config/browserslistTargetHandler.js +141 -0
  142. package/lib/config/defaults.js +612 -43
  143. package/lib/config/defineConfig.js +31 -0
  144. package/lib/config/normalization.js +46 -1
  145. package/lib/config/target.js +200 -2
  146. package/lib/container/ContainerEntryDependency.js +2 -0
  147. package/lib/container/ContainerEntryModule.js +27 -14
  148. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  149. package/lib/container/ContainerExposedDependency.js +6 -2
  150. package/lib/container/ContainerPlugin.js +2 -1
  151. package/lib/container/ContainerReferencePlugin.js +3 -2
  152. package/lib/container/FallbackDependency.js +9 -7
  153. package/lib/container/FallbackItemDependency.js +1 -0
  154. package/lib/container/FallbackModule.js +22 -9
  155. package/lib/container/FallbackModuleFactory.js +1 -0
  156. package/lib/container/HoistContainerReferencesPlugin.js +47 -55
  157. package/lib/container/ModuleFederationPlugin.js +21 -29
  158. package/lib/container/RemoteModule.js +33 -10
  159. package/lib/container/RemoteRuntimeModule.js +15 -12
  160. package/lib/container/RemoteToExternalDependency.js +1 -0
  161. package/lib/container/options.js +7 -0
  162. package/lib/css/CssGenerator.js +540 -272
  163. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  164. package/lib/css/CssLoadingRuntimeModule.js +173 -81
  165. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  166. package/lib/css/CssModulesPlugin.js +371 -208
  167. package/lib/css/CssParser.js +3538 -1963
  168. package/lib/css/syntax.js +4155 -0
  169. package/lib/debug/ProfilingPlugin.js +33 -2
  170. package/lib/deno/DenoTargetPlugin.js +41 -0
  171. package/lib/dependencies/AMDDefineDependency.js +29 -17
  172. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  173. package/lib/dependencies/AMDPlugin.js +6 -3
  174. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  175. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  176. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  177. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  178. package/lib/dependencies/AMDRequireDependency.js +28 -20
  179. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  180. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  181. package/lib/dependencies/CachedConstDependency.js +9 -1
  182. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  183. package/lib/dependencies/CommonJsExportRequireDependency.js +157 -38
  184. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  185. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  186. package/lib/dependencies/CommonJsFullRequireDependency.js +91 -27
  187. package/lib/dependencies/CommonJsImportsParserPlugin.js +189 -24
  188. package/lib/dependencies/CommonJsPlugin.js +7 -4
  189. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  190. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  191. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  192. package/lib/dependencies/ConstDependency.js +22 -12
  193. package/lib/dependencies/ContextDependency.js +13 -2
  194. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  195. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  196. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  197. package/lib/dependencies/ContextElementDependency.js +27 -14
  198. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  199. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  200. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  201. package/lib/dependencies/CssIcssExportDependency.js +681 -367
  202. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  203. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  204. package/lib/dependencies/CssImportDependency.js +37 -1
  205. package/lib/dependencies/CssUrlDependency.js +87 -14
  206. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  207. package/lib/dependencies/DllEntryDependency.js +12 -13
  208. package/lib/dependencies/DynamicExports.js +5 -0
  209. package/lib/dependencies/EntryDependency.js +1 -0
  210. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  211. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  212. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  213. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  214. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  215. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  216. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  217. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  218. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  219. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +34 -3
  220. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  221. package/lib/dependencies/HarmonyExportExpressionDependency.js +133 -43
  222. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +268 -44
  224. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  226. package/lib/dependencies/HarmonyExports.js +6 -1
  227. package/lib/dependencies/HarmonyImportDependency.js +60 -4
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  229. package/lib/dependencies/HarmonyImportGuard.js +427 -0
  230. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  231. package/lib/dependencies/HarmonyImportSpecifierDependency.js +146 -24
  232. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  233. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  234. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  235. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  236. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  237. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  238. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  239. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  240. package/lib/dependencies/ImportContextDependency.js +9 -9
  241. package/lib/dependencies/ImportDependency.js +92 -3
  242. package/lib/dependencies/ImportEagerDependency.js +2 -0
  243. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  244. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  245. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  246. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  247. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  248. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  249. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  250. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  251. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  252. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  253. package/lib/dependencies/ImportParserPlugin.js +114 -27
  254. package/lib/dependencies/ImportPhase.js +17 -11
  255. package/lib/dependencies/ImportPlugin.js +2 -1
  256. package/lib/dependencies/ImportWeakDependency.js +3 -0
  257. package/lib/dependencies/JsonExportsDependency.js +15 -10
  258. package/lib/dependencies/LoaderDependency.js +2 -0
  259. package/lib/dependencies/LoaderImportDependency.js +3 -0
  260. package/lib/dependencies/LoaderPlugin.js +9 -2
  261. package/lib/dependencies/LocalModule.js +15 -12
  262. package/lib/dependencies/LocalModuleDependency.js +15 -13
  263. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  264. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  265. package/lib/dependencies/ModuleDependency.js +14 -0
  266. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  267. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  268. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  269. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  270. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  271. package/lib/dependencies/NullDependency.js +2 -0
  272. package/lib/dependencies/PrefetchDependency.js +1 -0
  273. package/lib/dependencies/ProvidedDependency.js +36 -27
  274. package/lib/dependencies/PureExpressionDependency.js +14 -10
  275. package/lib/dependencies/RequireContextDependency.js +1 -0
  276. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  277. package/lib/dependencies/RequireContextPlugin.js +2 -1
  278. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  279. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  280. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  281. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  282. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  283. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  284. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  285. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  286. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  287. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  288. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  289. package/lib/dependencies/RequireResolveDependency.js +2 -0
  290. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  291. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  292. package/lib/dependencies/StaticExportsDependency.js +13 -10
  293. package/lib/dependencies/SystemPlugin.js +9 -6
  294. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  295. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  296. package/lib/dependencies/URLContextDependency.js +8 -7
  297. package/lib/dependencies/URLDependency.js +157 -33
  298. package/lib/dependencies/URLPlugin.js +2 -0
  299. package/lib/dependencies/UnsupportedDependency.js +12 -13
  300. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  301. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  302. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  303. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  304. package/lib/dependencies/WorkerDependency.js +111 -27
  305. package/lib/dependencies/WorkletDependency.js +278 -0
  306. package/lib/dependencies/getFunctionExpression.js +1 -0
  307. package/lib/dependencies/processExportInfo.js +14 -11
  308. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  309. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  310. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  311. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  312. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  313. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  314. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  315. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  316. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  317. package/lib/electron/ElectronTargetPlugin.js +24 -5
  318. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  319. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  320. package/lib/errors/BuildCycleError.js +1 -1
  321. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  322. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  323. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  324. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  325. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  326. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  327. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  328. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  329. package/lib/errors/JSONParseError.js +115 -0
  330. package/lib/errors/LoaderLoadingError.js +20 -0
  331. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  332. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  333. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  334. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  335. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  336. package/lib/errors/ModuleNotFoundError.js +94 -0
  337. package/lib/errors/ModuleParseError.js +141 -0
  338. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  339. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  340. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  341. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  342. package/lib/errors/NonErrorEmittedError.js +30 -0
  343. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  344. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  345. package/lib/errors/WebpackError.js +84 -0
  346. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  347. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  348. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  349. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +80 -52
  350. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  351. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  352. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  353. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  354. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  355. package/lib/hmr/lazyCompilationBackend.js +53 -12
  356. package/lib/html/HtmlGenerator.js +1490 -0
  357. package/lib/html/HtmlModule.js +41 -0
  358. package/lib/html/HtmlModulesPlugin.js +1129 -0
  359. package/lib/html/HtmlParser.js +1970 -0
  360. package/lib/html/favicon.svg +1 -0
  361. package/lib/html/syntax.js +9106 -0
  362. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  363. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  364. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  365. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  366. package/lib/ids/IdHelpers.js +49 -12
  367. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  368. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  369. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  370. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  371. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  372. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  373. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  374. package/lib/index.js +66 -15
  375. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  376. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  377. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  378. package/lib/javascript/ChunkHelpers.js +1 -0
  379. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  380. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  381. package/lib/javascript/JavascriptGenerator.js +213 -51
  382. package/lib/javascript/JavascriptModule.js +54 -0
  383. package/lib/javascript/JavascriptModulesPlugin.js +628 -198
  384. package/lib/javascript/JavascriptParser.js +1334 -471
  385. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  386. package/lib/javascript/StartupHelpers.js +5 -0
  387. package/lib/javascript/syntax.js +5037 -0
  388. package/lib/json/JsonData.js +5 -0
  389. package/lib/json/JsonGenerator.js +21 -0
  390. package/lib/json/JsonModule.js +40 -0
  391. package/lib/json/JsonModulesPlugin.js +8 -1
  392. package/lib/json/JsonParser.js +18 -27
  393. package/lib/library/AbstractLibraryPlugin.js +17 -2
  394. package/lib/library/AmdLibraryPlugin.js +8 -0
  395. package/lib/library/AssignLibraryPlugin.js +21 -3
  396. package/lib/library/EnableLibraryPlugin.js +8 -2
  397. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  398. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  399. package/lib/library/JsonpLibraryPlugin.js +8 -0
  400. package/lib/library/ModuleLibraryPlugin.js +154 -7
  401. package/lib/library/SystemLibraryPlugin.js +11 -3
  402. package/lib/library/UmdLibraryPlugin.js +16 -0
  403. package/lib/loaders/LoaderRunner.js +714 -0
  404. package/lib/loaders/loadLoader.js +100 -0
  405. package/lib/logging/Logger.js +17 -0
  406. package/lib/logging/createConsoleLogger.js +7 -0
  407. package/lib/logging/runtime.js +2 -0
  408. package/lib/logging/truncateArgs.js +2 -0
  409. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  410. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  411. package/lib/node/NodeSourcePlugin.js +1 -1
  412. package/lib/node/NodeTargetPlugin.js +4 -63
  413. package/lib/node/NodeTemplatePlugin.js +3 -1
  414. package/lib/node/NodeWatchFileSystem.js +40 -22
  415. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  416. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +33 -3
  417. package/lib/node/ReadFileCompileWasmPlugin.js +28 -3
  418. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  419. package/lib/node/nodeBuiltins.js +80 -0
  420. package/lib/node/nodeConsole.js +116 -64
  421. package/lib/optimize/AggressiveMergingPlugin.js +22 -16
  422. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  423. package/lib/optimize/ConcatenatedModule.js +603 -130
  424. package/lib/optimize/ConstExportsPlugin.js +211 -0
  425. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  426. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  427. package/lib/optimize/InlineExports.js +178 -0
  428. package/lib/optimize/InnerGraph.js +374 -262
  429. package/lib/optimize/InnerGraphPlugin.js +246 -117
  430. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  431. package/lib/optimize/MangleExportsPlugin.js +5 -1
  432. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  433. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  434. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  435. package/lib/optimize/ModuleConcatenationPlugin.js +229 -55
  436. package/lib/optimize/RealContentHashPlugin.js +130 -52
  437. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  438. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  439. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  440. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  441. package/lib/optimize/SplitChunksPlugin.js +200 -50
  442. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  443. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  444. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  445. package/lib/performance/SizeLimitsPlugin.js +8 -2
  446. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  448. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  449. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  450. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  451. package/lib/prefetch/ResourceHintPlugin.js +687 -0
  452. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  453. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  454. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  455. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  456. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  457. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  458. package/lib/rules/RuleSetCompiler.js +132 -0
  459. package/lib/rules/UseEffectRulePlugin.js +10 -3
  460. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  461. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  462. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  463. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  464. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  465. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  466. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  467. package/lib/runtime/CompatRuntimeModule.js +2 -0
  468. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  469. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  470. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  471. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  472. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  473. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  474. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  475. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  476. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  477. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  478. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  479. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  480. package/lib/runtime/HelperRuntimeModule.js +5 -0
  481. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  482. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  483. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  484. package/lib/runtime/NonceRuntimeModule.js +1 -0
  485. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  486. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  487. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  488. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  489. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  490. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  491. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  492. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  493. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  494. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  495. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  496. package/lib/schemes/DataUriPlugin.js +14 -2
  497. package/lib/schemes/FileUriPlugin.js +1 -1
  498. package/lib/schemes/HttpUriPlugin.js +86 -4
  499. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  500. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  501. package/lib/serialization/ArraySerializer.js +6 -8
  502. package/lib/serialization/BinaryMiddleware.js +427 -1006
  503. package/lib/serialization/DateObjectSerializer.js +4 -2
  504. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  505. package/lib/serialization/FileMiddleware.js +345 -59
  506. package/lib/serialization/MapObjectSerializer.js +7 -9
  507. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  508. package/lib/serialization/ObjectMiddleware.js +73 -13
  509. package/lib/serialization/PlainObjectSerializer.js +16 -8
  510. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  511. package/lib/serialization/Serializer.js +6 -0
  512. package/lib/serialization/SerializerMiddleware.js +14 -2
  513. package/lib/serialization/SetObjectSerializer.js +6 -8
  514. package/lib/serialization/SingleItemMiddleware.js +3 -0
  515. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  516. package/lib/sharing/ConsumeSharedModule.js +21 -7
  517. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  518. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  519. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  520. package/lib/sharing/ProvideSharedDependency.js +34 -15
  521. package/lib/sharing/ProvideSharedModule.js +42 -12
  522. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  523. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  524. package/lib/sharing/SharePlugin.js +5 -1
  525. package/lib/sharing/ShareRuntimeModule.js +19 -16
  526. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  527. package/lib/sharing/utils.js +9 -1
  528. package/lib/stats/DefaultStatsFactoryPlugin.js +289 -201
  529. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  530. package/lib/stats/DefaultStatsPrinterPlugin.js +74 -170
  531. package/lib/stats/StatsFactory.js +70 -27
  532. package/lib/stats/StatsPrinter.js +16 -2
  533. package/lib/typescript/TypeScriptPlugin.js +210 -0
  534. package/lib/url/URLParserPlugin.js +111 -23
  535. package/lib/util/ArrayHelpers.js +1 -0
  536. package/lib/util/ArrayQueue.js +10 -5
  537. package/lib/util/AsyncQueue.js +154 -74
  538. package/lib/util/Hash.js +2 -2
  539. package/lib/util/IterableHelpers.js +3 -0
  540. package/lib/util/LazyBucketSortedSet.js +26 -0
  541. package/lib/util/LazySet.js +45 -4
  542. package/lib/util/LocConverter.js +64 -0
  543. package/lib/util/ParallelismFactorCalculator.js +1 -0
  544. package/lib/util/Queue.js +6 -3
  545. package/lib/util/Semaphore.js +15 -1
  546. package/lib/util/SetHelpers.js +4 -1
  547. package/lib/util/SortableSet.js +7 -1
  548. package/lib/util/SourceProcessor.js +119 -0
  549. package/lib/util/StackedCacheMap.js +20 -3
  550. package/lib/util/StackedMap.js +162 -43
  551. package/lib/util/StringXor.js +1 -1
  552. package/lib/util/TupleQueue.js +7 -3
  553. package/lib/util/TupleSet.js +14 -0
  554. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  555. package/lib/util/WeakTupleMap.js +60 -1
  556. package/lib/util/binarySearchBounds.js +3 -2
  557. package/lib/util/chainedImports.js +3 -3
  558. package/lib/util/cleverMerge.js +19 -2
  559. package/lib/util/comparators.js +35 -4
  560. package/lib/util/compileBooleanMatcher.js +9 -0
  561. package/lib/util/concatenate.js +80 -24
  562. package/lib/util/conventions.js +46 -1
  563. package/lib/util/createHash.js +0 -1
  564. package/lib/util/createHooksRegistry.js +43 -0
  565. package/lib/util/createMappings.js +118 -0
  566. package/lib/util/dataURL.js +3 -2
  567. package/lib/util/deprecation.js +19 -0
  568. package/lib/util/deterministicGrouping.js +46 -17
  569. package/lib/util/extractSourceMap.js +2 -1
  570. package/lib/util/extractUrlAndGlobal.js +1 -0
  571. package/lib/util/findGraphRoots.js +7 -0
  572. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  573. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  574. package/lib/util/fs.js +87 -14
  575. package/lib/util/generateDebugId.js +1 -0
  576. package/lib/util/globUtils.js +710 -0
  577. package/lib/util/hash/BatchedHash.js +1 -0
  578. package/lib/util/hash/BulkUpdateHash.js +1 -0
  579. package/lib/util/hash/DebugHash.js +1 -0
  580. package/lib/util/hash/hash-digest.js +32 -15
  581. package/lib/util/hash/md4.js +1 -1
  582. package/lib/util/hash/wasm-hash.js +5 -0
  583. package/lib/util/hash/xxhash64.js +1 -1
  584. package/lib/util/identifier.js +118 -7
  585. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  586. package/lib/util/internalSerializables.js +102 -60
  587. package/lib/util/magicComment.js +149 -7
  588. package/lib/util/makeSerializable.js +7 -0
  589. package/lib/util/memoize.js +2 -0
  590. package/lib/util/mimeTypes.js +176 -0
  591. package/lib/util/nonNumericOnlyHash.js +31 -1
  592. package/lib/util/numberHash.js +2 -2
  593. package/lib/util/parseJson.js +41 -0
  594. package/lib/util/processAsyncTree.js +8 -0
  595. package/lib/util/property.js +9 -2
  596. package/lib/util/publicPathPlaceholder.js +64 -0
  597. package/lib/util/registerExternalSerializer.js +24 -4
  598. package/lib/util/removeBOM.js +1 -0
  599. package/lib/util/runtime.js +32 -0
  600. package/lib/util/semver.js +15 -0
  601. package/lib/util/serialization.js +2 -0
  602. package/lib/util/smartGrouping.js +8 -0
  603. package/lib/util/source.js +23 -0
  604. package/lib/util/topologicalSort.js +69 -0
  605. package/lib/validateSchema.js +1 -0
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  607. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  608. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  609. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  610. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  611. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  612. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  613. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  614. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  615. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  616. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  623. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  626. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  627. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  629. package/lib/web/JsonpTemplatePlugin.js +2 -1
  630. package/lib/webpack.js +78 -1
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +21 -0
  635. package/package.json +79 -77
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +1173 -80
  638. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  639. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  640. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  641. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  642. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  643. package/schemas/plugins/HtmlParserOptions.json +3 -0
  644. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  645. package/schemas/plugins/ProgressPlugin.json +38 -0
  646. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  647. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  648. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  649. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  650. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  652. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  653. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  654. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  655. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  656. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  657. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  658. package/types.d.ts +11053 -3019
  659. package/lib/CaseSensitiveModulesWarning.js +0 -72
  660. package/lib/GraphHelpers.js +0 -46
  661. package/lib/ModuleParseError.js +0 -125
  662. package/lib/NoModeWarning.js +0 -23
  663. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  664. package/lib/css/walkCssTokens.js +0 -1843
  665. package/lib/util/AppendOnlyStackedSet.js +0 -78
  666. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  668. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  669. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
package/lib/ChunkGroup.js CHANGED
@@ -24,9 +24,13 @@ const {
24
24
  /** @typedef {{ module: Module | null, loc: DependencyLocation, request: string }} OriginRecord */
25
25
 
26
26
  /**
27
+ * Describes the scheduling hints that can be attached to a chunk group.
28
+ * These values influence how child groups are ordered for preload/prefetch
29
+ * and how their fetch priority is exposed to runtime code.
27
30
  * @typedef {object} RawChunkGroupOptions
28
31
  * @property {number=} preloadOrder
29
32
  * @property {number=} prefetchOrder
33
+ * @property {number=} cssPreloadOrder preload only the chunk's CSS (`as="style"`), not its JS
30
34
  * @property {("low" | "high" | "auto")=} fetchPriority
31
35
  */
32
36
 
@@ -35,6 +39,8 @@ const {
35
39
  let debugId = 5000;
36
40
 
37
41
  /**
42
+ * Materializes a sortable set as an array without changing its current order.
43
+ * Used with `SortableSet` caches that expect a stable array result.
38
44
  * @template T
39
45
  * @param {SortableSet<T>} set set to convert to array.
40
46
  * @returns {T[]} the array format of existing set
@@ -54,6 +60,8 @@ const sortById = (a, b) => {
54
60
  };
55
61
 
56
62
  /**
63
+ * Orders origin records by referencing module and then by source location.
64
+ * This keeps origin metadata deterministic for hashing and diagnostics.
57
65
  * @param {OriginRecord} a the first comparator in sort
58
66
  * @param {OriginRecord} b the second comparator in sort
59
67
  * @returns {1 | -1 | 0} returns sorting order as index
@@ -66,9 +74,14 @@ const sortOrigin = (a, b) => {
66
74
  return compareLocations(a.loc, b.loc);
67
75
  };
68
76
 
77
+ /**
78
+ * Represents a connected group of chunks along with the parent/child
79
+ * relationships, async blocks, and traversal metadata webpack tracks for it.
80
+ */
69
81
  class ChunkGroup {
70
82
  /**
71
- * Creates an instance of ChunkGroup.
83
+ * Creates a chunk group and initializes the relationship sets and ordering
84
+ * metadata used while building and optimizing the chunk graph.
72
85
  * @param {string | ChunkGroupOptions=} options chunk group options passed to chunkGroup
73
86
  */
74
87
  constructor(options) {
@@ -113,7 +126,9 @@ class ChunkGroup {
113
126
  }
114
127
 
115
128
  /**
116
- * when a new chunk is added to a chunkGroup, addingOptions will occur.
129
+ * Merges additional options into the chunk group.
130
+ * Order-based options are combined by taking the higher priority, while
131
+ * unsupported conflicts surface as an explicit error.
117
132
  * @param {ChunkGroupOptions} options the chunkGroup options passed to addOptions
118
133
  * @returns {void}
119
134
  */
@@ -146,7 +161,7 @@ class ChunkGroup {
146
161
  }
147
162
 
148
163
  /**
149
- * returns the name of current ChunkGroup
164
+ * Returns the configured name of the chunk group, if one was assigned.
150
165
  * @returns {ChunkGroupOptions["name"]} returns the ChunkGroup name
151
166
  */
152
167
  get name() {
@@ -154,7 +169,7 @@ class ChunkGroup {
154
169
  }
155
170
 
156
171
  /**
157
- * sets a new name for current ChunkGroup
172
+ * Updates the configured name of the chunk group.
158
173
  * @param {string | undefined} value the new name for ChunkGroup
159
174
  * @returns {void}
160
175
  */
@@ -164,7 +179,8 @@ class ChunkGroup {
164
179
 
165
180
  /* istanbul ignore next */
166
181
  /**
167
- * get a uniqueId for ChunkGroup, made up of its member Chunk debugId's
182
+ * Returns a debug-only identifier derived from the group's member chunk
183
+ * debug ids. This is primarily useful in diagnostics and assertions.
168
184
  * @returns {string} a unique concatenation of chunk debugId's
169
185
  */
170
186
  get debugId() {
@@ -172,7 +188,8 @@ class ChunkGroup {
172
188
  }
173
189
 
174
190
  /**
175
- * get a unique id for ChunkGroup, made up of its member Chunk id's
191
+ * Returns an identifier derived from the ids of the chunks currently in
192
+ * the group.
176
193
  * @returns {string} a unique concatenation of chunk ids
177
194
  */
178
195
  get id() {
@@ -180,7 +197,8 @@ class ChunkGroup {
180
197
  }
181
198
 
182
199
  /**
183
- * Performs an unshift of a specific chunk
200
+ * Moves a chunk to the front of the group or inserts it when it is not
201
+ * already present.
184
202
  * @param {Chunk} chunk chunk being unshifted
185
203
  * @returns {boolean} returns true if attempted chunk shift is accepted
186
204
  */
@@ -197,7 +215,8 @@ class ChunkGroup {
197
215
  }
198
216
 
199
217
  /**
200
- * inserts a chunk before another existing chunk in group
218
+ * Inserts a chunk directly before another chunk that already belongs to the
219
+ * group, preserving the rest of the ordering.
201
220
  * @param {Chunk} chunk Chunk being inserted
202
221
  * @param {Chunk} before Placeholder/target chunk marking new chunk insertion point
203
222
  * @returns {boolean} return true if insertion was successful
@@ -219,7 +238,7 @@ class ChunkGroup {
219
238
  }
220
239
 
221
240
  /**
222
- * add a chunk into ChunkGroup. Is pushed on or prepended
241
+ * Appends a chunk to the group when it is not already a member.
223
242
  * @param {Chunk} chunk chunk being pushed into ChunkGroupS
224
243
  * @returns {boolean} returns true if chunk addition was successful.
225
244
  */
@@ -233,6 +252,8 @@ class ChunkGroup {
233
252
  }
234
253
 
235
254
  /**
255
+ * Replaces one member chunk with another while preserving the group's
256
+ * ordering and avoiding duplicates.
236
257
  * @param {Chunk} oldChunk chunk to be replaced
237
258
  * @param {Chunk} newChunk New chunk that will be replaced with
238
259
  * @returns {boolean | undefined} returns true if the replacement was successful
@@ -256,6 +277,7 @@ class ChunkGroup {
256
277
  }
257
278
 
258
279
  /**
280
+ * Removes a chunk from this group.
259
281
  * @param {Chunk} chunk chunk to remove
260
282
  * @returns {boolean} returns true if chunk was removed
261
283
  */
@@ -269,6 +291,8 @@ class ChunkGroup {
269
291
  }
270
292
 
271
293
  /**
294
+ * Indicates whether this chunk group is loaded as part of the initial page
295
+ * load instead of being created lazily.
272
296
  * @returns {boolean} true, when this chunk group will be loaded on initial page load
273
297
  */
274
298
  isInitial() {
@@ -276,6 +300,7 @@ class ChunkGroup {
276
300
  }
277
301
 
278
302
  /**
303
+ * Adds a child chunk group to the current group.
279
304
  * @param {ChunkGroup} group chunk group to add
280
305
  * @returns {boolean} returns true if chunk group was added
281
306
  */
@@ -286,6 +311,7 @@ class ChunkGroup {
286
311
  }
287
312
 
288
313
  /**
314
+ * Returns the child chunk groups reachable from this group.
289
315
  * @returns {ChunkGroup[]} returns the children of this group
290
316
  */
291
317
  getChildren() {
@@ -301,6 +327,8 @@ class ChunkGroup {
301
327
  }
302
328
 
303
329
  /**
330
+ * Removes a child chunk group and clears the corresponding parent link on
331
+ * the removed child.
304
332
  * @param {ChunkGroup} group the chunk group to remove
305
333
  * @returns {boolean} returns true if the chunk group was removed
306
334
  */
@@ -315,6 +343,7 @@ class ChunkGroup {
315
343
  }
316
344
 
317
345
  /**
346
+ * Records a parent chunk group relationship.
318
347
  * @param {ChunkGroup} parentChunk the parent group to be added into
319
348
  * @returns {boolean} returns true if this chunk group was added to the parent group
320
349
  */
@@ -327,6 +356,7 @@ class ChunkGroup {
327
356
  }
328
357
 
329
358
  /**
359
+ * Returns the parent chunk groups that can lead to this group.
330
360
  * @returns {ChunkGroup[]} returns the parents of this group
331
361
  */
332
362
  getParents() {
@@ -338,6 +368,7 @@ class ChunkGroup {
338
368
  }
339
369
 
340
370
  /**
371
+ * Checks whether the provided group is registered as a parent.
341
372
  * @param {ChunkGroup} parent the parent group
342
373
  * @returns {boolean} returns true if the parent group contains this group
343
374
  */
@@ -350,6 +381,7 @@ class ChunkGroup {
350
381
  }
351
382
 
352
383
  /**
384
+ * Removes a parent chunk group and clears the reverse child relationship.
353
385
  * @param {ChunkGroup} chunkGroup the parent group
354
386
  * @returns {boolean} returns true if this group has been removed from the parent
355
387
  */
@@ -362,6 +394,7 @@ class ChunkGroup {
362
394
  }
363
395
 
364
396
  /**
397
+ * Registers an async entrypoint that is rooted in this chunk group.
365
398
  * @param {Entrypoint} entrypoint entrypoint to add
366
399
  * @returns {boolean} returns true if entrypoint was added
367
400
  */
@@ -376,6 +409,7 @@ class ChunkGroup {
376
409
  }
377
410
 
378
411
  /**
412
+ * Returns the async dependency blocks that create or reference this group.
379
413
  * @returns {AsyncDependenciesBlock[]} an array containing the blocks
380
414
  */
381
415
  getBlocks() {
@@ -387,6 +421,7 @@ class ChunkGroup {
387
421
  }
388
422
 
389
423
  /**
424
+ * Checks whether an async dependency block is associated with this group.
390
425
  * @param {AsyncDependenciesBlock} block block
391
426
  * @returns {boolean} true, if block exists
392
427
  */
@@ -395,6 +430,7 @@ class ChunkGroup {
395
430
  }
396
431
 
397
432
  /**
433
+ * Exposes the group's async dependency blocks as an iterable.
398
434
  * @returns {Iterable<AsyncDependenciesBlock>} blocks
399
435
  */
400
436
  get blocksIterable() {
@@ -402,6 +438,7 @@ class ChunkGroup {
402
438
  }
403
439
 
404
440
  /**
441
+ * Associates an async dependency block with this chunk group.
405
442
  * @param {AsyncDependenciesBlock} block a block
406
443
  * @returns {boolean} false, if block was already added
407
444
  */
@@ -414,6 +451,8 @@ class ChunkGroup {
414
451
  }
415
452
 
416
453
  /**
454
+ * Records where this chunk group originated from in user code.
455
+ * The origin is used for diagnostics, ordering, and reporting.
417
456
  * @param {Module | null} module origin module
418
457
  * @param {DependencyLocation} loc location of the reference in the origin module
419
458
  * @param {string} request request name of the reference
@@ -428,6 +467,7 @@ class ChunkGroup {
428
467
  }
429
468
 
430
469
  /**
470
+ * Collects the emitted files produced by every chunk in the group.
431
471
  * @returns {string[]} the files contained this chunk group
432
472
  */
433
473
  getFiles() {
@@ -444,6 +484,9 @@ class ChunkGroup {
444
484
  }
445
485
 
446
486
  /**
487
+ * Disconnects this group from its parents, children, and chunks.
488
+ * Child groups are reconnected to this group's parents so the surrounding
489
+ * graph remains intact after removal.
447
490
  * @returns {void}
448
491
  */
449
492
  remove() {
@@ -503,6 +546,55 @@ class ChunkGroup {
503
546
  }
504
547
 
505
548
  /**
549
+ * Aggregates per-block `*Order` options for the blocks that bridge this
550
+ * chunk group to the given child chunk group. `*Order` options are tied to
551
+ * the originating `import()` call and must not be sourced from the child's
552
+ * shared options, otherwise a webpackPrefetch/Preload directive from one
553
+ * parent would leak into other parents that share the child by name.
554
+ * @param {ChunkGroup} childGroup the child chunk group
555
+ * @param {ChunkGraph} chunkGraph the chunk graph
556
+ * @returns {Record<string, number>} merged `*Order` options for the edge from this group to `childGroup`
557
+ */
558
+ getChildOrderOptions(childGroup, chunkGraph) {
559
+ /** @type {Record<string, number>} */
560
+ const result = Object.create(null);
561
+ let bridged = false;
562
+ for (const block of childGroup.blocksIterable) {
563
+ const rootModule = /** @type {Module} */ (block.getRootBlock());
564
+ if (!chunkGraph.isModuleInChunkGroup(rootModule, this)) continue;
565
+ bridged = true;
566
+ const opts = block.groupOptions;
567
+ if (!opts) continue;
568
+ for (const key of Object.keys(opts)) {
569
+ if (!key.endsWith("Order")) continue;
570
+ const value =
571
+ /** @type {number} */
572
+ (opts[/** @type {keyof ChunkGroupOptions} */ (key)]);
573
+ if (typeof value !== "number") continue;
574
+ if (result[key] === undefined || value > result[key]) {
575
+ result[key] = value;
576
+ }
577
+ }
578
+ }
579
+ // Fall back to the child's own options only when no block bridges
580
+ // this edge (e.g. a chunk group created by APIs that don't go through
581
+ // an AsyncDependenciesBlock). Otherwise we'd reintroduce the leak.
582
+ if (!bridged) {
583
+ for (const key of Object.keys(childGroup.options)) {
584
+ if (!key.endsWith("Order")) continue;
585
+ const value =
586
+ childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)];
587
+ if (typeof value === "number") {
588
+ result[key] = value;
589
+ }
590
+ }
591
+ }
592
+ return result;
593
+ }
594
+
595
+ /**
596
+ * Groups child chunk groups by their `*Order` options and sorts each group
597
+ * by descending order and deterministic chunk-group comparison.
506
598
  * @param {ModuleGraph} moduleGraph the module graph
507
599
  * @param {ChunkGraph} chunkGraph the chunk graph
508
600
  * @returns {Record<string, ChunkGroup[]>} mapping from children type to ordered list of ChunkGroups
@@ -511,22 +603,17 @@ class ChunkGroup {
511
603
  /** @type {Map<string, { order: number, group: ChunkGroup }[]>} */
512
604
  const lists = new Map();
513
605
  for (const childGroup of this._children) {
514
- for (const key of Object.keys(childGroup.options)) {
515
- if (key.endsWith("Order")) {
516
- const name = key.slice(0, key.length - "Order".length);
517
- let list = lists.get(name);
518
- if (list === undefined) {
519
- lists.set(name, (list = []));
520
- }
521
- list.push({
522
- order:
523
- /** @type {number} */
524
- (
525
- childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)]
526
- ),
527
- group: childGroup
528
- });
606
+ const edgeOptions = this.getChildOrderOptions(childGroup, chunkGraph);
607
+ for (const key of Object.keys(edgeOptions)) {
608
+ const name = key.slice(0, key.length - "Order".length);
609
+ let list = lists.get(name);
610
+ if (list === undefined) {
611
+ lists.set(name, (list = []));
529
612
  }
613
+ list.push({
614
+ order: edgeOptions[key],
615
+ group: childGroup
616
+ });
530
617
  }
531
618
  }
532
619
  /** @type {Record<string, ChunkGroup[]>} */
@@ -543,7 +630,7 @@ class ChunkGroup {
543
630
  }
544
631
 
545
632
  /**
546
- * Sets the top-down index of a module in this ChunkGroup
633
+ * Stores the module's top-down traversal index within this group.
547
634
  * @param {Module} module module for which the index should be set
548
635
  * @param {number} index the index of the module
549
636
  * @returns {void}
@@ -553,7 +640,7 @@ class ChunkGroup {
553
640
  }
554
641
 
555
642
  /**
556
- * Gets the top-down index of a module in this ChunkGroup
643
+ * Returns the module's top-down traversal index within this group.
557
644
  * @param {Module} module the module
558
645
  * @returns {number | undefined} index
559
646
  */
@@ -562,7 +649,7 @@ class ChunkGroup {
562
649
  }
563
650
 
564
651
  /**
565
- * Sets the bottom-up index of a module in this ChunkGroup
652
+ * Stores the module's bottom-up traversal index within this group.
566
653
  * @param {Module} module module for which the index should be set
567
654
  * @param {number} index the index of the module
568
655
  * @returns {void}
@@ -572,7 +659,7 @@ class ChunkGroup {
572
659
  }
573
660
 
574
661
  /**
575
- * Gets the bottom-up index of a module in this ChunkGroup
662
+ * Returns the module's bottom-up traversal index within this group.
576
663
  * @param {Module} module the module
577
664
  * @returns {number | undefined} index
578
665
  */
@@ -20,6 +20,7 @@ const memoize = require("./util/memoize");
20
20
  /** @typedef {import("./ModuleTemplate")} ModuleTemplate */
21
21
  /** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
22
22
  /**
23
+ * Defines the if set type used by this module.
23
24
  * @template T
24
25
  * @typedef {import("tapable").IfSet<T>} IfSet
25
26
  */
@@ -31,6 +32,7 @@ const getJavascriptModulesPlugin = memoize(() =>
31
32
  // TODO webpack 6 remove this class
32
33
  class ChunkTemplate {
33
34
  /**
35
+ * Creates an instance of ChunkTemplate.
34
36
  * @param {OutputOptions} outputOptions output options
35
37
  * @param {Compilation} compilation the compilation
36
38
  */
@@ -40,6 +42,7 @@ class ChunkTemplate {
40
42
  renderManifest: {
41
43
  tap: util.deprecate(
42
44
  /**
45
+ * Handles the callback logic for this hook.
43
46
  * @template AdditionalOptions
44
47
  * @param {string | Tap & IfSet<AdditionalOptions>} options options
45
48
  * @param {(renderManifestEntries: RenderManifestEntry[], renderManifestOptions: RenderManifestOptions) => RenderManifestEntry[]} fn function
@@ -60,6 +63,7 @@ class ChunkTemplate {
60
63
  modules: {
61
64
  tap: util.deprecate(
62
65
  /**
66
+ * Handles the callback logic for this hook.
63
67
  * @template AdditionalOptions
64
68
  * @param {string | Tap & IfSet<AdditionalOptions>} options options
65
69
  * @param {(source: Source, moduleTemplate: ModuleTemplate, renderContext: RenderContext) => Source} fn function
@@ -82,6 +86,7 @@ class ChunkTemplate {
82
86
  render: {
83
87
  tap: util.deprecate(
84
88
  /**
89
+ * Handles the callback logic for this hook.
85
90
  * @template AdditionalOptions
86
91
  * @param {string | Tap & IfSet<AdditionalOptions>} options options
87
92
  * @param {(source: Source, moduleTemplate: ModuleTemplate, renderContext: RenderContext) => Source} fn function
@@ -104,6 +109,7 @@ class ChunkTemplate {
104
109
  renderWithEntry: {
105
110
  tap: util.deprecate(
106
111
  /**
112
+ * Handles the callback logic for this hook.
107
113
  * @template AdditionalOptions
108
114
  * @param {string | Tap & IfSet<AdditionalOptions>} options options
109
115
  * @param {(source: Source, chunk: Chunk) => Source} fn function
@@ -130,6 +136,7 @@ class ChunkTemplate {
130
136
  hash: {
131
137
  tap: util.deprecate(
132
138
  /**
139
+ * Handles the callback logic for this hook.
133
140
  * @template AdditionalOptions
134
141
  * @param {string | Tap & IfSet<AdditionalOptions>} options options
135
142
  * @param {(hash: Hash) => void} fn function
@@ -144,6 +151,7 @@ class ChunkTemplate {
144
151
  hashForChunk: {
145
152
  tap: util.deprecate(
146
153
  /**
154
+ * Handles the callback logic for this hook.
147
155
  * @template AdditionalOptions
148
156
  * @param {string | Tap & IfSet<AdditionalOptions>} options options
149
157
  * @param {(hash: Hash, chunk: Chunk, chunkHashContext: ChunkHashContext) => void} fn function
@@ -167,6 +175,7 @@ class ChunkTemplate {
167
175
  Object.defineProperty(ChunkTemplate.prototype, "outputOptions", {
168
176
  get: util.deprecate(
169
177
  /**
178
+ * Returns output options.
170
179
  * @this {ChunkTemplate}
171
180
  * @returns {OutputOptions} output options
172
181
  */
@@ -0,0 +1,190 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Natsu @xiaoxiaojx
4
+ */
5
+
6
+ "use strict";
7
+
8
+ /** @typedef {import("./Compiler")} Compiler */
9
+ /** @typedef {import("./ModuleGraph")} ModuleGraph */
10
+ /** @typedef {import("./Module")} Module */
11
+ /** @typedef {import("./Module").BuildInfo} BuildInfo */
12
+
13
+ const PLUGIN_NAME = "CircularModulesPlugin";
14
+
15
+ /**
16
+ * Detects circular dependencies among synchronous module imports.
17
+ *
18
+ * Builds an adjacency layout from each module's synchronous outgoing
19
+ * connections (skipping weak and async-block edges), then runs an iterative
20
+ * SCC algorithm to find circular modules.
21
+ *
22
+ * Use the static `build()` method to create an instance. All intermediate data
23
+ * (adjacency layout, index mappings) is local to `build()` and released on
24
+ * return. The instance only holds the result.
25
+ */
26
+ class CycleGraph {
27
+ /**
28
+ * @param {Set<Module>} circularModules modules involved in circular dependencies
29
+ */
30
+ constructor(circularModules) {
31
+ /** @type {Set<Module>} */
32
+ this.circularModules = circularModules;
33
+ }
34
+
35
+ /**
36
+ * Builds a CycleGraph by constructing the synchronous outgoing-connection
37
+ * adjacency list and running iterative SCC to detect circular modules.
38
+ * @param {Iterable<Module>} modules the set of modules
39
+ * @param {ModuleGraph} moduleGraph the module graph
40
+ * @returns {CycleGraph} the result
41
+ */
42
+ static build(modules, moduleGraph) {
43
+ /** @type {Module[]} */
44
+ const moduleList = [];
45
+ /** @type {Map<Module, number>} */
46
+ const moduleToIndex = new Map();
47
+ for (const module of modules) {
48
+ moduleToIndex.set(module, moduleList.length);
49
+ moduleList.push(module);
50
+ }
51
+
52
+ const size = moduleList.length;
53
+ if (size === 0) return new CycleGraph(new Set());
54
+
55
+ /** @type {number[][]} */
56
+ const edges = Array.from({ length: size });
57
+ /** @type {boolean[]} */
58
+ const selfLoops = Array.from({ length: size }, () => false);
59
+
60
+ for (let i = 0; i < size; i++) {
61
+ const module = moduleList[i];
62
+ /** @type {number[]} */
63
+ const deps = [];
64
+ for (const connection of moduleGraph.getOutgoingConnections(module)) {
65
+ const dep = connection.dependency;
66
+ if (!dep) continue;
67
+ const target = connection.module;
68
+ if (!target) continue;
69
+ // Weak references don't synchronously evaluate the target.
70
+ if (connection.weak) continue;
71
+ // Async edges (dynamic import & friends) live in AsyncDependenciesBlock,
72
+ // so a synchronous dep's parent block is the module itself.
73
+ if (moduleGraph.getParentBlock(dep) !== module) continue;
74
+ if (target === module) {
75
+ selfLoops[i] = true;
76
+ continue;
77
+ }
78
+ const targetIdx = moduleToIndex.get(target);
79
+ if (targetIdx !== undefined) {
80
+ deps.push(targetIdx);
81
+ }
82
+ }
83
+ edges[i] = deps;
84
+ }
85
+
86
+ // Iterative SCC algorithm
87
+ /** @type {Set<Module>} */
88
+ const circular = new Set();
89
+ let nextIndex = 0;
90
+ const nodeIndex = new Int32Array(size).fill(-1);
91
+ const nodeLowLink = new Int32Array(size);
92
+ const nodeOnStack = new Uint8Array(size);
93
+ /** @type {number[]} */
94
+ const sccStack = [];
95
+
96
+ /**
97
+ * @typedef {object} Frame
98
+ * @property {number} node
99
+ * @property {number} edgeIdx
100
+ * @property {number} parent
101
+ */
102
+
103
+ for (let root = 0; root < size; root++) {
104
+ if (nodeIndex[root] !== -1) continue;
105
+
106
+ nodeIndex[root] = nextIndex;
107
+ nodeLowLink[root] = nextIndex;
108
+ nextIndex++;
109
+ nodeOnStack[root] = 1;
110
+ sccStack.push(root);
111
+
112
+ /** @type {Frame[]} */
113
+ const callStack = [{ node: root, edgeIdx: 0, parent: -1 }];
114
+
115
+ while (callStack.length > 0) {
116
+ const frame = /** @type {Frame} */ (callStack[callStack.length - 1]);
117
+ const v = frame.node;
118
+ const vEdges = edges[v];
119
+
120
+ if (frame.edgeIdx < vEdges.length) {
121
+ const w = vEdges[frame.edgeIdx++];
122
+ if (nodeIndex[w] === -1) {
123
+ nodeIndex[w] = nextIndex;
124
+ nodeLowLink[w] = nextIndex;
125
+ nextIndex++;
126
+ nodeOnStack[w] = 1;
127
+ sccStack.push(w);
128
+ callStack.push({ node: w, edgeIdx: 0, parent: v });
129
+ } else if (nodeOnStack[w] && nodeIndex[w] < nodeLowLink[v]) {
130
+ nodeLowLink[v] = nodeIndex[w];
131
+ }
132
+ } else {
133
+ if (nodeLowLink[v] === nodeIndex[v]) {
134
+ /** @type {number[]} */
135
+ const component = [];
136
+ let w;
137
+ do {
138
+ w = /** @type {number} */ (sccStack.pop());
139
+ nodeOnStack[w] = 0;
140
+ component.push(w);
141
+ } while (w !== v);
142
+
143
+ if (component.length > 1 || selfLoops[v]) {
144
+ for (const idx of component) {
145
+ circular.add(moduleList[idx]);
146
+ }
147
+ }
148
+ }
149
+
150
+ callStack.pop();
151
+ if (
152
+ frame.parent !== -1 &&
153
+ nodeLowLink[v] < nodeLowLink[frame.parent]
154
+ ) {
155
+ nodeLowLink[frame.parent] = nodeLowLink[v];
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ return new CycleGraph(circular);
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Detects circular dependencies and marks each circular module
167
+ * via buildInfo.isCircular for downstream consumers.
168
+ */
169
+ class CircularModulesPlugin {
170
+ /**
171
+ * @param {Compiler} compiler the compiler instance
172
+ * @returns {void}
173
+ */
174
+ apply(compiler) {
175
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
176
+ compilation.hooks.optimizeModules.tap(PLUGIN_NAME, (modules) => {
177
+ const { circularModules } = CycleGraph.build(
178
+ modules,
179
+ compilation.moduleGraph
180
+ );
181
+ for (const m of modules) {
182
+ /** @type {BuildInfo} */
183
+ (m.buildInfo).isCircular = circularModules.has(m);
184
+ }
185
+ });
186
+ });
187
+ }
188
+ }
189
+
190
+ module.exports = CircularModulesPlugin;