@depup/webpack 5.109.2-depup.0 → 5.110.3-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 (647) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +46 -35
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +107 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +91 -26
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +111 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +40 -49
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +152 -103
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +335 -169
  89. package/lib/RuntimeTemplate.js +2761 -316
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +12 -6
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +270 -78
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +46 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +84 -32
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +172 -100
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5334 -0
  160. package/lib/css/syntax.js +9647 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +170 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +24 -11
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +23 -14
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +121 -60
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +49 -31
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +45 -5
  230. package/lib/dependencies/ImportDependency.js +33 -50
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +73 -49
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +50 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +47 -28
  290. package/lib/dependencies/WorkerDependency.js +22 -22
  291. package/lib/dependencies/WorkletDependency.js +18 -21
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/importOptionsCheck.js +47 -0
  294. package/lib/dependencies/processExportInfo.js +5 -5
  295. package/lib/dll/DelegatedModule.js +34 -22
  296. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  297. package/lib/dll/DelegatedPlugin.js +2 -2
  298. package/lib/dll/DllEntryPlugin.js +2 -2
  299. package/lib/dll/DllModule.js +22 -15
  300. package/lib/dll/DllModuleFactory.js +7 -3
  301. package/lib/dll/DllPlugin.js +7 -5
  302. package/lib/dll/DllReferencePlugin.js +10 -7
  303. package/lib/dll/LibManifestPlugin.js +5 -5
  304. package/lib/electron/ElectronTargetPlugin.js +53 -49
  305. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  306. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  307. package/lib/errors/BroadContextsWarning.js +43 -0
  308. package/lib/errors/BuildCycleError.js +1 -1
  309. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  310. package/lib/errors/ChunkRenderError.js +1 -1
  311. package/lib/errors/CircularDependenciesWarning.js +38 -0
  312. package/lib/errors/CodeGenerationError.js +1 -1
  313. package/lib/errors/CommentCompilationWarning.js +1 -1
  314. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  315. package/lib/errors/DotenvFileError.js +29 -0
  316. package/lib/errors/DuplicateModulesWarning.js +45 -0
  317. package/lib/errors/DynamicExportsWarning.js +30 -0
  318. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  319. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  320. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  321. package/lib/errors/EvalUsageWarning.js +28 -0
  322. package/lib/errors/HookWebpackError.js +5 -5
  323. package/lib/errors/HotspotsWarning.js +57 -0
  324. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  325. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  326. package/lib/errors/InlinedAssetsWarning.js +36 -0
  327. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  328. package/lib/errors/LargeModulesWarning.js +45 -0
  329. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  330. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  331. package/lib/errors/MixedExportsWarning.js +41 -0
  332. package/lib/errors/ModuleDependencyError.js +13 -16
  333. package/lib/errors/ModuleDependencyWarning.js +5 -15
  334. package/lib/errors/ModuleHashingError.js +1 -1
  335. package/lib/errors/ModuleNotFoundError.js +2 -2
  336. package/lib/errors/ModuleParseError.js +1 -2
  337. package/lib/errors/ModuleRestoreError.js +1 -1
  338. package/lib/errors/ModuleStoreError.js +1 -1
  339. package/lib/errors/NodeStuffInWebError.js +1 -1
  340. package/lib/errors/OsDependentRuleWarning.js +31 -0
  341. package/lib/errors/PureAnnotationsWarning.js +36 -0
  342. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  343. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  344. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  345. package/lib/errors/TinyChunksWarning.js +40 -0
  346. package/lib/errors/TopLevelThisWarning.js +34 -0
  347. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  348. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  349. package/lib/errors/UnusedAliasesWarning.js +29 -0
  350. package/lib/errors/UnusedDefinesWarning.js +29 -0
  351. package/lib/errors/UnusedExternalsWarning.js +29 -0
  352. package/lib/errors/UnusedReexportsWarning.js +42 -0
  353. package/lib/errors/UnusedRuleWarning.js +29 -0
  354. package/lib/errors/WebpackError.js +9 -5
  355. package/lib/errors/deriveStackFromNestedError.js +90 -0
  356. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  357. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  358. package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
  359. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
  360. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  361. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  362. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  363. package/lib/hmr/lazyCompilationBackend.js +9 -6
  364. package/lib/hmr/parserHooks.js +56 -0
  365. package/lib/html/HtmlGenerator.js +277 -77
  366. package/lib/html/HtmlModule.js +7 -3
  367. package/lib/html/HtmlModulesPlugin.js +366 -200
  368. package/lib/html/HtmlParser.js +31 -86
  369. package/lib/html/data.js +1928 -0
  370. package/lib/html/htmlMinify.js +288 -0
  371. package/lib/html/syntax.js +6034 -1384
  372. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  373. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  374. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  375. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  376. package/lib/ids/IdHelpers.js +7 -8
  377. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  378. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  379. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  380. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  381. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  382. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  383. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  384. package/lib/index.js +10 -0
  385. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  386. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  387. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  388. package/lib/javascript/ChunkHelpers.js +1 -1
  389. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  390. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  391. package/lib/javascript/JavascriptGenerator.js +65 -165
  392. package/lib/javascript/JavascriptModule.js +9 -3
  393. package/lib/javascript/JavascriptModulesPlugin.js +103 -123
  394. package/lib/javascript/JavascriptParser.js +242 -99
  395. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  396. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  397. package/lib/javascript/StartupHelpers.js +55 -9
  398. package/lib/javascript/syntax.js +2678 -232
  399. package/lib/json/JsonData.js +8 -4
  400. package/lib/json/JsonGenerator.js +38 -16
  401. package/lib/json/JsonModule.js +7 -3
  402. package/lib/json/JsonModulesPlugin.js +1 -1
  403. package/lib/json/JsonParser.js +5 -6
  404. package/lib/library/AbstractLibraryPlugin.js +20 -14
  405. package/lib/library/AmdLibraryPlugin.js +11 -7
  406. package/lib/library/AssignLibraryPlugin.js +19 -13
  407. package/lib/library/EnableLibraryPlugin.js +2 -2
  408. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  409. package/lib/library/JsonpLibraryPlugin.js +11 -7
  410. package/lib/library/ModuleLibraryPlugin.js +256 -64
  411. package/lib/library/SystemLibraryPlugin.js +12 -8
  412. package/lib/library/UmdLibraryPlugin.js +62 -25
  413. package/lib/loaders/LoaderRunner.js +47 -6
  414. package/lib/loaders/loadLoader.js +8 -4
  415. package/lib/logging/createConsoleLogger.js +7 -4
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  417. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  418. package/lib/node/NodeSourcePlugin.js +1 -1
  419. package/lib/node/NodeTargetPlugin.js +4 -3
  420. package/lib/node/NodeTemplatePlugin.js +1 -1
  421. package/lib/node/NodeWatchFileSystem.js +70 -9
  422. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
  424. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  425. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  426. package/lib/node/nodeConsole.js +7 -3
  427. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  428. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  429. package/lib/optimize/ConcatenatedModule.js +1030 -476
  430. package/lib/optimize/ConstExportsPlugin.js +16 -7
  431. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  432. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  433. package/lib/optimize/InlineExports.js +130 -5
  434. package/lib/optimize/InnerGraph.js +28 -12
  435. package/lib/optimize/InnerGraphPlugin.js +23 -18
  436. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  437. package/lib/optimize/MangleExportsPlugin.js +7 -8
  438. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  439. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  440. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  441. package/lib/optimize/RealContentHashPlugin.js +121 -41
  442. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  443. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  444. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  445. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  446. package/lib/optimize/SplitChunksPlugin.js +86 -24
  447. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  448. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  449. package/lib/performance/BroadContextsPlugin.js +142 -0
  450. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  451. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  452. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  453. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  454. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  455. package/lib/performance/DynamicExportsPlugin.js +120 -0
  456. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  457. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  458. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  459. package/lib/performance/EvalUsagePlugin.js +115 -0
  460. package/lib/performance/HotspotsPlugin.js +296 -0
  461. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  462. package/lib/performance/LargeModulesPlugin.js +126 -0
  463. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  464. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  465. package/lib/performance/MixedExportsPlugin.js +136 -0
  466. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  467. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  468. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  469. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  470. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  471. package/lib/performance/SizeLimitsPlugin.js +139 -7
  472. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  473. package/lib/performance/TinyChunksPlugin.js +128 -0
  474. package/lib/performance/TopLevelThisPlugin.js +208 -0
  475. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  476. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  477. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  478. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  479. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  480. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  481. package/lib/performance/getModuleSize.js +22 -0
  482. package/lib/performance/getSourceModules.js +22 -0
  483. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  484. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  485. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  486. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  487. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  488. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  489. package/lib/prefetch/ResourceHintPlugin.js +295 -79
  490. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  491. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  492. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  493. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  494. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  495. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  496. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  497. package/lib/rules/RuleSetCompiler.js +146 -12
  498. package/lib/rules/UseEffectRulePlugin.js +18 -11
  499. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  500. package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
  501. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  502. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  503. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  504. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  505. package/lib/runtime/CompatRuntimeModule.js +5 -3
  506. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  507. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  508. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  509. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  510. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  511. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  512. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  513. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  514. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  515. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  516. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  517. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  518. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  519. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  520. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  521. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
  522. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  523. package/lib/runtime/NonceRuntimeModule.js +10 -0
  524. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  525. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  526. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  527. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  528. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  529. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  530. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  531. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  532. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  533. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  534. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  535. package/lib/runtime/baseUri.js +63 -0
  536. package/lib/schemes/DataUriPlugin.js +1 -1
  537. package/lib/schemes/FileUriPlugin.js +1 -1
  538. package/lib/schemes/HttpUriPlugin.js +46 -20
  539. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  540. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  541. package/lib/serialization/BinaryMiddleware.js +4 -4
  542. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  543. package/lib/serialization/FileMiddleware.js +22 -9
  544. package/lib/serialization/ObjectMiddleware.js +139 -114
  545. package/lib/serialization/PlainObjectSerializer.js +19 -16
  546. package/lib/sharing/ConsumeSharedModule.js +30 -21
  547. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  548. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  549. package/lib/sharing/ProvideSharedModule.js +25 -16
  550. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  551. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  552. package/lib/sharing/SharePlugin.js +17 -5
  553. package/lib/sharing/ShareRuntimeModule.js +4 -4
  554. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  555. package/lib/sharing/utils.js +1 -3
  556. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  557. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  558. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  559. package/lib/stats/StatsFactory.js +25 -26
  560. package/lib/stats/StatsPrinter.js +16 -12
  561. package/lib/typescript/TypeScriptPlugin.js +20 -24
  562. package/lib/url/URLParserPlugin.js +26 -13
  563. package/lib/util/ArrayQueue.js +3 -3
  564. package/lib/util/AsyncQueue.js +4 -3
  565. package/lib/util/Hash.js +5 -1
  566. package/lib/util/LazySet.js +35 -22
  567. package/lib/util/LocConverter.js +36 -13
  568. package/lib/util/SourceProcessor.js +1066 -24
  569. package/lib/util/StringXor.js +1 -1
  570. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  571. package/lib/util/chainedImports.js +9 -5
  572. package/lib/util/cleverMerge.js +1 -1
  573. package/lib/util/comparators.js +45 -14
  574. package/lib/util/concatenate.js +203 -77
  575. package/lib/util/conventions.js +10 -2
  576. package/lib/util/createHash.js +2 -2
  577. package/lib/util/createHooksRegistry.js +8 -10
  578. package/lib/util/createMappings.js +25 -3
  579. package/lib/util/dataURL.js +225 -1
  580. package/lib/util/extractSourceMap.js +4 -3
  581. package/lib/util/findCaseMismatch.js +139 -0
  582. package/lib/util/formatLocation.js +1 -2
  583. package/lib/util/fs.js +22 -5
  584. package/lib/util/globUtils.js +298 -24
  585. package/lib/util/hash/BatchedHash.js +5 -1
  586. package/lib/util/hash/BulkUpdateHash.js +5 -1
  587. package/lib/util/hash/DebugHash.js +5 -1
  588. package/lib/util/hash/hash-digest.js +6 -2
  589. package/lib/util/identifier.js +4 -0
  590. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  591. package/lib/util/internalSerializables.js +8 -0
  592. package/lib/util/lazyModule.js +56 -0
  593. package/lib/util/makeSerializable.js +7 -3
  594. package/lib/util/matchAlias.js +25 -0
  595. package/lib/util/mimeTypes.js +11 -5
  596. package/lib/util/nonNumericOnlyHash.js +4 -3
  597. package/lib/util/parseJson.js +5 -3
  598. package/lib/util/preloadModuleType.js +32 -0
  599. package/lib/util/registerExternalSerializer.js +7 -5
  600. package/lib/util/removeBOM.js +82 -1
  601. package/lib/util/runtime.js +2 -2
  602. package/lib/util/semver.js +1 -1
  603. package/lib/util/serialization.js +28 -28
  604. package/lib/util/source.js +2 -2
  605. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  607. package/lib/wasm/wasmModuleFilename.js +54 -0
  608. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
  609. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
  610. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  611. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  612. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  613. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  614. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  615. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
  616. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  623. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
  626. package/lib/web/FetchCompileWasmPlugin.js +48 -16
  627. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  629. package/lib/web/JsonpTemplatePlugin.js +2 -2
  630. package/lib/webpack.js +22 -11
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +1 -0
  635. package/package.json +32 -25
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +667 -34
  638. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  639. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  640. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  641. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  642. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  643. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  644. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  645. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  646. package/types.d.ts +3223 -465
  647. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -8,6 +8,7 @@
8
8
  const asyncLib = require("neo-async");
9
9
  const {
10
10
  AsyncSeriesBailHook,
11
+ AsyncSeriesHook,
11
12
  HookMap,
12
13
  SyncBailHook,
13
14
  SyncHook,
@@ -23,44 +24,83 @@ const { ImportPhaseUtils } = require("./dependencies/ImportPhase");
23
24
  const { getContext } = require("./loaders/LoaderRunner");
24
25
  const BasicEffectRulePlugin = require("./rules/BasicEffectRulePlugin");
25
26
  const BasicMatcherRulePlugin = require("./rules/BasicMatcherRulePlugin");
27
+ const GlobMatcherRulePlugin = require("./rules/GlobMatcherRulePlugin");
26
28
  const ObjectMatcherRulePlugin = require("./rules/ObjectMatcherRulePlugin");
27
29
  const RuleSetCompiler = require("./rules/RuleSetCompiler");
28
30
  const UseEffectRulePlugin = require("./rules/UseEffectRulePlugin");
29
31
  const LazySet = require("./util/LazySet");
30
32
  const { getScheme } = require("./util/URLAbsoluteSpecifier");
31
33
  const { cachedCleverMerge, cachedSetProperty } = require("./util/cleverMerge");
32
- const { join } = require("./util/fs");
33
34
  const {
35
+ applyCaseCorrections,
36
+ findCaseMismatch
37
+ } = require("./util/findCaseMismatch");
38
+ const { dirname, join, relative } = require("./util/fs");
39
+ const {
40
+ ABSOLUTE_PATH_REGEXP,
41
+ WINDOWS_PATH_SEPARATOR_REGEXP,
34
42
  escapeHashInPathRequest,
35
43
  parseResource,
36
44
  parseResourceWithoutFragment
37
45
  } = require("./util/identifier");
46
+ const matchAlias = require("./util/matchAlias");
38
47
 
39
- /** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */
40
- /** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
41
- /** @typedef {import("../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */
42
- /** @typedef {import("../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
43
- /** @typedef {import("./Compilation").FileSystemDependencies} FileSystemDependencies */
44
- /** @typedef {import("./Generator")} Generator */
45
- /** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
46
- /** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
47
- /** @typedef {import("./ModuleFactory").ModuleFactoryCreateDataContextInfo} ModuleFactoryCreateDataContextInfo */
48
- /** @typedef {import("./ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
49
- /** @typedef {import("./NormalModule").GeneratorOptions} GeneratorOptions */
50
- /** @typedef {import("./NormalModule").LoaderItem} LoaderItem */
51
- /** @typedef {import("./NormalModule").NormalModuleCreateData} NormalModuleCreateData */
52
- /** @typedef {import("./NormalModule").ParserOptions} ParserOptions */
53
- /** @typedef {import("./Parser")} Parser */
54
- /** @typedef {import("./ResolverFactory")} ResolverFactory */
55
- /** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
56
- /** @typedef {import("./dependencies/ModuleDependency")} ModuleDependency */
57
- /** @typedef {import("./dependencies/ImportPhase").ImportPhaseType} ImportPhaseType */
58
- /** @typedef {import("./dependencies/ImportPhase").ImportPhaseName} ImportPhaseName */
59
- /** @typedef {import("./javascript/JavascriptParser").ImportAttributes} ImportAttributes */
60
- /** @typedef {import("./rules/RuleSetCompiler").RuleSetRules} RuleSetRules */
61
- /** @typedef {import("./rules/RuleSetCompiler").RuleSet} RuleSet */
62
- /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
63
- /** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
48
+ /** @typedef {import("enhanced-resolve").Resolver["options"]["alias"]} AliasOptions */
49
+ /** @import { ResolveContext, ResolveRequest } from "enhanced-resolve" */
50
+ /**
51
+ * @import {
52
+ * ModuleOptionsNormalized as ModuleOptions,
53
+ * RuleSetRule,
54
+ * JavascriptParserOptions,
55
+ * EmptyGeneratorOptions,
56
+ * JsonParserOptions,
57
+ * JsonGeneratorOptions,
58
+ * AssetParserOptions,
59
+ * EmptyParserOptions,
60
+ * AssetGeneratorOptions,
61
+ * CssParserOptions,
62
+ * CssModuleParserOptions,
63
+ * CssGeneratorOptions,
64
+ * CssModuleGeneratorOptions,
65
+ * EmptyParserOptions as HtmlParserOptions,
66
+ * HtmlGeneratorOptions
67
+ * } from "../declarations/WebpackOptions"
68
+ */
69
+ /** @import { FileSystemDependencies } from "./Compilation" */
70
+ /** @import Generator from "./Generator" */
71
+ /**
72
+ * @import {
73
+ * ModuleFactoryCallback,
74
+ * ModuleFactoryCreateData,
75
+ * ModuleFactoryCreateDataContextInfo,
76
+ * ModuleFactoryResult
77
+ * } from "./ModuleFactory"
78
+ */
79
+ /**
80
+ * @import {
81
+ * GeneratorOptions,
82
+ * LoaderItem,
83
+ * NormalModuleCreateData,
84
+ * ParserOptions
85
+ * } from "./NormalModule"
86
+ */
87
+ /** @import Parser from "./Parser" */
88
+ /** @import ResolverFactory, { ResolverWithOptions } from "./ResolverFactory" */
89
+ /** @import ModuleDependency from "./dependencies/ModuleDependency" */
90
+ /**
91
+ * @import {
92
+ * ImportPhaseType,
93
+ * ImportPhaseName
94
+ * } from "./dependencies/ImportPhase"
95
+ */
96
+ /**
97
+ * @import JavascriptParser, {
98
+ * ImportAttributes
99
+ * } from "./javascript/JavascriptParser"
100
+ */
101
+ /** @import { RuleSetRules, RuleSet } from "./rules/RuleSetCompiler" */
102
+ /** @import { InputFileSystem } from "./util/fs" */
103
+ /** @import { AssociatedObjectForCache } from "./util/identifier" */
64
104
 
65
105
  /**
66
106
  * Defines the callback type used by this module.
@@ -131,22 +171,25 @@ const {
131
171
  * @typedef {ResolveDependencies & { loader: string, query: string | undefined, type: string | undefined }} LoaderResolveCacheEntry
132
172
  */
133
173
 
134
- /** @typedef {import("./ModuleTypeConstants").JAVASCRIPT_MODULE_TYPE_AUTO} JAVASCRIPT_MODULE_TYPE_AUTO */
135
- /** @typedef {import("./ModuleTypeConstants").JAVASCRIPT_MODULE_TYPE_DYNAMIC} JAVASCRIPT_MODULE_TYPE_DYNAMIC */
136
- /** @typedef {import("./ModuleTypeConstants").JAVASCRIPT_MODULE_TYPE_ESM} JAVASCRIPT_MODULE_TYPE_ESM */
137
- /** @typedef {import("./ModuleTypeConstants").JSON_MODULE_TYPE} JSON_MODULE_TYPE */
138
- /** @typedef {import("./ModuleTypeConstants").ASSET_MODULE_TYPE} ASSET_MODULE_TYPE */
139
- /** @typedef {import("./ModuleTypeConstants").ASSET_MODULE_TYPE_INLINE} ASSET_MODULE_TYPE_INLINE */
140
- /** @typedef {import("./ModuleTypeConstants").ASSET_MODULE_TYPE_RESOURCE} ASSET_MODULE_TYPE_RESOURCE */
141
- /** @typedef {import("./ModuleTypeConstants").ASSET_MODULE_TYPE_SOURCE} ASSET_MODULE_TYPE_SOURCE */
142
- /** @typedef {import("./ModuleTypeConstants").ASSET_MODULE_TYPE_BYTES} ASSET_MODULE_TYPE_BYTES */
143
- /** @typedef {import("./ModuleTypeConstants").WEBASSEMBLY_MODULE_TYPE_ASYNC} WEBASSEMBLY_MODULE_TYPE_ASYNC */
144
- /** @typedef {import("./ModuleTypeConstants").WEBASSEMBLY_MODULE_TYPE_SYNC} WEBASSEMBLY_MODULE_TYPE_SYNC */
145
- /** @typedef {import("./ModuleTypeConstants").CSS_MODULE_TYPE} CSS_MODULE_TYPE */
146
- /** @typedef {import("./ModuleTypeConstants").CSS_MODULE_TYPE_GLOBAL} CSS_MODULE_TYPE_GLOBAL */
147
- /** @typedef {import("./ModuleTypeConstants").CSS_MODULE_TYPE_MODULE} CSS_MODULE_TYPE_MODULE */
148
- /** @typedef {import("./ModuleTypeConstants").CSS_MODULE_TYPE_AUTO} CSS_MODULE_TYPE_AUTO */
149
- /** @typedef {import("./ModuleTypeConstants").HTML_MODULE_TYPE} HTML_MODULE_TYPE */
174
+ /**
175
+ * @import {
176
+ * JAVASCRIPT_MODULE_TYPE_DYNAMIC,
177
+ * JAVASCRIPT_MODULE_TYPE_ESM,
178
+ * JSON_MODULE_TYPE,
179
+ * ASSET_MODULE_TYPE,
180
+ * ASSET_MODULE_TYPE_INLINE,
181
+ * ASSET_MODULE_TYPE_RESOURCE,
182
+ * ASSET_MODULE_TYPE_SOURCE,
183
+ * ASSET_MODULE_TYPE_BYTES,
184
+ * WEBASSEMBLY_MODULE_TYPE_ASYNC,
185
+ * WEBASSEMBLY_MODULE_TYPE_SYNC,
186
+ * CSS_MODULE_TYPE,
187
+ * CSS_MODULE_TYPE_GLOBAL,
188
+ * CSS_MODULE_TYPE_MODULE,
189
+ * CSS_MODULE_TYPE_AUTO,
190
+ * HTML_MODULE_TYPE
191
+ * } from "./ModuleTypeConstants"
192
+ */
150
193
 
151
194
  /** @typedef {JAVASCRIPT_MODULE_TYPE_AUTO | JAVASCRIPT_MODULE_TYPE_DYNAMIC | JAVASCRIPT_MODULE_TYPE_ESM | JSON_MODULE_TYPE | ASSET_MODULE_TYPE | ASSET_MODULE_TYPE_INLINE | ASSET_MODULE_TYPE_RESOURCE | ASSET_MODULE_TYPE_SOURCE | WEBASSEMBLY_MODULE_TYPE_ASYNC | WEBASSEMBLY_MODULE_TYPE_SYNC | CSS_MODULE_TYPE | CSS_MODULE_TYPE_GLOBAL | CSS_MODULE_TYPE_MODULE | CSS_MODULE_TYPE_AUTO | HTML_MODULE_TYPE} KnownNormalModuleTypes */
152
195
  /** @typedef {KnownNormalModuleTypes | string} NormalModuleTypes */
@@ -161,6 +204,174 @@ const EMPTY_ELEMENTS = [];
161
204
 
162
205
  const MATCH_RESOURCE_REGEX = /^([^!]+)!=!/;
163
206
  const LEADING_DOT_EXTENSION_REGEX = /^[^.]/;
207
+ // Nothing in `util/identifier` matches a request (as opposed to a path) shape.
208
+ const RELATIVE_REQUEST_REGEXP = /^\.\.?[\\/]/;
209
+
210
+ /**
211
+ * Computes the edit distance of two strings, counting swapped neighbors as one
212
+ * edit and giving up as soon as the distance exceeds `max`.
213
+ * @param {string} a first string
214
+ * @param {string} b second string
215
+ * @param {number} max largest distance worth distinguishing
216
+ * @returns {number} the distance, or a value greater than `max` when it exceeds `max`
217
+ */
218
+ const editDistance = (a, b, max) => {
219
+ if (a === b) return 0;
220
+ if (Math.abs(a.length - b.length) > max) return max + 1;
221
+ /** @type {number[] | undefined} */
222
+ let rowBeforePrevious;
223
+ /** @type {number[]} */
224
+ let previousRow = [];
225
+ for (let column = 0; column <= b.length; column++) previousRow.push(column);
226
+ for (let row = 1; row <= a.length; row++) {
227
+ const currentRow = [row];
228
+ let rowMinimum = row;
229
+ for (let column = 1; column <= b.length; column++) {
230
+ let distance = Math.min(
231
+ previousRow[column - 1] + (a[row - 1] === b[column - 1] ? 0 : 1),
232
+ previousRow[column] + 1,
233
+ currentRow[column - 1] + 1
234
+ );
235
+ if (
236
+ rowBeforePrevious &&
237
+ a[row - 1] === b[column - 2] &&
238
+ a[row - 2] === b[column - 1]
239
+ ) {
240
+ distance = Math.min(distance, rowBeforePrevious[column - 2] + 1);
241
+ }
242
+ currentRow.push(distance);
243
+ if (distance < rowMinimum) rowMinimum = distance;
244
+ }
245
+ if (rowMinimum > max) return max + 1;
246
+ rowBeforePrevious = previousRow;
247
+ previousRow = currentRow;
248
+ }
249
+ return previousRow[b.length];
250
+ };
251
+
252
+ /**
253
+ * Names an entry of a directory can be requested by: as written, and without
254
+ * the extension the resolver would have appended.
255
+ * @param {string} entry name of a directory entry
256
+ * @param {Set<string>} extensions the resolvable extensions
257
+ * @returns {string[]} names the entry answers to
258
+ */
259
+ const namesForEntry = (entry, extensions) => {
260
+ const names = [entry];
261
+ for (const extension of extensions) {
262
+ if (entry.length > extension.length && entry.endsWith(extension)) {
263
+ names.push(entry.slice(0, -extension.length));
264
+ }
265
+ }
266
+ return names;
267
+ };
268
+
269
+ /**
270
+ * Picks the entry of a directory a failed request most likely meant. Ties are
271
+ * broken by name so the hint does not depend on the order the directory lists.
272
+ * @param {string} requested the requested file name
273
+ * @param {string[]} entries names in the directory
274
+ * @param {Set<string>} extensions the resolvable extensions
275
+ * @returns {{ entry: string, distance: number } | undefined} the closest entry and how far it is from the request
276
+ */
277
+ const findClosestEntry = (requested, entries, extensions) => {
278
+ // A typo is only distinguishable from an unrelated name once the name is
279
+ // long enough, so short requests are matched by casing alone.
280
+ let allowedDistance = requested.length < 4 ? 0 : requested.length < 8 ? 1 : 2;
281
+ const lowerCaseRequested = requested.toLowerCase();
282
+ /** @type {{ entry: string, distance: number } | undefined} */
283
+ let best;
284
+ for (const entry of entries) {
285
+ // The entry exists as requested, so the request failed for another reason.
286
+ if (entry === requested) return;
287
+ for (const name of namesForEntry(entry, extensions)) {
288
+ const distance = editDistance(
289
+ lowerCaseRequested,
290
+ name.toLowerCase(),
291
+ allowedDistance
292
+ );
293
+ if (distance > allowedDistance) continue;
294
+ if (best && distance === allowedDistance && entry >= best.entry) continue;
295
+ allowedDistance = distance;
296
+ best = { entry, distance };
297
+ }
298
+ }
299
+ return best;
300
+ };
301
+
302
+ /** Bounds the walk up the context when a module request is looked up. */
303
+ const MAX_MODULE_LOOKUP_DIRECTORIES = 10;
304
+
305
+ /** Bounds the paths a failed request is looked for under, aliases included. */
306
+ const MAX_SUGGESTION_CANDIDATES = 20;
307
+
308
+ /**
309
+ * Directories a module request is looked up in, nearest first.
310
+ * @param {InputFileSystem} fs input file system
311
+ * @param {string} context directory the request comes from
312
+ * @param {Iterable<string | string[]>} modules the `resolve.modules` entries
313
+ * @returns {string[]} absolute directories
314
+ */
315
+ const moduleLookupDirectories = (fs, context, modules) => {
316
+ /** @type {string[]} */
317
+ const relativeNames = [];
318
+ /** @type {string[]} */
319
+ const directories = [];
320
+ for (const entry of modules) {
321
+ for (const name of Array.isArray(entry) ? entry : [entry]) {
322
+ if (ABSOLUTE_PATH_REGEXP.test(name)) {
323
+ directories.push(name);
324
+ } else {
325
+ relativeNames.push(name);
326
+ }
327
+ }
328
+ }
329
+ let current = context;
330
+ while (
331
+ relativeNames.length > 0 &&
332
+ directories.length < MAX_MODULE_LOOKUP_DIRECTORIES
333
+ ) {
334
+ for (const name of relativeNames) directories.push(join(fs, current, name));
335
+ const parent = dirname(fs, current);
336
+ if (parent === current) break;
337
+ current = parent;
338
+ }
339
+ return directories;
340
+ };
341
+
342
+ /**
343
+ * Requests an alias could have turned this one into, so a hint can look where
344
+ * the resolver looked. Mirrors `AliasPlugin`: a name matches the whole request
345
+ * or a leading segment of it, and `onlyModule` restricts it to the former.
346
+ * @param {string} request the request as written
347
+ * @param {AliasOptions} aliases the `resolve.alias` entries
348
+ * @returns {string[]} the requests the aliases map this one to
349
+ */
350
+ const aliasedRequests = (request, aliases) => {
351
+ /** @type {string[]} */
352
+ const requests = [];
353
+ for (const { name, alias, onlyModule } of aliases) {
354
+ if (!matchAlias(request, name, onlyModule)) continue;
355
+ const tail = request.slice(name.length);
356
+ for (const target of Array.isArray(alias) ? alias : [alias]) {
357
+ // `false` tells the resolver to ignore the request, so it names no path
358
+ if (typeof target === "string") requests.push(target + tail);
359
+ }
360
+ }
361
+ return requests;
362
+ };
363
+
364
+ /**
365
+ * Whether a request spells out directories of its own, as opposed to naming an
366
+ * entry of the directory it is resolved against.
367
+ * @param {string} prefix the request without its last segment
368
+ * @returns {boolean} true when the prefix names at least one directory
369
+ */
370
+ const namesDirectories = (prefix) =>
371
+ prefix
372
+ .replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/")
373
+ .split("/")
374
+ .some((segment) => segment !== "" && segment !== "." && segment !== "..");
164
375
 
165
376
  /**
166
377
  * Replays the file/context/missing dependencies captured by a loader resolve
@@ -282,6 +493,7 @@ const deprecationChangedHookMessage = (name, hook) => {
282
493
 
283
494
  const ruleSetCompiler = new RuleSetCompiler([
284
495
  new BasicMatcherRulePlugin("test", "resource"),
496
+ new GlobMatcherRulePlugin("glob", "resource"),
285
497
  new BasicMatcherRulePlugin("scheme"),
286
498
  new BasicMatcherRulePlugin("mimetype"),
287
499
  new BasicMatcherRulePlugin("dependency"),
@@ -311,6 +523,7 @@ const ruleSetCompiler = new RuleSetCompiler([
311
523
  return false;
312
524
  }),
313
525
  new ObjectMatcherRulePlugin("descriptionData"),
526
+ new BasicMatcherRulePlugin("descriptionRelativePath"),
314
527
  new BasicEffectRulePlugin("type"),
315
528
  new BasicEffectRulePlugin("sideEffects"),
316
529
  new BasicEffectRulePlugin("parser"),
@@ -321,42 +534,26 @@ const ruleSetCompiler = new RuleSetCompiler([
321
534
  new UseEffectRulePlugin()
322
535
  ]);
323
536
 
324
- /** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
325
- /** @typedef {import("../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
326
- /** @typedef {import("./javascript/JavascriptGenerator")} JavascriptGenerator */
327
- /** @typedef {import("../declarations/WebpackOptions").EmptyGeneratorOptions} EmptyGeneratorOptions */
328
-
329
- /** @typedef {import("./json/JsonParser")} JsonParser */
330
- /** @typedef {import("../declarations/WebpackOptions").JsonParserOptions} JsonParserOptions */
331
- /** @typedef {import("./json/JsonGenerator")} JsonGenerator */
332
- /** @typedef {import("../declarations/WebpackOptions").JsonGeneratorOptions} JsonGeneratorOptions */
333
-
334
- /** @typedef {import("./asset/AssetParser")} AssetParser */
335
- /** @typedef {import("./asset/AssetSourceParser")} AssetSourceParser */
336
- /** @typedef {import("./asset/AssetBytesParser")} AssetBytesParser */
337
- /** @typedef {import("../declarations/WebpackOptions").AssetParserOptions} AssetParserOptions */
338
- /** @typedef {import("../declarations/WebpackOptions").EmptyParserOptions} EmptyParserOptions */
339
- /** @typedef {import("./asset/AssetGenerator")} AssetGenerator */
340
- /** @typedef {import("../declarations/WebpackOptions").AssetGeneratorOptions} AssetGeneratorOptions */
341
- /** @typedef {import("../declarations/WebpackOptions").AssetInlineGeneratorOptions} AssetInlineGeneratorOptions */
342
- /** @typedef {import("../declarations/WebpackOptions").AssetResourceGeneratorOptions} AssetResourceGeneratorOptions */
343
- /** @typedef {import("./asset/AssetSourceGenerator")} AssetSourceGenerator */
344
- /** @typedef {import("./asset/AssetBytesGenerator")} AssetBytesGenerator */
345
-
346
- /** @typedef {import("./wasm-async/AsyncWebAssemblyParser")} AsyncWebAssemblyParser */
347
- /** @typedef {import("./wasm-sync/WebAssemblyParser")} WebAssemblyParser */
348
-
349
- /** @typedef {import("./css/CssParser")} CssParser */
350
- /** @typedef {import("../declarations/WebpackOptions").CssParserOptions} CssParserOptions */
351
- /** @typedef {import("../declarations/WebpackOptions").CssModuleParserOptions} CssModuleParserOptions */
352
- /** @typedef {import("./css/CssGenerator")} CssGenerator */
353
- /** @typedef {import("../declarations/WebpackOptions").CssGeneratorOptions} CssGeneratorOptions */
354
- /** @typedef {import("../declarations/WebpackOptions").CssModuleGeneratorOptions} CssModuleGeneratorOptions */
355
-
356
- /** @typedef {import("./html/HtmlParser")} HtmlParser */
357
- /** @typedef {import("../declarations/WebpackOptions").EmptyParserOptions} HtmlParserOptions */
358
- /** @typedef {import("./html/HtmlGenerator")} HtmlGenerator */
359
- /** @typedef {import("../declarations/WebpackOptions").HtmlGeneratorOptions} HtmlGeneratorOptions */
537
+ /** @import JavascriptGenerator from "./javascript/JavascriptGenerator" */
538
+
539
+ /** @import JsonParser from "./json/JsonParser" */
540
+ /** @import JsonGenerator from "./json/JsonGenerator" */
541
+
542
+ /** @import AssetParser from "./asset/AssetParser" */
543
+ /** @import AssetSourceParser from "./asset/AssetSourceParser" */
544
+ /** @import AssetBytesParser from "./asset/AssetBytesParser" */
545
+ /** @import AssetGenerator from "./asset/AssetGenerator" */
546
+ /** @import AssetSourceGenerator from "./asset/AssetSourceGenerator" */
547
+ /** @import AssetBytesGenerator from "./asset/AssetBytesGenerator" */
548
+
549
+ /** @import AsyncWebAssemblyParser from "./wasm-async/AsyncWebAssemblyParser" */
550
+ /** @import WebAssemblyParser from "./wasm-sync/WebAssemblyParser" */
551
+
552
+ /** @import CssParser from "./css/CssParser" */
553
+ /** @import CssGenerator from "./css/CssGenerator" */
554
+
555
+ /** @import HtmlParser from "./html/HtmlParser" */
556
+ /** @import HtmlGenerator from "./html/HtmlGenerator" */
360
557
 
361
558
  /* eslint-disable jsdoc/type-formatting */
362
559
  /**
@@ -452,6 +649,11 @@ class NormalModuleFactory extends ModuleFactory {
452
649
  createModule: new AsyncSeriesBailHook(["createData", "resolveData"]),
453
650
  /** @type {SyncWaterfallHook<[Module, CreateData, ResolveData]>} */
454
651
  module: new SyncWaterfallHook(["module", "createData", "resolveData"]),
652
+ /**
653
+ * @type {HookMap<AsyncSeriesHook<[]>>}
654
+ * @since 5.110.0
655
+ */
656
+ prepareModuleType: new HookMap(() => new AsyncSeriesHook([])),
455
657
  /** @type {import("tapable").TypedHookMap<RecordFactoryFromTuple<ParsersAndGeneratorsByTypes, [2], 1>>} */
456
658
  createParser: new HookMap(() => new SyncBailHook(["parserOptions"])),
457
659
  /** @type {import("tapable").TypedHookMap<RecordFactoryFromTuple<ParsersAndGeneratorsByTypes, [1, 2]>>} */
@@ -493,6 +695,10 @@ class NormalModuleFactory extends ModuleFactory {
493
695
  this.parserCache = new Map();
494
696
  /** @type {Map<string, WeakMap<GeneratorOptions, Generator>>} */
495
697
  this.generatorCache = new Map();
698
+ // `true` once a type is prepared, otherwise the calls waiting on the
699
+ // in-flight `prepareModuleType` for it
700
+ /** @type {Map<string, true | Callback<void>[]>} */
701
+ this._moduleTypePreparation = new Map();
496
702
  /** @type {Set<Module>} */
497
703
  this._restoredUnsafeCacheEntries = new Set();
498
704
  /** @type {Map<string, LoaderResolveCacheEntry>} */
@@ -779,6 +985,9 @@ class NormalModuleFactory extends ModuleFactory {
779
985
  descriptionData: matchResourceData
780
986
  ? undefined
781
987
  : resourceData.data.descriptionFileData,
988
+ descriptionRelativePath: matchResourceData
989
+ ? undefined
990
+ : resourceData.data.relativePath,
782
991
  issuer: contextInfo.issuer,
783
992
  compiler: contextInfo.compiler,
784
993
  issuerLayer: contextInfo.issuerLayer || ""
@@ -857,37 +1066,46 @@ class NormalModuleFactory extends ModuleFactory {
857
1066
  const resolveOptions = settings.resolve;
858
1067
  const layer = settings.layer;
859
1068
 
860
- try {
861
- Object.assign(data.createData, {
862
- layer:
863
- layer === undefined ? contextInfo.issuerLayer || null : layer,
864
- request: stringifyLoadersAndResource(
865
- allLoaders,
866
- resourceData.resource
867
- ),
868
- userRequest,
869
- rawRequest: request,
870
- loaders: allLoaders,
871
- resource: resourceData.resource,
872
- context:
873
- resourceData.context || getContext(resourceData.resource),
874
- matchResource: matchResourceData
875
- ? matchResourceData.resource
876
- : undefined,
877
- resourceResolveData: resourceData.data,
878
- settings,
879
- type,
880
- parser: this.getParser(type, settings.parser),
881
- parserOptions: settings.parser,
882
- generator: this.getGenerator(type, settings.generator),
883
- generatorOptions: settings.generator,
884
- resolveOptions,
885
- extractSourceMap: settings.extractSourceMap || false
886
- });
887
- } catch (createDataErr) {
888
- return callback(/** @type {Error} */ (createDataErr));
889
- }
890
- callback();
1069
+ const applyCreateData = () => {
1070
+ try {
1071
+ Object.assign(data.createData, {
1072
+ layer:
1073
+ layer === undefined
1074
+ ? contextInfo.issuerLayer || null
1075
+ : layer,
1076
+ request: stringifyLoadersAndResource(
1077
+ allLoaders,
1078
+ resourceData.resource
1079
+ ),
1080
+ userRequest,
1081
+ rawRequest: request,
1082
+ loaders: allLoaders,
1083
+ resource: resourceData.resource,
1084
+ context:
1085
+ resourceData.context || getContext(resourceData.resource),
1086
+ matchResource: matchResourceData
1087
+ ? matchResourceData.resource
1088
+ : undefined,
1089
+ resourceResolveData: resourceData.data,
1090
+ settings,
1091
+ type,
1092
+ parser: this.getParser(type, settings.parser),
1093
+ parserOptions: settings.parser,
1094
+ generator: this.getGenerator(type, settings.generator),
1095
+ generatorOptions: settings.generator,
1096
+ resolveOptions,
1097
+ extractSourceMap: settings.extractSourceMap || false
1098
+ });
1099
+ } catch (createDataErr) {
1100
+ return callback(/** @type {Error} */ (createDataErr));
1101
+ }
1102
+ callback();
1103
+ };
1104
+
1105
+ this._prepareModuleType(type, (err) => {
1106
+ if (err) return callback(err);
1107
+ applyCreateData();
1108
+ });
891
1109
  });
892
1110
  this.resolveRequestArray(
893
1111
  contextInfo,
@@ -1244,6 +1462,183 @@ ${hints.join("\n\n")}`;
1244
1462
  resolveContext,
1245
1463
  callback
1246
1464
  ) {
1465
+ /**
1466
+ * Names the entry of the request's directory it comes closest to, for
1467
+ * requests that failed over a typo or the casing of a file name. A module
1468
+ * request is looked up in the module directories, so a wrongly cased
1469
+ * package name is named too, and a directory the request spells out is
1470
+ * itself matched by casing.
1471
+ * @param {(hint?: string) => void} callback callback
1472
+ * @returns {void}
1473
+ */
1474
+ const suggestClosestEntry = (callback) => {
1475
+ const {
1476
+ path: requestPath,
1477
+ query,
1478
+ fragment
1479
+ } = parseResource(unresolvedResource);
1480
+
1481
+ /**
1482
+ * Absolute paths the resolver would have tried for a request, in the
1483
+ * order it tries them.
1484
+ * @param {string} request a request
1485
+ * @returns {string[]} absolute paths
1486
+ */
1487
+ const lookupPaths = (request) => {
1488
+ if (ABSOLUTE_PATH_REGEXP.test(request)) {
1489
+ const paths = [request];
1490
+ const firstChar = request.charCodeAt(0);
1491
+ // A request rooted at '/' is looked up under 'resolve.roots' as well
1492
+ if (firstChar === 47 /* "/" */ || firstChar === 92 /* "\\" */) {
1493
+ for (const root of resolver.options.roots) {
1494
+ paths.push(join(this.fs, root, request.slice(1)));
1495
+ }
1496
+ }
1497
+ return paths;
1498
+ }
1499
+ if (RELATIVE_REQUEST_REGEXP.test(request)) {
1500
+ return [join(this.fs, context, request)];
1501
+ }
1502
+ /** @type {string[]} */
1503
+ const paths = [];
1504
+ // 'preferRelative' lets a module request resolve next to its origin too
1505
+ if (resolver.options.preferRelative) {
1506
+ paths.push(join(this.fs, context, request));
1507
+ }
1508
+ for (const directory of moduleLookupDirectories(
1509
+ this.fs,
1510
+ context,
1511
+ resolver.options.modules
1512
+ )) {
1513
+ paths.push(join(this.fs, directory, request));
1514
+ }
1515
+ return paths;
1516
+ };
1517
+
1518
+ const absoluteRequests = lookupPaths(requestPath);
1519
+ // Each path costs a readdir, a casing walk and a resolve, so a large
1520
+ // alias map must not turn one failed request into unbounded work
1521
+ for (const aliased of aliasedRequests(
1522
+ requestPath,
1523
+ resolver.options.alias
1524
+ )) {
1525
+ if (absoluteRequests.length >= MAX_SUGGESTION_CANDIDATES) break;
1526
+ for (const path of lookupPaths(aliased)) absoluteRequests.push(path);
1527
+ }
1528
+ if (absoluteRequests.length > MAX_SUGGESTION_CANDIDATES) {
1529
+ absoluteRequests.length = MAX_SUGGESTION_CANDIDATES;
1530
+ }
1531
+
1532
+ /**
1533
+ * @param {string} prefix the request without its last segment, with the real casing
1534
+ * @param {string} requestedName the last segment of the request
1535
+ * @param {string[]} entries entries of the directory it was looked up in
1536
+ * @param {boolean} directoryCorrected whether the casing of `prefix` had to be corrected
1537
+ * @param {() => void} giveUp continues the search when nothing is close enough
1538
+ * @returns {void}
1539
+ */
1540
+ const suggest = (
1541
+ prefix,
1542
+ requestedName,
1543
+ entries,
1544
+ directoryCorrected,
1545
+ giveUp
1546
+ ) => {
1547
+ const closest =
1548
+ directoryCorrected && entries.includes(requestedName)
1549
+ ? { entry: requestedName, distance: 0 }
1550
+ : findClosestEntry(
1551
+ requestedName,
1552
+ entries,
1553
+ resolver.options.extensions
1554
+ );
1555
+ if (!closest) return giveUp();
1556
+ const existing = prefix + closest.entry;
1557
+ // The query and fragment select what to do with the file, so they
1558
+ // belong in a request the user is meant to copy — but not in a
1559
+ // sentence about what is on disk
1560
+ const suggestion = existing + query + fragment;
1561
+ const characters =
1562
+ closest.distance === 1
1563
+ ? "1 character"
1564
+ : `${closest.distance} characters`;
1565
+ // A corrected directory is not part of `entry`, so the whole path has
1566
+ // to be named for the sentence to account for every difference
1567
+ const difference =
1568
+ closest.distance === 0
1569
+ ? directoryCorrected
1570
+ ? `'${existing}' exists and differs from the request only in casing. Case-sensitive filesystems (most Linux ones) fail to resolve it, even when the same build succeeds on a case-insensitive one.`
1571
+ : `'${closest.entry}' exists in that directory and differs from the request only in casing. Case-sensitive filesystems (most Linux ones) fail to resolve it, even when the same build succeeds on a case-insensitive one.`
1572
+ : directoryCorrected
1573
+ ? `'${prefix}' differs from the request only in casing, and '${closest.entry}' is the closest name in it. It differs from the request by ${characters}, ignoring case and file extension.`
1574
+ : `'${closest.entry}' is the closest name in that directory. It differs from the request by ${characters}, ignoring case and file extension.`;
1575
+ // Offering a request that fails too would only be a second error, so the
1576
+ // resolver has the last word. That keeps the hint aligned with every
1577
+ // resolve option, not just the ones consulted to find the entry.
1578
+ resolver.resolve(
1579
+ contextInfo,
1580
+ context,
1581
+ suggestion,
1582
+ resolveContext,
1583
+ (suggestionError, resolved) => {
1584
+ if (suggestionError || !resolved) return giveUp();
1585
+ callback(`Did you mean '${suggestion}'?
1586
+ ${difference}`);
1587
+ }
1588
+ );
1589
+ };
1590
+
1591
+ /**
1592
+ * @param {number} index index into `absoluteRequests`
1593
+ * @returns {void}
1594
+ */
1595
+ const next = (index) => {
1596
+ if (index >= absoluteRequests.length) return callback();
1597
+ const absoluteRequest = absoluteRequests[index];
1598
+ const directory = dirname(this.fs, absoluteRequest);
1599
+ const requestedName = relative(this.fs, directory, absoluteRequest);
1600
+ // A request ending in '.' or '..' names a directory, not an entry in one.
1601
+ if (!requestPath.endsWith(requestedName)) return next(index + 1);
1602
+ const prefix = requestPath.slice(
1603
+ 0,
1604
+ requestPath.length - requestedName.length
1605
+ );
1606
+ this.fs.readdir(directory, (err, entries) => {
1607
+ if (!err && entries) {
1608
+ return suggest(
1609
+ prefix,
1610
+ requestedName,
1611
+ /** @type {string[]} */ (entries),
1612
+ false,
1613
+ () => next(index + 1)
1614
+ );
1615
+ }
1616
+ // The directory is missing, so only a directory the request spells
1617
+ // out itself can be the wrongly cased one
1618
+ if (!namesDirectories(prefix)) return next(index + 1);
1619
+ findCaseMismatch(this.fs, directory, (mismatch) => {
1620
+ if (!mismatch) return next(index + 1);
1621
+ const fixedPrefix = applyCaseCorrections(
1622
+ prefix,
1623
+ mismatch.corrections
1624
+ );
1625
+ if (fixedPrefix === undefined) return next(index + 1);
1626
+ this.fs.readdir(mismatch.path, (realError, realEntries) => {
1627
+ if (realError || !realEntries) return next(index + 1);
1628
+ suggest(
1629
+ fixedPrefix,
1630
+ requestedName,
1631
+ /** @type {string[]} */ (realEntries),
1632
+ true,
1633
+ () => next(index + 1)
1634
+ );
1635
+ });
1636
+ });
1637
+ });
1638
+ };
1639
+ next(0);
1640
+ };
1641
+
1247
1642
  asyncLib.parallel(
1248
1643
  [
1249
1644
  (callback) => {
@@ -1345,7 +1740,11 @@ If changing the source code is not an option there is also a resolve options cal
1345
1740
  ],
1346
1741
  (err, hints) => {
1347
1742
  if (err) return callback(err);
1348
- callback(null, /** @type {string[]} */ (hints).filter(Boolean));
1743
+ const resolveHints = /** @type {string[]} */ (hints).filter(Boolean);
1744
+ // The hints above explain why an existing file was rejected and name it
1745
+ // themselves, so only look for a similar name when none of them applied.
1746
+ if (resolveHints.length > 0) return callback(null, resolveHints);
1747
+ suggestClosestEntry((hint) => callback(null, hint ? [hint] : []));
1349
1748
  }
1350
1749
  );
1351
1750
  }
@@ -1491,6 +1890,52 @@ If changing the source code is not an option there is also a resolve options cal
1491
1890
  );
1492
1891
  }
1493
1892
 
1893
+ /**
1894
+ * Runs `prepareModuleType` for a type once, so a plugin can load what its
1895
+ * synchronous `createParser`/`createGenerator` tap needs. Calls back
1896
+ * synchronously for a type nothing taps or that is already prepared.
1897
+ * @param {string} type module type
1898
+ * @param {Callback<void>} callback signals the type is ready
1899
+ * @returns {void}
1900
+ */
1901
+ _prepareModuleType(type, callback) {
1902
+ const state = this._moduleTypePreparation.get(type);
1903
+ if (state === true) return callback(null);
1904
+ if (state !== undefined) {
1905
+ state.push(callback);
1906
+ return;
1907
+ }
1908
+ const hook = this.hooks.prepareModuleType.get(type);
1909
+ if (hook === undefined) {
1910
+ this._moduleTypePreparation.set(type, true);
1911
+ return callback(null);
1912
+ }
1913
+ /** @type {Callback<void>[]} */
1914
+ const waiting = [];
1915
+ this._moduleTypePreparation.set(type, waiting);
1916
+ hook.callAsync((err) => {
1917
+ // a failed preparation must not be remembered as done
1918
+ if (err) this._moduleTypePreparation.delete(type);
1919
+ else this._moduleTypePreparation.set(type, true);
1920
+ // every queued factorize must be resumed, so one callback throwing
1921
+ // cannot starve the rest — the first throw is rethrown afterwards
1922
+ waiting.unshift(callback);
1923
+ const error = err || null;
1924
+ /** @type {Error | undefined} */
1925
+ let thrown;
1926
+ for (const waitingCallback of waiting) {
1927
+ try {
1928
+ waitingCallback(error);
1929
+ } catch (err_) {
1930
+ if (thrown === undefined) {
1931
+ thrown = /** @type {Error} */ (err_);
1932
+ }
1933
+ }
1934
+ }
1935
+ if (thrown !== undefined) throw thrown;
1936
+ });
1937
+ }
1938
+
1494
1939
  /**
1495
1940
  * Returns parser.
1496
1941
  * @template {string} T