webpack 5.59.0 → 5.76.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.

Potentially problematic release.


This version of webpack might be problematic. Click here for more details.

Files changed (236) hide show
  1. package/README.md +22 -24
  2. package/bin/webpack.js +0 -0
  3. package/hot/dev-server.js +17 -4
  4. package/hot/lazy-compilation-node.js +3 -1
  5. package/hot/poll.js +1 -1
  6. package/hot/signal.js +1 -1
  7. package/lib/APIPlugin.js +33 -0
  8. package/lib/BannerPlugin.js +13 -5
  9. package/lib/Cache.js +1 -1
  10. package/lib/CacheFacade.js +4 -11
  11. package/lib/Chunk.js +6 -3
  12. package/lib/ChunkGraph.js +94 -8
  13. package/lib/ChunkGroup.js +1 -1
  14. package/lib/CleanPlugin.js +81 -20
  15. package/lib/Compilation.js +188 -93
  16. package/lib/Compiler.js +87 -18
  17. package/lib/ConstPlugin.js +2 -2
  18. package/lib/ContextModule.js +142 -51
  19. package/lib/ContextModuleFactory.js +65 -25
  20. package/lib/DelegatedModule.js +1 -1
  21. package/lib/DelegatedModuleFactoryPlugin.js +1 -1
  22. package/lib/Dependency.js +17 -0
  23. package/lib/DependencyTemplate.js +9 -0
  24. package/lib/DependencyTemplates.js +1 -1
  25. package/lib/DllModule.js +1 -1
  26. package/lib/DllReferencePlugin.js +1 -1
  27. package/lib/EntryOptionPlugin.js +2 -0
  28. package/lib/ErrorHelpers.js +2 -2
  29. package/lib/EvalDevToolModulePlugin.js +16 -1
  30. package/lib/EvalSourceMapDevToolPlugin.js +25 -4
  31. package/lib/ExportsInfo.js +5 -5
  32. package/lib/ExternalModule.js +94 -54
  33. package/lib/ExternalModuleFactoryPlugin.js +5 -5
  34. package/lib/FileSystemInfo.js +124 -58
  35. package/lib/Generator.js +3 -0
  36. package/lib/HookWebpackError.js +1 -1
  37. package/lib/HotModuleReplacementPlugin.js +3 -1
  38. package/lib/LoaderOptionsPlugin.js +1 -1
  39. package/lib/Module.js +28 -4
  40. package/lib/ModuleFilenameHelpers.js +8 -4
  41. package/lib/ModuleHashingError.js +29 -0
  42. package/lib/MultiCompiler.js +1 -1
  43. package/lib/MultiWatching.js +1 -1
  44. package/lib/NodeStuffPlugin.js +13 -3
  45. package/lib/NormalModule.js +51 -33
  46. package/lib/NormalModuleFactory.js +42 -37
  47. package/lib/ProgressPlugin.js +4 -5
  48. package/lib/RawModule.js +1 -1
  49. package/lib/RuntimeGlobals.js +29 -1
  50. package/lib/RuntimeModule.js +1 -1
  51. package/lib/RuntimePlugin.js +84 -1
  52. package/lib/RuntimeTemplate.js +114 -2
  53. package/lib/Template.js +3 -2
  54. package/lib/TemplatedPathPlugin.js +48 -23
  55. package/lib/WatchIgnorePlugin.js +19 -7
  56. package/lib/Watching.js +33 -19
  57. package/lib/WebpackOptionsApply.js +79 -11
  58. package/lib/asset/AssetGenerator.js +228 -71
  59. package/lib/asset/AssetModulesPlugin.js +3 -0
  60. package/lib/asset/AssetParser.js +1 -0
  61. package/lib/asset/AssetSourceGenerator.js +31 -6
  62. package/lib/asset/AssetSourceParser.js +1 -0
  63. package/lib/asset/RawDataUrlModule.js +148 -0
  64. package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
  65. package/lib/buildChunkGraph.js +38 -7
  66. package/lib/cache/PackFileCacheStrategy.js +15 -8
  67. package/lib/cache/ResolverCachePlugin.js +90 -29
  68. package/lib/cli.js +44 -3
  69. package/lib/config/browserslistTargetHandler.js +41 -6
  70. package/lib/config/defaults.js +123 -19
  71. package/lib/config/normalization.js +10 -2
  72. package/lib/config/target.js +10 -0
  73. package/lib/container/ContainerEntryModule.js +8 -5
  74. package/lib/container/FallbackModule.js +4 -4
  75. package/lib/container/ModuleFederationPlugin.js +2 -0
  76. package/lib/container/RemoteModule.js +4 -2
  77. package/lib/container/RemoteRuntimeModule.js +8 -7
  78. package/lib/css/CssExportsGenerator.js +139 -0
  79. package/lib/css/CssGenerator.js +109 -0
  80. package/lib/css/CssLoadingRuntimeModule.js +442 -0
  81. package/lib/css/CssModulesPlugin.js +462 -0
  82. package/lib/css/CssParser.js +618 -0
  83. package/lib/css/walkCssTokens.js +659 -0
  84. package/lib/debug/ProfilingPlugin.js +24 -21
  85. package/lib/dependencies/AMDRequireDependency.js +6 -6
  86. package/lib/dependencies/CommonJsExportsParserPlugin.js +1 -2
  87. package/lib/dependencies/CommonJsFullRequireDependency.js +5 -1
  88. package/lib/dependencies/CommonJsImportsParserPlugin.js +344 -61
  89. package/lib/dependencies/CommonJsRequireContextDependency.js +6 -2
  90. package/lib/dependencies/CommonJsRequireDependency.js +2 -1
  91. package/lib/dependencies/ContextDependency.js +16 -2
  92. package/lib/dependencies/ContextDependencyHelpers.js +21 -8
  93. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  94. package/lib/dependencies/ContextElementDependency.js +25 -3
  95. package/lib/dependencies/CreateScriptUrlDependency.js +12 -0
  96. package/lib/dependencies/CssExportDependency.js +85 -0
  97. package/lib/dependencies/CssImportDependency.js +75 -0
  98. package/lib/dependencies/CssLocalIdentifierDependency.js +119 -0
  99. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +101 -0
  100. package/lib/dependencies/CssUrlDependency.js +132 -0
  101. package/lib/dependencies/ExportsInfoDependency.js +6 -0
  102. package/lib/dependencies/HarmonyAcceptImportDependency.js +5 -3
  103. package/lib/dependencies/HarmonyCompatibilityDependency.js +5 -5
  104. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +127 -0
  105. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +12 -3
  106. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +25 -17
  107. package/lib/dependencies/HarmonyExportInitFragment.js +4 -1
  108. package/lib/dependencies/HarmonyImportDependency.js +23 -0
  109. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +142 -45
  110. package/lib/dependencies/HarmonyImportSpecifierDependency.js +46 -22
  111. package/lib/dependencies/HarmonyModulesPlugin.js +10 -0
  112. package/lib/dependencies/ImportContextDependency.js +0 -2
  113. package/lib/dependencies/ImportMetaContextDependency.js +35 -0
  114. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +252 -0
  115. package/lib/dependencies/ImportMetaContextPlugin.js +59 -0
  116. package/lib/dependencies/ImportMetaPlugin.js +22 -3
  117. package/lib/dependencies/ImportParserPlugin.js +35 -29
  118. package/lib/dependencies/JsonExportsDependency.js +17 -21
  119. package/lib/dependencies/LoaderDependency.js +13 -0
  120. package/lib/dependencies/LoaderImportDependency.js +13 -0
  121. package/lib/dependencies/LoaderPlugin.js +4 -2
  122. package/lib/dependencies/ModuleDependency.js +11 -1
  123. package/lib/dependencies/ProvidedDependency.js +31 -8
  124. package/lib/dependencies/RequireContextDependency.js +0 -16
  125. package/lib/dependencies/RequireEnsureDependency.js +2 -2
  126. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  127. package/lib/dependencies/RequireResolveDependency.js +2 -1
  128. package/lib/dependencies/URLDependency.js +3 -8
  129. package/lib/dependencies/URLPlugin.js +22 -1
  130. package/lib/dependencies/WorkerPlugin.js +2 -0
  131. package/lib/esm/ModuleChunkFormatPlugin.js +74 -49
  132. package/lib/esm/ModuleChunkLoadingPlugin.js +3 -1
  133. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +25 -9
  134. package/lib/hmr/HotModuleReplacement.runtime.js +29 -14
  135. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +4 -3
  136. package/lib/hmr/LazyCompilationPlugin.js +54 -26
  137. package/lib/hmr/lazyCompilationBackend.js +51 -12
  138. package/lib/ids/DeterministicModuleIdsPlugin.js +55 -35
  139. package/lib/ids/HashedModuleIdsPlugin.js +11 -14
  140. package/lib/ids/IdHelpers.js +26 -12
  141. package/lib/ids/NamedModuleIdsPlugin.js +6 -9
  142. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  143. package/lib/ids/OccurrenceModuleIdsPlugin.js +13 -10
  144. package/lib/ids/SyncModuleIdsPlugin.js +140 -0
  145. package/lib/index.js +20 -0
  146. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +2 -2
  147. package/lib/javascript/BasicEvaluatedExpression.js +5 -2
  148. package/lib/javascript/ChunkHelpers.js +33 -0
  149. package/lib/javascript/JavascriptGenerator.js +1 -0
  150. package/lib/javascript/JavascriptModulesPlugin.js +27 -2
  151. package/lib/javascript/JavascriptParser.js +143 -73
  152. package/lib/javascript/StartupHelpers.js +7 -30
  153. package/lib/json/JsonData.js +8 -0
  154. package/lib/json/JsonParser.js +4 -6
  155. package/lib/library/AssignLibraryPlugin.js +39 -15
  156. package/lib/library/EnableLibraryPlugin.js +11 -0
  157. package/lib/library/UmdLibraryPlugin.js +5 -3
  158. package/lib/node/NodeTargetPlugin.js +3 -0
  159. package/lib/node/NodeWatchFileSystem.js +85 -31
  160. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +23 -8
  161. package/lib/node/RequireChunkLoadingRuntimeModule.js +24 -9
  162. package/lib/optimize/ConcatenatedModule.js +62 -26
  163. package/lib/optimize/ModuleConcatenationPlugin.js +26 -4
  164. package/lib/optimize/RealContentHashPlugin.js +45 -15
  165. package/lib/optimize/SplitChunksPlugin.js +8 -1
  166. package/lib/runtime/AsyncModuleRuntimeModule.js +50 -66
  167. package/lib/runtime/BaseUriRuntimeModule.js +31 -0
  168. package/lib/runtime/CreateScriptRuntimeModule.js +36 -0
  169. package/lib/runtime/CreateScriptUrlRuntimeModule.js +9 -34
  170. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +76 -0
  171. package/lib/runtime/LoadScriptRuntimeModule.js +11 -9
  172. package/lib/runtime/NonceRuntimeModule.js +24 -0
  173. package/lib/schemes/HttpUriPlugin.js +77 -14
  174. package/lib/serialization/FileMiddleware.js +44 -9
  175. package/lib/sharing/ConsumeSharedModule.js +8 -2
  176. package/lib/sharing/ConsumeSharedRuntimeModule.js +26 -5
  177. package/lib/sharing/ProvideSharedModule.js +4 -2
  178. package/lib/sharing/ProvideSharedPlugin.js +1 -2
  179. package/lib/sharing/ShareRuntimeModule.js +1 -1
  180. package/lib/sharing/utils.js +1 -1
  181. package/lib/stats/DefaultStatsFactoryPlugin.js +113 -68
  182. package/lib/stats/DefaultStatsPrinterPlugin.js +90 -25
  183. package/lib/util/ArrayHelpers.js +30 -0
  184. package/lib/util/AsyncQueue.js +1 -1
  185. package/lib/util/compileBooleanMatcher.js +1 -1
  186. package/lib/util/create-schema-validation.js +9 -2
  187. package/lib/util/createHash.js +12 -0
  188. package/lib/util/deprecation.js +10 -2
  189. package/lib/util/deterministicGrouping.js +1 -1
  190. package/lib/util/extractUrlAndGlobal.js +3 -0
  191. package/lib/util/fs.js +11 -0
  192. package/lib/util/hash/BatchedHash.js +7 -4
  193. package/lib/util/hash/md4.js +20 -0
  194. package/lib/util/hash/wasm-hash.js +163 -0
  195. package/lib/util/hash/xxhash64.js +5 -139
  196. package/lib/util/identifier.js +65 -44
  197. package/lib/util/internalSerializables.js +15 -0
  198. package/lib/util/nonNumericOnlyHash.js +22 -0
  199. package/lib/util/semver.js +17 -10
  200. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +9 -3
  201. package/lib/wasm-sync/WebAssemblyParser.js +1 -1
  202. package/lib/web/JsonpChunkLoadingRuntimeModule.js +31 -18
  203. package/lib/webpack.js +10 -3
  204. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -11
  205. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +33 -22
  206. package/module.d.ts +215 -0
  207. package/package.json +28 -32
  208. package/schemas/WebpackOptions.check.js +1 -1
  209. package/schemas/WebpackOptions.json +321 -30
  210. package/schemas/plugins/BannerPlugin.check.js +1 -1
  211. package/schemas/plugins/BannerPlugin.json +4 -0
  212. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  213. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  214. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  215. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  216. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  217. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  218. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  219. package/schemas/plugins/container/ContainerPlugin.json +2 -1
  220. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  221. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  222. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  223. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  224. package/schemas/plugins/container/ModuleFederationPlugin.json +3 -1
  225. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  226. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  227. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  228. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  229. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  230. package/schemas/plugins/css/CssParserOptions.json +3 -0
  231. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  232. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  233. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  234. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  235. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  236. package/types.d.ts +869 -296
@@ -9,7 +9,7 @@ const {
9
9
  compareModulesByPreOrderIndexOrIdentifier
10
10
  } = require("../util/comparators");
11
11
  const {
12
- getUsedModuleIds,
12
+ getUsedModuleIdsAndModules,
13
13
  getFullModuleName,
14
14
  assignDeterministicIds
15
15
  } = require("./IdHelpers");
@@ -18,8 +18,17 @@ const {
18
18
  /** @typedef {import("../Module")} Module */
19
19
 
20
20
  class DeterministicModuleIdsPlugin {
21
- constructor(options) {
22
- this.options = options || {};
21
+ /**
22
+ * @param {Object} options options
23
+ * @param {string=} options.context context relative to which module identifiers are computed
24
+ * @param {function(Module): boolean=} options.test selector function for modules
25
+ * @param {number=} options.maxLength maximum id length in digits (used as starting point)
26
+ * @param {number=} options.salt hash salt for ids
27
+ * @param {boolean=} options.fixedLength do not increase the maxLength to find an optimal id space size
28
+ * @param {boolean=} options.failOnConflict throw an error when id conflicts occur (instead of rehashing)
29
+ */
30
+ constructor(options = {}) {
31
+ this.options = options;
23
32
  }
24
33
 
25
34
  /**
@@ -31,40 +40,51 @@ class DeterministicModuleIdsPlugin {
31
40
  compiler.hooks.compilation.tap(
32
41
  "DeterministicModuleIdsPlugin",
33
42
  compilation => {
34
- compilation.hooks.moduleIds.tap(
35
- "DeterministicModuleIdsPlugin",
36
- modules => {
37
- const chunkGraph = compilation.chunkGraph;
38
- const context = this.options.context
39
- ? this.options.context
40
- : compiler.context;
41
- const maxLength = this.options.maxLength || 3;
43
+ compilation.hooks.moduleIds.tap("DeterministicModuleIdsPlugin", () => {
44
+ const chunkGraph = compilation.chunkGraph;
45
+ const context = this.options.context
46
+ ? this.options.context
47
+ : compiler.context;
48
+ const maxLength = this.options.maxLength || 3;
49
+ const failOnConflict = this.options.failOnConflict || false;
50
+ const fixedLength = this.options.fixedLength || false;
51
+ const salt = this.options.salt || 0;
52
+ let conflicts = 0;
42
53
 
43
- const usedIds = getUsedModuleIds(compilation);
44
- assignDeterministicIds(
45
- Array.from(modules).filter(module => {
46
- if (!module.needId) return false;
47
- if (chunkGraph.getNumberOfModuleChunks(module) === 0)
48
- return false;
49
- return chunkGraph.getModuleId(module) === null;
50
- }),
51
- module => getFullModuleName(module, context, compiler.root),
52
- compareModulesByPreOrderIndexOrIdentifier(
53
- compilation.moduleGraph
54
- ),
55
- (module, id) => {
56
- const size = usedIds.size;
57
- usedIds.add(`${id}`);
58
- if (size === usedIds.size) return false;
59
- chunkGraph.setModuleId(module, id);
60
- return true;
61
- },
62
- [Math.pow(10, maxLength)],
63
- 10,
64
- usedIds.size
54
+ const [usedIds, modules] = getUsedModuleIdsAndModules(
55
+ compilation,
56
+ this.options.test
57
+ );
58
+ assignDeterministicIds(
59
+ modules,
60
+ module => getFullModuleName(module, context, compiler.root),
61
+ failOnConflict
62
+ ? () => 0
63
+ : compareModulesByPreOrderIndexOrIdentifier(
64
+ compilation.moduleGraph
65
+ ),
66
+ (module, id) => {
67
+ const size = usedIds.size;
68
+ usedIds.add(`${id}`);
69
+ if (size === usedIds.size) {
70
+ conflicts++;
71
+ return false;
72
+ }
73
+ chunkGraph.setModuleId(module, id);
74
+ return true;
75
+ },
76
+ [Math.pow(10, maxLength)],
77
+ fixedLength ? 0 : 10,
78
+ usedIds.size,
79
+ salt
80
+ );
81
+ if (failOnConflict && conflicts)
82
+ throw new Error(
83
+ `Assigning deterministic module ids has lead to ${conflicts} conflict${
84
+ conflicts > 1 ? "s" : ""
85
+ }.\nIncrease the 'maxLength' to increase the id space and make conflicts less likely (recommended when there are many conflicts or application is expected to grow), or add an 'salt' number to try another hash starting value in the same id space (recommended when there is only a single conflict).`
65
86
  );
66
- }
67
- );
87
+ });
68
88
  }
69
89
  );
70
90
  }
@@ -10,7 +10,10 @@ const {
10
10
  } = require("../util/comparators");
11
11
  const createSchemaValidation = require("../util/create-schema-validation");
12
12
  const createHash = require("../util/createHash");
13
- const { getUsedModuleIds, getFullModuleName } = require("./IdHelpers");
13
+ const {
14
+ getUsedModuleIdsAndModules,
15
+ getFullModuleName
16
+ } = require("./IdHelpers");
14
17
 
15
18
  /** @typedef {import("../../declarations/plugins/HashedModuleIdsPlugin").HashedModuleIdsPluginOptions} HashedModuleIdsPluginOptions */
16
19
 
@@ -43,22 +46,16 @@ class HashedModuleIdsPlugin {
43
46
  apply(compiler) {
44
47
  const options = this.options;
45
48
  compiler.hooks.compilation.tap("HashedModuleIdsPlugin", compilation => {
46
- compilation.hooks.moduleIds.tap("HashedModuleIdsPlugin", modules => {
49
+ compilation.hooks.moduleIds.tap("HashedModuleIdsPlugin", () => {
47
50
  const chunkGraph = compilation.chunkGraph;
48
51
  const context = this.options.context
49
52
  ? this.options.context
50
53
  : compiler.context;
51
54
 
52
- const usedIds = getUsedModuleIds(compilation);
53
- const modulesInNaturalOrder = Array.from(modules)
54
- .filter(m => {
55
- if (!m.needId) return false;
56
- if (chunkGraph.getNumberOfModuleChunks(m) === 0) return false;
57
- return chunkGraph.getModuleId(module) === null;
58
- })
59
- .sort(
60
- compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
61
- );
55
+ const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
56
+ const modulesInNaturalOrder = modules.sort(
57
+ compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
58
+ );
62
59
  for (const module of modulesInNaturalOrder) {
63
60
  const ident = getFullModuleName(module, context, compiler.root);
64
61
  const hash = createHash(options.hashFunction);
@@ -67,8 +64,8 @@ class HashedModuleIdsPlugin {
67
64
  hash.digest(options.hashDigest)
68
65
  );
69
66
  let len = options.hashDigestLength;
70
- while (usedIds.has(hashId.substr(0, len))) len++;
71
- const moduleId = hashId.substr(0, len);
67
+ while (usedIds.has(hashId.slice(0, len))) len++;
68
+ const moduleId = hashId.slice(0, len);
72
69
  chunkGraph.setModuleId(module, moduleId);
73
70
  usedIds.add(moduleId);
74
71
  }
@@ -25,7 +25,7 @@ const getHash = (str, len, hashFunction) => {
25
25
  const hash = createHash(hashFunction);
26
26
  hash.update(str);
27
27
  const digest = /** @type {string} */ (hash.digest("hex"));
28
- return digest.substr(0, len);
28
+ return digest.slice(0, len);
29
29
  };
30
30
 
31
31
  /**
@@ -234,11 +234,14 @@ const addToMapOfItems = (map, key, value) => {
234
234
 
235
235
  /**
236
236
  * @param {Compilation} compilation the compilation
237
- * @returns {Set<string>} used module ids as strings
237
+ * @param {function(Module): boolean=} filter filter modules
238
+ * @returns {[Set<string>, Module[]]} used module ids as strings and modules without id matching the filter
238
239
  */
239
- const getUsedModuleIds = compilation => {
240
+ const getUsedModuleIdsAndModules = (compilation, filter) => {
240
241
  const chunkGraph = compilation.chunkGraph;
241
242
 
243
+ const modules = [];
244
+
242
245
  /** @type {Set<string>} */
243
246
  const usedIds = new Set();
244
247
  if (compilation.usedModuleIds) {
@@ -248,15 +251,23 @@ const getUsedModuleIds = compilation => {
248
251
  }
249
252
 
250
253
  for (const module of compilation.modules) {
254
+ if (!module.needId) continue;
251
255
  const moduleId = chunkGraph.getModuleId(module);
252
256
  if (moduleId !== null) {
253
257
  usedIds.add(moduleId + "");
258
+ } else {
259
+ if (
260
+ (!filter || filter(module)) &&
261
+ chunkGraph.getNumberOfModuleChunks(module) !== 0
262
+ ) {
263
+ modules.push(module);
264
+ }
254
265
  }
255
266
  }
256
267
 
257
- return usedIds;
268
+ return [usedIds, modules];
258
269
  };
259
- exports.getUsedModuleIds = getUsedModuleIds;
270
+ exports.getUsedModuleIdsAndModules = getUsedModuleIdsAndModules;
260
271
 
261
272
  /**
262
273
  * @param {Compilation} compilation the compilation
@@ -359,6 +370,7 @@ exports.assignNames = assignNames;
359
370
  * @param {number[]} ranges usable ranges for ids
360
371
  * @param {number} expandFactor factor to create more ranges
361
372
  * @param {number} extraSpace extra space to allocate, i. e. when some ids are already used
373
+ * @param {number} salt salting number to initialize hashing
362
374
  * @returns {void}
363
375
  */
364
376
  const assignDeterministicIds = (
@@ -368,13 +380,14 @@ const assignDeterministicIds = (
368
380
  assignId,
369
381
  ranges = [10],
370
382
  expandFactor = 10,
371
- extraSpace = 0
383
+ extraSpace = 0,
384
+ salt = 0
372
385
  ) => {
373
386
  items.sort(comparator);
374
387
 
375
388
  // max 5% fill rate
376
389
  const optimalRange = Math.min(
377
- Math.ceil(items.length * 20) + extraSpace,
390
+ items.length * 20 + extraSpace,
378
391
  Number.MAX_SAFE_INTEGER
379
392
  );
380
393
 
@@ -384,15 +397,17 @@ const assignDeterministicIds = (
384
397
  i++;
385
398
  if (i < ranges.length) {
386
399
  range = Math.min(ranges[i], Number.MAX_SAFE_INTEGER);
387
- } else {
400
+ } else if (expandFactor) {
388
401
  range = Math.min(range * expandFactor, Number.MAX_SAFE_INTEGER);
402
+ } else {
403
+ break;
389
404
  }
390
405
  }
391
406
 
392
407
  for (const item of items) {
393
408
  const ident = getName(item);
394
409
  let id;
395
- let i = 0;
410
+ let i = salt;
396
411
  do {
397
412
  id = numberHash(ident + i++, range);
398
413
  } while (!assignId(item, id));
@@ -401,15 +416,14 @@ const assignDeterministicIds = (
401
416
  exports.assignDeterministicIds = assignDeterministicIds;
402
417
 
403
418
  /**
419
+ * @param {Set<string>} usedIds used ids
404
420
  * @param {Iterable<Module>} modules the modules
405
421
  * @param {Compilation} compilation the compilation
406
422
  * @returns {void}
407
423
  */
408
- const assignAscendingModuleIds = (modules, compilation) => {
424
+ const assignAscendingModuleIds = (usedIds, modules, compilation) => {
409
425
  const chunkGraph = compilation.chunkGraph;
410
426
 
411
- const usedIds = getUsedModuleIds(compilation);
412
-
413
427
  let nextId = 0;
414
428
  let assignId;
415
429
  if (usedIds.size > 0) {
@@ -10,7 +10,7 @@ const {
10
10
  getShortModuleName,
11
11
  getLongModuleName,
12
12
  assignNames,
13
- getUsedModuleIds,
13
+ getUsedModuleIdsAndModules,
14
14
  assignAscendingModuleIds
15
15
  } = require("./IdHelpers");
16
16
 
@@ -31,27 +31,24 @@ class NamedModuleIdsPlugin {
31
31
  const { root } = compiler;
32
32
  compiler.hooks.compilation.tap("NamedModuleIdsPlugin", compilation => {
33
33
  const { hashFunction } = compilation.outputOptions;
34
- compilation.hooks.moduleIds.tap("NamedModuleIdsPlugin", modules => {
34
+ compilation.hooks.moduleIds.tap("NamedModuleIdsPlugin", () => {
35
35
  const chunkGraph = compilation.chunkGraph;
36
36
  const context = this.options.context
37
37
  ? this.options.context
38
38
  : compiler.context;
39
39
 
40
+ const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
40
41
  const unnamedModules = assignNames(
41
- Array.from(modules).filter(module => {
42
- if (!module.needId) return false;
43
- if (chunkGraph.getNumberOfModuleChunks(module) === 0) return false;
44
- return chunkGraph.getModuleId(module) === null;
45
- }),
42
+ modules,
46
43
  m => getShortModuleName(m, context, root),
47
44
  (m, shortName) =>
48
45
  getLongModuleName(shortName, m, context, hashFunction, root),
49
46
  compareModulesByIdentifier,
50
- getUsedModuleIds(compilation),
47
+ usedIds,
51
48
  (m, name) => chunkGraph.setModuleId(m, name)
52
49
  );
53
50
  if (unnamedModules.length > 0) {
54
- assignAscendingModuleIds(unnamedModules, compilation);
51
+ assignAscendingModuleIds(usedIds, unnamedModules, compilation);
55
52
  }
56
53
  });
57
54
  });
@@ -8,7 +8,10 @@
8
8
  const {
9
9
  compareModulesByPreOrderIndexOrIdentifier
10
10
  } = require("../util/comparators");
11
- const { assignAscendingModuleIds } = require("./IdHelpers");
11
+ const {
12
+ assignAscendingModuleIds,
13
+ getUsedModuleIdsAndModules
14
+ } = require("./IdHelpers");
12
15
 
13
16
  /** @typedef {import("../Compiler")} Compiler */
14
17
  /** @typedef {import("../Module")} Module */
@@ -22,18 +25,12 @@ class NaturalModuleIdsPlugin {
22
25
  apply(compiler) {
23
26
  compiler.hooks.compilation.tap("NaturalModuleIdsPlugin", compilation => {
24
27
  compilation.hooks.moduleIds.tap("NaturalModuleIdsPlugin", modules => {
25
- const chunkGraph = compilation.chunkGraph;
26
- const modulesInNaturalOrder = Array.from(modules)
27
- .filter(
28
- m =>
29
- m.needId &&
30
- chunkGraph.getNumberOfModuleChunks(m) > 0 &&
31
- chunkGraph.getModuleId(m) === null
32
- )
33
- .sort(
34
- compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
35
- );
36
- assignAscendingModuleIds(modulesInNaturalOrder, compilation);
28
+ const [usedIds, modulesInNaturalOrder] =
29
+ getUsedModuleIdsAndModules(compilation);
30
+ modulesInNaturalOrder.sort(
31
+ compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
32
+ );
33
+ assignAscendingModuleIds(usedIds, modulesInNaturalOrder, compilation);
37
34
  });
38
35
  });
39
36
  }
@@ -9,7 +9,10 @@ const {
9
9
  compareModulesByPreOrderIndexOrIdentifier
10
10
  } = require("../util/comparators");
11
11
  const createSchemaValidation = require("../util/create-schema-validation");
12
- const { assignAscendingModuleIds } = require("./IdHelpers");
12
+ const {
13
+ assignAscendingModuleIds,
14
+ getUsedModuleIdsAndModules
15
+ } = require("./IdHelpers");
13
16
 
14
17
  /** @typedef {import("../../declarations/plugins/ids/OccurrenceModuleIdsPlugin").OccurrenceModuleIdsPluginOptions} OccurrenceModuleIdsPluginOptions */
15
18
  /** @typedef {import("../Compiler")} Compiler */
@@ -44,15 +47,11 @@ class OccurrenceModuleIdsPlugin {
44
47
  compiler.hooks.compilation.tap("OccurrenceModuleIdsPlugin", compilation => {
45
48
  const moduleGraph = compilation.moduleGraph;
46
49
 
47
- compilation.hooks.moduleIds.tap("OccurrenceModuleIdsPlugin", modules => {
50
+ compilation.hooks.moduleIds.tap("OccurrenceModuleIdsPlugin", () => {
48
51
  const chunkGraph = compilation.chunkGraph;
49
52
 
50
- const modulesInOccurrenceOrder = Array.from(modules).filter(
51
- m =>
52
- m.needId &&
53
- chunkGraph.getNumberOfModuleChunks(m) > 0 &&
54
- chunkGraph.getModuleId(m) === null
55
- );
53
+ const [usedIds, modulesInOccurrenceOrder] =
54
+ getUsedModuleIdsAndModules(compilation);
56
55
 
57
56
  const occursInInitialChunksMap = new Map();
58
57
  const occursInAllChunksMap = new Map();
@@ -121,7 +120,7 @@ class OccurrenceModuleIdsPlugin {
121
120
  }
122
121
  }
123
122
 
124
- for (const m of modules) {
123
+ for (const m of modulesInOccurrenceOrder) {
125
124
  const result =
126
125
  countOccurs(m) +
127
126
  chunkGraph.getNumberOfModuleChunks(m) +
@@ -147,7 +146,11 @@ class OccurrenceModuleIdsPlugin {
147
146
  return naturalCompare(a, b);
148
147
  });
149
148
 
150
- assignAscendingModuleIds(modulesInOccurrenceOrder, compilation);
149
+ assignAscendingModuleIds(
150
+ usedIds,
151
+ modulesInOccurrenceOrder,
152
+ compilation
153
+ );
151
154
  });
152
155
  });
153
156
  }
@@ -0,0 +1,140 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const { WebpackError } = require("..");
9
+ const { getUsedModuleIdsAndModules } = require("./IdHelpers");
10
+
11
+ /** @typedef {import("../Compiler")} Compiler */
12
+ /** @typedef {import("../Module")} Module */
13
+
14
+ const plugin = "SyncModuleIdsPlugin";
15
+
16
+ class SyncModuleIdsPlugin {
17
+ /**
18
+ * @param {Object} options options
19
+ * @param {string} options.path path to file
20
+ * @param {string=} options.context context for module names
21
+ * @param {function(Module): boolean} options.test selector for modules
22
+ * @param {"read" | "create" | "merge" | "update"=} options.mode operation mode (defaults to merge)
23
+ */
24
+ constructor({ path, context, test, mode }) {
25
+ this._path = path;
26
+ this._context = context;
27
+ this._test = test || (() => true);
28
+ const readAndWrite = !mode || mode === "merge" || mode === "update";
29
+ this._read = readAndWrite || mode === "read";
30
+ this._write = readAndWrite || mode === "create";
31
+ this._prune = mode === "update";
32
+ }
33
+
34
+ /**
35
+ * Apply the plugin
36
+ * @param {Compiler} compiler the compiler instance
37
+ * @returns {void}
38
+ */
39
+ apply(compiler) {
40
+ /** @type {Map<string, string | number>} */
41
+ let data;
42
+ let dataChanged = false;
43
+ if (this._read) {
44
+ compiler.hooks.readRecords.tapAsync(plugin, callback => {
45
+ const fs = compiler.intermediateFileSystem;
46
+ fs.readFile(this._path, (err, buffer) => {
47
+ if (err) {
48
+ if (err.code !== "ENOENT") {
49
+ return callback(err);
50
+ }
51
+ return callback();
52
+ }
53
+ const json = JSON.parse(buffer.toString());
54
+ data = new Map();
55
+ for (const key of Object.keys(json)) {
56
+ data.set(key, json[key]);
57
+ }
58
+ dataChanged = false;
59
+ return callback();
60
+ });
61
+ });
62
+ }
63
+ if (this._write) {
64
+ compiler.hooks.emitRecords.tapAsync(plugin, callback => {
65
+ if (!data || !dataChanged) return callback();
66
+ const json = {};
67
+ const sorted = Array.from(data).sort(([a], [b]) => (a < b ? -1 : 1));
68
+ for (const [key, value] of sorted) {
69
+ json[key] = value;
70
+ }
71
+ const fs = compiler.intermediateFileSystem;
72
+ fs.writeFile(this._path, JSON.stringify(json), callback);
73
+ });
74
+ }
75
+ compiler.hooks.thisCompilation.tap(plugin, compilation => {
76
+ const associatedObjectForCache = compiler.root;
77
+ const context = this._context || compiler.context;
78
+ if (this._read) {
79
+ compilation.hooks.reviveModules.tap(plugin, (_1, _2) => {
80
+ if (!data) return;
81
+ const { chunkGraph } = compilation;
82
+ const [usedIds, modules] = getUsedModuleIdsAndModules(
83
+ compilation,
84
+ this._test
85
+ );
86
+ for (const module of modules) {
87
+ const name = module.libIdent({
88
+ context,
89
+ associatedObjectForCache
90
+ });
91
+ if (!name) continue;
92
+ const id = data.get(name);
93
+ const idAsString = `${id}`;
94
+ if (usedIds.has(idAsString)) {
95
+ const err = new WebpackError(
96
+ `SyncModuleIdsPlugin: Unable to restore id '${id}' from '${this._path}' as it's already used.`
97
+ );
98
+ err.module = module;
99
+ compilation.errors.push(err);
100
+ }
101
+ chunkGraph.setModuleId(module, id);
102
+ usedIds.add(idAsString);
103
+ }
104
+ });
105
+ }
106
+ if (this._write) {
107
+ compilation.hooks.recordModules.tap(plugin, modules => {
108
+ const { chunkGraph } = compilation;
109
+ let oldData = data;
110
+ if (!oldData) {
111
+ oldData = data = new Map();
112
+ } else if (this._prune) {
113
+ data = new Map();
114
+ }
115
+ for (const module of modules) {
116
+ if (this._test(module)) {
117
+ const name = module.libIdent({
118
+ context,
119
+ associatedObjectForCache
120
+ });
121
+ if (!name) continue;
122
+ const id = chunkGraph.getModuleId(module);
123
+ if (id === null) continue;
124
+ const oldId = oldData.get(name);
125
+ if (oldId !== id) {
126
+ dataChanged = true;
127
+ } else if (data === oldData) {
128
+ continue;
129
+ }
130
+ data.set(name, id);
131
+ }
132
+ }
133
+ if (data.size !== oldData.size) dataChanged = true;
134
+ });
135
+ }
136
+ });
137
+ }
138
+ }
139
+
140
+ module.exports = SyncModuleIdsPlugin;
package/lib/index.js CHANGED
@@ -11,6 +11,7 @@ const memoize = require("./util/memoize");
11
11
  /** @typedef {import("../declarations/WebpackOptions").Entry} Entry */
12
12
  /** @typedef {import("../declarations/WebpackOptions").EntryNormalized} EntryNormalized */
13
13
  /** @typedef {import("../declarations/WebpackOptions").EntryObject} EntryObject */
14
+ /** @typedef {import("../declarations/WebpackOptions").FileCacheOptions} FileCacheOptions */
14
15
  /** @typedef {import("../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
15
16
  /** @typedef {import("../declarations/WebpackOptions").ModuleOptions} ModuleOptions */
16
17
  /** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
@@ -19,15 +20,23 @@ const memoize = require("./util/memoize");
19
20
  /** @typedef {import("../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
20
21
  /** @typedef {import("../declarations/WebpackOptions").RuleSetUse} RuleSetUse */
21
22
  /** @typedef {import("../declarations/WebpackOptions").RuleSetUseItem} RuleSetUseItem */
23
+ /** @typedef {import("../declarations/WebpackOptions").StatsOptions} StatsOptions */
22
24
  /** @typedef {import("../declarations/WebpackOptions").WebpackOptions} Configuration */
23
25
  /** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptionsNormalized */
24
26
  /** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */
25
27
  /** @typedef {import("../declarations/WebpackOptions").WebpackPluginInstance} WebpackPluginInstance */
26
28
  /** @typedef {import("./Compilation").Asset} Asset */
27
29
  /** @typedef {import("./Compilation").AssetInfo} AssetInfo */
30
+ /** @typedef {import("./Compilation").EntryOptions} EntryOptions */
31
+ /** @typedef {import("./Compilation").PathData} PathData */
32
+ /** @typedef {import("./Compiler").AssetEmittedInfo} AssetEmittedInfo */
28
33
  /** @typedef {import("./MultiStats")} MultiStats */
29
34
  /** @typedef {import("./Parser").ParserState} ParserState */
35
+ /** @typedef {import("./ResolverFactory").ResolvePluginInstance} ResolvePluginInstance */
36
+ /** @typedef {import("./ResolverFactory").Resolver} Resolver */
30
37
  /** @typedef {import("./Watching")} Watching */
38
+ /** @typedef {import("./cli").Argument} Argument */
39
+ /** @typedef {import("./cli").Problem} Problem */
31
40
  /** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */
32
41
  /** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */
33
42
  /** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */
@@ -333,6 +342,9 @@ module.exports = mergeExports(fn, {
333
342
  get ModuleDependency() {
334
343
  return require("./dependencies/ModuleDependency");
335
344
  },
345
+ get HarmonyImportDependency() {
346
+ return require("./dependencies/HarmonyImportDependency");
347
+ },
336
348
  get ConstDependency() {
337
349
  return require("./dependencies/ConstDependency");
338
350
  },
@@ -483,6 +495,9 @@ module.exports = mergeExports(fn, {
483
495
  wasm: {
484
496
  get AsyncWebAssemblyModulesPlugin() {
485
497
  return require("./wasm-async/AsyncWebAssemblyModulesPlugin");
498
+ },
499
+ get EnableWasmLoadingPlugin() {
500
+ return require("./wasm/EnableWasmLoadingPlugin");
486
501
  }
487
502
  },
488
503
 
@@ -561,6 +576,11 @@ module.exports = mergeExports(fn, {
561
576
  get HttpUriPlugin() {
562
577
  return require("./schemes/HttpUriPlugin");
563
578
  }
579
+ },
580
+ ids: {
581
+ get SyncModuleIdsPlugin() {
582
+ return require("./ids/SyncModuleIdsPlugin");
583
+ }
564
584
  }
565
585
  }
566
586
  });
@@ -45,7 +45,7 @@ class ArrayPushCallbackChunkFormatPlugin {
45
45
  const { chunk, chunkGraph, runtimeTemplate } = renderContext;
46
46
  const hotUpdateChunk =
47
47
  chunk instanceof HotUpdateChunk ? chunk : null;
48
- const globalObject = runtimeTemplate.outputOptions.globalObject;
48
+ const globalObject = runtimeTemplate.globalObject;
49
49
  const source = new ConcatSource();
50
50
  const runtimeModules =
51
51
  chunkGraph.getChunkRuntimeModulesInOrder(chunk);
@@ -138,7 +138,7 @@ class ArrayPushCallbackChunkFormatPlugin {
138
138
  (chunk, hash, { chunkGraph, runtimeTemplate }) => {
139
139
  if (chunk.hasRuntime()) return;
140
140
  hash.update(
141
- `ArrayPushCallbackChunkFormatPlugin1${runtimeTemplate.outputOptions.chunkLoadingGlobal}${runtimeTemplate.outputOptions.hotUpdateGlobal}${runtimeTemplate.outputOptions.globalObject}`
141
+ `ArrayPushCallbackChunkFormatPlugin1${runtimeTemplate.outputOptions.chunkLoadingGlobal}${runtimeTemplate.outputOptions.hotUpdateGlobal}${runtimeTemplate.globalObject}`
142
142
  );
143
143
  const entries = Array.from(
144
144
  chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
@@ -61,12 +61,14 @@ class BasicEvaluatedExpression {
61
61
  /** @type {BasicEvaluatedExpression | undefined} */
62
62
  this.postfix = undefined;
63
63
  this.wrappedInnerExpressions = undefined;
64
- /** @type {string | undefined} */
64
+ /** @type {string | VariableInfoInterface | undefined} */
65
65
  this.identifier = undefined;
66
66
  /** @type {VariableInfoInterface} */
67
67
  this.rootInfo = undefined;
68
68
  /** @type {() => string[]} */
69
69
  this.getMembers = undefined;
70
+ /** @type {() => boolean[]} */
71
+ this.getMembersOptionals = undefined;
70
72
  /** @type {EsTreeNode} */
71
73
  this.expression = undefined;
72
74
  }
@@ -342,11 +344,12 @@ class BasicEvaluatedExpression {
342
344
  return this;
343
345
  }
344
346
 
345
- setIdentifier(identifier, rootInfo, getMembers) {
347
+ setIdentifier(identifier, rootInfo, getMembers, getMembersOptionals) {
346
348
  this.type = TypeIdentifier;
347
349
  this.identifier = identifier;
348
350
  this.rootInfo = rootInfo;
349
351
  this.getMembers = getMembers;
352
+ this.getMembersOptionals = getMembersOptionals;
350
353
  this.sideEffects = true;
351
354
  return this;
352
355
  }