@depup/webpack 5.110.1-depup.0 → 5.111.1-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 (304) hide show
  1. package/README.md +7 -8
  2. package/changes.json +7 -11
  3. package/lib/APIPlugin.js +26 -11
  4. package/lib/AutomaticPrefetchPlugin.js +1 -1
  5. package/lib/Cache.js +8 -3
  6. package/lib/CacheFacade.js +1 -1
  7. package/lib/ChunkGraph.js +20 -18
  8. package/lib/CircularModulesPlugin.js +157 -55
  9. package/lib/CleanPlugin.js +2 -2
  10. package/lib/CompatibilityPlugin.js +3 -4
  11. package/lib/Compilation.js +337 -338
  12. package/lib/Compiler.js +213 -51
  13. package/lib/ConcatenationScope.js +25 -35
  14. package/lib/ConstPlugin.js +16 -132
  15. package/lib/CopyPlugin.js +1054 -0
  16. package/lib/DefinePlugin.js +24 -8
  17. package/lib/DependencyTemplate.js +2 -1
  18. package/lib/DotenvPlugin.js +64 -40
  19. package/lib/ErrorHelpers.js +113 -0
  20. package/lib/ExportsInfo.js +30 -16
  21. package/lib/ExternalModule.js +47 -22
  22. package/lib/FileSystemInfo.js +17 -14
  23. package/lib/FlagDependencyExportsPlugin.js +53 -34
  24. package/lib/FlagDependencyUsagePlugin.js +17 -15
  25. package/lib/Generator.js +24 -2
  26. package/lib/HotModuleReplacementPlugin.js +55 -7
  27. package/lib/IgnorePlugin.js +1 -1
  28. package/lib/JavascriptMetaInfoPlugin.js +5 -3
  29. package/lib/LoaderOptionsPlugin.js +1 -1
  30. package/lib/MainTemplate.js +5 -1
  31. package/lib/Module.js +19 -10
  32. package/lib/ModuleGraph.js +6 -9
  33. package/lib/MultiCompiler.js +7 -17
  34. package/lib/MultiWatching.js +1 -1
  35. package/lib/NormalModule.js +148 -70
  36. package/lib/NormalModuleFactory.js +1 -1
  37. package/lib/RuntimeGlobals.js +21 -7
  38. package/lib/RuntimeModule.js +28 -12
  39. package/lib/RuntimePlugin.js +33 -3
  40. package/lib/RuntimeTemplate.js +1147 -847
  41. package/lib/SourceMapDevToolPlugin.js +54 -104
  42. package/lib/TemplatedPathPlugin.js +16 -59
  43. package/lib/Watching.js +9 -0
  44. package/lib/WebpackOptionsApply.js +84 -91
  45. package/lib/asset/AssetBytesGenerator.js +7 -1
  46. package/lib/asset/AssetGenerator.js +50 -24
  47. package/lib/asset/AssetModule.js +3 -0
  48. package/lib/asset/AssetSourceGenerator.js +7 -1
  49. package/lib/asset/WebManifestParser.js +7 -5
  50. package/lib/async-modules/AsyncModuleHelpers.js +10 -4
  51. package/lib/buildChunkGraph.js +11 -15
  52. package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
  53. package/lib/cache/IdleFileCachePlugin.js +2 -2
  54. package/lib/cache/MemoryCachePlugin.js +4 -4
  55. package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
  56. package/lib/cache/PackFileCacheStrategy.js +17 -19
  57. package/lib/cache/getLazyHashedEtag.js +3 -5
  58. package/lib/config/browserslistTargetHandler.js +17 -4
  59. package/lib/config/defaults.js +162 -142
  60. package/lib/config/getClaimedAssetTypes.js +10 -11
  61. package/lib/config/normalization.js +100 -20
  62. package/lib/config/target.js +13 -4
  63. package/lib/container/ContainerReferencePlugin.js +6 -0
  64. package/lib/container/RemoteRuntimeModule.js +9 -0
  65. package/lib/container/declaredRemotes.js +39 -0
  66. package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
  67. package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
  68. package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
  69. package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
  70. package/lib/css/CssGenerator.js +27 -11
  71. package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
  72. package/lib/css/CssLoadingRuntimeModule.js +92 -15
  73. package/lib/css/CssModule.js +1 -1
  74. package/lib/css/CssModulesPlugin.js +3 -10
  75. package/lib/css/CssParser.js +162 -31
  76. package/lib/css/CssServerStylesRuntimeModule.js +9 -0
  77. package/lib/css/cssMinify.js +43 -32
  78. package/lib/css/data.js +3526 -871
  79. package/lib/css/syntax.js +6455 -1237
  80. package/lib/debug/ProfilingPlugin.js +7 -4
  81. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
  82. package/lib/dependencies/AMDRuntimeModules.js +18 -0
  83. package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
  84. package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
  85. package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
  86. package/lib/dependencies/CommonJsPlugin.js +19 -3
  87. package/lib/dependencies/CommonJsRequireDependency.js +32 -9
  88. package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
  89. package/lib/dependencies/ContextDependency.js +1 -1
  90. package/lib/dependencies/ContextDependencyHelpers.js +3 -9
  91. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +20 -7
  92. package/lib/dependencies/ContextElementDependency.js +1 -1
  93. package/lib/dependencies/CssIcssExportDependency.js +13 -9
  94. package/lib/dependencies/CssIcssImportDependency.js +3 -6
  95. package/lib/dependencies/CssUrlDependency.js +3 -5
  96. package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
  97. package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
  98. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +10 -4
  99. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +12 -7
  100. package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
  101. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +217 -34
  102. package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
  103. package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
  104. package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
  105. package/lib/dependencies/HarmonyImportDependency.js +99 -41
  106. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +198 -25
  107. package/lib/dependencies/HarmonyImportSideEffectDependency.js +117 -4
  108. package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
  109. package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
  110. package/lib/dependencies/HtmlEntryDependency.js +136 -104
  111. package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
  112. package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
  113. package/lib/dependencies/ImportContextDependency.js +43 -3
  114. package/lib/dependencies/ImportDependency.js +8 -29
  115. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  116. package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
  117. package/lib/dependencies/ImportMetaMainDependency.js +104 -0
  118. package/lib/dependencies/ImportMetaPlugin.js +67 -25
  119. package/lib/dependencies/ImportParserPlugin.js +25 -15
  120. package/lib/dependencies/LoaderPlugin.js +26 -1
  121. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  122. package/lib/dependencies/RequireHeaderDependency.js +20 -21
  123. package/lib/dependencies/SystemRuntimeModule.js +9 -0
  124. package/lib/dependencies/URLContextDependency.js +1 -1
  125. package/lib/dependencies/URLDependency.js +6 -5
  126. package/lib/dependencies/WorkerAndWorkletPlugin.js +16 -21
  127. package/lib/dependencies/WorkerDependency.js +12 -18
  128. package/lib/dependencies/WorkletDependency.js +12 -20
  129. package/lib/dependencies/importOptionsCheck.js +47 -0
  130. package/lib/dll/DelegatedModule.js +18 -1
  131. package/lib/dll/DllReferencePlugin.js +11 -8
  132. package/lib/dll/LibManifestPlugin.js +1 -1
  133. package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
  134. package/lib/errors/DotenvFileError.js +29 -0
  135. package/lib/errors/DuplicateModulesWarning.js +12 -7
  136. package/lib/errors/EmptyCopyPatternWarning.js +26 -0
  137. package/lib/errors/ExternalStarReexportError.js +44 -0
  138. package/lib/errors/HookWebpackError.js +3 -2
  139. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  140. package/lib/errors/MissingSourceMapsWarning.js +36 -0
  141. package/lib/errors/ModuleParseError.js +2 -1
  142. package/lib/errors/UnusedAssetsWarning.js +36 -0
  143. package/lib/errors/UnusedFederationWarning.js +35 -0
  144. package/lib/errors/UnusedModulesWarning.js +38 -0
  145. package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
  146. package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
  147. package/lib/esm/ModuleChunkLoadingPlugin.js +21 -5
  148. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +91 -53
  149. package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
  150. package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
  151. package/lib/hmr/LazyCompilationPlugin.js +3 -5
  152. package/lib/html/HtmlGenerator.js +72 -87
  153. package/lib/html/HtmlModulesPlugin.js +479 -215
  154. package/lib/html/HtmlParser.js +110 -147
  155. package/lib/html/builtinEmbeddedRenderer.js +107 -0
  156. package/lib/html/data.js +142 -7
  157. package/lib/html/htmlMinify.js +92 -122
  158. package/lib/html/syntax.js +2031 -1556
  159. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  160. package/lib/index.js +49 -3
  161. package/lib/javascript/ChunkFormatHelpers.js +4 -3
  162. package/lib/javascript/JavascriptGenerator.js +8 -1
  163. package/lib/javascript/JavascriptModule.js +1 -0
  164. package/lib/javascript/JavascriptModulesPlugin.js +76 -80
  165. package/lib/javascript/JavascriptParser.js +1970 -900
  166. package/lib/javascript/StartupHelpers.js +27 -3
  167. package/lib/javascript/data.js +172 -0
  168. package/lib/javascript/grammar.js +5546 -0
  169. package/lib/javascript/parser.js +1500 -0
  170. package/lib/javascript/regexp.js +1762 -0
  171. package/lib/javascript/regexpData.js +51 -0
  172. package/lib/javascript/syntax.js +9061 -5262
  173. package/lib/json/JsonGenerator.js +7 -1
  174. package/lib/library/ModuleLibraryPlugin.js +171 -132
  175. package/lib/loaders/LoaderRunner.js +170 -14
  176. package/lib/node/NodeWatchFileSystem.js +3 -9
  177. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
  178. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +8 -15
  179. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
  180. package/lib/optimize/AggressiveMergingPlugin.js +3 -5
  181. package/lib/optimize/ConcatenatedModule.js +222 -125
  182. package/lib/optimize/ConstExportsPlugin.js +50 -34
  183. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
  184. package/lib/optimize/InlineExports.js +20 -2
  185. package/lib/optimize/InnerGraphPlugin.js +7 -13
  186. package/lib/optimize/LimitChunkCountPlugin.js +5 -8
  187. package/lib/optimize/MangleExportsPlugin.js +13 -4
  188. package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
  189. package/lib/optimize/RealContentHashPlugin.js +179 -44
  190. package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
  191. package/lib/optimize/SplitChunksPlugin.js +2 -4
  192. package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
  193. package/lib/performance/BroadContextsPlugin.js +1 -1
  194. package/lib/performance/CacheEffectivenessPlugin.js +7 -7
  195. package/lib/performance/DuplicateModulesPlugin.js +57 -13
  196. package/lib/performance/EvalUsagePlugin.js +5 -2
  197. package/lib/performance/MissingSourceMapsPlugin.js +115 -0
  198. package/lib/performance/PureAnnotationsPlugin.js +6 -3
  199. package/lib/performance/SizeLimitsPlugin.js +2 -4
  200. package/lib/performance/TopLevelThisPlugin.js +5 -4
  201. package/lib/performance/UnusedAssetsPlugin.js +109 -0
  202. package/lib/performance/UnusedFederationPlugin.js +147 -0
  203. package/lib/performance/UnusedModulesPlugin.js +141 -0
  204. package/lib/performance/UnusedReexportsPlugin.js +1 -55
  205. package/lib/performance/isOnlyReexported.js +65 -0
  206. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
  207. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
  208. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
  209. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
  210. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
  211. package/lib/prefetch/ResourceHintPlugin.js +29 -35
  212. package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
  213. package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
  214. package/lib/rules/RuleSetCompiler.js +211 -4
  215. package/lib/runtime/AsyncModuleRuntimeModule.js +103 -67
  216. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
  217. package/lib/runtime/BaseUriRuntimeModule.js +9 -0
  218. package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
  219. package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
  220. package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
  221. package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
  222. package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
  223. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
  224. package/lib/runtime/GlobalRuntimeModule.js +11 -4
  225. package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
  226. package/lib/runtime/HelperRuntimeModule.js +10 -0
  227. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +313 -222
  228. package/lib/runtime/NonceRuntimeModule.js +9 -0
  229. package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
  230. package/lib/runtime/PublicPathRuntimeModule.js +9 -0
  231. package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
  232. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
  233. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
  234. package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
  235. package/lib/runtime/SystemContextRuntimeModule.js +9 -0
  236. package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
  237. package/lib/schemes/DataUriPlugin.js +3 -6
  238. package/lib/schemes/HttpUriPlugin.js +22 -5
  239. package/lib/schemes/VirtualUrlPlugin.js +1 -1
  240. package/lib/serialization/BinaryMiddleware.js +9 -9
  241. package/lib/serialization/FileMiddleware.js +31 -18
  242. package/lib/serialization/ObjectMiddleware.js +168 -139
  243. package/lib/sharing/ConsumeSharedPlugin.js +12 -0
  244. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
  245. package/lib/sharing/ShareRuntimeModule.js +9 -0
  246. package/lib/sharing/declaredShared.js +47 -0
  247. package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
  248. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
  249. package/lib/typescript/TypeScriptPlugin.js +10 -13
  250. package/lib/url/URLParserPlugin.js +6 -8
  251. package/lib/util/ArrayQueue.js +3 -3
  252. package/lib/util/LocConverter.js +4 -7
  253. package/lib/util/SourceProcessor.js +115 -99
  254. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  255. package/lib/util/async.js +292 -0
  256. package/lib/util/buildDiagnostics.js +69 -0
  257. package/lib/util/chainedImports.js +3 -4
  258. package/lib/util/concatenate.js +4 -4
  259. package/lib/util/conventions.js +5 -1
  260. package/lib/util/createHooksRegistry.js +1 -2
  261. package/lib/util/createMappings.js +25 -3
  262. package/lib/util/dataURL.js +2 -3
  263. package/lib/util/deterministicGrouping.js +8 -13
  264. package/lib/util/findGraphRoots.js +6 -13
  265. package/lib/util/fs.js +27 -1
  266. package/lib/util/globUtils.js +1 -1
  267. package/lib/util/handlerKeys.js +40 -0
  268. package/lib/util/hash/wasm-hash.js +3 -4
  269. package/lib/util/identifier.js +20 -0
  270. package/lib/util/internalSerializables.js +7 -1
  271. package/lib/util/registerExternalSerializer.js +6 -45
  272. package/lib/util/removeBOM.js +82 -1
  273. package/lib/util/semver.js +5 -3
  274. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +14 -3
  275. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +14 -3
  276. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
  277. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
  278. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +7 -12
  279. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
  280. package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
  281. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
  282. package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
  283. package/lib/web/FetchCompileAsyncWasmPlugin.js +10 -6
  284. package/lib/web/FetchCompileWasmPlugin.js +4 -2
  285. package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
  286. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
  287. package/package.json +55 -46
  288. package/schemas/WebpackOptions.check.js +1 -1
  289. package/schemas/WebpackOptions.json +388 -76
  290. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  291. package/schemas/plugins/ManifestPlugin.check.js +1 -1
  292. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  293. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  294. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  295. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  296. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  297. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  298. package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
  299. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
  300. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  301. package/types.d.ts +1795 -608
  302. package/lib/dependencies/ExportBindingInitFragment.js +0 -191
  303. package/lib/errors/EntrypointOverlapWarning.js +0 -45
  304. package/lib/performance/EntrypointOverlapPlugin.js +0 -122
@@ -7,8 +7,12 @@
7
7
 
8
8
  const { readFile } = require("fs");
9
9
  const { parseResource } = require("../util/identifier");
10
+ const { adjustSourceMapForRemovedBOM } = require("../util/removeBOM");
10
11
  const loadLoader = require("./loadLoader");
11
12
 
13
+ /** @import { RawSourceMap } from "webpack-sources" */
14
+ /** @import { Environment } from "../../declarations/WebpackOptions" */
15
+
12
16
  // Set on a loader context to have each loader's own run measured. Absent
13
17
  // unless something asked for the measurement, and read once per loader.
14
18
  const LOADER_TIMING = Symbol("loader timing");
@@ -43,14 +47,139 @@ const LOADER_TIMING = Symbol("loader timing");
43
47
 
44
48
  /** @typedef {(...args: EXPECTED_ANY[]) => void} LoaderCallback */
45
49
 
46
- /** @typedef {import("../../declarations/LoaderContext").LoaderRunnerLoaderContext<EXPECTED_ANY>} LoaderRunnerLoaderContext */
50
+ /**
51
+ * @typedef {object} AdditionalDataKnown
52
+ * @property {EXPECTED_OBJECT} webpackAST the AST webpack should parse instead of the source
53
+ */
54
+
55
+ /** @typedef {AdditionalDataKnown & Record<string, EXPECTED_ANY>} AdditionalData */
56
+
57
+ /**
58
+ * @callback WebpackLoaderContextCallback
59
+ * @param {undefined | null | Error} err error object
60
+ * @param {(string | Buffer)=} content the loader result
61
+ * @param {(null | string | RawSourceMap)=} sourceMap a source map for the result
62
+ * @param {AdditionalData=} additionalData data passed to the next loader
63
+ * @returns {void}
64
+ */
65
+
66
+ /**
67
+ * @typedef {object} LoaderEntry
68
+ * @property {string} request
69
+ * @property {string} path
70
+ * @property {string} query
71
+ * @property {string} fragment
72
+ * @property {EXPECTED_OBJECT | string | undefined} options
73
+ * @property {string} ident
74
+ * @property {EXPECTED_FUNCTION | undefined} normal
75
+ * @property {EXPECTED_FUNCTION | undefined} pitch
76
+ * @property {boolean | undefined} raw
77
+ * @property {EXPECTED_OBJECT | undefined} data
78
+ * @property {boolean} pitchExecuted
79
+ * @property {boolean} normalExecuted
80
+ * @property {("commonjs" | "module")=} type
81
+ */
82
+
83
+ /**
84
+ * The members the runner never lets a loader assign. They carry no
85
+ * documentation, so a type literal loses nothing and keeps `readonly`
86
+ * @template OptionsType
87
+ * @typedef {{ readonly currentRequest: string, readonly data: EXPECTED_ANY, readonly previousRequest: string, readonly query: string | OptionsType, readonly remainingRequest: string, readonly request: string }} LoaderRunnerReadonlyContext
88
+ */
89
+
90
+ /**
91
+ * @template OptionsType
92
+ * @typedef {object} LoaderRunnerMutableContext
93
+ * @property {(context: string) => void} addContextDependency Add a directory as dependency of the loader result.
94
+ * @property {(file: string) => void} addDependency Adds a file as dependency of the loader result in order to make them watchable.
95
+ * For example, html-loader uses this technique as it finds src and src-set attributes.
96
+ * Then, it sets the url's for those attributes as dependencies of the html file that is parsed.
97
+ * @property {(context: string) => void} addMissingDependency
98
+ * @property {() => WebpackLoaderContextCallback} async Make this loader async.
99
+ * @property {(flag?: boolean) => void} cacheable Make this loader result cacheable. By default it's cacheable.
100
+ * A cacheable loader must have a deterministic result, when inputs and dependencies haven't changed.
101
+ * This means the loader shouldn't have other dependencies than specified with this.addDependency.
102
+ * Most loaders are deterministic and cacheable.
103
+ * @property {WebpackLoaderContextCallback} callback
104
+ * @property {() => void} clearDependencies Remove all dependencies of the loader result. Even initial dependencies and these of other loaders.
105
+ * @property {string} context The directory of the module. Can be used as context for resolving other stuff.
106
+ * eg '/workspaces/ts-loader/examples/vanilla/src'
107
+ * @property {(file: string) => void} dependency alias of addDependency
108
+ * Adds a file as dependency of the loader result in order to make them watchable.
109
+ * For example, html-loader uses this technique as it finds src and src-set attributes.
110
+ * Then, it sets the url's for those attributes as dependencies of the html file that is parsed.
111
+ * @property {() => string[]} getContextDependencies
112
+ * @property {() => string[]} getDependencies
113
+ * @property {() => string[]} getMissingDependencies
114
+ * @property {number} loaderIndex The index in the loaders array of the current loader.
115
+ * In the example: in loader1: 0, in loader2: 1
116
+ * @property {LoaderEntry[]} loaders An array of all the loaders. It is writeable in the pitch phase.
117
+ * loaders = [{request: string, path: string, query: string, module: function}]
118
+ * @property {string} resourcePath The resource path.
119
+ * In the example: "/abc/resource.js"
120
+ * @property {string} resourceQuery The resource query string.
121
+ * Example: "?query"
122
+ * @property {string} resourceFragment The resource fragment.
123
+ * Example: "#frag"
124
+ * @property {string} resource The resource inclusive query and fragment.
125
+ * Example: "/abc/resource.js?query#frag"
126
+ * @property {string} target Target of compilation.
127
+ * Example: "web"
128
+ * @property {Environment} environment Tell what kind of ES-features may be used in the generated runtime-code.
129
+ * Example: { arrowFunction: true }
130
+ */
131
+
132
+ /**
133
+ * The properties are added by https://github.com/webpack/loader-runner
134
+ * @template OptionsType
135
+ * @typedef {LoaderRunnerMutableContext<OptionsType> & LoaderRunnerReadonlyContext<OptionsType>} LoaderRunnerLoaderContext
136
+ */
137
+
138
+ /**
139
+ * @template [OptionsType={}]
140
+ * @template [ContextAdditions={}]
141
+ * @typedef {(this: import("../NormalModule").LoaderContext<OptionsType> & ContextAdditions, remainingRequest: string, previousRequest: string, data: EXPECTED_OBJECT) => string | Buffer | Promise<string | Buffer> | void} PitchLoaderDefinitionFunction
142
+ */
143
+
144
+ /**
145
+ * @template [OptionsType={}]
146
+ * @template [ContextAdditions={}]
147
+ * @typedef {(this: import("../NormalModule").LoaderContext<OptionsType> & ContextAdditions, content: string, sourceMap?: string | RawSourceMap, additionalData?: AdditionalData) => string | Buffer | Promise<string | Buffer> | void} LoaderDefinitionFunction
148
+ */
149
+
150
+ /**
151
+ * @template [OptionsType={}]
152
+ * @template [ContextAdditions={}]
153
+ * @typedef {(this: import("../NormalModule").LoaderContext<OptionsType> & ContextAdditions, content: Buffer, sourceMap?: string | RawSourceMap, additionalData?: AdditionalData) => string | Buffer | Promise<string | Buffer> | void} RawLoaderDefinitionFunction
154
+ */
155
+
156
+ /**
157
+ * @template [OptionsType={}]
158
+ * @template [ContextAdditions={}]
159
+ * @typedef {LoaderDefinitionFunction<OptionsType, ContextAdditions> & { raw?: false, pitch?: PitchLoaderDefinitionFunction<OptionsType, ContextAdditions> }} LoaderDefinition
160
+ */
161
+
162
+ /**
163
+ * @template [OptionsType={}]
164
+ * @template [ContextAdditions={}]
165
+ * @typedef {RawLoaderDefinitionFunction<OptionsType, ContextAdditions> & { raw: true, pitch?: PitchLoaderDefinitionFunction<OptionsType, ContextAdditions> }} RawLoaderDefinition
166
+ */
167
+
168
+ /**
169
+ * @template [OptionsType={}]
170
+ * @template [ContextAdditions={}]
171
+ * @typedef {object} LoaderModule
172
+ * @property {(RawLoaderDefinitionFunction<OptionsType, ContextAdditions> | LoaderDefinitionFunction<OptionsType, ContextAdditions>)=} default
173
+ * @property {false=} raw
174
+ * @property {PitchLoaderDefinitionFunction<OptionsType, ContextAdditions>=} pitch
175
+ */
47
176
 
48
177
  /**
49
178
  * The loader context as the runner sees and mutates it: the canonical
50
179
  * `LoaderRunnerLoaderContext` shape (not re-declared here), with only the fields
51
180
  * the runner assigns internally before a loader runs widened to their mutable
52
181
  * form (nullable `context`/`callback`/`async`, `LoaderObject` loaders).
53
- * @typedef {Omit<LoaderRunnerLoaderContext, "context" | "callback" | "async" | "loaders"> & { context: string | null, callback: LoaderCallback | null, async: (() => LoaderCallback | undefined) | null, loaders: LoaderObject[] }} LoaderContext
182
+ * @typedef {Omit<LoaderRunnerLoaderContext<EXPECTED_ANY>, "context" | "callback" | "async" | "loaders"> & { context: string | null, callback: LoaderCallback | null, async: (() => LoaderCallback | undefined) | null, loaders: LoaderObject[] }} LoaderContext
54
183
  */
55
184
 
56
185
  const HASH_ESCAPE_REGEXP = /#/g;
@@ -59,6 +188,8 @@ const HASH_ESCAPE_REGEXP = /#/g;
59
188
  const UTF8_BOM_0 = 0xef;
60
189
  const UTF8_BOM_1 = 0xbb;
61
190
  const UTF8_BOM_2 = 0xbf;
191
+ // U+FEFF, the BOM once decoded
192
+ const BOM_CHAR_CODE = 0xfeff;
62
193
 
63
194
  /**
64
195
  * @param {Buffer} buf buffer
@@ -76,6 +207,14 @@ function utf8BufferToString(buf) {
76
207
  return buf.toString("utf8");
77
208
  }
78
209
 
210
+ /**
211
+ * @param {string} str string
212
+ * @returns {string} string, with a leading BOM removed
213
+ */
214
+ function stringWithoutBOM(str) {
215
+ return str.charCodeAt(0) === BOM_CHAR_CODE ? str.slice(1) : str;
216
+ }
217
+
79
218
  /**
80
219
  * Escape `#` with a preceding `\0` byte; short-circuits when there is no `#`.
81
220
  * @param {string} str input string
@@ -292,9 +431,19 @@ function runSyncOrAsync(fn, context, args, callback) {
292
431
  /**
293
432
  * @param {EXPECTED_ANY[]} args arguments
294
433
  * @param {boolean | null=} raw whether the loader wants a Buffer
434
+ * @param {boolean=} fromLoader whether args came from a loader rather than the resource
295
435
  * @returns {void}
296
436
  */
297
- function convertArgs(args, raw) {
437
+ function convertArgs(args, raw, fromLoader) {
438
+ // A BOM only means anything at the start of a file, so one a loader produced
439
+ // is content the next loader must not see. The resource keeps its own.
440
+ if (fromLoader && typeof args[0] === "string") {
441
+ const withoutBOM = stringWithoutBOM(args[0]);
442
+ if (withoutBOM !== args[0]) {
443
+ args[0] = withoutBOM;
444
+ if (args[1]) args[1] = adjustSourceMapForRemovedBOM(args[1]);
445
+ }
446
+ }
298
447
  if (!raw && Buffer.isBuffer(args[0])) {
299
448
  args[0] = utf8BufferToString(args[0]);
300
449
  } else if (raw && typeof args[0] === "string") {
@@ -307,9 +456,16 @@ function convertArgs(args, raw) {
307
456
  * @param {LoaderContext} loaderContext the loader context
308
457
  * @param {EXPECTED_ANY[]} args arguments
309
458
  * @param {(err: Error | null, args?: EXPECTED_ANY[]) => void} callback callback
459
+ * @param {boolean=} fromLoader whether args came from a loader rather than the resource
310
460
  * @returns {void}
311
461
  */
312
- function iterateNormalLoaders(options, loaderContext, args, callback) {
462
+ function iterateNormalLoaders(
463
+ options,
464
+ loaderContext,
465
+ args,
466
+ callback,
467
+ fromLoader
468
+ ) {
313
469
  while (loaderContext.loaderIndex >= 0) {
314
470
  const currentLoaderObject =
315
471
  loaderContext.loaders[loaderContext.loaderIndex];
@@ -327,11 +483,11 @@ function iterateNormalLoaders(options, loaderContext, args, callback) {
327
483
  continue;
328
484
  }
329
485
 
330
- convertArgs(args, currentLoaderObject.raw);
486
+ convertArgs(args, currentLoaderObject.raw, fromLoader);
331
487
 
332
488
  return runSyncOrAsync(fn, loaderContext, args, (err, ...nextArgs) => {
333
489
  if (err) return callback(err);
334
- iterateNormalLoaders(options, loaderContext, nextArgs, callback);
490
+ iterateNormalLoaders(options, loaderContext, nextArgs, callback, true);
335
491
  });
336
492
  }
337
493
 
@@ -410,7 +566,7 @@ function iteratePitchingLoaders(options, loaderContext, callback) {
410
566
  }
411
567
  if (hasArg) {
412
568
  loaderContext.loaderIndex--;
413
- iterateNormalLoaders(options, loaderContext, args, callback);
569
+ iterateNormalLoaders(options, loaderContext, args, callback, true);
414
570
  } else {
415
571
  iteratePitchingLoaders(options, loaderContext, callback);
416
572
  }
@@ -547,7 +703,7 @@ function createLoaderContext(base) {
547
703
  * Marks the request as not cacheable with the given reasons instead of
548
704
  * attributing the currently running loader (used by the host when the cause
549
705
  * lives outside the loader, e.g. in a child compilation of `importModule`).
550
- * @param {LoaderRunnerLoaderContext} loaderContext loader context
706
+ * @param {LoaderRunnerLoaderContext<EXPECTED_ANY>} loaderContext loader context
551
707
  * @param {string[]} reasons reasons why the request is not cacheable
552
708
  * @returns {void}
553
709
  */
@@ -654,12 +810,12 @@ const ACCESSORS = {
654
810
  * @returns {void}
655
811
  */
656
812
  module.exports.runLoaders = function runLoaders(options, callback) {
657
- // reuse a context already prepared by createLoaderContext (e.g. from
658
- // NormalModule), else augment the caller-provided context (or a fresh object)
659
- // in place. State is intentionally preserved across the handoff, so host hooks
660
- // (e.g. beforeLoaders) can pre-add dependencies or mark the request
661
- // non-cacheable before the run; a caller re-running on the same context should
662
- // clearDependencies() first to avoid accumulating stale dependencies.
813
+ // WHY: reuse a context `createLoaderContext` already prepared, from
814
+ // NormalModule say, else augment the caller-provided context, or a fresh
815
+ // object, in place. State is intentionally preserved across the handoff, so a
816
+ // host hook such as `beforeLoaders` can pre-add dependencies or mark the
817
+ // request non-cacheable before the run; a caller re-running on the same context
818
+ // should `clearDependencies()` first, to avoid accumulating stale ones.
663
819
  const provided = /** @type {EXPECTED_ANY} */ (options.context);
664
820
  const loaderContext =
665
821
  provided && provided[LOADER_STATE]
@@ -147,15 +147,9 @@ class NodeWatchFileSystem {
147
147
  const directoriesSet =
148
148
  directories instanceof Set ? directories : new Set(directories);
149
149
 
150
- // Watchpack reports a watched directory (a context dependency) in
151
- // `changes` whenever its contents change, alongside the individual
152
- // file events. The default `fs.purge(dir)` matches cache keys by
153
- // prefix, so it would wipe the stat cache of every file inside the
154
- // directory even though only file-level events actually invalidate
155
- // file stats. For directories we explicitly watch, purge only the
156
- // directory's own entry (`{ exact: true }`, enhanced-resolve >=
157
- // 5.22.0); file-level events in the same aggregated batch still
158
- // handle file stats and the parent readdir invalidation.
150
+ // Watchpack reports a watched directory whenever its contents change, and
151
+ // `fs.purge(dir)` matches by prefix, wiping every file's stat cache with it.
152
+ // Only its own entry is purged; the batch's file events carry the rest.
159
153
  /**
160
154
  * @param {Changes | null | undefined} changes changes set
161
155
  * @param {Removals | null | undefined} removals removals set
@@ -32,6 +32,28 @@ class ReadFileChunkLoadingRuntimeModule extends RuntimeModule {
32
32
  this.runtimeRequirements = runtimeRequirements;
33
33
  }
34
34
 
35
+ /**
36
+ * The `[handlerMap, key]` pairs this module installs onto a chunk handler map
37
+ * such as `__webpack_require__.f`, or `null` where it cannot name them.
38
+ * @returns {[string, string][] | null} installed chunk handlers (do not mutate)
39
+ */
40
+ getInstalledChunkHandlers() {
41
+ const runtimeRequirements = this.runtimeRequirements;
42
+ /** @type {[string, string][]} */
43
+ const handlers = [];
44
+ if (runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers)) {
45
+ handlers.push([RuntimeGlobals.ensureChunkHandlers, "readFileVm"]);
46
+ }
47
+ // The hot update flow installs this one onto the same map while it runs.
48
+ if (runtimeRequirements.has(RuntimeGlobals.hmrDownloadUpdateHandlers)) {
49
+ handlers.push([RuntimeGlobals.ensureChunkHandlers, "readFileVmHmr"]);
50
+ }
51
+ if (runtimeRequirements.has(RuntimeGlobals.onChunksLoaded)) {
52
+ handlers.push([RuntimeGlobals.onChunksLoaded, "readFileVm"]);
53
+ }
54
+ return handlers;
55
+ }
56
+
35
57
  /**
36
58
  * Returns generated code.
37
59
  * @private
@@ -62,27 +62,20 @@ class ReadFileCompileAsyncWasmPlugin {
62
62
  // settled while the plugin is being applied.
63
63
  /**
64
64
  * @param {string} path rendered path to the wasm file
65
- * @param {RuntimeSpec} runtime the runtime this loader serves
65
+ * @param {boolean} analyzable whether the call site bakes a complete URL
66
66
  * @returns {string} the argument to hand the reader
67
67
  */
68
- const wasmUrlArg = (path, runtime) =>
69
- compilation.runtimeTemplate.supportsAnalyzable(
70
- "wasm",
71
- undefined,
72
- undefined,
73
- runtime
74
- )
75
- ? path
76
- : compilation.runtimeTemplate.importMetaUrl(path);
68
+ const wasmUrlArg = (path, analyzable) =>
69
+ analyzable ? path : compilation.runtimeTemplate.importMetaUrl(path);
77
70
  /**
78
- * @type {(path: string, runtime: RuntimeSpec) => string} callback to generate code to load the wasm file
71
+ * @type {(path: string, runtime: RuntimeSpec, analyzable: boolean) => string} callback to generate code to load the wasm file
79
72
  */
80
73
  const generateLoadBinaryCode = this._import
81
- ? (path, runtime) =>
74
+ ? (path, runtime, analyzable) =>
82
75
  Template.asString([
83
76
  "Promise.all([import('fs'), import('url')]).then(([{ readFile }, { URL }]) => new Promise((resolve, reject) => {",
84
77
  Template.indent([
85
- `readFile(${wasmUrlArg(path, runtime)}, (err, buffer) => {`,
78
+ `readFile(${wasmUrlArg(path, analyzable)}, (err, buffer) => {`,
86
79
  Template.indent([
87
80
  "if (err) return reject(err);",
88
81
  "",
@@ -154,7 +147,7 @@ class ReadFileCompileAsyncWasmPlugin {
154
147
  if (
155
148
  !compilation.runtimeTemplate.supportsAnalyzable(
156
149
  "wasm",
157
- undefined,
150
+ chunkGraph,
158
151
  undefined,
159
152
  chunk.runtime
160
153
  ) &&
@@ -196,7 +189,7 @@ class ReadFileCompileAsyncWasmPlugin {
196
189
  if (
197
190
  !compilation.runtimeTemplate.supportsAnalyzable(
198
191
  "wasm",
199
- undefined,
192
+ chunkGraph,
200
193
  undefined,
201
194
  chunk.runtime
202
195
  ) &&
@@ -32,6 +32,28 @@ class RequireChunkLoadingRuntimeModule extends RuntimeModule {
32
32
  this.runtimeRequirements = runtimeRequirements;
33
33
  }
34
34
 
35
+ /**
36
+ * The `[handlerMap, key]` pairs this module installs onto a chunk handler map
37
+ * such as `__webpack_require__.f`, or `null` where it cannot name them.
38
+ * @returns {[string, string][] | null} installed chunk handlers (do not mutate)
39
+ */
40
+ getInstalledChunkHandlers() {
41
+ const runtimeRequirements = this.runtimeRequirements;
42
+ /** @type {[string, string][]} */
43
+ const handlers = [];
44
+ if (runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers)) {
45
+ handlers.push([RuntimeGlobals.ensureChunkHandlers, "require"]);
46
+ }
47
+ // The hot update flow installs this one onto the same map while it runs.
48
+ if (runtimeRequirements.has(RuntimeGlobals.hmrDownloadUpdateHandlers)) {
49
+ handlers.push([RuntimeGlobals.ensureChunkHandlers, "requireHmr"]);
50
+ }
51
+ if (runtimeRequirements.has(RuntimeGlobals.onChunksLoaded)) {
52
+ handlers.push([RuntimeGlobals.onChunksLoaded, "require"]);
53
+ }
54
+ return handlers;
55
+ }
56
+
35
57
  /**
36
58
  * Returns generated code.
37
59
  * @private
@@ -53,11 +53,9 @@ class AggressiveMergingPlugin {
53
53
  },
54
54
  (chunks) => {
55
55
  const chunkGraph = compilation.chunkGraph;
56
- // Only the single best pair is merged per pass (the hook re-runs
57
- // after each merge), so track the max directly instead of building
58
- // and sorting the full O(chunks²) list of pairs every pass. A strict
59
- // `>` keeps the first-encountered best, matching the previous stable
60
- // descending sort's `[0]`.
56
+ // One pair is merged per pass and the hook re-runs, so the maximum is
57
+ // tracked directly rather than sorting every pair each time. A strict
58
+ // `>` keeps the first best found, as a stable descending sort would.
61
59
  /** @type {Chunk | undefined} */
62
60
  let bestA;
63
61
  /** @type {Chunk | undefined} */