@depup/webpack 5.110.3-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 (283) 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/CircularModulesPlugin.js +157 -55
  8. package/lib/CleanPlugin.js +2 -2
  9. package/lib/CompatibilityPlugin.js +3 -4
  10. package/lib/Compilation.js +336 -337
  11. package/lib/Compiler.js +213 -51
  12. package/lib/ConstPlugin.js +16 -132
  13. package/lib/CopyPlugin.js +1054 -0
  14. package/lib/DefinePlugin.js +24 -8
  15. package/lib/DependencyTemplate.js +2 -1
  16. package/lib/DotenvPlugin.js +24 -28
  17. package/lib/ErrorHelpers.js +113 -0
  18. package/lib/ExportsInfo.js +20 -16
  19. package/lib/ExternalModule.js +47 -22
  20. package/lib/FileSystemInfo.js +17 -14
  21. package/lib/FlagDependencyExportsPlugin.js +53 -34
  22. package/lib/FlagDependencyUsagePlugin.js +9 -13
  23. package/lib/Generator.js +24 -2
  24. package/lib/HotModuleReplacementPlugin.js +55 -7
  25. package/lib/IgnorePlugin.js +1 -1
  26. package/lib/JavascriptMetaInfoPlugin.js +5 -3
  27. package/lib/LoaderOptionsPlugin.js +1 -1
  28. package/lib/MainTemplate.js +5 -1
  29. package/lib/Module.js +19 -10
  30. package/lib/ModuleGraph.js +6 -9
  31. package/lib/MultiCompiler.js +7 -17
  32. package/lib/MultiWatching.js +1 -1
  33. package/lib/NormalModule.js +135 -50
  34. package/lib/NormalModuleFactory.js +1 -1
  35. package/lib/RuntimeGlobals.js +21 -7
  36. package/lib/RuntimeModule.js +28 -12
  37. package/lib/RuntimePlugin.js +30 -3
  38. package/lib/RuntimeTemplate.js +813 -518
  39. package/lib/SourceMapDevToolPlugin.js +54 -104
  40. package/lib/TemplatedPathPlugin.js +16 -59
  41. package/lib/Watching.js +9 -0
  42. package/lib/WebpackOptionsApply.js +84 -91
  43. package/lib/asset/AssetBytesGenerator.js +7 -1
  44. package/lib/asset/AssetGenerator.js +50 -24
  45. package/lib/asset/AssetModule.js +3 -0
  46. package/lib/asset/AssetSourceGenerator.js +7 -1
  47. package/lib/asset/WebManifestParser.js +7 -5
  48. package/lib/buildChunkGraph.js +11 -15
  49. package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
  50. package/lib/cache/IdleFileCachePlugin.js +2 -2
  51. package/lib/cache/MemoryCachePlugin.js +4 -4
  52. package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
  53. package/lib/cache/PackFileCacheStrategy.js +17 -19
  54. package/lib/cache/getLazyHashedEtag.js +3 -5
  55. package/lib/config/browserslistTargetHandler.js +17 -4
  56. package/lib/config/defaults.js +138 -128
  57. package/lib/config/getClaimedAssetTypes.js +10 -11
  58. package/lib/config/normalization.js +82 -12
  59. package/lib/config/target.js +13 -4
  60. package/lib/container/ContainerReferencePlugin.js +6 -0
  61. package/lib/container/RemoteRuntimeModule.js +9 -0
  62. package/lib/container/declaredRemotes.js +39 -0
  63. package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
  64. package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
  65. package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
  66. package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
  67. package/lib/css/CssGenerator.js +27 -11
  68. package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
  69. package/lib/css/CssLoadingRuntimeModule.js +94 -36
  70. package/lib/css/CssModule.js +1 -1
  71. package/lib/css/CssModulesPlugin.js +7 -6
  72. package/lib/css/CssParser.js +162 -31
  73. package/lib/css/CssServerStylesRuntimeModule.js +9 -0
  74. package/lib/css/cssMinify.js +43 -32
  75. package/lib/css/data.js +3514 -869
  76. package/lib/css/syntax.js +6370 -1220
  77. package/lib/debug/ProfilingPlugin.js +7 -4
  78. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
  79. package/lib/dependencies/AMDRuntimeModules.js +18 -0
  80. package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
  81. package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
  82. package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
  83. package/lib/dependencies/CommonJsPlugin.js +19 -3
  84. package/lib/dependencies/CommonJsRequireDependency.js +14 -5
  85. package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
  86. package/lib/dependencies/ContextDependency.js +1 -1
  87. package/lib/dependencies/ContextDependencyHelpers.js +3 -9
  88. package/lib/dependencies/ContextElementDependency.js +1 -1
  89. package/lib/dependencies/CssIcssExportDependency.js +13 -9
  90. package/lib/dependencies/CssIcssImportDependency.js +3 -6
  91. package/lib/dependencies/CssUrlDependency.js +3 -5
  92. package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
  93. package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
  94. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +10 -7
  95. package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
  96. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +74 -17
  97. package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
  98. package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
  99. package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
  100. package/lib/dependencies/HarmonyImportDependency.js +6 -1
  101. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +111 -17
  102. package/lib/dependencies/HarmonyImportSideEffectDependency.js +3 -4
  103. package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
  104. package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
  105. package/lib/dependencies/HtmlEntryDependency.js +124 -102
  106. package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
  107. package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
  108. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  109. package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
  110. package/lib/dependencies/ImportMetaMainDependency.js +104 -0
  111. package/lib/dependencies/ImportMetaPlugin.js +67 -25
  112. package/lib/dependencies/ImportParserPlugin.js +1 -1
  113. package/lib/dependencies/LoaderPlugin.js +26 -1
  114. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  115. package/lib/dependencies/SystemRuntimeModule.js +9 -0
  116. package/lib/dependencies/URLContextDependency.js +1 -1
  117. package/lib/dependencies/URLDependency.js +6 -5
  118. package/lib/dependencies/WorkerAndWorkletPlugin.js +15 -21
  119. package/lib/dependencies/WorkerDependency.js +7 -7
  120. package/lib/dependencies/WorkletDependency.js +7 -11
  121. package/lib/dll/DelegatedModule.js +18 -1
  122. package/lib/dll/DllReferencePlugin.js +11 -8
  123. package/lib/dll/LibManifestPlugin.js +1 -1
  124. package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
  125. package/lib/errors/DuplicateModulesWarning.js +12 -7
  126. package/lib/errors/EmptyCopyPatternWarning.js +26 -0
  127. package/lib/errors/ExternalStarReexportError.js +44 -0
  128. package/lib/errors/HookWebpackError.js +3 -2
  129. package/lib/errors/MissingSourceMapsWarning.js +36 -0
  130. package/lib/errors/ModuleParseError.js +2 -1
  131. package/lib/errors/UnusedAssetsWarning.js +36 -0
  132. package/lib/errors/UnusedFederationWarning.js +35 -0
  133. package/lib/errors/UnusedModulesWarning.js +38 -0
  134. package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
  135. package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
  136. package/lib/esm/ModuleChunkLoadingPlugin.js +30 -11
  137. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +92 -60
  138. package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
  139. package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
  140. package/lib/hmr/LazyCompilationPlugin.js +3 -5
  141. package/lib/html/HtmlGenerator.js +72 -87
  142. package/lib/html/HtmlModulesPlugin.js +418 -200
  143. package/lib/html/HtmlParser.js +110 -147
  144. package/lib/html/builtinEmbeddedRenderer.js +107 -0
  145. package/lib/html/data.js +142 -7
  146. package/lib/html/htmlMinify.js +92 -122
  147. package/lib/html/syntax.js +1618 -1391
  148. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  149. package/lib/index.js +49 -3
  150. package/lib/javascript/ChunkFormatHelpers.js +4 -3
  151. package/lib/javascript/JavascriptGenerator.js +8 -1
  152. package/lib/javascript/JavascriptModule.js +1 -0
  153. package/lib/javascript/JavascriptModulesPlugin.js +73 -72
  154. package/lib/javascript/JavascriptParser.js +1970 -900
  155. package/lib/javascript/StartupHelpers.js +27 -3
  156. package/lib/javascript/data.js +172 -0
  157. package/lib/javascript/grammar.js +5546 -0
  158. package/lib/javascript/parser.js +1500 -0
  159. package/lib/javascript/regexp.js +1762 -0
  160. package/lib/javascript/regexpData.js +51 -0
  161. package/lib/javascript/syntax.js +9061 -5262
  162. package/lib/json/JsonGenerator.js +7 -1
  163. package/lib/library/ModuleLibraryPlugin.js +171 -132
  164. package/lib/loaders/LoaderRunner.js +137 -9
  165. package/lib/node/NodeWatchFileSystem.js +3 -9
  166. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
  167. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
  168. package/lib/optimize/AggressiveMergingPlugin.js +3 -5
  169. package/lib/optimize/ConcatenatedModule.js +178 -120
  170. package/lib/optimize/ConstExportsPlugin.js +50 -39
  171. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
  172. package/lib/optimize/InlineExports.js +20 -123
  173. package/lib/optimize/InnerGraphPlugin.js +7 -13
  174. package/lib/optimize/LimitChunkCountPlugin.js +5 -8
  175. package/lib/optimize/MangleExportsPlugin.js +13 -4
  176. package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
  177. package/lib/optimize/RealContentHashPlugin.js +68 -9
  178. package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
  179. package/lib/optimize/SplitChunksPlugin.js +2 -4
  180. package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
  181. package/lib/performance/BroadContextsPlugin.js +1 -1
  182. package/lib/performance/CacheEffectivenessPlugin.js +7 -7
  183. package/lib/performance/DuplicateModulesPlugin.js +57 -13
  184. package/lib/performance/EvalUsagePlugin.js +5 -2
  185. package/lib/performance/MissingSourceMapsPlugin.js +115 -0
  186. package/lib/performance/PureAnnotationsPlugin.js +6 -3
  187. package/lib/performance/SizeLimitsPlugin.js +2 -4
  188. package/lib/performance/TopLevelThisPlugin.js +5 -4
  189. package/lib/performance/UnusedAssetsPlugin.js +109 -0
  190. package/lib/performance/UnusedFederationPlugin.js +147 -0
  191. package/lib/performance/UnusedModulesPlugin.js +141 -0
  192. package/lib/performance/UnusedReexportsPlugin.js +1 -55
  193. package/lib/performance/isOnlyReexported.js +65 -0
  194. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
  195. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
  196. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
  197. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
  198. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
  199. package/lib/prefetch/ResourceHintPlugin.js +18 -23
  200. package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
  201. package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
  202. package/lib/rules/RuleSetCompiler.js +211 -4
  203. package/lib/runtime/AsyncModuleRuntimeModule.js +98 -66
  204. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
  205. package/lib/runtime/BaseUriRuntimeModule.js +9 -0
  206. package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
  207. package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
  208. package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
  209. package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
  210. package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
  211. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
  212. package/lib/runtime/GlobalRuntimeModule.js +11 -4
  213. package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
  214. package/lib/runtime/HelperRuntimeModule.js +10 -0
  215. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +305 -224
  216. package/lib/runtime/NonceRuntimeModule.js +9 -0
  217. package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
  218. package/lib/runtime/PublicPathRuntimeModule.js +9 -0
  219. package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
  220. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
  221. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
  222. package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
  223. package/lib/runtime/SystemContextRuntimeModule.js +9 -0
  224. package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
  225. package/lib/schemes/DataUriPlugin.js +3 -6
  226. package/lib/schemes/VirtualUrlPlugin.js +1 -1
  227. package/lib/serialization/BinaryMiddleware.js +9 -9
  228. package/lib/serialization/FileMiddleware.js +16 -16
  229. package/lib/serialization/ObjectMiddleware.js +168 -139
  230. package/lib/sharing/ConsumeSharedPlugin.js +12 -0
  231. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
  232. package/lib/sharing/ShareRuntimeModule.js +9 -0
  233. package/lib/sharing/declaredShared.js +47 -0
  234. package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
  235. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
  236. package/lib/typescript/TypeScriptPlugin.js +2 -3
  237. package/lib/url/URLParserPlugin.js +6 -8
  238. package/lib/util/LocConverter.js +4 -7
  239. package/lib/util/SourceProcessor.js +91 -91
  240. package/lib/util/async.js +292 -0
  241. package/lib/util/buildDiagnostics.js +69 -0
  242. package/lib/util/chainedImports.js +3 -4
  243. package/lib/util/concatenate.js +4 -4
  244. package/lib/util/createHooksRegistry.js +1 -2
  245. package/lib/util/dataURL.js +2 -3
  246. package/lib/util/deterministicGrouping.js +8 -13
  247. package/lib/util/findGraphRoots.js +6 -13
  248. package/lib/util/fs.js +27 -1
  249. package/lib/util/globUtils.js +1 -1
  250. package/lib/util/handlerKeys.js +40 -0
  251. package/lib/util/hash/wasm-hash.js +3 -4
  252. package/lib/util/identifier.js +20 -0
  253. package/lib/util/internalSerializables.js +5 -1
  254. package/lib/util/registerExternalSerializer.js +6 -45
  255. package/lib/util/semver.js +5 -3
  256. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +9 -0
  257. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -0
  258. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
  259. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
  260. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
  261. package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
  262. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
  263. package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
  264. package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
  265. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
  266. package/package.json +55 -46
  267. package/schemas/WebpackOptions.check.js +1 -1
  268. package/schemas/WebpackOptions.json +379 -66
  269. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  270. package/schemas/plugins/ManifestPlugin.check.js +1 -1
  271. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  272. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  273. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  274. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  275. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  276. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  277. package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
  278. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
  279. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  280. package/types.d.ts +1723 -604
  281. package/lib/dependencies/ExportBindingInitFragment.js +0 -191
  282. package/lib/errors/EntrypointOverlapWarning.js +0 -45
  283. package/lib/performance/EntrypointOverlapPlugin.js +0 -122
@@ -259,7 +259,13 @@ class JsonGenerator extends Generator {
259
259
  * @returns {Source | null} generated code
260
260
  */
261
261
  generateError(error, module, generateContext) {
262
- return new RawSource(Generator.throwBuildErrorCode(error));
262
+ return new RawSource(
263
+ Generator.throwBuildErrorCode(
264
+ error,
265
+ undefined,
266
+ generateContext.runtimeTemplate.requestShortener
267
+ )
268
+ );
263
269
  }
264
270
 
265
271
  /**
@@ -14,15 +14,17 @@ const Template = require("../Template");
14
14
  const HarmonyExportExpressionDependency = require("../dependencies/HarmonyExportExpressionDependency");
15
15
  const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
16
16
  const HarmonyExportSpecifierDependency = require("../dependencies/HarmonyExportSpecifierDependency");
17
+ const ExternalStarReexportError = require("../errors/ExternalStarReexportError");
17
18
  const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
18
19
  const ConcatenatedModule = require("../optimize/ConcatenatedModule");
19
20
  const { InlinedUsedName } = require("../optimize/InlineExports");
21
+ const { toJsStringLiteral } = require("../util/identifier");
20
22
  const {
21
23
  RESERVED_IDENTIFIER,
22
24
  SAFE_IDENTIFIER,
23
25
  propertyAccess
24
26
  } = require("../util/property");
25
- const { getEntryRuntime, getRuntimeKey } = require("../util/runtime");
27
+ const { getEntryRuntime } = require("../util/runtime");
26
28
  const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
27
29
 
28
30
  /** @import { Source } from "webpack-sources" */
@@ -37,13 +39,14 @@ const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
37
39
  /** @import Compilation from "../Compilation" */
38
40
  /** @import Compiler from "../Compiler" */
39
41
  /** @import ModuleGraph from "../ModuleGraph" */
40
- /** @import Module, { BuildMeta } from "../Module" */
42
+ /** @import Module from "../Module" */
41
43
  /**
42
44
  * @import {
43
45
  * StartupRenderContext,
44
46
  * ModuleRenderContext
45
47
  * } from "../javascript/JavascriptModulesPlugin"
46
48
  */
49
+ /** @import { ImportAttributes } from "../javascript/JavascriptParser" */
47
50
  /** @import { RuntimeSpec } from "../util/runtime" */
48
51
  /**
49
52
  * @import {
@@ -122,6 +125,18 @@ const definesOnlyNativeExports = (module, moduleGraph) => {
122
125
  const toExportName = (name) =>
123
126
  SAFE_IDENTIFIER.test(name) ? name : JSON.stringify(name);
124
127
 
128
+ /**
129
+ * Renders the import attributes of a reexport in the syntax the author wrote,
130
+ * since a legacy `assert` clause and a `with` clause are not interchangeable.
131
+ * @param {ImportAttributes | undefined} attributes the import attributes
132
+ * @returns {string} the attributes clause, empty when there are none
133
+ */
134
+ const toAttributesClause = (attributes) => {
135
+ if (!attributes) return "";
136
+ const { _isLegacyAssert: isLegacyAssert, ...values } = attributes;
137
+ return ` ${isLegacyAssert ? "assert" : "with"} ${JSON.stringify(values)}`;
138
+ };
139
+
125
140
  /**
126
141
  * Whether the export name can also be used as the declared binding name.
127
142
  * @param {string} name export name
@@ -156,73 +171,33 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
156
171
  super.apply(compiler);
157
172
 
158
173
  compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
159
- const { onDemandExportsGeneration } =
160
- ConcatenatedModule.getCompilationHooks(compilation);
161
174
  const javascriptHooks =
162
175
  JavascriptModulesPlugin.getCompilationHooks(compilation);
163
- onDemandExportsGeneration.tap(
164
- PLUGIN_NAME,
165
- (module, runtimes, source, finalName) => {
166
- /** @type {BuildMeta} */
167
- const buildMeta = module.buildMeta || (module.buildMeta = {});
168
-
169
- /** @type {BuildMeta["exportsSourceByRuntime"]} */
170
- const exportsSourceByRuntime =
171
- buildMeta.exportsSourceByRuntime ||
172
- (buildMeta.exportsSourceByRuntime = new Map());
173
-
174
- /** @type {BuildMeta["exportsFinalNameByRuntime"]} */
175
- const exportsFinalNameByRuntime =
176
- buildMeta.exportsFinalNameByRuntime ||
177
- (buildMeta.exportsFinalNameByRuntime = new Map());
178
-
179
- for (const runtime of runtimes) {
180
- const key = getRuntimeKey(runtime);
181
- exportsSourceByRuntime.set(key, source);
182
- exportsFinalNameByRuntime.set(key, finalName);
183
- }
184
176
 
185
- return true;
186
- }
187
- );
188
- // The same for a plain entry, whose definitions come from a dependency template.
189
- // Placed after the module body, which its value bindings read.
190
- javascriptHooks.onDemandExportsGeneration.tap(
191
- PLUGIN_NAME,
192
- (module, runtime, source, placeAtEnd) => {
193
- const entries = libraryEntryModules.get(compilation);
194
- if (!entries || !entries.has(module)) return;
195
- if (!definesOnlyNativeExports(module, compilation.moduleGraph)) {
196
- return;
197
- }
198
- /** @type {BuildMeta} */
199
- const buildMeta = module.buildMeta || (module.buildMeta = {});
200
- const key = getRuntimeKey(runtime);
201
- if (placeAtEnd) {
202
- const bindings =
203
- buildMeta.exportsBindingSourceByRuntime ||
204
- (buildMeta.exportsBindingSourceByRuntime = new Map());
205
- bindings.set(key, source);
206
- } else {
207
- const sources =
208
- buildMeta.exportsSourceByRuntime ||
209
- (buildMeta.exportsSourceByRuntime = new Map());
210
- // The `__esModule` marker and the definitions both land here, so
211
- // keep whichever arrived first rather than replacing it.
212
- const before = sources.get(key);
213
- sources.set(key, before ? `${before}${source}` : source);
177
+ compilation.hooks.beforeCodeGeneration.tap(PLUGIN_NAME, () => {
178
+ const entries = libraryEntryModules.get(compilation);
179
+ if (entries === undefined) return;
180
+ const { moduleGraph } = compilation;
181
+ for (const { dependencies } of compilation.entries.values()) {
182
+ for (const dep of dependencies) {
183
+ const module = dep && moduleGraph.getModule(dep);
184
+ if (!module) continue;
185
+ const root =
186
+ module instanceof ConcatenatedModule ? module.rootModule : module;
187
+ if (!entries.has(root)) continue;
188
+ if (
189
+ root === module &&
190
+ !definesOnlyNativeExports(module, moduleGraph)
191
+ ) {
192
+ continue;
193
+ }
194
+ moduleGraph.getMeta(module).onDemandExports = true;
214
195
  }
215
- return true;
216
196
  }
217
- );
197
+ });
218
198
 
219
- // `ModuleLibraryPlugin` stashes the on-demand exports source via
220
- // `onDemandExportsGeneration` and only re-emits it when the
221
- // module is wrapped in an IIFE/factory. When the entry is
222
- // inlined directly, the stashed source — and the
223
- // `definePropertyGetters` / `requireScope` runtime helpers it
224
- // pulled in — never make it into the output. Drop those helpers
225
- // from the chunk's set so the bundle stays clean.
199
+ // The stashed exports source is re-emitted only where the entry is wrapped;
200
+ // inlined directly, the helpers it pulled in have no reader and can go.
226
201
  compilation.hooks.additionalChunkRuntimeRequirements.tap(
227
202
  PLUGIN_NAME,
228
203
  (chunk, set, { chunkGraph, codeGenerationResults }) => {
@@ -240,22 +215,16 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
240
215
  if (javascriptHooks.inlineInRuntimeBailout.isUsed()) return;
241
216
 
242
217
  const [module] = chunkGraph.getChunkEntryModulesIterable(chunk);
243
- const runtimeKey = getRuntimeKey(chunk.runtime);
244
- const buildMeta = module.buildMeta;
245
- const takenOver =
246
- (buildMeta &&
247
- buildMeta.exportsSourceByRuntime &&
248
- buildMeta.exportsSourceByRuntime.has(runtimeKey)) ||
249
- (buildMeta &&
250
- buildMeta.exportsBindingSourceByRuntime &&
251
- buildMeta.exportsBindingSourceByRuntime.has(runtimeKey));
252
- if (!takenOver) return;
253
218
  const codeGenResult = codeGenerationResults.get(
254
219
  module,
255
220
  chunk.runtime
256
221
  );
257
- const jsSource =
258
- codeGenResult && codeGenResult.sources.get("javascript");
222
+ const { data } = codeGenResult;
223
+ const takenOver =
224
+ data !== undefined &&
225
+ (data.has("exportsSource") || data.has("exportsBindingSource"));
226
+ if (!takenOver) return;
227
+ const jsSource = codeGenResult.sources.get("javascript");
259
228
  if (
260
229
  jsSource &&
261
230
  String(jsSource.source()).includes(`${RuntimeGlobals.require}.`)
@@ -367,6 +336,7 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
367
336
  }
368
337
  }
369
338
  }
339
+ this._checkStarReexportedExternals(module, compilation);
370
340
  moduleGraph.addExtraReason(module, "used as library export");
371
341
  let entries = libraryEntryModules.get(compilation);
372
342
  if (entries === undefined) {
@@ -376,6 +346,61 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
376
346
  entries.add(module);
377
347
  }
378
348
 
349
+ /**
350
+ * Reports every external the entry star-reexports whose request names a property
351
+ * path, which `export *` has no way to reference.
352
+ * @param {Module} module the library entry module
353
+ * @param {Compilation} compilation the compilation
354
+ * @returns {void}
355
+ */
356
+ _checkStarReexportedExternals(module, compilation) {
357
+ const { moduleGraph } = compilation;
358
+ /** @type {Set<Module>} */
359
+ const visitedReexportModules = new Set([module]);
360
+ /** @type {Module[]} */
361
+ const queue = [module];
362
+ /** @type {Set<ExternalModule>} */
363
+ const unsupportedExternals = new Set();
364
+
365
+ for (const current of queue) {
366
+ for (const connection of moduleGraph.getOutgoingConnections(current)) {
367
+ const dep = connection.dependency;
368
+
369
+ // Only handle star-reexport statement
370
+ if (
371
+ !(dep instanceof HarmonyExportImportedSpecifierDependency) ||
372
+ dep.name !== null
373
+ ) {
374
+ continue;
375
+ }
376
+ const importedModule = connection.resolvedModule;
377
+
378
+ // Only a module providing unknown exports keeps its reexport rendered
379
+ if (
380
+ moduleGraph.getExportsInfo(importedModule)._otherExportsInfo
381
+ .provided !== null
382
+ ) {
383
+ continue;
384
+ }
385
+ if (importedModule instanceof ExternalModule) {
386
+ const request = importedModule.getResolvedRequest();
387
+ if (Array.isArray(request) && request.length > 1) {
388
+ unsupportedExternals.add(importedModule);
389
+ }
390
+ } else if (!visitedReexportModules.has(importedModule)) {
391
+ visitedReexportModules.add(importedModule);
392
+ queue.push(importedModule);
393
+ }
394
+ }
395
+ }
396
+
397
+ for (const externalModule of unsupportedExternals) {
398
+ compilation.errors.push(
399
+ new ExternalStarReexportError(externalModule, module)
400
+ );
401
+ }
402
+ }
403
+
379
404
  /**
380
405
  * Returns preprocess as needed by overriding.
381
406
  * @param {LibraryOptions} library normalized library option
@@ -415,14 +440,17 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
415
440
  ) {
416
441
  const result = new ConcatSource(source);
417
442
  /** @type {Set<string>} */
418
- const moduleRequests = new Set();
443
+ const externalReexports = new Set();
419
444
  /** @type {Map<string, string | InlinedUsedName>} */
420
445
  const unknownProvidedExports = new Map();
446
+ /** @type {Set<Module>} */
447
+ const visitedReexportModules = new Set();
421
448
 
422
449
  /**
423
450
  * Resolves dynamic star reexport.
424
451
  * @param {Module} module the module
425
452
  * @param {boolean} isDynamicReexport if module is dynamic reexported
453
+ * @returns {void}
426
454
  */
427
455
  const resolveDynamicStarReexport = (module, isDynamicReexport) => {
428
456
  for (const connection of moduleGraph.getOutgoingConnections(module)) {
@@ -445,8 +473,22 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
445
473
  ) {
446
474
  // Handle export * from 'external'
447
475
  if (importedModule instanceof ExternalModule) {
448
- moduleRequests.add(importedModule.userRequest);
449
- } else {
476
+ const request = importedModule.getResolvedRequest();
477
+ // A property path is reported by `_checkStarReexportedExternals`,
478
+ // and an absent one by the external's own build
479
+ const specifier =
480
+ typeof request === "string"
481
+ ? request
482
+ : Array.isArray(request) && request.length === 1
483
+ ? request[0]
484
+ : undefined;
485
+ if (specifier !== undefined) {
486
+ externalReexports.add(
487
+ `export * from ${toJsStringLiteral(specifier)}${toAttributesClause(dep.attributes)};\n`
488
+ );
489
+ }
490
+ } else if (!visitedReexportModules.has(importedModule)) {
491
+ visitedReexportModules.add(importedModule);
450
492
  resolveDynamicStarReexport(importedModule, true);
451
493
  }
452
494
  }
@@ -473,8 +515,8 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
473
515
 
474
516
  resolveDynamicStarReexport(module, false);
475
517
 
476
- for (const request of moduleRequests) {
477
- result.add(`export * from "${request}";\n`);
518
+ for (const reexport of externalReexports) {
519
+ result.add(reexport);
478
520
  }
479
521
 
480
522
  for (const [origin, used] of unknownProvidedExports) {
@@ -520,19 +562,13 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
520
562
  ]
521
563
  : moduleGraph.getExportsInfo(module).orderedExports;
522
564
 
523
- const exportsFinalNameByRuntime =
524
- (module.buildMeta &&
525
- module.buildMeta.exportsFinalNameByRuntime &&
526
- module.buildMeta.exportsFinalNameByRuntime.get(
527
- getRuntimeKey(chunk.runtime)
528
- )) ||
529
- {};
565
+ const { data } = codeGenerationResults.get(module, chunk.runtime);
530
566
 
531
567
  const isInlinedEntryWithoutIIFE = inlined && !inlinedInIIFE;
532
568
  // Direct export bindings from on-demand concatenation
533
- const definitions = isInlinedEntryWithoutIIFE
534
- ? exportsFinalNameByRuntime
535
- : {};
569
+ /** @type {Record<string, string>} */
570
+ const definitions =
571
+ (isInlinedEntryWithoutIIFE && data && data.get("exportsFinalName")) || {};
536
572
 
537
573
  /** @type {string[]} */
538
574
  const shortHandedExports = [];
@@ -566,15 +602,12 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
566
602
  .treatAsCommonJs;
567
603
  const skipRenderDefaultExport = Boolean(treatAsCommonJs);
568
604
 
569
- // A single (non-concatenated) inlined entry is rendered at the top
570
- // level, so its own declarations are top-level bindings we can export
571
- // directly — keeping ESM live bindings instead of snapshotting
572
- // `__webpack_exports__.x` into a `const`. Concatenated entries already
573
- // get direct bindings via `definitions` above.
605
+ // A single inlined entry renders at the top level, so its declarations are
606
+ // bindings that can be exported directly, keeping ESM live bindings rather
607
+ // than snapshotting them into a `const`.
574
608
  /** @type {Map<string, string> | undefined} */
575
609
  let directBindings;
576
610
  if (isInlinedEntryWithoutIIFE && !treatAsCommonJs) {
577
- const { data } = codeGenerationResults.get(module, chunk.runtime);
578
611
  const topLevelDeclarations =
579
612
  (data && data.get("topLevelDeclarations")) ||
580
613
  (module.buildInfo && module.buildInfo.topLevelDeclarations);
@@ -593,15 +626,8 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
593
626
  }
594
627
  }
595
628
 
596
- // Taken over by `onDemandExportsGeneration` above, and re-emitted by
597
- // `renderModuleContent` only where the module is wrapped — which is not here.
598
- const bindingsTakenOver = Boolean(
599
- module.buildMeta &&
600
- module.buildMeta.exportsBindingSourceByRuntime &&
601
- module.buildMeta.exportsBindingSourceByRuntime.has(
602
- getRuntimeKey(chunk.runtime)
603
- )
604
- );
629
+ const bindingsTakenOver =
630
+ data !== undefined && data.has("exportsBindingSource");
605
631
 
606
632
  const moduleExportsInfo = moduleGraph.getExportsInfo(module);
607
633
 
@@ -623,7 +649,7 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
623
649
  }
624
650
 
625
651
  // Try to find all known exports of the entry module
626
- outer: for (const exportInfo of exportInfos) {
652
+ for (const exportInfo of exportInfos) {
627
653
  if (!exportInfo.provided) continue;
628
654
 
629
655
  const originalName = exportInfo.name;
@@ -631,20 +657,40 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
631
657
  if (skipRenderDefaultExport && originalName === "default") continue;
632
658
 
633
659
  // Try to find all exports from the reexported modules
634
- const target = exportInfo.findTarget(moduleGraph, (_m) => true);
635
- // A namespace object target (`export * as ns from "./module"`) has no
636
- // export name, so there is nothing that could be missing
637
- if (target && target.export) {
638
- const targetExport = target.export[0];
639
- const reexportsInfo = moduleGraph.getExportsInfo(target.module);
640
- for (const reexportInfo of reexportsInfo.orderedExports) {
641
- if (
642
- reexportInfo.provided === false &&
643
- reexportInfo.name !== "default" &&
644
- reexportInfo.name === targetExport
645
- ) {
646
- continue outer;
647
- }
660
+ const target = exportInfo.getTarget(moduleGraph);
661
+
662
+ // A re-export is provided even when its target lacks the export, and
663
+ // the path can end in a property access, so every name is looked up.
664
+ if (
665
+ target &&
666
+ target.export &&
667
+ target.export[target.export.length - 1] !== "default" &&
668
+ moduleGraph
669
+ .getExportsInfo(target.module)
670
+ .isExportProvided(target.export) === false
671
+ ) {
672
+ continue;
673
+ }
674
+
675
+ if (
676
+ target &&
677
+ target.module instanceof ExternalModule &&
678
+ target.export &&
679
+ target.export.length === 1 &&
680
+ codeGenerationResults.has(target.module, chunk.runtime)
681
+ ) {
682
+ const reexport = codeGenerationResults.getData(
683
+ target.module,
684
+ chunk.runtime,
685
+ "externalReexport"
686
+ );
687
+ if (reexport) {
688
+ if (!bindingsTakenOver) needExportsDeclaration = true;
689
+ result.add(
690
+ `export { ${toExportName(target.export[0])} as ${toExportName(originalName)} } ${reexport};\n`
691
+ );
692
+ alreadyRenderedExports.add(originalName);
693
+ continue;
648
694
  }
649
695
  }
650
696
 
@@ -690,7 +736,6 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
690
736
  finalName.includes("("))
691
737
  ) {
692
738
  if (exportInfo.isReexport()) {
693
- const { data } = codeGenerationResults.get(module, chunk.runtime);
694
739
  const topLevelDeclarations =
695
740
  (data && data.get("topLevelDeclarations")) ||
696
741
  (module.buildInfo && module.buildInfo.topLevelDeclarations);
@@ -769,19 +814,13 @@ class ModuleLibraryPlugin extends AbstractLibraryPlugin {
769
814
  renderModuleContent(
770
815
  source,
771
816
  module,
772
- { factory, inlinedInIIFE, chunk },
817
+ { factory, inlinedInIIFE, chunk, codeGenerationResults },
773
818
  libraryContext
774
819
  ) {
775
- const runtimeKey = getRuntimeKey(chunk.runtime);
776
- const buildMeta = module.buildMeta;
777
- const exportsSource =
778
- buildMeta &&
779
- buildMeta.exportsSourceByRuntime &&
780
- buildMeta.exportsSourceByRuntime.get(runtimeKey);
781
- const bindingSource =
782
- buildMeta &&
783
- buildMeta.exportsBindingSourceByRuntime &&
784
- buildMeta.exportsBindingSourceByRuntime.get(runtimeKey);
820
+ const { data } = codeGenerationResults.get(module, chunk.runtime);
821
+ if (data === undefined) return source;
822
+ const exportsSource = data.get("exportsSource");
823
+ const bindingSource = data.get("exportsBindingSource");
785
824
 
786
825
  // Re-add the exports source in a factory or IIFE-wrapped startup module; value
787
826
  // bindings read the declarations above them, so those go after the body.
@@ -10,6 +10,9 @@ const { parseResource } = require("../util/identifier");
10
10
  const { adjustSourceMapForRemovedBOM } = require("../util/removeBOM");
11
11
  const loadLoader = require("./loadLoader");
12
12
 
13
+ /** @import { RawSourceMap } from "webpack-sources" */
14
+ /** @import { Environment } from "../../declarations/WebpackOptions" */
15
+
13
16
  // Set on a loader context to have each loader's own run measured. Absent
14
17
  // unless something asked for the measurement, and read once per loader.
15
18
  const LOADER_TIMING = Symbol("loader timing");
@@ -44,14 +47,139 @@ const LOADER_TIMING = Symbol("loader timing");
44
47
 
45
48
  /** @typedef {(...args: EXPECTED_ANY[]) => void} LoaderCallback */
46
49
 
47
- /** @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
+ */
48
176
 
49
177
  /**
50
178
  * The loader context as the runner sees and mutates it: the canonical
51
179
  * `LoaderRunnerLoaderContext` shape (not re-declared here), with only the fields
52
180
  * the runner assigns internally before a loader runs widened to their mutable
53
181
  * form (nullable `context`/`callback`/`async`, `LoaderObject` loaders).
54
- * @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
55
183
  */
56
184
 
57
185
  const HASH_ESCAPE_REGEXP = /#/g;
@@ -575,7 +703,7 @@ function createLoaderContext(base) {
575
703
  * Marks the request as not cacheable with the given reasons instead of
576
704
  * attributing the currently running loader (used by the host when the cause
577
705
  * lives outside the loader, e.g. in a child compilation of `importModule`).
578
- * @param {LoaderRunnerLoaderContext} loaderContext loader context
706
+ * @param {LoaderRunnerLoaderContext<EXPECTED_ANY>} loaderContext loader context
579
707
  * @param {string[]} reasons reasons why the request is not cacheable
580
708
  * @returns {void}
581
709
  */
@@ -682,12 +810,12 @@ const ACCESSORS = {
682
810
  * @returns {void}
683
811
  */
684
812
  module.exports.runLoaders = function runLoaders(options, callback) {
685
- // reuse a context already prepared by createLoaderContext (e.g. from
686
- // NormalModule), else augment the caller-provided context (or a fresh object)
687
- // in place. State is intentionally preserved across the handoff, so host hooks
688
- // (e.g. beforeLoaders) can pre-add dependencies or mark the request
689
- // non-cacheable before the run; a caller re-running on the same context should
690
- // 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.
691
819
  const provided = /** @type {EXPECTED_ANY} */ (options.context);
692
820
  const loaderContext =
693
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