webpack 5.59.0 → 5.94.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 (570) hide show
  1. package/README.md +48 -38
  2. package/bin/webpack.js +34 -10
  3. package/hot/dev-server.js +19 -5
  4. package/hot/lazy-compilation-node.js +13 -1
  5. package/hot/lazy-compilation-web.js +9 -0
  6. package/hot/log-apply-result.js +5 -0
  7. package/hot/log.js +23 -4
  8. package/hot/only-dev-server.js +3 -2
  9. package/hot/poll.js +5 -2
  10. package/hot/signal.js +6 -2
  11. package/lib/APIPlugin.js +226 -122
  12. package/lib/AbstractMethodError.js +10 -5
  13. package/lib/AsyncDependenciesBlock.js +13 -5
  14. package/lib/AutomaticPrefetchPlugin.js +2 -1
  15. package/lib/BannerPlugin.js +33 -12
  16. package/lib/Cache.js +16 -12
  17. package/lib/CacheFacade.js +13 -16
  18. package/lib/CaseSensitiveModulesWarning.js +8 -8
  19. package/lib/Chunk.js +60 -33
  20. package/lib/ChunkGraph.js +207 -72
  21. package/lib/ChunkGroup.js +40 -20
  22. package/lib/ChunkTemplate.js +43 -0
  23. package/lib/CleanPlugin.js +117 -32
  24. package/lib/CodeGenerationResults.js +8 -7
  25. package/lib/CommentCompilationWarning.js +0 -1
  26. package/lib/CompatibilityPlugin.js +85 -46
  27. package/lib/Compilation.js +712 -392
  28. package/lib/Compiler.js +393 -172
  29. package/lib/ConcatenationScope.js +10 -13
  30. package/lib/ConditionalInitFragment.js +22 -14
  31. package/lib/ConstPlugin.js +104 -64
  32. package/lib/ContextExclusionPlugin.js +3 -3
  33. package/lib/ContextModule.js +283 -108
  34. package/lib/ContextModuleFactory.js +151 -63
  35. package/lib/ContextReplacementPlugin.js +25 -10
  36. package/lib/CssModule.js +166 -0
  37. package/lib/DefinePlugin.js +254 -148
  38. package/lib/DelegatedModule.js +29 -6
  39. package/lib/DelegatedModuleFactoryPlugin.js +42 -22
  40. package/lib/DelegatedPlugin.js +4 -0
  41. package/lib/DependenciesBlock.js +17 -2
  42. package/lib/Dependency.js +58 -29
  43. package/lib/DependencyTemplate.js +24 -3
  44. package/lib/DependencyTemplates.js +2 -2
  45. package/lib/DllEntryPlugin.js +18 -1
  46. package/lib/DllModule.js +21 -4
  47. package/lib/DllModuleFactory.js +2 -1
  48. package/lib/DllPlugin.js +9 -7
  49. package/lib/DllReferencePlugin.js +50 -19
  50. package/lib/EntryOptionPlugin.js +6 -1
  51. package/lib/EntryPlugin.js +7 -4
  52. package/lib/Entrypoint.js +2 -2
  53. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  54. package/lib/EnvironmentPlugin.js +5 -2
  55. package/lib/ErrorHelpers.js +65 -26
  56. package/lib/EvalDevToolModulePlugin.js +37 -13
  57. package/lib/EvalSourceMapDevToolPlugin.js +50 -20
  58. package/lib/ExportsInfo.js +234 -133
  59. package/lib/ExportsInfoApiPlugin.js +31 -15
  60. package/lib/ExternalModule.js +391 -129
  61. package/lib/ExternalModuleFactoryPlugin.js +65 -17
  62. package/lib/FileSystemInfo.js +1038 -523
  63. package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
  64. package/lib/FlagDependencyExportsPlugin.js +352 -349
  65. package/lib/FlagDependencyUsagePlugin.js +10 -10
  66. package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
  67. package/lib/Generator.js +16 -8
  68. package/lib/GraphHelpers.js +3 -2
  69. package/lib/HookWebpackError.js +11 -13
  70. package/lib/HotModuleReplacementPlugin.js +221 -128
  71. package/lib/IgnoreErrorModuleFactory.js +4 -4
  72. package/lib/IgnorePlugin.js +5 -4
  73. package/lib/IgnoreWarningsPlugin.js +6 -9
  74. package/lib/InitFragment.js +39 -15
  75. package/lib/JavascriptMetaInfoPlugin.js +27 -15
  76. package/lib/LibManifestPlugin.js +45 -16
  77. package/lib/LoaderOptionsPlugin.js +13 -3
  78. package/lib/MainTemplate.js +74 -21
  79. package/lib/Module.js +155 -34
  80. package/lib/ModuleBuildError.js +13 -11
  81. package/lib/ModuleDependencyError.js +6 -4
  82. package/lib/ModuleDependencyWarning.js +6 -4
  83. package/lib/ModuleError.js +10 -5
  84. package/lib/ModuleFactory.js +4 -4
  85. package/lib/ModuleFilenameHelpers.js +164 -54
  86. package/lib/ModuleGraph.js +93 -53
  87. package/lib/ModuleGraphConnection.js +27 -13
  88. package/lib/ModuleHashingError.js +29 -0
  89. package/lib/ModuleInfoHeaderPlugin.js +92 -33
  90. package/lib/ModuleNotFoundError.js +5 -2
  91. package/lib/ModuleParseError.js +17 -9
  92. package/lib/ModuleProfile.js +1 -0
  93. package/lib/ModuleRestoreError.js +3 -1
  94. package/lib/ModuleStoreError.js +3 -2
  95. package/lib/ModuleTemplate.js +33 -1
  96. package/lib/ModuleTypeConstants.js +168 -0
  97. package/lib/ModuleWarning.js +10 -5
  98. package/lib/MultiCompiler.js +115 -38
  99. package/lib/MultiStats.js +75 -33
  100. package/lib/MultiWatching.js +6 -2
  101. package/lib/NodeStuffPlugin.js +136 -37
  102. package/lib/NormalModule.js +437 -194
  103. package/lib/NormalModuleFactory.js +313 -116
  104. package/lib/NormalModuleReplacementPlugin.js +10 -4
  105. package/lib/NullFactory.js +1 -1
  106. package/lib/OptimizationStages.js +3 -3
  107. package/lib/Parser.js +1 -1
  108. package/lib/PlatformPlugin.js +39 -0
  109. package/lib/PrefetchPlugin.js +4 -0
  110. package/lib/ProgressPlugin.js +83 -28
  111. package/lib/ProvidePlugin.js +37 -19
  112. package/lib/RawModule.js +18 -5
  113. package/lib/RecordIdsPlugin.js +8 -8
  114. package/lib/RequireJsStuffPlugin.js +22 -15
  115. package/lib/ResolverFactory.js +8 -4
  116. package/lib/RuntimeGlobals.js +99 -65
  117. package/lib/RuntimeModule.js +17 -15
  118. package/lib/RuntimePlugin.js +116 -13
  119. package/lib/RuntimeTemplate.js +304 -102
  120. package/lib/SelfModuleFactory.js +12 -0
  121. package/lib/SizeFormatHelpers.js +2 -4
  122. package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
  123. package/lib/SourceMapDevToolPlugin.js +89 -42
  124. package/lib/Stats.js +12 -7
  125. package/lib/Template.js +30 -33
  126. package/lib/TemplatedPathPlugin.js +102 -34
  127. package/lib/UseStrictPlugin.js +37 -12
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
  129. package/lib/WarnDeprecatedOptionPlugin.js +6 -0
  130. package/lib/WatchIgnorePlugin.js +46 -13
  131. package/lib/Watching.js +139 -76
  132. package/lib/WebpackError.js +14 -5
  133. package/lib/WebpackIsIncludedPlugin.js +22 -13
  134. package/lib/WebpackOptionsApply.js +162 -56
  135. package/lib/WebpackOptionsDefaulter.js +10 -3
  136. package/lib/asset/AssetGenerator.js +351 -99
  137. package/lib/asset/AssetModulesPlugin.js +57 -33
  138. package/lib/asset/AssetParser.js +15 -6
  139. package/lib/asset/AssetSourceGenerator.js +30 -10
  140. package/lib/asset/AssetSourceParser.js +8 -2
  141. package/lib/asset/RawDataUrlModule.js +162 -0
  142. package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
  143. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  144. package/lib/buildChunkGraph.js +376 -420
  145. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  146. package/lib/cache/IdleFileCachePlugin.js +26 -13
  147. package/lib/cache/MemoryCachePlugin.js +1 -1
  148. package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
  149. package/lib/cache/PackFileCacheStrategy.js +172 -94
  150. package/lib/cache/ResolverCachePlugin.js +115 -43
  151. package/lib/cache/getLazyHashedEtag.js +2 -2
  152. package/lib/cache/mergeEtags.js +16 -21
  153. package/lib/cli.js +195 -110
  154. package/lib/config/browserslistTargetHandler.js +106 -41
  155. package/lib/config/defaults.js +572 -154
  156. package/lib/config/normalization.js +361 -322
  157. package/lib/config/target.js +105 -66
  158. package/lib/container/ContainerEntryDependency.js +2 -1
  159. package/lib/container/ContainerEntryModule.js +27 -11
  160. package/lib/container/ContainerEntryModuleFactory.js +1 -1
  161. package/lib/container/ContainerExposedDependency.js +9 -0
  162. package/lib/container/ContainerPlugin.js +18 -12
  163. package/lib/container/ContainerReferencePlugin.js +1 -1
  164. package/lib/container/FallbackDependency.js +13 -0
  165. package/lib/container/FallbackItemDependency.js +3 -0
  166. package/lib/container/FallbackModule.js +19 -8
  167. package/lib/container/FallbackModuleFactory.js +1 -1
  168. package/lib/container/ModuleFederationPlugin.js +2 -0
  169. package/lib/container/RemoteModule.js +17 -4
  170. package/lib/container/RemoteRuntimeModule.js +31 -17
  171. package/lib/container/RemoteToExternalDependency.js +3 -0
  172. package/lib/container/options.js +18 -4
  173. package/lib/css/CssExportsGenerator.js +203 -0
  174. package/lib/css/CssGenerator.js +151 -0
  175. package/lib/css/CssLoadingRuntimeModule.js +592 -0
  176. package/lib/css/CssModulesPlugin.js +888 -0
  177. package/lib/css/CssParser.js +1049 -0
  178. package/lib/css/walkCssTokens.js +775 -0
  179. package/lib/debug/ProfilingPlugin.js +102 -54
  180. package/lib/dependencies/AMDDefineDependency.js +54 -10
  181. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
  182. package/lib/dependencies/AMDPlugin.js +44 -24
  183. package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
  184. package/lib/dependencies/AMDRequireContextDependency.js +15 -0
  185. package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
  186. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
  187. package/lib/dependencies/AMDRequireDependency.js +21 -6
  188. package/lib/dependencies/AMDRequireItemDependency.js +6 -0
  189. package/lib/dependencies/AMDRuntimeModules.js +4 -4
  190. package/lib/dependencies/CachedConstDependency.js +22 -1
  191. package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
  193. package/lib/dependencies/CommonJsExportsDependency.js +28 -5
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
  197. package/lib/dependencies/CommonJsPlugin.js +51 -26
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
  199. package/lib/dependencies/CommonJsRequireDependency.js +9 -1
  200. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
  201. package/lib/dependencies/ConstDependency.js +12 -3
  202. package/lib/dependencies/ContextDependency.js +32 -5
  203. package/lib/dependencies/ContextDependencyHelpers.js +92 -62
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  205. package/lib/dependencies/ContextElementDependency.js +41 -4
  206. package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
  207. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  208. package/lib/dependencies/CssExportDependency.js +156 -0
  209. package/lib/dependencies/CssImportDependency.js +125 -0
  210. package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
  211. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
  212. package/lib/dependencies/CssUrlDependency.js +164 -0
  213. package/lib/dependencies/DelegatedSourceDependency.js +3 -0
  214. package/lib/dependencies/DllEntryDependency.js +14 -0
  215. package/lib/dependencies/DynamicExports.js +15 -11
  216. package/lib/dependencies/ExportsInfoDependency.js +26 -5
  217. package/lib/dependencies/ExternalModuleDependency.js +109 -0
  218. package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
  219. package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
  220. package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
  221. package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
  222. package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
  223. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
  224. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
  225. package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
  226. package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
  227. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
  228. package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
  229. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
  230. package/lib/dependencies/HarmonyExports.js +13 -7
  231. package/lib/dependencies/HarmonyImportDependency.js +65 -19
  232. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
  233. package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
  234. package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
  235. package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
  236. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
  237. package/lib/dependencies/ImportContextDependency.js +15 -2
  238. package/lib/dependencies/ImportDependency.js +50 -12
  239. package/lib/dependencies/ImportEagerDependency.js +11 -6
  240. package/lib/dependencies/ImportMetaContextDependency.js +42 -0
  241. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
  242. package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
  243. package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
  244. package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
  245. package/lib/dependencies/ImportMetaPlugin.js +128 -59
  246. package/lib/dependencies/ImportParserPlugin.js +153 -83
  247. package/lib/dependencies/ImportPlugin.js +21 -7
  248. package/lib/dependencies/ImportWeakDependency.js +11 -6
  249. package/lib/dependencies/JsonExportsDependency.js +38 -30
  250. package/lib/dependencies/LoaderDependency.js +14 -0
  251. package/lib/dependencies/LoaderImportDependency.js +14 -0
  252. package/lib/dependencies/LoaderPlugin.js +54 -40
  253. package/lib/dependencies/LocalModule.js +17 -1
  254. package/lib/dependencies/LocalModuleDependency.js +15 -0
  255. package/lib/dependencies/LocalModulesHelpers.js +22 -4
  256. package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
  257. package/lib/dependencies/ModuleDependency.js +24 -7
  258. package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
  259. package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
  260. package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
  261. package/lib/dependencies/PrefetchDependency.js +3 -0
  262. package/lib/dependencies/ProvidedDependency.js +43 -8
  263. package/lib/dependencies/PureExpressionDependency.js +73 -39
  264. package/lib/dependencies/RequireContextDependency.js +6 -16
  265. package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
  266. package/lib/dependencies/RequireContextPlugin.js +20 -7
  267. package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
  268. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
  269. package/lib/dependencies/RequireEnsureDependency.js +16 -2
  270. package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
  271. package/lib/dependencies/RequireEnsurePlugin.js +27 -7
  272. package/lib/dependencies/RequireHeaderDependency.js +14 -1
  273. package/lib/dependencies/RequireIncludeDependency.js +6 -1
  274. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
  275. package/lib/dependencies/RequireIncludePlugin.js +25 -5
  276. package/lib/dependencies/RequireResolveContextDependency.js +19 -2
  277. package/lib/dependencies/RequireResolveDependency.js +8 -1
  278. package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
  279. package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
  280. package/lib/dependencies/StaticExportsDependency.js +8 -0
  281. package/lib/dependencies/SystemPlugin.js +49 -22
  282. package/lib/dependencies/SystemRuntimeModule.js +1 -1
  283. package/lib/dependencies/URLDependency.js +20 -13
  284. package/lib/dependencies/URLPlugin.js +115 -27
  285. package/lib/dependencies/UnsupportedDependency.js +13 -0
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
  287. package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
  289. package/lib/dependencies/WorkerDependency.js +47 -3
  290. package/lib/dependencies/WorkerPlugin.js +143 -59
  291. package/lib/dependencies/getFunctionExpression.js +9 -0
  292. package/lib/dependencies/processExportInfo.js +3 -1
  293. package/lib/electron/ElectronTargetPlugin.js +1 -0
  294. package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
  295. package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
  296. package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
  297. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
  298. package/lib/formatLocation.js +1 -2
  299. package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
  300. package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
  301. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
  302. package/lib/hmr/LazyCompilationPlugin.js +94 -41
  303. package/lib/hmr/lazyCompilationBackend.js +107 -44
  304. package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
  305. package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
  306. package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
  307. package/lib/ids/HashedModuleIdsPlugin.js +24 -16
  308. package/lib/ids/IdHelpers.js +59 -49
  309. package/lib/ids/NamedChunkIdsPlugin.js +13 -1
  310. package/lib/ids/NamedModuleIdsPlugin.js +20 -12
  311. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  312. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
  313. package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
  314. package/lib/ids/SyncModuleIdsPlugin.js +146 -0
  315. package/lib/index.js +44 -5
  316. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
  317. package/lib/javascript/BasicEvaluatedExpression.js +133 -19
  318. package/lib/javascript/ChunkHelpers.js +33 -0
  319. package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
  320. package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
  321. package/lib/javascript/JavascriptGenerator.js +37 -6
  322. package/lib/javascript/JavascriptModulesPlugin.js +523 -295
  323. package/lib/javascript/JavascriptParser.js +1591 -574
  324. package/lib/javascript/JavascriptParserHelpers.js +58 -37
  325. package/lib/javascript/StartupHelpers.js +69 -47
  326. package/lib/json/JsonData.js +33 -0
  327. package/lib/json/JsonGenerator.js +29 -21
  328. package/lib/json/JsonModulesPlugin.js +13 -7
  329. package/lib/json/JsonParser.js +30 -16
  330. package/lib/library/AbstractLibraryPlugin.js +6 -2
  331. package/lib/library/AmdLibraryPlugin.js +34 -18
  332. package/lib/library/AssignLibraryPlugin.js +68 -32
  333. package/lib/library/EnableLibraryPlugin.js +39 -14
  334. package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
  335. package/lib/library/JsonpLibraryPlugin.js +4 -3
  336. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  337. package/lib/library/ModuleLibraryPlugin.js +12 -7
  338. package/lib/library/SystemLibraryPlugin.js +6 -4
  339. package/lib/library/UmdLibraryPlugin.js +119 -100
  340. package/lib/logging/Logger.js +59 -6
  341. package/lib/logging/createConsoleLogger.js +25 -40
  342. package/lib/logging/runtime.js +8 -9
  343. package/lib/logging/truncateArgs.js +9 -8
  344. package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
  345. package/lib/node/NodeEnvironmentPlugin.js +14 -8
  346. package/lib/node/NodeTargetPlugin.js +7 -0
  347. package/lib/node/NodeTemplatePlugin.js +10 -2
  348. package/lib/node/NodeWatchFileSystem.js +100 -50
  349. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
  350. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
  351. package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
  352. package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
  353. package/lib/node/nodeConsole.js +48 -31
  354. package/lib/optimize/AggressiveMergingPlugin.js +10 -4
  355. package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
  356. package/lib/optimize/ConcatenatedModule.js +353 -212
  357. package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
  358. package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
  359. package/lib/optimize/InnerGraph.js +30 -25
  360. package/lib/optimize/InnerGraphPlugin.js +105 -64
  361. package/lib/optimize/LimitChunkCountPlugin.js +32 -9
  362. package/lib/optimize/MangleExportsPlugin.js +7 -2
  363. package/lib/optimize/MinMaxSizeWarning.js +6 -1
  364. package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
  365. package/lib/optimize/RealContentHashPlugin.js +99 -43
  366. package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
  367. package/lib/optimize/RuntimeChunkPlugin.js +15 -2
  368. package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
  369. package/lib/optimize/SplitChunksPlugin.js +129 -78
  370. package/lib/performance/SizeLimitsPlugin.js +22 -8
  371. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
  372. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
  373. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
  374. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
  375. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
  376. package/lib/rules/BasicEffectRulePlugin.js +7 -1
  377. package/lib/rules/BasicMatcherRulePlugin.js +8 -1
  378. package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
  379. package/lib/rules/RuleSetCompiler.js +53 -32
  380. package/lib/rules/UseEffectRulePlugin.js +42 -36
  381. package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
  382. package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
  383. package/lib/runtime/BaseUriRuntimeModule.js +35 -0
  384. package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
  385. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
  386. package/lib/runtime/CompatRuntimeModule.js +7 -2
  387. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  388. package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
  389. package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
  390. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
  391. package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
  392. package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
  393. package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
  394. package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
  395. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
  396. package/lib/runtime/GlobalRuntimeModule.js +1 -1
  397. package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
  398. package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
  399. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
  400. package/lib/runtime/NonceRuntimeModule.js +24 -0
  401. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
  402. package/lib/runtime/PublicPathRuntimeModule.js +9 -2
  403. package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
  404. package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
  405. package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
  406. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
  407. package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
  408. package/lib/runtime/SystemContextRuntimeModule.js +1 -1
  409. package/lib/schemes/DataUriPlugin.js +16 -3
  410. package/lib/schemes/HttpUriPlugin.js +336 -120
  411. package/lib/serialization/ArraySerializer.js +22 -6
  412. package/lib/serialization/BinaryMiddleware.js +212 -33
  413. package/lib/serialization/DateObjectSerializer.js +16 -4
  414. package/lib/serialization/ErrorObjectSerializer.js +23 -6
  415. package/lib/serialization/FileMiddleware.js +187 -86
  416. package/lib/serialization/MapObjectSerializer.js +25 -8
  417. package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
  418. package/lib/serialization/ObjectMiddleware.js +96 -66
  419. package/lib/serialization/PlainObjectSerializer.js +51 -14
  420. package/lib/serialization/RegExpObjectSerializer.js +17 -5
  421. package/lib/serialization/Serializer.js +23 -5
  422. package/lib/serialization/SerializerMiddleware.js +8 -8
  423. package/lib/serialization/SetObjectSerializer.js +22 -6
  424. package/lib/serialization/SingleItemMiddleware.js +2 -2
  425. package/lib/serialization/types.js +2 -2
  426. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  427. package/lib/sharing/ConsumeSharedModule.js +40 -17
  428. package/lib/sharing/ConsumeSharedPlugin.js +139 -102
  429. package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
  430. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  431. package/lib/sharing/ProvideSharedDependency.js +17 -0
  432. package/lib/sharing/ProvideSharedModule.js +19 -6
  433. package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
  434. package/lib/sharing/ProvideSharedPlugin.js +37 -30
  435. package/lib/sharing/SharePlugin.js +2 -2
  436. package/lib/sharing/ShareRuntimeModule.js +20 -10
  437. package/lib/sharing/resolveMatchedConfigs.js +6 -5
  438. package/lib/sharing/utils.js +338 -34
  439. package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
  440. package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
  441. package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
  442. package/lib/stats/StatsFactory.js +128 -57
  443. package/lib/stats/StatsPrinter.js +77 -46
  444. package/lib/util/ArrayHelpers.js +35 -1
  445. package/lib/util/ArrayQueue.js +15 -22
  446. package/lib/util/AsyncQueue.js +37 -16
  447. package/lib/util/IterableHelpers.js +3 -4
  448. package/lib/util/LazyBucketSortedSet.js +60 -44
  449. package/lib/util/LazySet.js +11 -2
  450. package/lib/util/MapHelpers.js +17 -5
  451. package/lib/util/ParallelismFactorCalculator.js +11 -1
  452. package/lib/util/Queue.js +9 -3
  453. package/lib/util/Semaphore.js +4 -7
  454. package/lib/util/SetHelpers.js +5 -5
  455. package/lib/util/SortableSet.js +19 -6
  456. package/lib/util/StackedCacheMap.js +33 -3
  457. package/lib/util/StackedMap.js +1 -3
  458. package/lib/util/StringXor.js +46 -0
  459. package/lib/util/TupleQueue.js +9 -3
  460. package/lib/util/TupleSet.js +15 -5
  461. package/lib/util/URLAbsoluteSpecifier.js +8 -8
  462. package/lib/util/WeakTupleMap.js +70 -28
  463. package/lib/util/binarySearchBounds.js +51 -9
  464. package/lib/util/chainedImports.js +97 -0
  465. package/lib/util/cleverMerge.js +51 -36
  466. package/lib/util/comparators.js +146 -83
  467. package/lib/util/compileBooleanMatcher.js +35 -7
  468. package/lib/util/conventions.js +126 -0
  469. package/lib/util/create-schema-validation.js +9 -2
  470. package/lib/util/createHash.js +49 -14
  471. package/lib/util/deprecation.js +48 -15
  472. package/lib/util/deterministicGrouping.js +71 -39
  473. package/lib/util/extractUrlAndGlobal.js +3 -0
  474. package/lib/util/findGraphRoots.js +7 -5
  475. package/lib/util/fs.js +419 -94
  476. package/lib/util/hash/BatchedHash.js +10 -4
  477. package/lib/util/hash/md4.js +20 -0
  478. package/lib/util/hash/wasm-hash.js +163 -0
  479. package/lib/util/hash/xxhash64.js +7 -141
  480. package/lib/util/identifier.js +140 -93
  481. package/lib/util/internalSerializables.js +22 -0
  482. package/lib/util/makeSerializable.js +7 -0
  483. package/lib/util/memoize.js +10 -10
  484. package/lib/util/mergeScope.js +76 -0
  485. package/lib/util/nonNumericOnlyHash.js +22 -0
  486. package/lib/util/numberHash.js +84 -34
  487. package/lib/util/objectToMap.js +0 -1
  488. package/lib/util/processAsyncTree.js +7 -1
  489. package/lib/util/propertyAccess.js +7 -55
  490. package/lib/util/propertyName.js +77 -0
  491. package/lib/util/registerExternalSerializer.js +2 -2
  492. package/lib/util/runtime.js +188 -133
  493. package/lib/util/semver.js +64 -56
  494. package/lib/util/serialization.js +26 -1
  495. package/lib/util/smartGrouping.js +10 -10
  496. package/lib/util/source.js +1 -1
  497. package/lib/validateSchema.js +6 -2
  498. package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
  499. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
  500. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
  501. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
  502. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
  503. package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
  504. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
  505. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
  506. package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
  507. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
  508. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
  509. package/lib/wasm-sync/WebAssemblyParser.js +23 -9
  510. package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
  511. package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
  512. package/lib/web/FetchCompileWasmPlugin.js +59 -42
  513. package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
  514. package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
  515. package/lib/webpack.js +43 -12
  516. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
  517. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
  518. package/module.d.ts +233 -0
  519. package/package.json +85 -139
  520. package/schemas/WebpackOptions.check.js +1 -1
  521. package/schemas/WebpackOptions.json +679 -47
  522. package/schemas/plugins/BannerPlugin.check.js +1 -1
  523. package/schemas/plugins/BannerPlugin.json +9 -1
  524. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  525. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  526. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
  529. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  530. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  531. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  532. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  534. package/schemas/plugins/container/ContainerPlugin.json +10 -1
  535. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  536. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  537. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  538. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  539. package/schemas/plugins/container/ModuleFederationPlugin.json +12 -1
  540. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  541. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  542. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  543. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  544. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  545. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  546. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  547. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  548. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  549. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  550. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  551. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  552. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  553. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  554. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  555. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  556. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  557. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  558. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  559. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  560. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  561. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  562. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  563. package/schemas/plugins/css/CssParserOptions.json +3 -0
  564. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  565. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  566. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  567. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  568. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  569. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  570. package/types.d.ts +5026 -1756
@@ -5,6 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const EventEmitter = require("events");
8
9
  const { extname, basename } = require("path");
9
10
  const { URL } = require("url");
10
11
  const { createGunzip, createBrotliDecompress, createInflate } = require("zlib");
@@ -14,14 +15,73 @@ const createHash = require("../util/createHash");
14
15
  const { mkdirp, dirname, join } = require("../util/fs");
15
16
  const memoize = require("../util/memoize");
16
17
 
18
+ /** @typedef {import("http").IncomingMessage} IncomingMessage */
19
+ /** @typedef {import("http").RequestOptions} RequestOptions */
20
+ /** @typedef {import("net").Socket} Socket */
21
+ /** @typedef {import("stream").Readable} Readable */
17
22
  /** @typedef {import("../../declarations/plugins/schemes/HttpUriPlugin").HttpUriPluginOptions} HttpUriPluginOptions */
18
23
  /** @typedef {import("../Compiler")} Compiler */
24
+ /** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */
25
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
26
+ /** @typedef {import("../NormalModuleFactory").ResourceDataWithData} ResourceDataWithData */
27
+ /** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
19
28
 
20
29
  const getHttp = memoize(() => require("http"));
21
30
  const getHttps = memoize(() => require("https"));
22
31
 
23
- /** @type {(() => void)[] | undefined} */
24
- let inProgressWrite = undefined;
32
+ /**
33
+ * @param {typeof import("http") | typeof import("https")} request request
34
+ * @param {string | { toString: () => string } | undefined} proxy proxy
35
+ * @returns {function(URL, RequestOptions, function(IncomingMessage): void): EventEmitter} fn
36
+ */
37
+ const proxyFetch = (request, proxy) => (url, options, callback) => {
38
+ const eventEmitter = new EventEmitter();
39
+
40
+ /**
41
+ * @param {Socket=} socket socket
42
+ * @returns {void}
43
+ */
44
+ const doRequest = socket => {
45
+ request
46
+ .get(url, { ...options, ...(socket && { socket }) }, callback)
47
+ .on("error", eventEmitter.emit.bind(eventEmitter, "error"));
48
+ };
49
+
50
+ if (proxy) {
51
+ const { hostname: host, port } = new URL(proxy);
52
+
53
+ getHttp()
54
+ .request({
55
+ host, // IP address of proxy server
56
+ port, // port of proxy server
57
+ method: "CONNECT",
58
+ path: url.host
59
+ })
60
+ .on("connect", (res, socket) => {
61
+ if (res.statusCode === 200) {
62
+ // connected to proxy server
63
+ doRequest(socket);
64
+ }
65
+ })
66
+ .on("error", err => {
67
+ eventEmitter.emit(
68
+ "error",
69
+ new Error(
70
+ `Failed to connect to proxy server "${proxy}": ${err.message}`
71
+ )
72
+ );
73
+ })
74
+ .end();
75
+ } else {
76
+ doRequest();
77
+ }
78
+
79
+ return eventEmitter;
80
+ };
81
+
82
+ /** @typedef {() => void} InProgressWriteItem */
83
+ /** @type {InProgressWriteItem[] | undefined} */
84
+ let inProgressWrite;
25
85
 
26
86
  const validate = createSchemaValidation(
27
87
  require("../../schemas/plugins/schemes/HttpUriPlugin.check.js"),
@@ -32,18 +92,31 @@ const validate = createSchemaValidation(
32
92
  }
33
93
  );
34
94
 
95
+ /**
96
+ * @param {string} str path
97
+ * @returns {string} safe path
98
+ */
35
99
  const toSafePath = str =>
36
100
  str
37
101
  .replace(/^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$/g, "")
38
102
  .replace(/[^a-zA-Z0-9._-]+/g, "_");
39
103
 
104
+ /**
105
+ * @param {Buffer} content content
106
+ * @returns {string} integrity
107
+ */
40
108
  const computeIntegrity = content => {
41
109
  const hash = createHash("sha512");
42
110
  hash.update(content);
43
- const integrity = "sha512-" + hash.digest("base64");
111
+ const integrity = `sha512-${hash.digest("base64")}`;
44
112
  return integrity;
45
113
  };
46
114
 
115
+ /**
116
+ * @param {Buffer} content content
117
+ * @param {string} integrity integrity
118
+ * @returns {boolean} true, if integrity matches
119
+ */
47
120
  const verifyIntegrity = (content, integrity) => {
48
121
  if (integrity === "ignore") return true;
49
122
  return computeIntegrity(content) === integrity;
@@ -71,6 +144,11 @@ const parseKeyValuePairs = str => {
71
144
  return result;
72
145
  };
73
146
 
147
+ /**
148
+ * @param {string | undefined} cacheControl Cache-Control header
149
+ * @param {number} requestTime timestamp of request
150
+ * @returns {{storeCache: boolean, storeLock: boolean, validUntil: number}} Logic for storing in cache and lockfile cache
151
+ */
74
152
  const parseCacheControl = (cacheControl, requestTime) => {
75
153
  // When false resource is not stored in cache
76
154
  let storeCache = true;
@@ -81,8 +159,8 @@ const parseCacheControl = (cacheControl, requestTime) => {
81
159
  if (cacheControl) {
82
160
  const parsed = parseKeyValuePairs(cacheControl);
83
161
  if (parsed["no-cache"]) storeCache = storeLock = false;
84
- if (parsed["max-age"] && !isNaN(+parsed["max-age"])) {
85
- validUntil = requestTime + +parsed["max-age"] * 1000;
162
+ if (parsed["max-age"] && !Number.isNaN(Number(parsed["max-age"]))) {
163
+ validUntil = requestTime + Number(parsed["max-age"]) * 1000;
86
164
  }
87
165
  if (parsed["must-revalidate"]) validUntil = 0;
88
166
  }
@@ -94,23 +172,28 @@ const parseCacheControl = (cacheControl, requestTime) => {
94
172
  };
95
173
 
96
174
  /**
97
- * @typedef {Object} LockfileEntry
175
+ * @typedef {object} LockfileEntry
98
176
  * @property {string} resolved
99
177
  * @property {string} integrity
100
178
  * @property {string} contentType
101
179
  */
102
180
 
103
- const areLockfileEntriesEqual = (a, b) => {
104
- return (
105
- a.resolved === b.resolved &&
106
- a.integrity === b.integrity &&
107
- a.contentType === b.contentType
108
- );
109
- };
181
+ /**
182
+ * @param {LockfileEntry} a first lockfile entry
183
+ * @param {LockfileEntry} b second lockfile entry
184
+ * @returns {boolean} true when equal, otherwise false
185
+ */
186
+ const areLockfileEntriesEqual = (a, b) =>
187
+ a.resolved === b.resolved &&
188
+ a.integrity === b.integrity &&
189
+ a.contentType === b.contentType;
110
190
 
111
- const entryToString = entry => {
112
- return `resolved: ${entry.resolved}, integrity: ${entry.integrity}, contentType: ${entry.contentType}`;
113
- };
191
+ /**
192
+ * @param {LockfileEntry} entry lockfile entry
193
+ * @returns {`resolved: ${string}, integrity: ${string}, contentType: ${*}`} stringified entry
194
+ */
195
+ const entryToString = entry =>
196
+ `resolved: ${entry.resolved}, integrity: ${entry.integrity}, contentType: ${entry.contentType}`;
114
197
 
115
198
  class Lockfile {
116
199
  constructor() {
@@ -119,6 +202,10 @@ class Lockfile {
119
202
  this.entries = new Map();
120
203
  }
121
204
 
205
+ /**
206
+ * @param {string} content content of the lockfile
207
+ * @returns {Lockfile} lockfile
208
+ */
122
209
  static parse(content) {
123
210
  // TODO handle merge conflicts
124
211
  const data = JSON.parse(content);
@@ -135,12 +222,15 @@ class Lockfile {
135
222
  : {
136
223
  resolved: key,
137
224
  ...entry
138
- }
225
+ }
139
226
  );
140
227
  }
141
228
  return lockfile;
142
229
  }
143
230
 
231
+ /**
232
+ * @returns {string} stringified lockfile
233
+ */
144
234
  toString() {
145
235
  let str = "{\n";
146
236
  const entries = Array.from(this.entries).sort(([a], [b]) =>
@@ -165,17 +255,17 @@ class Lockfile {
165
255
 
166
256
  /**
167
257
  * @template R
168
- * @param {function(function(Error=, R=): void): void} fn function
169
- * @returns {function(function(Error=, R=): void): void} cached function
258
+ * @param {function(function(Error | null, R=): void): void} fn function
259
+ * @returns {function(function(Error | null, R=): void): void} cached function
170
260
  */
171
261
  const cachedWithoutKey = fn => {
172
262
  let inFlight = false;
173
263
  /** @type {Error | undefined} */
174
- let cachedError = undefined;
264
+ let cachedError;
175
265
  /** @type {R | undefined} */
176
- let cachedResult = undefined;
177
- /** @type {(function(Error=, R=): void)[] | undefined} */
178
- let cachedCallbacks = undefined;
266
+ let cachedResult;
267
+ /** @type {(function(Error| null, R=): void)[] | undefined} */
268
+ let cachedCallbacks;
179
269
  return callback => {
180
270
  if (inFlight) {
181
271
  if (cachedResult !== undefined) return callback(null, cachedResult);
@@ -199,14 +289,22 @@ const cachedWithoutKey = fn => {
199
289
  /**
200
290
  * @template T
201
291
  * @template R
202
- * @param {function(T, function(Error=, R=): void): void} fn function
203
- * @param {function(T, function(Error=, R=): void): void=} forceFn function for the second try
204
- * @returns {(function(T, function(Error=, R=): void): void) & { force: function(T, function(Error=, R=): void): void }} cached function
292
+ * @param {function(T, function(Error | null, R=): void): void} fn function
293
+ * @param {function(T, function(Error | null, R=): void): void=} forceFn function for the second try
294
+ * @returns {(function(T, function(Error | null, R=): void): void) & { force: function(T, function(Error | null, R=): void): void }} cached function
205
295
  */
206
296
  const cachedWithKey = (fn, forceFn = fn) => {
207
- /** @typedef {{ result?: R, error?: Error, callbacks?: (function(Error=, R=): void)[], force?: true }} CacheEntry */
208
- /** @type {Map<T, CacheEntry>} */
297
+ /**
298
+ * @template R
299
+ * @typedef {{ result?: R, error?: Error, callbacks?: (function(Error | null, R=): void)[], force?: true }} CacheEntry
300
+ */
301
+ /** @type {Map<T, CacheEntry<R>>} */
209
302
  const cache = new Map();
303
+ /**
304
+ * @param {T} arg arg
305
+ * @param {function(Error | null, R=): void} callback callback
306
+ * @returns {void}
307
+ */
210
308
  const resultFn = (arg, callback) => {
211
309
  const cacheEntry = cache.get(arg);
212
310
  if (cacheEntry !== undefined) {
@@ -217,7 +315,7 @@ const cachedWithKey = (fn, forceFn = fn) => {
217
315
  else cacheEntry.callbacks.push(callback);
218
316
  return;
219
317
  }
220
- /** @type {CacheEntry} */
318
+ /** @type {CacheEntry<R>} */
221
319
  const newCacheEntry = {
222
320
  result: undefined,
223
321
  error: undefined,
@@ -233,6 +331,11 @@ const cachedWithKey = (fn, forceFn = fn) => {
233
331
  if (callbacks !== undefined) for (const cb of callbacks) cb(err, result);
234
332
  });
235
333
  };
334
+ /**
335
+ * @param {T} arg arg
336
+ * @param {function(Error | null, R=): void} callback callback
337
+ * @returns {void}
338
+ */
236
339
  resultFn.force = (arg, callback) => {
237
340
  const cacheEntry = cache.get(arg);
238
341
  if (cacheEntry !== undefined && cacheEntry.force) {
@@ -243,7 +346,7 @@ const cachedWithKey = (fn, forceFn = fn) => {
243
346
  else cacheEntry.callbacks.push(callback);
244
347
  return;
245
348
  }
246
- /** @type {CacheEntry} */
349
+ /** @type {CacheEntry<R>} */
247
350
  const newCacheEntry = {
248
351
  result: undefined,
249
352
  error: undefined,
@@ -263,6 +366,24 @@ const cachedWithKey = (fn, forceFn = fn) => {
263
366
  return resultFn;
264
367
  };
265
368
 
369
+ /**
370
+ * @typedef {object} LockfileCache
371
+ * @property {Lockfile} lockfile lockfile
372
+ * @property {Snapshot} snapshot snapshot
373
+ */
374
+
375
+ /**
376
+ * @typedef {object} ResolveContentResult
377
+ * @property {LockfileEntry} entry lockfile entry
378
+ * @property {Buffer} content content
379
+ * @property {boolean} storeLock need store lockfile
380
+ */
381
+
382
+ /** @typedef {{ storeCache: boolean, storeLock: boolean, validUntil: number, etag: string | undefined, fresh: boolean }} FetchResultMeta */
383
+ /** @typedef {FetchResultMeta & { location: string }} RedirectFetchResult */
384
+ /** @typedef {FetchResultMeta & { entry: LockfileEntry, content: Buffer }} ContentFetchResult */
385
+ /** @typedef {RedirectFetchResult | ContentFetchResult} FetchResult */
386
+
266
387
  class HttpUriPlugin {
267
388
  /**
268
389
  * @param {HttpUriPluginOptions} options options
@@ -274,6 +395,7 @@ class HttpUriPlugin {
274
395
  this._upgrade = options.upgrade;
275
396
  this._frozen = options.frozen;
276
397
  this._allowedUris = options.allowedUris;
398
+ this._proxy = options.proxy;
277
399
  }
278
400
 
279
401
  /**
@@ -282,25 +404,30 @@ class HttpUriPlugin {
282
404
  * @returns {void}
283
405
  */
284
406
  apply(compiler) {
407
+ const proxy =
408
+ this._proxy || process.env.http_proxy || process.env.HTTP_PROXY;
285
409
  const schemes = [
286
410
  {
287
411
  scheme: "http",
288
- fetch: (url, options, callback) => getHttp().get(url, options, callback)
412
+ fetch: proxyFetch(getHttp(), proxy)
289
413
  },
290
414
  {
291
415
  scheme: "https",
292
- fetch: (url, options, callback) =>
293
- getHttps().get(url, options, callback)
416
+ fetch: proxyFetch(getHttps(), proxy)
294
417
  }
295
418
  ];
419
+ /** @type {LockfileCache} */
296
420
  let lockfileCache;
297
421
  compiler.hooks.compilation.tap(
298
422
  "HttpUriPlugin",
299
423
  (compilation, { normalModuleFactory }) => {
300
- const intermediateFs = compiler.intermediateFileSystem;
424
+ const intermediateFs =
425
+ /** @type {IntermediateFileSystem} */
426
+ (compiler.intermediateFileSystem);
301
427
  const fs = compilation.inputFileSystem;
302
428
  const cache = compilation.getCache("webpack.HttpUriPlugin");
303
429
  const logger = compilation.getLogger("webpack.HttpUriPlugin");
430
+ /** @type {string} */
304
431
  const lockfileLocation =
305
432
  this._lockfileLocation ||
306
433
  join(
@@ -310,10 +437,11 @@ class HttpUriPlugin {
310
437
  ? `${toSafePath(compiler.name)}.webpack.lock`
311
438
  : "webpack.lock"
312
439
  );
440
+ /** @type {string | false} */
313
441
  const cacheLocation =
314
442
  this._cacheLocation !== undefined
315
443
  ? this._cacheLocation
316
- : lockfileLocation + ".data";
444
+ : `${lockfileLocation}.data`;
317
445
  const upgrade = this._upgrade || false;
318
446
  const frozen = this._frozen || false;
319
447
  const hashFunction = "sha512";
@@ -323,6 +451,7 @@ class HttpUriPlugin {
323
451
 
324
452
  let warnedAboutEol = false;
325
453
 
454
+ /** @type {Map<string, string>} */
326
455
  const cacheKeyCache = new Map();
327
456
  /**
328
457
  * @param {string} url the url
@@ -358,7 +487,7 @@ class HttpUriPlugin {
358
487
 
359
488
  const getLockfile = cachedWithoutKey(
360
489
  /**
361
- * @param {function(Error=, Lockfile=): void} callback callback
490
+ * @param {function(Error | null, Lockfile=): void} callback callback
362
491
  * @returns {void}
363
492
  */
364
493
  callback => {
@@ -375,14 +504,14 @@ class HttpUriPlugin {
375
504
  [],
376
505
  buffer ? [] : [lockfileLocation],
377
506
  { timestamp: true },
378
- (err, snapshot) => {
507
+ (err, s) => {
379
508
  if (err) return callback(err);
380
509
  const lockfile = buffer
381
510
  ? Lockfile.parse(buffer.toString("utf-8"))
382
511
  : new Lockfile();
383
512
  lockfileCache = {
384
513
  lockfile,
385
- snapshot
514
+ snapshot: /** @type {Snapshot} */ (s)
386
515
  };
387
516
  callback(null, lockfile);
388
517
  }
@@ -404,8 +533,16 @@ class HttpUriPlugin {
404
533
  }
405
534
  );
406
535
 
407
- /** @type {Map<string, LockfileEntry | "ignore" | "no-cache"> | undefined} */
408
- let lockfileUpdates = undefined;
536
+ /** @typedef {Map<string, LockfileEntry | "ignore" | "no-cache">} LockfileUpdates */
537
+
538
+ /** @type {LockfileUpdates | undefined} */
539
+ let lockfileUpdates;
540
+
541
+ /**
542
+ * @param {Lockfile} lockfile lockfile instance
543
+ * @param {string} url url to store
544
+ * @param {LockfileEntry | "ignore" | "no-cache"} entry lockfile entry
545
+ */
409
546
  const storeLockEntry = (lockfile, url, entry) => {
410
547
  const oldEntry = lockfile.entries.get(url);
411
548
  if (lockfileUpdates === undefined) lockfileUpdates = new Map();
@@ -440,6 +577,13 @@ class HttpUriPlugin {
440
577
  }
441
578
  };
442
579
 
580
+ /**
581
+ * @param {Lockfile} lockfile lockfile
582
+ * @param {string} url url
583
+ * @param {ResolveContentResult} result result
584
+ * @param {function(Error | null, ResolveContentResult=): void} callback callback
585
+ * @returns {void}
586
+ */
443
587
  const storeResult = (lockfile, url, result, callback) => {
444
588
  if (result.storeLock) {
445
589
  storeLockEntry(lockfile, url, result.entry);
@@ -462,12 +606,16 @@ class HttpUriPlugin {
462
606
 
463
607
  for (const { scheme, fetch } of schemes) {
464
608
  /**
465
- *
466
609
  * @param {string} url URL
467
- * @param {string} integrity integrity
468
- * @param {function(Error=, { entry: LockfileEntry, content: Buffer, storeLock: boolean }=): void} callback callback
610
+ * @param {string | null} integrity integrity
611
+ * @param {function(Error | null, ResolveContentResult=): void} callback callback
469
612
  */
470
613
  const resolveContent = (url, integrity, callback) => {
614
+ /**
615
+ * @param {Error | null} err error
616
+ * @param {TODO} result result result
617
+ * @returns {void}
618
+ */
471
619
  const handleResult = (err, result) => {
472
620
  if (err) return callback(err);
473
621
  if ("location" in result) {
@@ -476,41 +624,37 @@ class HttpUriPlugin {
476
624
  integrity,
477
625
  (err, innerResult) => {
478
626
  if (err) return callback(err);
627
+ const { entry, content, storeLock } =
628
+ /** @type {ResolveContentResult} */ (innerResult);
479
629
  callback(null, {
480
- entry: innerResult.entry,
481
- content: innerResult.content,
482
- storeLock: innerResult.storeLock && result.storeLock
630
+ entry,
631
+ content,
632
+ storeLock: storeLock && result.storeLock
483
633
  });
484
634
  }
485
635
  );
486
- } else {
487
- if (
488
- !result.fresh &&
489
- integrity &&
490
- result.entry.integrity !== integrity &&
491
- !verifyIntegrity(result.content, integrity)
492
- ) {
493
- return fetchContent.force(url, handleResult);
494
- }
495
- return callback(null, {
496
- entry: result.entry,
497
- content: result.content,
498
- storeLock: result.storeLock
499
- });
500
636
  }
637
+ if (
638
+ !result.fresh &&
639
+ integrity &&
640
+ result.entry.integrity !== integrity &&
641
+ !verifyIntegrity(result.content, integrity)
642
+ ) {
643
+ return fetchContent.force(url, handleResult);
644
+ }
645
+ return callback(null, {
646
+ entry: result.entry,
647
+ content: result.content,
648
+ storeLock: result.storeLock
649
+ });
501
650
  };
502
651
  fetchContent(url, handleResult);
503
652
  };
504
653
 
505
- /** @typedef {{ storeCache: boolean, storeLock: boolean, validUntil: number, etag: string | undefined, fresh: boolean }} FetchResultMeta */
506
- /** @typedef {FetchResultMeta & { location: string }} RedirectFetchResult */
507
- /** @typedef {FetchResultMeta & { entry: LockfileEntry, content: Buffer }} ContentFetchResult */
508
- /** @typedef {RedirectFetchResult | ContentFetchResult} FetchResult */
509
-
510
654
  /**
511
655
  * @param {string} url URL
512
- * @param {FetchResult} cachedResult result from cache
513
- * @param {function(Error=, FetchResult=): void} callback callback
656
+ * @param {FetchResult | RedirectFetchResult | undefined} cachedResult result from cache
657
+ * @param {function(Error | null, FetchResult=): void} callback callback
514
658
  * @returns {void}
515
659
  */
516
660
  const fetchContentRaw = (url, cachedResult, callback) => {
@@ -521,14 +665,14 @@ class HttpUriPlugin {
521
665
  headers: {
522
666
  "accept-encoding": "gzip, deflate, br",
523
667
  "user-agent": "webpack",
524
- "if-none-match": cachedResult
525
- ? cachedResult.etag || null
526
- : null
668
+ "if-none-match": /** @type {TODO} */ (
669
+ cachedResult ? cachedResult.etag || null : null
670
+ )
527
671
  }
528
672
  },
529
673
  res => {
530
- const etag = res.headers["etag"];
531
- const location = res.headers["location"];
674
+ const etag = res.headers.etag;
675
+ const location = res.headers.location;
532
676
  const cacheControl = res.headers["cache-control"];
533
677
  const { storeLock, storeCache, validUntil } = parseCacheControl(
534
678
  cacheControl,
@@ -583,34 +727,54 @@ class HttpUriPlugin {
583
727
  );
584
728
  };
585
729
  if (res.statusCode === 304) {
730
+ const result = /** @type {FetchResult} */ (cachedResult);
586
731
  if (
587
- cachedResult.validUntil < validUntil ||
588
- cachedResult.storeLock !== storeLock ||
589
- cachedResult.storeCache !== storeCache ||
590
- cachedResult.etag !== etag
732
+ result.validUntil < validUntil ||
733
+ result.storeLock !== storeLock ||
734
+ result.storeCache !== storeCache ||
735
+ result.etag !== etag
591
736
  ) {
592
- return finishWith(cachedResult);
593
- } else {
594
- logger.debug(`GET ${url} [${res.statusCode}] (unchanged)`);
595
- return callback(null, {
596
- ...cachedResult,
597
- fresh: true
598
- });
737
+ return finishWith(result);
599
738
  }
739
+ logger.debug(`GET ${url} [${res.statusCode}] (unchanged)`);
740
+ return callback(null, { ...result, fresh: true });
600
741
  }
601
742
  if (
602
743
  location &&
744
+ res.statusCode &&
603
745
  res.statusCode >= 301 &&
604
746
  res.statusCode <= 308
605
747
  ) {
606
- return finishWith({
748
+ const result = {
607
749
  location: new URL(location, url).href
750
+ };
751
+ if (
752
+ !cachedResult ||
753
+ !("location" in cachedResult) ||
754
+ cachedResult.location !== result.location ||
755
+ cachedResult.validUntil < validUntil ||
756
+ cachedResult.storeLock !== storeLock ||
757
+ cachedResult.storeCache !== storeCache ||
758
+ cachedResult.etag !== etag
759
+ ) {
760
+ return finishWith(result);
761
+ }
762
+ logger.debug(`GET ${url} [${res.statusCode}] (unchanged)`);
763
+ return callback(null, {
764
+ ...result,
765
+ fresh: true,
766
+ storeLock,
767
+ storeCache,
768
+ validUntil,
769
+ etag
608
770
  });
609
771
  }
610
772
  const contentType = res.headers["content-type"] || "";
773
+ /** @type {Buffer[]} */
611
774
  const bufferArr = [];
612
775
 
613
776
  const contentEncoding = res.headers["content-encoding"];
777
+ /** @type {Readable} */
614
778
  let stream = res;
615
779
  if (contentEncoding === "gzip") {
616
780
  stream = stream.pipe(createGunzip());
@@ -662,9 +826,10 @@ class HttpUriPlugin {
662
826
  const fetchContent = cachedWithKey(
663
827
  /**
664
828
  * @param {string} url URL
665
- * @param {function(Error=, { validUntil: number, etag?: string, entry: LockfileEntry, content: Buffer, fresh: boolean } | { validUntil: number, etag?: string, location: string, fresh: boolean }=): void} callback callback
829
+ * @param {function(Error | null, { validUntil: number, etag?: string, entry: LockfileEntry, content: Buffer, fresh: boolean } | { validUntil: number, etag?: string, location: string, fresh: boolean }=): void} callback callback
666
830
  * @returns {void}
667
- */ (url, callback) => {
831
+ */
832
+ (url, callback) => {
668
833
  cache.get(url, null, (err, cachedResult) => {
669
834
  if (err) return callback(err);
670
835
  if (cachedResult) {
@@ -677,25 +842,32 @@ class HttpUriPlugin {
677
842
  (url, callback) => fetchContentRaw(url, undefined, callback)
678
843
  );
679
844
 
845
+ /**
846
+ * @param {string} uri uri
847
+ * @returns {boolean} true when allowed, otherwise false
848
+ */
680
849
  const isAllowed = uri => {
681
850
  for (const allowed of allowedUris) {
682
851
  if (typeof allowed === "string") {
683
852
  if (uri.startsWith(allowed)) return true;
684
853
  } else if (typeof allowed === "function") {
685
854
  if (allowed(uri)) return true;
686
- } else {
687
- if (allowed.test(uri)) return true;
855
+ } else if (allowed.test(uri)) {
856
+ return true;
688
857
  }
689
858
  }
690
859
  return false;
691
860
  };
692
861
 
862
+ /** @typedef {{ entry: LockfileEntry, content: Buffer }} Info */
863
+
693
864
  const getInfo = cachedWithKey(
694
865
  /**
695
866
  * @param {string} url the url
696
- * @param {function(Error=, { entry: LockfileEntry, content: Buffer }=): void} callback callback
867
+ * @param {function(Error | null, Info=): void} callback callback
697
868
  * @returns {void}
698
869
  */
870
+ // eslint-disable-next-line no-loop-func
699
871
  (url, callback) => {
700
872
  if (!isAllowed(url)) {
701
873
  return callback(
@@ -706,8 +878,9 @@ class HttpUriPlugin {
706
878
  )
707
879
  );
708
880
  }
709
- getLockfile((err, lockfile) => {
881
+ getLockfile((err, _lockfile) => {
710
882
  if (err) return callback(err);
883
+ const lockfile = /** @type {Lockfile} */ (_lockfile);
711
884
  const entryOrString = lockfile.entries.get(url);
712
885
  if (!entryOrString) {
713
886
  if (frozen) {
@@ -719,14 +892,24 @@ class HttpUriPlugin {
719
892
  }
720
893
  resolveContent(url, null, (err, result) => {
721
894
  if (err) return callback(err);
722
- storeResult(lockfile, url, result, callback);
895
+ storeResult(
896
+ /** @type {Lockfile} */
897
+ (lockfile),
898
+ url,
899
+ /** @type {ResolveContentResult} */
900
+ (result),
901
+ callback
902
+ );
723
903
  });
724
904
  return;
725
905
  }
726
906
  if (typeof entryOrString === "string") {
727
907
  const entryTag = entryOrString;
728
- resolveContent(url, null, (err, result) => {
908
+ resolveContent(url, null, (err, _result) => {
729
909
  if (err) return callback(err);
910
+ const result =
911
+ /** @type {ResolveContentResult} */
912
+ (_result);
730
913
  if (!result.storeLock || entryTag === "ignore")
731
914
  return callback(null, result);
732
915
  if (frozen) {
@@ -750,8 +933,11 @@ Remove this line from the lockfile to force upgrading.`
750
933
  return;
751
934
  }
752
935
  let entry = entryOrString;
936
+ /**
937
+ * @param {Buffer=} lockedContent locked content
938
+ */
753
939
  const doFetch = lockedContent => {
754
- resolveContent(url, entry.integrity, (err, result) => {
940
+ resolveContent(url, entry.integrity, (err, _result) => {
755
941
  if (err) {
756
942
  if (lockedContent) {
757
943
  logger.warn(
@@ -765,6 +951,9 @@ Remove this line from the lockfile to force upgrading.`
765
951
  }
766
952
  return callback(err);
767
953
  }
954
+ const result =
955
+ /** @type {ResolveContentResult} */
956
+ (_result);
768
957
  if (!result.storeLock) {
769
958
  // When the lockfile entry should be no-cache
770
959
  // we need to update the lockfile
@@ -819,12 +1008,16 @@ Remove this line from the lockfile to force upgrading.`
819
1008
  const key = getCacheKey(entry.resolved);
820
1009
  const filePath = join(intermediateFs, cacheLocation, key);
821
1010
  fs.readFile(filePath, (err, result) => {
822
- const content = /** @type {Buffer} */ (result);
823
1011
  if (err) {
824
1012
  if (err.code === "ENOENT") return doFetch();
825
1013
  return callback(err);
826
1014
  }
827
- const continueWithCachedContent = result => {
1015
+ const content = /** @type {Buffer} */ (result);
1016
+ /**
1017
+ * @param {Buffer | undefined} _result result
1018
+ * @returns {void}
1019
+ */
1020
+ const continueWithCachedContent = _result => {
828
1021
  if (!upgrade) {
829
1022
  // When not in upgrade mode, we accept the result from the lockfile cache
830
1023
  return callback(null, { entry, content });
@@ -832,6 +1025,7 @@ Remove this line from the lockfile to force upgrading.`
832
1025
  return doFetch(content);
833
1026
  };
834
1027
  if (!verifyIntegrity(content, entry.integrity)) {
1028
+ /** @type {Buffer | undefined} */
835
1029
  let contentWithChangedEol;
836
1030
  let isEolChanged = false;
837
1031
  try {
@@ -842,7 +1036,7 @@ Remove this line from the lockfile to force upgrading.`
842
1036
  contentWithChangedEol,
843
1037
  entry.integrity
844
1038
  );
845
- } catch (e) {
1039
+ } catch (_err) {
846
1040
  // ignore
847
1041
  }
848
1042
  if (isEolChanged) {
@@ -869,10 +1063,14 @@ This will avoid that the end of line sequence is changed by git on Windows.`;
869
1063
  );
870
1064
  intermediateFs.writeFile(
871
1065
  filePath,
872
- contentWithChangedEol,
1066
+ /** @type {Buffer} */
1067
+ (contentWithChangedEol),
873
1068
  err => {
874
1069
  if (err) return callback(err);
875
- continueWithCachedContent(contentWithChangedEol);
1070
+ continueWithCachedContent(
1071
+ /** @type {Buffer} */
1072
+ (contentWithChangedEol)
1073
+ );
876
1074
  }
877
1075
  );
878
1076
  return;
@@ -894,15 +1092,14 @@ Lockfile corrupted (${
894
1092
  Run build with un-frozen lockfile to automatically fix lockfile.`
895
1093
  )
896
1094
  );
897
- } else {
898
- // "fix" the lockfile entry to the correct integrity
899
- // the content has priority over the integrity value
900
- entry = {
901
- ...entry,
902
- integrity: computeIntegrity(content)
903
- };
904
- storeLockEntry(lockfile, url, entry);
905
1095
  }
1096
+ // "fix" the lockfile entry to the correct integrity
1097
+ // the content has priority over the integrity value
1098
+ entry = {
1099
+ ...entry,
1100
+ integrity: computeIntegrity(content)
1101
+ };
1102
+ storeLockEntry(lockfile, url, entry);
906
1103
  }
907
1104
  continueWithCachedContent(result);
908
1105
  });
@@ -913,9 +1110,15 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
913
1110
  }
914
1111
  );
915
1112
 
1113
+ /**
1114
+ * @param {URL} url url
1115
+ * @param {ResourceDataWithData} resourceData resource data
1116
+ * @param {function(Error | null, true | void): void} callback callback
1117
+ */
916
1118
  const respondWithUrlModule = (url, resourceData, callback) => {
917
- getInfo(url.href, (err, result) => {
1119
+ getInfo(url.href, (err, _result) => {
918
1120
  if (err) return callback(err);
1121
+ const result = /** @type {Info} */ (_result);
919
1122
  resourceData.resource = url.href;
920
1123
  resourceData.path = url.origin + url.pathname;
921
1124
  resourceData.query = url.search;
@@ -951,7 +1154,7 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
951
1154
  return callback();
952
1155
  }
953
1156
  respondWithUrlModule(
954
- new URL(resourceData.resource, data.context + "/"),
1157
+ new URL(resourceData.resource, `${data.context}/`),
955
1158
  resourceData,
956
1159
  callback
957
1160
  );
@@ -959,13 +1162,15 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
959
1162
  const hooks = NormalModule.getCompilationHooks(compilation);
960
1163
  hooks.readResourceForScheme
961
1164
  .for(scheme)
962
- .tapAsync("HttpUriPlugin", (resource, module, callback) => {
963
- return getInfo(resource, (err, result) => {
1165
+ .tapAsync("HttpUriPlugin", (resource, module, callback) =>
1166
+ getInfo(resource, (err, _result) => {
964
1167
  if (err) return callback(err);
965
- module.buildInfo.resourceIntegrity = result.entry.integrity;
1168
+ const result = /** @type {Info} */ (_result);
1169
+ /** @type {BuildInfo} */
1170
+ (module.buildInfo).resourceIntegrity = result.entry.integrity;
966
1171
  callback(null, result.content);
967
- });
968
- });
1172
+ })
1173
+ );
969
1174
  hooks.needBuild.tapAsync(
970
1175
  "HttpUriPlugin",
971
1176
  (module, context, callback) => {
@@ -973,11 +1178,13 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
973
1178
  module.resource &&
974
1179
  module.resource.startsWith(`${scheme}://`)
975
1180
  ) {
976
- getInfo(module.resource, (err, result) => {
1181
+ getInfo(module.resource, (err, _result) => {
977
1182
  if (err) return callback(err);
1183
+ const result = /** @type {Info} */ (_result);
978
1184
  if (
979
1185
  result.entry.integrity !==
980
- module.buildInfo.resourceIntegrity
1186
+ /** @type {BuildInfo} */
1187
+ (module.buildInfo).resourceIntegrity
981
1188
  ) {
982
1189
  return callback(null, true);
983
1190
  }
@@ -1003,7 +1210,9 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
1003
1210
  );
1004
1211
 
1005
1212
  const writeDone = () => {
1006
- const nextOperation = inProgressWrite.shift();
1213
+ const nextOperation =
1214
+ /** @type {InProgressWriteItem[]} */
1215
+ (inProgressWrite).shift();
1007
1216
  if (nextOperation) {
1008
1217
  nextOperation();
1009
1218
  } else {
@@ -1019,19 +1228,25 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
1019
1228
  const lockfile = buffer
1020
1229
  ? Lockfile.parse(buffer.toString("utf-8"))
1021
1230
  : new Lockfile();
1022
- for (const [key, value] of lockfileUpdates) {
1231
+ for (const [key, value] of /** @type {LockfileUpdates} */ (
1232
+ lockfileUpdates
1233
+ )) {
1023
1234
  lockfile.entries.set(key, value);
1024
1235
  }
1025
1236
  intermediateFs.writeFile(tempFile, lockfile.toString(), err => {
1026
1237
  if (err) {
1027
1238
  writeDone();
1028
- return intermediateFs.unlink(tempFile, () => callback(err));
1239
+ return (
1240
+ /** @type {NonNullable<IntermediateFileSystem["unlink"]>} */
1241
+ (intermediateFs.unlink)(tempFile, () => callback(err))
1242
+ );
1029
1243
  }
1030
1244
  intermediateFs.rename(tempFile, lockfileLocation, err => {
1031
1245
  if (err) {
1032
1246
  writeDone();
1033
- return intermediateFs.unlink(tempFile, () =>
1034
- callback(err)
1247
+ return (
1248
+ /** @type {NonNullable<IntermediateFileSystem["unlink"]>} */
1249
+ (intermediateFs.unlink)(tempFile, () => callback(err))
1035
1250
  );
1036
1251
  }
1037
1252
  writeDone();
@@ -1044,6 +1259,7 @@ Run build with un-frozen lockfile to automatically fix lockfile.`
1044
1259
  inProgressWrite.push(runWrite);
1045
1260
  } else {
1046
1261
  inProgressWrite = [];
1262
+ runWrite();
1047
1263
  }
1048
1264
  }
1049
1265
  );