webpack 5.98.0 → 5.99.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 (251) hide show
  1. package/README.md +7 -3
  2. package/lib/AsyncDependenciesBlock.js +3 -1
  3. package/lib/BannerPlugin.js +1 -1
  4. package/lib/Cache.js +9 -7
  5. package/lib/CacheFacade.js +5 -5
  6. package/lib/Chunk.js +2 -2
  7. package/lib/ChunkGraph.js +21 -16
  8. package/lib/ChunkTemplate.js +6 -6
  9. package/lib/CleanPlugin.js +10 -10
  10. package/lib/CodeGenerationResults.js +4 -3
  11. package/lib/CompatibilityPlugin.js +4 -1
  12. package/lib/Compilation.js +326 -152
  13. package/lib/Compiler.js +13 -18
  14. package/lib/ConditionalInitFragment.js +1 -1
  15. package/lib/ConstPlugin.js +5 -3
  16. package/lib/ContextModule.js +4 -2
  17. package/lib/ContextModuleFactory.js +3 -3
  18. package/lib/ContextReplacementPlugin.js +43 -16
  19. package/lib/DefinePlugin.js +25 -24
  20. package/lib/DelegatedModule.js +4 -2
  21. package/lib/DelegatedModuleFactoryPlugin.js +2 -1
  22. package/lib/Dependency.js +19 -13
  23. package/lib/DependencyTemplates.js +4 -3
  24. package/lib/DllModule.js +4 -2
  25. package/lib/DllModuleFactory.js +2 -2
  26. package/lib/DllReferencePlugin.js +2 -1
  27. package/lib/DynamicEntryPlugin.js +1 -1
  28. package/lib/EnvironmentPlugin.js +4 -2
  29. package/lib/ExportsInfo.js +72 -40
  30. package/lib/ExternalModule.js +14 -5
  31. package/lib/ExternalModuleFactoryPlugin.js +24 -12
  32. package/lib/FileSystemInfo.js +129 -94
  33. package/lib/FlagDependencyExportsPlugin.js +6 -4
  34. package/lib/FlagDependencyUsagePlugin.js +1 -1
  35. package/lib/Generator.js +29 -1
  36. package/lib/HookWebpackError.js +2 -2
  37. package/lib/HotModuleReplacementPlugin.js +3 -9
  38. package/lib/IgnoreErrorModuleFactory.js +2 -2
  39. package/lib/IgnorePlugin.js +0 -5
  40. package/lib/InitFragment.js +1 -1
  41. package/lib/LoaderOptionsPlugin.js +8 -5
  42. package/lib/MainTemplate.js +7 -7
  43. package/lib/Module.js +40 -17
  44. package/lib/ModuleBuildError.js +3 -1
  45. package/lib/ModuleDependencyError.js +4 -3
  46. package/lib/ModuleDependencyWarning.js +4 -3
  47. package/lib/ModuleFactory.js +9 -3
  48. package/lib/ModuleFilenameHelpers.js +13 -13
  49. package/lib/ModuleGraph.js +20 -14
  50. package/lib/ModuleGraphConnection.js +7 -13
  51. package/lib/ModuleNotFoundError.js +1 -1
  52. package/lib/ModuleParseError.js +2 -1
  53. package/lib/ModuleSourceTypesConstants.js +11 -0
  54. package/lib/ModuleTemplate.js +5 -5
  55. package/lib/ModuleTypeConstants.js +15 -0
  56. package/lib/MultiCompiler.js +4 -4
  57. package/lib/MultiStats.js +1 -1
  58. package/lib/NormalModule.js +101 -54
  59. package/lib/NormalModuleFactory.js +38 -33
  60. package/lib/NormalModuleReplacementPlugin.js +3 -2
  61. package/lib/NullFactory.js +2 -2
  62. package/lib/Parser.js +4 -3
  63. package/lib/ProgressPlugin.js +1 -2
  64. package/lib/RawModule.js +4 -2
  65. package/lib/RecordIdsPlugin.js +6 -2
  66. package/lib/RequestShortener.js +3 -1
  67. package/lib/ResolverFactory.js +12 -9
  68. package/lib/RuntimeModule.js +4 -2
  69. package/lib/RuntimeTemplate.js +2 -1
  70. package/lib/SelfModuleFactory.js +2 -2
  71. package/lib/SourceMapDevToolPlugin.js +0 -8
  72. package/lib/Template.js +6 -5
  73. package/lib/TemplatedPathPlugin.js +15 -12
  74. package/lib/WebpackOptionsApply.js +1 -1
  75. package/lib/asset/AssetGenerator.js +237 -170
  76. package/lib/asset/AssetModulesPlugin.js +50 -8
  77. package/lib/asset/AssetSourceGenerator.js +18 -0
  78. package/lib/asset/RawDataUrlModule.js +4 -2
  79. package/lib/buildChunkGraph.js +14 -4
  80. package/lib/cache/MemoryWithGcCachePlugin.js +6 -2
  81. package/lib/cache/PackFileCacheStrategy.js +137 -121
  82. package/lib/cache/ResolverCachePlugin.js +15 -7
  83. package/lib/cache/getLazyHashedEtag.js +4 -3
  84. package/lib/cli.js +23 -15
  85. package/lib/config/defaults.js +93 -26
  86. package/lib/config/normalization.js +14 -13
  87. package/lib/config/target.js +8 -8
  88. package/lib/container/ContainerEntryModule.js +4 -2
  89. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  90. package/lib/container/FallbackModule.js +4 -2
  91. package/lib/container/FallbackModuleFactory.js +2 -2
  92. package/lib/container/RemoteModule.js +4 -2
  93. package/lib/container/options.js +5 -5
  94. package/lib/css/CssGenerator.js +71 -9
  95. package/lib/css/CssModulesPlugin.js +30 -5
  96. package/lib/css/CssParser.js +37 -17
  97. package/lib/css/walkCssTokens.js +17 -17
  98. package/lib/debug/ProfilingPlugin.js +98 -38
  99. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +10 -4
  100. package/lib/dependencies/AMDPlugin.js +5 -2
  101. package/lib/dependencies/AMDRequireArrayDependency.js +4 -3
  102. package/lib/dependencies/AMDRequireContextDependency.js +2 -1
  103. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +15 -7
  104. package/lib/dependencies/AMDRuntimeModules.js +3 -1
  105. package/lib/dependencies/CommonJsExportRequireDependency.js +4 -5
  106. package/lib/dependencies/CommonJsExportsParserPlugin.js +3 -3
  107. package/lib/dependencies/CommonJsImportsParserPlugin.js +8 -7
  108. package/lib/dependencies/CommonJsRequireContextDependency.js +2 -1
  109. package/lib/dependencies/ContextDependencyHelpers.js +13 -6
  110. package/lib/dependencies/CssIcssExportDependency.js +15 -12
  111. package/lib/dependencies/CssIcssImportDependency.js +4 -1
  112. package/lib/dependencies/CssLocalIdentifierDependency.js +17 -14
  113. package/lib/dependencies/ExportsInfoDependency.js +6 -1
  114. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +5 -5
  115. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +22 -15
  116. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +23 -8
  117. package/lib/dependencies/HarmonyExportSpecifierDependency.js +2 -2
  118. package/lib/dependencies/HarmonyImportDependency.js +8 -6
  119. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +19 -14
  120. package/lib/dependencies/HarmonyImportSpecifierDependency.js +5 -5
  121. package/lib/dependencies/ImportContextDependency.js +2 -1
  122. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +8 -4
  123. package/lib/dependencies/JsonExportsDependency.js +24 -8
  124. package/lib/dependencies/LoaderPlugin.js +4 -14
  125. package/lib/dependencies/RequireContextDependency.js +2 -1
  126. package/lib/dependencies/RequireContextDependencyParserPlugin.js +6 -3
  127. package/lib/dependencies/RequireEnsureDependenciesBlock.js +3 -2
  128. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +11 -5
  129. package/lib/dependencies/RequireResolveContextDependency.js +1 -1
  130. package/lib/dependencies/WebAssemblyExportImportedDependency.js +1 -1
  131. package/lib/dependencies/WorkerDependency.js +6 -3
  132. package/lib/dependencies/WorkerPlugin.js +100 -41
  133. package/lib/esm/ModuleChunkFormatPlugin.js +5 -0
  134. package/lib/hmr/HotModuleReplacement.runtime.js +1 -0
  135. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +1 -0
  136. package/lib/hmr/LazyCompilationPlugin.js +32 -24
  137. package/lib/hmr/lazyCompilationBackend.js +1 -1
  138. package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
  139. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  140. package/lib/ids/IdHelpers.js +15 -14
  141. package/lib/ids/SyncModuleIdsPlugin.js +9 -5
  142. package/lib/index.js +5 -5
  143. package/lib/javascript/BasicEvaluatedExpression.js +6 -6
  144. package/lib/javascript/JavascriptGenerator.js +11 -1
  145. package/lib/javascript/JavascriptModulesPlugin.js +51 -31
  146. package/lib/javascript/JavascriptParser.js +272 -188
  147. package/lib/javascript/JavascriptParserHelpers.js +10 -9
  148. package/lib/javascript/StartupHelpers.js +4 -1
  149. package/lib/json/JsonData.js +4 -4
  150. package/lib/json/JsonGenerator.js +54 -22
  151. package/lib/json/JsonModulesPlugin.js +16 -2
  152. package/lib/json/JsonParser.js +8 -4
  153. package/lib/library/AbstractLibraryPlugin.js +7 -3
  154. package/lib/library/AssignLibraryPlugin.js +29 -1
  155. package/lib/library/EnableLibraryPlugin.js +7 -10
  156. package/lib/library/ExportPropertyLibraryPlugin.js +4 -1
  157. package/lib/library/ModuleLibraryPlugin.js +121 -15
  158. package/lib/logging/Logger.js +2 -2
  159. package/lib/logging/createConsoleLogger.js +4 -4
  160. package/lib/node/NodeEnvironmentPlugin.js +6 -2
  161. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +1 -2
  162. package/lib/node/ReadFileCompileWasmPlugin.js +1 -2
  163. package/lib/node/nodeConsole.js +3 -1
  164. package/lib/optimize/AggressiveSplittingPlugin.js +1 -1
  165. package/lib/optimize/ConcatenatedModule.js +19 -12
  166. package/lib/optimize/InnerGraph.js +3 -2
  167. package/lib/optimize/InnerGraphPlugin.js +13 -7
  168. package/lib/optimize/LimitChunkCountPlugin.js +20 -0
  169. package/lib/optimize/ModuleConcatenationPlugin.js +10 -7
  170. package/lib/optimize/RealContentHashPlugin.js +8 -4
  171. package/lib/optimize/SideEffectsFlagPlugin.js +4 -2
  172. package/lib/optimize/SplitChunksPlugin.js +87 -65
  173. package/lib/rules/BasicEffectRulePlugin.js +9 -1
  174. package/lib/rules/BasicMatcherRulePlugin.js +15 -4
  175. package/lib/rules/ObjectMatcherRulePlugin.js +12 -3
  176. package/lib/rules/RuleSetCompiler.js +25 -14
  177. package/lib/rules/UseEffectRulePlugin.js +47 -17
  178. package/lib/runtime/GetChunkFilenameRuntimeModule.js +6 -6
  179. package/lib/schemes/HttpUriPlugin.js +38 -17
  180. package/lib/serialization/BinaryMiddleware.js +52 -19
  181. package/lib/serialization/FileMiddleware.js +78 -48
  182. package/lib/serialization/ObjectMiddleware.js +78 -29
  183. package/lib/serialization/PlainObjectSerializer.js +1 -1
  184. package/lib/serialization/Serializer.js +15 -10
  185. package/lib/serialization/SerializerMiddleware.js +80 -41
  186. package/lib/serialization/SingleItemMiddleware.js +10 -7
  187. package/lib/serialization/types.js +1 -1
  188. package/lib/sharing/ConsumeSharedModule.js +4 -2
  189. package/lib/sharing/ProvideSharedModule.js +4 -2
  190. package/lib/sharing/ProvideSharedModuleFactory.js +5 -3
  191. package/lib/sharing/utils.js +2 -2
  192. package/lib/stats/DefaultStatsFactoryPlugin.js +80 -78
  193. package/lib/stats/DefaultStatsPresetPlugin.js +43 -23
  194. package/lib/stats/DefaultStatsPrinterPlugin.js +85 -43
  195. package/lib/stats/StatsFactory.js +11 -11
  196. package/lib/stats/StatsPrinter.js +7 -7
  197. package/lib/util/ArrayHelpers.js +2 -4
  198. package/lib/util/ArrayQueue.js +1 -1
  199. package/lib/util/AsyncQueue.js +4 -4
  200. package/lib/util/IterableHelpers.js +1 -1
  201. package/lib/util/LazyBucketSortedSet.js +41 -23
  202. package/lib/util/LazySet.js +3 -2
  203. package/lib/util/MapHelpers.js +1 -1
  204. package/lib/util/ParallelismFactorCalculator.js +1 -1
  205. package/lib/util/Semaphore.js +3 -3
  206. package/lib/util/SetHelpers.js +1 -1
  207. package/lib/util/SortableSet.js +9 -7
  208. package/lib/util/TupleQueue.js +9 -8
  209. package/lib/util/TupleSet.js +2 -2
  210. package/lib/util/WeakTupleMap.js +12 -11
  211. package/lib/util/binarySearchBounds.js +2 -1
  212. package/lib/util/cleverMerge.js +84 -54
  213. package/lib/util/comparators.js +22 -21
  214. package/lib/util/compileBooleanMatcher.js +3 -3
  215. package/lib/util/concatenate.js +6 -4
  216. package/lib/util/create-schema-validation.js +4 -4
  217. package/lib/util/createHash.js +2 -2
  218. package/lib/util/deprecation.js +35 -33
  219. package/lib/util/deterministicGrouping.js +6 -6
  220. package/lib/util/findGraphRoots.js +1 -1
  221. package/lib/util/fs.js +39 -39
  222. package/lib/util/hash/wasm-hash.js +2 -2
  223. package/lib/util/identifier.js +15 -18
  224. package/lib/util/makeSerializable.js +1 -1
  225. package/lib/util/memoize.js +4 -1
  226. package/lib/util/objectToMap.js +3 -2
  227. package/lib/util/processAsyncTree.js +2 -2
  228. package/lib/util/propertyName.js +0 -1
  229. package/lib/util/registerExternalSerializer.js +15 -18
  230. package/lib/util/removeBOM.js +25 -0
  231. package/lib/util/runtime.js +34 -27
  232. package/lib/util/serialization.js +5 -16
  233. package/lib/util/smartGrouping.js +3 -3
  234. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +3 -3
  235. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +11 -0
  236. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +10 -0
  237. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +4 -0
  238. package/lib/wasm-sync/WebAssemblyGenerator.js +28 -12
  239. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +10 -0
  240. package/lib/wasm-sync/WebAssemblyParser.js +9 -4
  241. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -0
  242. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -25
  243. package/package.json +19 -17
  244. package/schemas/WebpackOptions.check.js +1 -1
  245. package/schemas/WebpackOptions.json +48 -13
  246. package/schemas/plugins/JsonModulesPluginGenerator.check.d.ts +7 -0
  247. package/schemas/plugins/JsonModulesPluginGenerator.check.js +6 -0
  248. package/schemas/plugins/JsonModulesPluginGenerator.json +11 -0
  249. package/schemas/plugins/SourceMapDevToolPlugin.json +2 -2
  250. package/types.d.ts +918 -615
  251. package/lib/library/ModernModuleLibraryPlugin.js +0 -144
@@ -14,6 +14,7 @@ const numberHash = require("../util/numberHash");
14
14
  /** @typedef {import("../Compilation")} Compilation */
15
15
  /** @typedef {import("../Module")} Module */
16
16
  /** @typedef {typeof import("../util/Hash")} Hash */
17
+ /** @typedef {import("../util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
17
18
 
18
19
  /**
19
20
  * @param {string} str string to hash
@@ -75,7 +76,7 @@ const shortenLongString = (string, delimiter, hashFunction) => {
75
76
  /**
76
77
  * @param {Module} module the module
77
78
  * @param {string} context context directory
78
- * @param {object=} associatedObjectForCache an object to which the cache will be attached
79
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
79
80
  * @returns {string} short module name
80
81
  */
81
82
  const getShortModuleName = (module, context, associatedObjectForCache) => {
@@ -95,7 +96,7 @@ module.exports.getShortModuleName = getShortModuleName;
95
96
  * @param {Module} module the module
96
97
  * @param {string} context context directory
97
98
  * @param {string | Hash} hashFunction hash function to use
98
- * @param {object=} associatedObjectForCache an object to which the cache will be attached
99
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
99
100
  * @returns {string} long module name
100
101
  */
101
102
  const getLongModuleName = (
@@ -113,7 +114,7 @@ module.exports.getLongModuleName = getLongModuleName;
113
114
  /**
114
115
  * @param {Module} module the module
115
116
  * @param {string} context context directory
116
- * @param {object=} associatedObjectForCache an object to which the cache will be attached
117
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
117
118
  * @returns {string} full module name
118
119
  */
119
120
  const getFullModuleName = (module, context, associatedObjectForCache) =>
@@ -126,7 +127,7 @@ module.exports.getFullModuleName = getFullModuleName;
126
127
  * @param {string} context context directory
127
128
  * @param {string} delimiter delimiter for names
128
129
  * @param {string | Hash} hashFunction hash function to use
129
- * @param {object=} associatedObjectForCache an object to which the cache will be attached
130
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
130
131
  * @returns {string} short chunk name
131
132
  */
132
133
  const getShortChunkName = (
@@ -156,7 +157,7 @@ module.exports.getShortChunkName = getShortChunkName;
156
157
  * @param {string} context context directory
157
158
  * @param {string} delimiter delimiter for names
158
159
  * @param {string | Hash} hashFunction hash function to use
159
- * @param {object=} associatedObjectForCache an object to which the cache will be attached
160
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
160
161
  * @returns {string} short chunk name
161
162
  */
162
163
  const getLongChunkName = (
@@ -189,7 +190,7 @@ module.exports.getLongChunkName = getLongChunkName;
189
190
  * @param {Chunk} chunk the chunk
190
191
  * @param {ChunkGraph} chunkGraph the chunk graph
191
192
  * @param {string} context context directory
192
- * @param {object=} associatedObjectForCache an object to which the cache will be attached
193
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
193
194
  * @returns {string} full chunk name
194
195
  */
195
196
  const getFullChunkName = (
@@ -226,7 +227,7 @@ const addToMapOfItems = (map, key, value) => {
226
227
 
227
228
  /**
228
229
  * @param {Compilation} compilation the compilation
229
- * @param {function(Module): boolean=} filter filter modules
230
+ * @param {((module: Module) => boolean)=} filter filter modules
230
231
  * @returns {[Set<string>, Module[]]} used module ids as strings and modules without id matching the filter
231
232
  */
232
233
  const getUsedModuleIdsAndModules = (compilation, filter) => {
@@ -286,11 +287,11 @@ module.exports.getUsedChunkIds = getUsedChunkIds;
286
287
  /**
287
288
  * @template T
288
289
  * @param {Iterable<T>} items list of items to be named
289
- * @param {function(T): string} getShortName get a short name for an item
290
- * @param {function(T, string): string} getLongName get a long name for an item
291
- * @param {function(T, T): -1|0|1} comparator order of items
290
+ * @param {(item: T) => string} getShortName get a short name for an item
291
+ * @param {(item: T, name: string) => string} getLongName get a long name for an item
292
+ * @param {(a: T, b: T) => -1 | 0 | 1} comparator order of items
292
293
  * @param {Set<string>} usedIds already used ids, will not be assigned
293
- * @param {function(T, string): void} assignName assign a name to an item
294
+ * @param {(item: T, name: string) => void} assignName assign a name to an item
294
295
  * @returns {T[]} list of items without a name
295
296
  */
296
297
  const assignNames = (
@@ -354,9 +355,9 @@ module.exports.assignNames = assignNames;
354
355
  /**
355
356
  * @template T
356
357
  * @param {T[]} items list of items to be named
357
- * @param {function(T): string} getName get a name for an item
358
- * @param {function(T, T): -1|0|1} comparator order of items
359
- * @param {function(T, number): boolean} assignId assign an id to an item
358
+ * @param {(item: T) => string} getName get a name for an item
359
+ * @param {(a: T, n: T) => -1 | 0 | 1} comparator order of items
360
+ * @param {(item: T, id: number) => boolean} assignId assign an id to an item
360
361
  * @param {number[]} ranges usable ranges for ids
361
362
  * @param {number} expandFactor factor to create more ranges
362
363
  * @param {number} extraSpace extra space to allocate, i. e. when some ids are already used
@@ -14,13 +14,17 @@ const { getUsedModuleIdsAndModules } = require("./IdHelpers");
14
14
 
15
15
  const plugin = "SyncModuleIdsPlugin";
16
16
 
17
+ /**
18
+ * @typedef {object} SyncModuleIdsPluginOptions
19
+ * @property {string} path path to file
20
+ * @property {string=} context context for module names
21
+ * @property {((module: Module) => boolean)=} test selector for modules
22
+ * @property {"read" | "create" | "merge" | "update"=} mode operation mode (defaults to merge)
23
+ */
24
+
17
25
  class SyncModuleIdsPlugin {
18
26
  /**
19
- * @param {object} options options
20
- * @param {string} options.path path to file
21
- * @param {string=} options.context context for module names
22
- * @param {function(Module): boolean} options.test selector for modules
23
- * @param {"read" | "create" | "merge" | "update"=} options.mode operation mode (defaults to merge)
27
+ * @param {SyncModuleIdsPluginOptions} options options
24
28
  */
25
29
  constructor({ path, context, test, mode }) {
26
30
  this._path = path;
package/lib/index.js CHANGED
@@ -64,15 +64,15 @@ const memoize = require("./util/memoize");
64
64
  /** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
65
65
 
66
66
  /**
67
- * @template {Function} T
68
- * @param {function(): T} factory factory function
67
+ * @template {EXPECTED_FUNCTION} T
68
+ * @param {() => T} factory factory function
69
69
  * @returns {T} function
70
70
  */
71
71
  const lazyFunction = factory => {
72
72
  const fac = memoize(factory);
73
73
  const f = /** @type {any} */ (
74
74
  /**
75
- * @param {...any} args args
75
+ * @param {...EXPECTED_ANY} args args
76
76
  * @returns {T} result
77
77
  */
78
78
  (...args) => fac()(...args)
@@ -120,13 +120,13 @@ module.exports = mergeExports(fn, {
120
120
  return require("./webpack");
121
121
  },
122
122
  /**
123
- * @returns {function(Configuration | Configuration[]): void} validate fn
123
+ * @returns {(configuration: Configuration | Configuration[]) => void} validate fn
124
124
  */
125
125
  get validate() {
126
126
  const webpackOptionsSchemaCheck = require("../schemas/WebpackOptions.check.js");
127
127
  const getRealValidate = memoize(
128
128
  /**
129
- * @returns {function(Configuration | Configuration[]): void} validate fn
129
+ * @returns {(configuration: Configuration | Configuration[]) => void} validate fn
130
130
  */
131
131
  () => {
132
132
  const validateSchema = require("./validateSchema");
@@ -7,7 +7,7 @@
7
7
 
8
8
  /** @typedef {import("estree").Node} Node */
9
9
  /** @typedef {import("./JavascriptParser").Range} Range */
10
- /** @typedef {import("./JavascriptParser").VariableInfoInterface} VariableInfoInterface */
10
+ /** @typedef {import("./JavascriptParser").VariableInfo} VariableInfo */
11
11
 
12
12
  const TypeUnknown = 0;
13
13
  const TypeUndefined = 1;
@@ -51,7 +51,7 @@ class BasicEvaluatedExpression {
51
51
  this.quasis = undefined;
52
52
  /** @type {BasicEvaluatedExpression[] | undefined} */
53
53
  this.parts = undefined;
54
- /** @type {any[] | undefined} */
54
+ /** @type {EXPECTED_ANY[] | undefined} */
55
55
  this.array = undefined;
56
56
  /** @type {BasicEvaluatedExpression[] | undefined} */
57
57
  this.items = undefined;
@@ -63,9 +63,9 @@ class BasicEvaluatedExpression {
63
63
  this.postfix = undefined;
64
64
  /** @type {BasicEvaluatedExpression[] | undefined} */
65
65
  this.wrappedInnerExpressions = undefined;
66
- /** @type {string | VariableInfoInterface | undefined} */
66
+ /** @type {string | VariableInfo | undefined} */
67
67
  this.identifier = undefined;
68
- /** @type {string | VariableInfoInterface | undefined} */
68
+ /** @type {string | VariableInfo | undefined} */
69
69
  this.rootInfo = undefined;
70
70
  /** @type {(() => string[]) | undefined} */
71
71
  this.getMembers = undefined;
@@ -386,8 +386,8 @@ class BasicEvaluatedExpression {
386
386
 
387
387
  /**
388
388
  * Set's the value of this expression to a particular identifier and its members.
389
- * @param {string | VariableInfoInterface} identifier identifier to set
390
- * @param {string | VariableInfoInterface} rootInfo root info
389
+ * @param {string | VariableInfo} identifier identifier to set
390
+ * @param {string | VariableInfo} rootInfo root info
391
391
  * @param {() => string[]} getMembers members
392
392
  * @param {() => boolean[]=} getMembersOptionals optional members
393
393
  * @param {() => Range[]=} getMemberRanges ranges of progressively increasing sub-expressions
@@ -36,7 +36,7 @@ const deprecatedGetInitFragments = util.deprecate(
36
36
  * @returns {InitFragment<GenerateContext>[]} init fragments
37
37
  */
38
38
  (template, dependency, templateContext) =>
39
- /** @type {DependencyTemplate & { getInitFragments: function(Dependency, DependencyTemplateContext): InitFragment<GenerateContext>[] }} */
39
+ /** @type {DependencyTemplate & { getInitFragments: (dependency: Dependency, dependencyTemplateContext: DependencyTemplateContext) => InitFragment<GenerateContext>[] }} */
40
40
  (template).getInitFragments(dependency, templateContext),
41
41
  "DependencyTemplate.getInitFragment is deprecated (use apply(dep, source, { initFragments }) instead)",
42
42
  "DEP_WEBPACK_JAVASCRIPT_GENERATOR_GET_INIT_FRAGMENTS"
@@ -110,6 +110,16 @@ class JavascriptGenerator extends Generator {
110
110
  return InitFragment.addToSource(source, initFragments, generateContext);
111
111
  }
112
112
 
113
+ /**
114
+ * @param {Error} error the error
115
+ * @param {NormalModule} module module for which the code should be generated
116
+ * @param {GenerateContext} generateContext context for generate
117
+ * @returns {Source | null} generated code
118
+ */
119
+ generateError(error, module, generateContext) {
120
+ return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
121
+ }
122
+
113
123
  /**
114
124
  * @param {Module} module the module to generate
115
125
  * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments
@@ -26,6 +26,7 @@ const {
26
26
  JAVASCRIPT_MODULE_TYPE_ESM,
27
27
  WEBPACK_MODULE_TYPE_RUNTIME
28
28
  } = require("../ModuleTypeConstants");
29
+ const NormalModule = require("../NormalModule");
29
30
  const RuntimeGlobals = require("../RuntimeGlobals");
30
31
  const Template = require("../Template");
31
32
  const { last, someInIterable } = require("../util/IterableHelpers");
@@ -41,6 +42,7 @@ const {
41
42
  } = require("../util/concatenate");
42
43
  const createHash = require("../util/createHash");
43
44
  const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
45
+ const removeBOM = require("../util/removeBOM");
44
46
  const { intersectRuntime } = require("../util/runtime");
45
47
  const JavascriptGenerator = require("./JavascriptGenerator");
46
48
  const JavascriptParser = require("./JavascriptParser");
@@ -48,13 +50,14 @@ const JavascriptParser = require("./JavascriptParser");
48
50
  /** @typedef {import("eslint-scope").Reference} Reference */
49
51
  /** @typedef {import("eslint-scope").Scope} Scope */
50
52
  /** @typedef {import("eslint-scope").Variable} Variable */
53
+ /** @typedef {import("estree").Program} Program */
51
54
  /** @typedef {import("webpack-sources").Source} Source */
52
55
  /** @typedef {import("../../declarations/WebpackOptions").Output} OutputOptions */
53
56
  /** @typedef {import("../Chunk")} Chunk */
54
57
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
55
58
  /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
56
59
  /** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
57
- /** @typedef {import("../Compilation").ModuleObject} ModuleObject */
60
+ /** @typedef {import("../Compilation").ExecuteModuleObject} ExecuteModuleObject */
58
61
  /** @typedef {import("../Compiler")} Compiler */
59
62
  /** @typedef {import("../DependencyTemplates")} DependencyTemplates */
60
63
  /** @typedef {import("../Entrypoint")} Entrypoint */
@@ -248,7 +251,7 @@ class JavascriptModulesPlugin {
248
251
 
249
252
  constructor(options = {}) {
250
253
  this.options = options;
251
- /** @type {WeakMap<Source, TODO>} */
254
+ /** @type {WeakMap<Source, { source: Source, needModule:boolean, needExports: boolean, needRequire: boolean, needThisAsExports: boolean, needStrict: boolean | undefined }>} */
252
255
  this._moduleFactoryCache = new WeakMap();
253
256
  }
254
257
 
@@ -262,24 +265,45 @@ class JavascriptModulesPlugin {
262
265
  PLUGIN_NAME,
263
266
  (compilation, { normalModuleFactory }) => {
264
267
  const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation);
265
- normalModuleFactory.hooks.createParser
266
- .for(JAVASCRIPT_MODULE_TYPE_AUTO)
267
- .tap(PLUGIN_NAME, options => new JavascriptParser("auto"));
268
- normalModuleFactory.hooks.createParser
269
- .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
270
- .tap(PLUGIN_NAME, options => new JavascriptParser("script"));
271
- normalModuleFactory.hooks.createParser
272
- .for(JAVASCRIPT_MODULE_TYPE_ESM)
273
- .tap(PLUGIN_NAME, options => new JavascriptParser("module"));
274
- normalModuleFactory.hooks.createGenerator
275
- .for(JAVASCRIPT_MODULE_TYPE_AUTO)
276
- .tap(PLUGIN_NAME, () => new JavascriptGenerator());
277
- normalModuleFactory.hooks.createGenerator
278
- .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
279
- .tap(PLUGIN_NAME, () => new JavascriptGenerator());
280
- normalModuleFactory.hooks.createGenerator
281
- .for(JAVASCRIPT_MODULE_TYPE_ESM)
282
- .tap(PLUGIN_NAME, () => new JavascriptGenerator());
268
+
269
+ for (const type of [
270
+ JAVASCRIPT_MODULE_TYPE_AUTO,
271
+ JAVASCRIPT_MODULE_TYPE_DYNAMIC,
272
+ JAVASCRIPT_MODULE_TYPE_ESM
273
+ ]) {
274
+ normalModuleFactory.hooks.createParser
275
+ .for(type)
276
+ .tap(PLUGIN_NAME, _options => {
277
+ switch (type) {
278
+ case JAVASCRIPT_MODULE_TYPE_AUTO: {
279
+ return new JavascriptParser("auto");
280
+ }
281
+ case JAVASCRIPT_MODULE_TYPE_DYNAMIC: {
282
+ return new JavascriptParser("script");
283
+ }
284
+ case JAVASCRIPT_MODULE_TYPE_ESM: {
285
+ return new JavascriptParser("module");
286
+ }
287
+ }
288
+ });
289
+ normalModuleFactory.hooks.createGenerator
290
+ .for(type)
291
+ .tap(PLUGIN_NAME, () => new JavascriptGenerator());
292
+
293
+ NormalModule.getCompilationHooks(compilation).processResult.tap(
294
+ PLUGIN_NAME,
295
+ (result, module) => {
296
+ if (module.type === type) {
297
+ const [source, ...rest] = result;
298
+
299
+ return [removeBOM(source), ...rest];
300
+ }
301
+
302
+ return result;
303
+ }
304
+ );
305
+ }
306
+
283
307
  compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => {
284
308
  const {
285
309
  hash,
@@ -487,7 +511,7 @@ class JavascriptModulesPlugin {
487
511
  );
488
512
 
489
513
  const moduleObject =
490
- /** @type {ModuleObject} */
514
+ /** @type {ExecuteModuleObject} */
491
515
  (options.moduleObject);
492
516
 
493
517
  try {
@@ -977,7 +1001,7 @@ class JavascriptModulesPlugin {
977
1001
  const lastEntryModule =
978
1002
  /** @type {Module} */
979
1003
  (last(chunkGraph.getChunkEntryModulesIterable(chunk)));
980
- /** @type {function(string[], string): Source} */
1004
+ /** @type {(content: string[], name: string) => Source} */
981
1005
  const toSource = useSourceMap
982
1006
  ? (content, name) =>
983
1007
  new OriginalSource(Template.asString(content), name)
@@ -1506,7 +1530,7 @@ class JavascriptModulesPlugin {
1506
1530
  const renamedInlinedModules = new Map();
1507
1531
  const { runtimeTemplate } = renderContext;
1508
1532
 
1509
- /** @typedef {{ source: Source, module: Module, ast: any, variables: Set<Variable>, through: Set<Reference>, usedInNonInlined: Set<Variable>, moduleScope: Scope }} Info */
1533
+ /** @typedef {{ source: Source, module: Module, ast: Program, variables: Set<Variable>, through: Set<Reference>, usedInNonInlined: Set<Variable>, moduleScope: Scope }} Info */
1510
1534
  /** @type {Map<Module, Info>} */
1511
1535
  const inlinedModulesToInfo = new Map();
1512
1536
  /** @type {Set<string>} */
@@ -1583,12 +1607,6 @@ class JavascriptModulesPlugin {
1583
1607
  }
1584
1608
 
1585
1609
  for (const variable of info.variables) {
1586
- allUsedNames.add(variable.name);
1587
- const references = getAllReferences(variable);
1588
- const allIdentifiers = new Set(
1589
- references.map(r => r.identifier).concat(variable.identifiers)
1590
- );
1591
-
1592
1610
  const usedNamesInScopeInfo = new Map();
1593
1611
  const ignoredScopes = new Set();
1594
1612
 
@@ -1601,6 +1619,9 @@ class JavascriptModulesPlugin {
1601
1619
 
1602
1620
  if (allUsedNames.has(name) || usedNames.has(name)) {
1603
1621
  const references = getAllReferences(variable);
1622
+ const allIdentifiers = new Set(
1623
+ references.map(r => r.identifier).concat(variable.identifiers)
1624
+ );
1604
1625
  for (const ref of references) {
1605
1626
  addScopeSymbols(
1606
1627
  ref.from,
@@ -1635,9 +1656,8 @@ class JavascriptModulesPlugin {
1635
1656
  }
1636
1657
  source.replace(r[0], r[1] - 1, newName);
1637
1658
  }
1638
- } else {
1639
- allUsedNames.add(name);
1640
1659
  }
1660
+ allUsedNames.add(name);
1641
1661
  }
1642
1662
 
1643
1663
  renamedInlinedModules.set(m, source);