webpack 5.99.6 → 5.99.8

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 (219) hide show
  1. package/lib/AutomaticPrefetchPlugin.js +21 -22
  2. package/lib/BannerPlugin.js +31 -35
  3. package/lib/CleanPlugin.js +5 -3
  4. package/lib/Compilation.js +21 -15
  5. package/lib/Compiler.js +2 -1
  6. package/lib/ContextExclusionPlugin.js +4 -2
  7. package/lib/ContextModule.js +1 -1
  8. package/lib/ContextModuleFactory.js +1 -2
  9. package/lib/ContextReplacementPlugin.js +7 -4
  10. package/lib/DefinePlugin.js +2 -2
  11. package/lib/DelegatedModule.js +18 -8
  12. package/lib/DelegatedModuleFactoryPlugin.js +9 -7
  13. package/lib/DelegatedPlugin.js +4 -2
  14. package/lib/DllEntryPlugin.js +4 -2
  15. package/lib/DllPlugin.js +5 -3
  16. package/lib/DllReferencePlugin.js +56 -60
  17. package/lib/DynamicEntryPlugin.js +4 -2
  18. package/lib/EntryOptionPlugin.js +3 -1
  19. package/lib/EntryPlugin.js +4 -2
  20. package/lib/EnvironmentPlugin.js +4 -2
  21. package/lib/EvalDevToolModulePlugin.js +9 -7
  22. package/lib/EvalSourceMapDevToolPlugin.js +138 -139
  23. package/lib/ExportsInfo.js +35 -16
  24. package/lib/ExternalModule.js +6 -5
  25. package/lib/ExternalsPlugin.js +3 -1
  26. package/lib/FileSystemInfo.js +2 -2
  27. package/lib/FlagDependencyExportsPlugin.js +2 -1
  28. package/lib/IgnorePlugin.js +6 -4
  29. package/lib/IgnoreWarningsPlugin.js +4 -2
  30. package/lib/LibManifestPlugin.js +5 -6
  31. package/lib/LoaderOptionsPlugin.js +4 -2
  32. package/lib/LoaderTargetPlugin.js +4 -2
  33. package/lib/Module.js +19 -12
  34. package/lib/ModuleFilenameHelpers.js +8 -4
  35. package/lib/ModuleInfoHeaderPlugin.js +11 -12
  36. package/lib/MultiCompiler.js +5 -3
  37. package/lib/NoEmitOnErrorsPlugin.js +5 -3
  38. package/lib/NormalModule.js +13 -8
  39. package/lib/NormalModuleReplacementPlugin.js +33 -36
  40. package/lib/PlatformPlugin.js +3 -1
  41. package/lib/PrefetchPlugin.js +4 -2
  42. package/lib/ProgressPlugin.js +23 -26
  43. package/lib/RecordIdsPlugin.js +72 -102
  44. package/lib/RuntimePlugin.js +34 -32
  45. package/lib/SourceMapDevToolPlugin.js +9 -8
  46. package/lib/WarnCaseSensitiveModulesPlugin.js +36 -37
  47. package/lib/WarnNoModeSetPlugin.js +3 -1
  48. package/lib/WatchIgnorePlugin.js +3 -1
  49. package/lib/WebpackError.js +11 -3
  50. package/lib/WebpackOptionsApply.js +6 -7
  51. package/lib/asset/AssetGenerator.js +2 -2
  52. package/lib/async-modules/InferAsyncModulesPlugin.js +25 -26
  53. package/lib/cache/IdleFileCachePlugin.js +11 -12
  54. package/lib/cache/MemoryWithGcCachePlugin.js +7 -5
  55. package/lib/cache/ResolverCachePlugin.js +8 -6
  56. package/lib/cli.js +5 -1
  57. package/lib/config/defaults.js +10 -6
  58. package/lib/config/normalization.js +14 -8
  59. package/lib/container/ContainerReferencePlugin.js +24 -26
  60. package/lib/container/ModuleFederationPlugin.js +2 -1
  61. package/lib/css/CssGenerator.js +1 -1
  62. package/lib/css/CssModulesPlugin.js +8 -6
  63. package/lib/debug/ProfilingPlugin.js +18 -21
  64. package/lib/dependencies/CommonJsImportsParserPlugin.js +1 -1
  65. package/lib/dependencies/ContextElementDependency.js +1 -1
  66. package/lib/dependencies/CssLocalIdentifierDependency.js +2 -2
  67. package/lib/dependencies/HarmonyDetectionParserPlugin.js +9 -15
  68. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -15
  69. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +4 -2
  70. package/lib/dependencies/LoaderPlugin.js +5 -3
  71. package/lib/dependencies/RequireContextDependencyParserPlugin.js +46 -46
  72. package/lib/dependencies/RequireContextPlugin.js +2 -1
  73. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +94 -100
  74. package/lib/dependencies/WorkerPlugin.js +2 -2
  75. package/lib/esm/ModuleChunkLoadingPlugin.js +72 -73
  76. package/lib/hmr/HotModuleReplacement.runtime.js +0 -1
  77. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +0 -2
  78. package/lib/hmr/LazyCompilationPlugin.js +17 -18
  79. package/lib/ids/ChunkModuleIdRangePlugin.js +6 -6
  80. package/lib/ids/DeterministicModuleIdsPlugin.js +47 -48
  81. package/lib/ids/HashedModuleIdsPlugin.js +4 -2
  82. package/lib/ids/NamedChunkIdsPlugin.js +4 -2
  83. package/lib/ids/NamedModuleIdsPlugin.js +4 -2
  84. package/lib/ids/NaturalChunkIdsPlugin.js +4 -2
  85. package/lib/ids/NaturalModuleIdsPlugin.js +4 -2
  86. package/lib/ids/OccurrenceChunkIdsPlugin.js +4 -2
  87. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -2
  88. package/lib/index.js +11 -0
  89. package/lib/javascript/JavascriptModulesPlugin.js +2 -2
  90. package/lib/javascript/JavascriptParser.js +634 -656
  91. package/lib/json/JsonModulesPlugin.js +4 -4
  92. package/lib/library/AbstractLibraryPlugin.js +1 -1
  93. package/lib/library/ModuleLibraryPlugin.js +60 -42
  94. package/lib/node/CommonJsChunkLoadingPlugin.js +69 -73
  95. package/lib/node/NodeEnvironmentPlugin.js +3 -1
  96. package/lib/node/nodeConsole.js +3 -2
  97. package/lib/optimize/AggressiveSplittingPlugin.js +224 -232
  98. package/lib/optimize/ConcatenatedModule.js +15 -16
  99. package/lib/optimize/FlagIncludedChunksPlugin.js +92 -97
  100. package/lib/optimize/LimitChunkCountPlugin.js +4 -2
  101. package/lib/optimize/MangleExportsPlugin.js +15 -16
  102. package/lib/optimize/MinChunkSizePlugin.js +4 -2
  103. package/lib/optimize/ModuleConcatenationPlugin.js +6 -4
  104. package/lib/optimize/RealContentHashPlugin.js +4 -2
  105. package/lib/optimize/RemoveEmptyChunksPlugin.js +5 -3
  106. package/lib/optimize/RemoveParentModulesPlugin.js +4 -2
  107. package/lib/optimize/RuntimeChunkPlugin.js +21 -23
  108. package/lib/optimize/SideEffectsFlagPlugin.js +9 -6
  109. package/lib/optimize/SplitChunksPlugin.js +9 -7
  110. package/lib/performance/SizeLimitsPlugin.js +3 -1
  111. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +61 -62
  112. package/lib/rules/BasicEffectRulePlugin.js +1 -2
  113. package/lib/rules/ObjectMatcherRulePlugin.js +2 -1
  114. package/lib/rules/RuleSetCompiler.js +19 -5
  115. package/lib/rules/UseEffectRulePlugin.js +4 -6
  116. package/lib/runtime/StartupChunkDependenciesPlugin.js +39 -42
  117. package/lib/schemes/DataUriPlugin.js +5 -3
  118. package/lib/schemes/FileUriPlugin.js +5 -3
  119. package/lib/schemes/HttpUriPlugin.js +186 -188
  120. package/lib/serialization/AggregateErrorSerializer.js +42 -0
  121. package/lib/serialization/ErrorObjectSerializer.js +7 -2
  122. package/lib/serialization/ObjectMiddleware.js +13 -0
  123. package/lib/sharing/ProvideSharedPlugin.js +6 -4
  124. package/lib/stats/DefaultStatsFactoryPlugin.js +89 -33
  125. package/lib/stats/DefaultStatsPresetPlugin.js +25 -20
  126. package/lib/stats/DefaultStatsPrinterPlugin.js +306 -341
  127. package/lib/util/concatenate.js +4 -2
  128. package/lib/util/createHash.js +3 -3
  129. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +55 -57
  130. package/lib/web/JsonpChunkLoadingPlugin.js +73 -74
  131. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +77 -78
  132. package/package.json +35 -30
  133. package/schemas/WebpackOptions.check.d.ts +1 -1
  134. package/schemas/WebpackOptions.check.js +2 -2
  135. package/schemas/WebpackOptions.json +267 -26
  136. package/schemas/plugins/BannerPlugin.check.d.ts +1 -1
  137. package/schemas/plugins/BannerPlugin.check.js +1 -1
  138. package/schemas/plugins/DllPlugin.check.d.ts +1 -1
  139. package/schemas/plugins/DllPlugin.check.js +1 -1
  140. package/schemas/plugins/DllReferencePlugin.check.d.ts +1 -1
  141. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  142. package/schemas/plugins/HashedModuleIdsPlugin.check.d.ts +1 -1
  143. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  144. package/schemas/plugins/IgnorePlugin.check.d.ts +1 -1
  145. package/schemas/plugins/IgnorePlugin.check.js +1 -1
  146. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +1 -1
  147. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  148. package/schemas/plugins/ProgressPlugin.check.d.ts +1 -1
  149. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  150. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +1 -1
  151. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  152. package/schemas/plugins/SourceMapDevToolPlugin.json +2 -2
  153. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +1 -1
  154. package/schemas/plugins/WatchIgnorePlugin.check.js +1 -1
  155. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +1 -1
  156. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  157. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +1 -1
  158. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  159. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +1 -1
  160. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  161. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +1 -1
  162. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  163. package/schemas/plugins/container/ContainerPlugin.check.d.ts +1 -1
  164. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  165. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +1 -1
  166. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  167. package/schemas/plugins/container/ExternalsType.check.d.ts +1 -1
  168. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  169. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +1 -1
  170. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  171. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +1 -1
  172. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +1 -1
  173. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +1 -1
  174. package/schemas/plugins/css/CssAutoParserOptions.check.js +1 -1
  175. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +1 -1
  176. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
  177. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +1 -1
  178. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +1 -1
  179. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +1 -1
  180. package/schemas/plugins/css/CssGlobalParserOptions.check.js +1 -1
  181. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +1 -1
  182. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +1 -1
  183. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +1 -1
  184. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  185. package/schemas/plugins/css/CssParserOptions.check.d.ts +1 -1
  186. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  187. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +1 -1
  188. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  189. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +1 -1
  190. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -1
  191. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +1 -1
  192. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -1
  193. package/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts +7 -0
  194. package/schemas/plugins/{JsonModulesPluginGenerator.check.js → json/JsonModulesPluginGenerator.check.js} +1 -1
  195. package/schemas/plugins/json/JsonModulesPluginGenerator.json +3 -0
  196. package/schemas/plugins/json/JsonModulesPluginParser.check.d.ts +7 -0
  197. package/schemas/plugins/{JsonModulesPluginParser.check.js → json/JsonModulesPluginParser.check.js} +1 -1
  198. package/schemas/plugins/json/JsonModulesPluginParser.json +3 -0
  199. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +1 -1
  200. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  201. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +1 -1
  202. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  203. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +1 -1
  204. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -1
  205. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +1 -1
  206. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  207. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +1 -1
  208. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  209. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +1 -1
  210. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +1 -1
  211. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +1 -1
  212. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +1 -1
  213. package/schemas/plugins/sharing/SharePlugin.check.d.ts +1 -1
  214. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  215. package/types.d.ts +587 -207
  216. package/schemas/plugins/JsonModulesPluginGenerator.check.d.ts +0 -7
  217. package/schemas/plugins/JsonModulesPluginGenerator.json +0 -11
  218. package/schemas/plugins/JsonModulesPluginParser.check.d.ts +0 -7
  219. package/schemas/plugins/JsonModulesPluginParser.json +0 -16
@@ -101,13 +101,15 @@ const TREE_DEPENDENCIES = {
101
101
  [RuntimeGlobals.shareScopeMap]: [RuntimeGlobals.hasOwnProperty]
102
102
  };
103
103
 
104
+ const PLUGIN_NAME = "RuntimePlugin";
105
+
104
106
  class RuntimePlugin {
105
107
  /**
106
108
  * @param {Compiler} compiler the Compiler
107
109
  * @returns {void}
108
110
  */
109
111
  apply(compiler) {
110
- compiler.hooks.compilation.tap("RuntimePlugin", compilation => {
112
+ compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
111
113
  const globalChunkLoading = compilation.outputOptions.chunkLoading;
112
114
  /**
113
115
  * @param {Chunk} chunk chunk
@@ -128,12 +130,12 @@ class RuntimePlugin {
128
130
  for (const req of GLOBALS_ON_REQUIRE) {
129
131
  compilation.hooks.runtimeRequirementInModule
130
132
  .for(req)
131
- .tap("RuntimePlugin", (module, set) => {
133
+ .tap(PLUGIN_NAME, (module, set) => {
132
134
  set.add(RuntimeGlobals.requireScope);
133
135
  });
134
136
  compilation.hooks.runtimeRequirementInTree
135
137
  .for(req)
136
- .tap("RuntimePlugin", (module, set) => {
138
+ .tap(PLUGIN_NAME, (module, set) => {
137
139
  set.add(RuntimeGlobals.requireScope);
138
140
  });
139
141
  }
@@ -142,7 +144,7 @@ class RuntimePlugin {
142
144
  TREE_DEPENDENCIES[/** @type {keyof TREE_DEPENDENCIES} */ (req)];
143
145
  compilation.hooks.runtimeRequirementInTree
144
146
  .for(req)
145
- .tap("RuntimePlugin", (chunk, set) => {
147
+ .tap(PLUGIN_NAME, (chunk, set) => {
146
148
  for (const dep of deps) set.add(dep);
147
149
  });
148
150
  }
@@ -151,13 +153,13 @@ class RuntimePlugin {
151
153
  MODULE_DEPENDENCIES[/** @type {keyof MODULE_DEPENDENCIES} */ (req)];
152
154
  compilation.hooks.runtimeRequirementInModule
153
155
  .for(req)
154
- .tap("RuntimePlugin", (chunk, set) => {
156
+ .tap(PLUGIN_NAME, (chunk, set) => {
155
157
  for (const dep of deps) set.add(dep);
156
158
  });
157
159
  }
158
160
  compilation.hooks.runtimeRequirementInTree
159
161
  .for(RuntimeGlobals.definePropertyGetters)
160
- .tap("RuntimePlugin", chunk => {
162
+ .tap(PLUGIN_NAME, chunk => {
161
163
  compilation.addRuntimeModule(
162
164
  chunk,
163
165
  new DefinePropertyGettersRuntimeModule()
@@ -166,7 +168,7 @@ class RuntimePlugin {
166
168
  });
167
169
  compilation.hooks.runtimeRequirementInTree
168
170
  .for(RuntimeGlobals.makeNamespaceObject)
169
- .tap("RuntimePlugin", chunk => {
171
+ .tap(PLUGIN_NAME, chunk => {
170
172
  compilation.addRuntimeModule(
171
173
  chunk,
172
174
  new MakeNamespaceObjectRuntimeModule()
@@ -175,7 +177,7 @@ class RuntimePlugin {
175
177
  });
176
178
  compilation.hooks.runtimeRequirementInTree
177
179
  .for(RuntimeGlobals.createFakeNamespaceObject)
178
- .tap("RuntimePlugin", chunk => {
180
+ .tap(PLUGIN_NAME, chunk => {
179
181
  compilation.addRuntimeModule(
180
182
  chunk,
181
183
  new CreateFakeNamespaceObjectRuntimeModule()
@@ -184,7 +186,7 @@ class RuntimePlugin {
184
186
  });
185
187
  compilation.hooks.runtimeRequirementInTree
186
188
  .for(RuntimeGlobals.hasOwnProperty)
187
- .tap("RuntimePlugin", chunk => {
189
+ .tap(PLUGIN_NAME, chunk => {
188
190
  compilation.addRuntimeModule(
189
191
  chunk,
190
192
  new HasOwnPropertyRuntimeModule()
@@ -193,7 +195,7 @@ class RuntimePlugin {
193
195
  });
194
196
  compilation.hooks.runtimeRequirementInTree
195
197
  .for(RuntimeGlobals.compatGetDefaultExport)
196
- .tap("RuntimePlugin", chunk => {
198
+ .tap(PLUGIN_NAME, chunk => {
197
199
  compilation.addRuntimeModule(
198
200
  chunk,
199
201
  new CompatGetDefaultExportRuntimeModule()
@@ -202,13 +204,13 @@ class RuntimePlugin {
202
204
  });
203
205
  compilation.hooks.runtimeRequirementInTree
204
206
  .for(RuntimeGlobals.runtimeId)
205
- .tap("RuntimePlugin", chunk => {
207
+ .tap(PLUGIN_NAME, chunk => {
206
208
  compilation.addRuntimeModule(chunk, new RuntimeIdRuntimeModule());
207
209
  return true;
208
210
  });
209
211
  compilation.hooks.runtimeRequirementInTree
210
212
  .for(RuntimeGlobals.publicPath)
211
- .tap("RuntimePlugin", (chunk, set) => {
213
+ .tap(PLUGIN_NAME, (chunk, set) => {
212
214
  const { outputOptions } = compilation;
213
215
  const { publicPath: globalPublicPath, scriptType } = outputOptions;
214
216
  const entryOptions = chunk.getEntryOptions();
@@ -237,19 +239,19 @@ class RuntimePlugin {
237
239
  });
238
240
  compilation.hooks.runtimeRequirementInTree
239
241
  .for(RuntimeGlobals.global)
240
- .tap("RuntimePlugin", chunk => {
242
+ .tap(PLUGIN_NAME, chunk => {
241
243
  compilation.addRuntimeModule(chunk, new GlobalRuntimeModule());
242
244
  return true;
243
245
  });
244
246
  compilation.hooks.runtimeRequirementInTree
245
247
  .for(RuntimeGlobals.asyncModule)
246
- .tap("RuntimePlugin", chunk => {
248
+ .tap(PLUGIN_NAME, chunk => {
247
249
  compilation.addRuntimeModule(chunk, new AsyncModuleRuntimeModule());
248
250
  return true;
249
251
  });
250
252
  compilation.hooks.runtimeRequirementInTree
251
253
  .for(RuntimeGlobals.systemContext)
252
- .tap("RuntimePlugin", chunk => {
254
+ .tap(PLUGIN_NAME, chunk => {
253
255
  const entryOptions = chunk.getEntryOptions();
254
256
  const libraryType =
255
257
  entryOptions && entryOptions.library !== undefined
@@ -267,7 +269,7 @@ class RuntimePlugin {
267
269
  });
268
270
  compilation.hooks.runtimeRequirementInTree
269
271
  .for(RuntimeGlobals.getChunkScriptFilename)
270
- .tap("RuntimePlugin", (chunk, set, { chunkGraph }) => {
272
+ .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
271
273
  if (
272
274
  typeof compilation.outputOptions.chunkFilename === "string" &&
273
275
  /\[(full)?hash(:\d+)?\]/.test(
@@ -297,7 +299,7 @@ class RuntimePlugin {
297
299
  });
298
300
  compilation.hooks.runtimeRequirementInTree
299
301
  .for(RuntimeGlobals.getChunkCssFilename)
300
- .tap("RuntimePlugin", (chunk, set, { chunkGraph }) => {
302
+ .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
301
303
  if (
302
304
  typeof compilation.outputOptions.cssChunkFilename === "string" &&
303
305
  /\[(full)?hash(:\d+)?\]/.test(
@@ -322,7 +324,7 @@ class RuntimePlugin {
322
324
  });
323
325
  compilation.hooks.runtimeRequirementInTree
324
326
  .for(RuntimeGlobals.getChunkUpdateScriptFilename)
325
- .tap("RuntimePlugin", (chunk, set) => {
327
+ .tap(PLUGIN_NAME, (chunk, set) => {
326
328
  if (
327
329
  /\[(full)?hash(:\d+)?\]/.test(
328
330
  /** @type {NonNullable<OutputNormalized["hotUpdateChunkFilename"]>} */
@@ -346,7 +348,7 @@ class RuntimePlugin {
346
348
  });
347
349
  compilation.hooks.runtimeRequirementInTree
348
350
  .for(RuntimeGlobals.getUpdateManifestFilename)
349
- .tap("RuntimePlugin", (chunk, set) => {
351
+ .tap(PLUGIN_NAME, (chunk, set) => {
350
352
  if (
351
353
  /\[(full)?hash(:\d+)?\]/.test(
352
354
  /** @type {NonNullable<OutputNormalized["hotUpdateMainFilename"]>} */
@@ -368,7 +370,7 @@ class RuntimePlugin {
368
370
  });
369
371
  compilation.hooks.runtimeRequirementInTree
370
372
  .for(RuntimeGlobals.ensureChunk)
371
- .tap("RuntimePlugin", (chunk, set) => {
373
+ .tap(PLUGIN_NAME, (chunk, set) => {
372
374
  const hasAsyncChunks = chunk.hasAsyncChunks();
373
375
  if (hasAsyncChunks) {
374
376
  set.add(RuntimeGlobals.ensureChunkHandlers);
@@ -381,18 +383,18 @@ class RuntimePlugin {
381
383
  });
382
384
  compilation.hooks.runtimeRequirementInTree
383
385
  .for(RuntimeGlobals.ensureChunkIncludeEntries)
384
- .tap("RuntimePlugin", (chunk, set) => {
386
+ .tap(PLUGIN_NAME, (chunk, set) => {
385
387
  set.add(RuntimeGlobals.ensureChunkHandlers);
386
388
  });
387
389
  compilation.hooks.runtimeRequirementInTree
388
390
  .for(RuntimeGlobals.shareScopeMap)
389
- .tap("RuntimePlugin", (chunk, set) => {
391
+ .tap(PLUGIN_NAME, (chunk, set) => {
390
392
  compilation.addRuntimeModule(chunk, new ShareRuntimeModule());
391
393
  return true;
392
394
  });
393
395
  compilation.hooks.runtimeRequirementInTree
394
396
  .for(RuntimeGlobals.loadScript)
395
- .tap("RuntimePlugin", (chunk, set) => {
397
+ .tap(PLUGIN_NAME, (chunk, set) => {
396
398
  const withCreateScriptUrl = Boolean(
397
399
  compilation.outputOptions.trustedTypes
398
400
  );
@@ -408,7 +410,7 @@ class RuntimePlugin {
408
410
  });
409
411
  compilation.hooks.runtimeRequirementInTree
410
412
  .for(RuntimeGlobals.createScript)
411
- .tap("RuntimePlugin", (chunk, set) => {
413
+ .tap(PLUGIN_NAME, (chunk, set) => {
412
414
  if (compilation.outputOptions.trustedTypes) {
413
415
  set.add(RuntimeGlobals.getTrustedTypesPolicy);
414
416
  }
@@ -417,7 +419,7 @@ class RuntimePlugin {
417
419
  });
418
420
  compilation.hooks.runtimeRequirementInTree
419
421
  .for(RuntimeGlobals.createScriptUrl)
420
- .tap("RuntimePlugin", (chunk, set) => {
422
+ .tap(PLUGIN_NAME, (chunk, set) => {
421
423
  if (compilation.outputOptions.trustedTypes) {
422
424
  set.add(RuntimeGlobals.getTrustedTypesPolicy);
423
425
  }
@@ -429,7 +431,7 @@ class RuntimePlugin {
429
431
  });
430
432
  compilation.hooks.runtimeRequirementInTree
431
433
  .for(RuntimeGlobals.getTrustedTypesPolicy)
432
- .tap("RuntimePlugin", (chunk, set) => {
434
+ .tap(PLUGIN_NAME, (chunk, set) => {
433
435
  compilation.addRuntimeModule(
434
436
  chunk,
435
437
  new GetTrustedTypesPolicyRuntimeModule(set)
@@ -438,13 +440,13 @@ class RuntimePlugin {
438
440
  });
439
441
  compilation.hooks.runtimeRequirementInTree
440
442
  .for(RuntimeGlobals.relativeUrl)
441
- .tap("RuntimePlugin", (chunk, set) => {
443
+ .tap(PLUGIN_NAME, (chunk, set) => {
442
444
  compilation.addRuntimeModule(chunk, new RelativeUrlRuntimeModule());
443
445
  return true;
444
446
  });
445
447
  compilation.hooks.runtimeRequirementInTree
446
448
  .for(RuntimeGlobals.onChunksLoaded)
447
- .tap("RuntimePlugin", (chunk, set) => {
449
+ .tap(PLUGIN_NAME, (chunk, set) => {
448
450
  compilation.addRuntimeModule(
449
451
  chunk,
450
452
  new OnChunksLoadedRuntimeModule()
@@ -453,7 +455,7 @@ class RuntimePlugin {
453
455
  });
454
456
  compilation.hooks.runtimeRequirementInTree
455
457
  .for(RuntimeGlobals.baseURI)
456
- .tap("RuntimePlugin", chunk => {
458
+ .tap(PLUGIN_NAME, chunk => {
457
459
  if (isChunkLoadingDisabledForChunk(chunk)) {
458
460
  compilation.addRuntimeModule(chunk, new BaseUriRuntimeModule());
459
461
  return true;
@@ -461,13 +463,13 @@ class RuntimePlugin {
461
463
  });
462
464
  compilation.hooks.runtimeRequirementInTree
463
465
  .for(RuntimeGlobals.scriptNonce)
464
- .tap("RuntimePlugin", chunk => {
466
+ .tap(PLUGIN_NAME, chunk => {
465
467
  compilation.addRuntimeModule(chunk, new NonceRuntimeModule());
466
468
  return true;
467
469
  });
468
470
  // TODO webpack 6: remove CompatRuntimeModule
469
471
  compilation.hooks.additionalTreeRuntimeRequirements.tap(
470
- "RuntimePlugin",
472
+ PLUGIN_NAME,
471
473
  (chunk, set) => {
472
474
  const { mainTemplate } = compilation;
473
475
  if (
@@ -481,7 +483,7 @@ class RuntimePlugin {
481
483
  }
482
484
  );
483
485
  JavascriptModulesPlugin.getCompilationHooks(compilation).chunkHash.tap(
484
- "RuntimePlugin",
486
+ PLUGIN_NAME,
485
487
  (chunk, hash, { chunkGraph }) => {
486
488
  const xor = new StringXor();
487
489
  for (const m of chunkGraph.getChunkRuntimeModulesIterable(chunk)) {
@@ -19,6 +19,7 @@ const { makePathsAbsolute } = require("./util/identifier");
19
19
 
20
20
  /** @typedef {import("webpack-sources").MapOptions} MapOptions */
21
21
  /** @typedef {import("webpack-sources").Source} Source */
22
+ /** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
22
23
  /** @typedef {import("../declarations/plugins/SourceMapDevToolPlugin").SourceMapDevToolPluginOptions} SourceMapDevToolPluginOptions */
23
24
  /** @typedef {import("./Cache").Etag} Etag */
24
25
  /** @typedef {import("./CacheFacade").ItemCacheFacade} ItemCacheFacade */
@@ -29,8 +30,6 @@ const { makePathsAbsolute } = require("./util/identifier");
29
30
  /** @typedef {import("./Module")} Module */
30
31
  /** @typedef {import("./NormalModule").SourceMap} SourceMap */
31
32
  /** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
32
- /** @typedef {import("./util/Hash")} Hash */
33
- /** @typedef {import("./util/createHash").Algorithm} Algorithm */
34
33
  /** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
35
34
 
36
35
  const validate = createSchemaValidation(
@@ -131,6 +130,8 @@ const getTaskForFile = (
131
130
  };
132
131
  };
133
132
 
133
+ const PLUGIN_NAME = "SourceMapDevToolPlugin";
134
+
134
135
  class SourceMapDevToolPlugin {
135
136
  /**
136
137
  * @param {SourceMapDevToolPluginOptions=} options options object
@@ -178,18 +179,18 @@ class SourceMapDevToolPlugin {
178
179
  options
179
180
  );
180
181
 
181
- compiler.hooks.compilation.tap("SourceMapDevToolPlugin", compilation => {
182
+ compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
182
183
  new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
183
184
 
184
185
  compilation.hooks.processAssets.tapAsync(
185
186
  {
186
- name: "SourceMapDevToolPlugin",
187
+ name: PLUGIN_NAME,
187
188
  stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
188
189
  additionalAssets: true
189
190
  },
190
191
  (assets, callback) => {
191
192
  const chunkGraph = compilation.chunkGraph;
192
- const cache = compilation.getCache("SourceMapDevToolPlugin");
193
+ const cache = compilation.getCache(PLUGIN_NAME);
193
194
  /** @type {Map<string | Module, string>} */
194
195
  const moduleToSourceNameMapping = new Map();
195
196
  const reportProgress =
@@ -487,7 +488,7 @@ class SourceMapDevToolPlugin {
487
488
  (
488
489
  usesContentHash &&
489
490
  createHash(
490
- /** @type {Algorithm} */
491
+ /** @type {HashFunction} */
491
492
  (compilation.outputOptions.hashFunction)
492
493
  )
493
494
  .update(sourceMapString)
@@ -552,12 +553,12 @@ class SourceMapDevToolPlugin {
552
553
  } else {
553
554
  if (currentSourceMappingURLComment === false) {
554
555
  throw new Error(
555
- "SourceMapDevToolPlugin: append can't be false when no filename is provided"
556
+ `${PLUGIN_NAME}: append can't be false when no filename is provided`
556
557
  );
557
558
  }
558
559
  if (typeof currentSourceMappingURLComment === "function") {
559
560
  throw new Error(
560
- "SourceMapDevToolPlugin: append can't be a function when no filename is provided"
561
+ `${PLUGIN_NAME}: append can't be a function when no filename is provided`
561
562
  );
562
563
  }
563
564
  /**
@@ -11,6 +11,8 @@ const CaseSensitiveModulesWarning = require("./CaseSensitiveModulesWarning");
11
11
  /** @typedef {import("./Module")} Module */
12
12
  /** @typedef {import("./NormalModule")} NormalModule */
13
13
 
14
+ const PLUGIN_NAME = "WarnCaseSensitiveModulesPlugin";
15
+
14
16
  class WarnCaseSensitiveModulesPlugin {
15
17
  /**
16
18
  * Apply the plugin
@@ -18,47 +20,44 @@ class WarnCaseSensitiveModulesPlugin {
18
20
  * @returns {void}
19
21
  */
20
22
  apply(compiler) {
21
- compiler.hooks.compilation.tap(
22
- "WarnCaseSensitiveModulesPlugin",
23
- compilation => {
24
- compilation.hooks.seal.tap("WarnCaseSensitiveModulesPlugin", () => {
25
- /** @type {Map<string, Map<string, Module>>} */
26
- const moduleWithoutCase = new Map();
27
- for (const module of compilation.modules) {
28
- const identifier = module.identifier();
23
+ compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
24
+ compilation.hooks.seal.tap(PLUGIN_NAME, () => {
25
+ /** @type {Map<string, Map<string, Module>>} */
26
+ const moduleWithoutCase = new Map();
27
+ for (const module of compilation.modules) {
28
+ const identifier = module.identifier();
29
29
 
30
- // Ignore `data:` URLs, because it's not a real path
31
- if (
32
- /** @type {NormalModule} */
33
- (module).resourceResolveData !== undefined &&
34
- /** @type {NormalModule} */
35
- (module).resourceResolveData.encodedContent !== undefined
36
- ) {
37
- continue;
38
- }
30
+ // Ignore `data:` URLs, because it's not a real path
31
+ if (
32
+ /** @type {NormalModule} */
33
+ (module).resourceResolveData !== undefined &&
34
+ /** @type {NormalModule} */
35
+ (module).resourceResolveData.encodedContent !== undefined
36
+ ) {
37
+ continue;
38
+ }
39
39
 
40
- const lowerIdentifier = identifier.toLowerCase();
41
- let map = moduleWithoutCase.get(lowerIdentifier);
42
- if (map === undefined) {
43
- map = new Map();
44
- moduleWithoutCase.set(lowerIdentifier, map);
45
- }
46
- map.set(identifier, module);
40
+ const lowerIdentifier = identifier.toLowerCase();
41
+ let map = moduleWithoutCase.get(lowerIdentifier);
42
+ if (map === undefined) {
43
+ map = new Map();
44
+ moduleWithoutCase.set(lowerIdentifier, map);
47
45
  }
48
- for (const pair of moduleWithoutCase) {
49
- const map = pair[1];
50
- if (map.size > 1) {
51
- compilation.warnings.push(
52
- new CaseSensitiveModulesWarning(
53
- map.values(),
54
- compilation.moduleGraph
55
- )
56
- );
57
- }
46
+ map.set(identifier, module);
47
+ }
48
+ for (const pair of moduleWithoutCase) {
49
+ const map = pair[1];
50
+ if (map.size > 1) {
51
+ compilation.warnings.push(
52
+ new CaseSensitiveModulesWarning(
53
+ map.values(),
54
+ compilation.moduleGraph
55
+ )
56
+ );
58
57
  }
59
- });
60
- }
61
- );
58
+ }
59
+ });
60
+ });
62
61
  }
63
62
  }
64
63
 
@@ -9,6 +9,8 @@ const NoModeWarning = require("./NoModeWarning");
9
9
 
10
10
  /** @typedef {import("./Compiler")} Compiler */
11
11
 
12
+ const PLUGIN_NAME = "WarnNoModeSetPlugin";
13
+
12
14
  class WarnNoModeSetPlugin {
13
15
  /**
14
16
  * Apply the plugin
@@ -16,7 +18,7 @@ class WarnNoModeSetPlugin {
16
18
  * @returns {void}
17
19
  */
18
20
  apply(compiler) {
19
- compiler.hooks.thisCompilation.tap("WarnNoModeSetPlugin", compilation => {
21
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
20
22
  compilation.warnings.push(new NoModeWarning());
21
23
  });
22
24
  }
@@ -125,6 +125,8 @@ class IgnoringWatchFileSystem {
125
125
  }
126
126
  }
127
127
 
128
+ const PLUGIN_NAME = "WatchIgnorePlugin";
129
+
128
130
  class WatchIgnorePlugin {
129
131
  /**
130
132
  * @param {WatchIgnorePluginOptions} options options
@@ -140,7 +142,7 @@ class WatchIgnorePlugin {
140
142
  * @returns {void}
141
143
  */
142
144
  apply(compiler) {
143
- compiler.hooks.afterEnvironment.tap("WatchIgnorePlugin", () => {
145
+ compiler.hooks.afterEnvironment.tap(PLUGIN_NAME, () => {
144
146
  compiler.watchFileSystem = new IgnoringWatchFileSystem(
145
147
  /** @type {WatchFileSystem} */
146
148
  (compiler.watchFileSystem),
@@ -18,9 +18,11 @@ class WebpackError extends Error {
18
18
  /**
19
19
  * Creates an instance of WebpackError.
20
20
  * @param {string=} message error message
21
+ * @param {{ cause?: unknown }} options error options
21
22
  */
22
- constructor(message) {
23
- super(message);
23
+ constructor(message, options = {}) {
24
+ // @ts-expect-error ES2018 doesn't `Error.cause`, but it can be used by developers
25
+ super(message, options);
24
26
 
25
27
  /** @type {string=} */
26
28
  this.details = undefined;
@@ -37,7 +39,11 @@ class WebpackError extends Error {
37
39
  }
38
40
 
39
41
  [inspect]() {
40
- return this.stack + (this.details ? `\n${this.details}` : "");
42
+ return (
43
+ this.stack +
44
+ (this.details ? `\n${this.details}` : "") +
45
+ (this.cause ? `\n${this.cause}` : "")
46
+ );
41
47
  }
42
48
 
43
49
  /**
@@ -47,6 +53,7 @@ class WebpackError extends Error {
47
53
  write(this.name);
48
54
  write(this.message);
49
55
  write(this.stack);
56
+ write(this.cause);
50
57
  write(this.details);
51
58
  write(this.loc);
52
59
  write(this.hideStack);
@@ -59,6 +66,7 @@ class WebpackError extends Error {
59
66
  this.name = read();
60
67
  this.message = read();
61
68
  this.stack = read();
69
+ this.cause = read();
62
70
  this.details = read();
63
71
  this.loc = read();
64
72
  this.hideStack = read();
@@ -63,6 +63,8 @@ const { cleverMerge } = require("./util/cleverMerge");
63
63
  /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
64
64
  /** @typedef {import("./util/fs").IntermediateFileSystem} IntermediateFileSystem */
65
65
 
66
+ const CLASS_NAME = "WebpackOptionsApply";
67
+
66
68
  class WebpackOptionsApply extends OptionsApply {
67
69
  constructor() {
68
70
  super();
@@ -502,10 +504,7 @@ class WebpackOptionsApply extends OptionsApply {
502
504
  }
503
505
  if (options.optimization.runtimeChunk) {
504
506
  const RuntimeChunkPlugin = require("./optimize/RuntimeChunkPlugin");
505
- new RuntimeChunkPlugin(
506
- /** @type {{ name?: (entrypoint: { name: string }) => string }} */
507
- (options.optimization.runtimeChunk)
508
- ).apply(compiler);
507
+ new RuntimeChunkPlugin(options.optimization.runtimeChunk).apply(compiler);
509
508
  }
510
509
  if (!options.optimization.emitOnErrors) {
511
510
  const NoEmitOnErrorsPlugin = require("./NoEmitOnErrorsPlugin");
@@ -764,7 +763,7 @@ class WebpackOptionsApply extends OptionsApply {
764
763
  }
765
764
  compiler.resolverFactory.hooks.resolveOptions
766
765
  .for("normal")
767
- .tap("WebpackOptionsApply", resolveOptions => {
766
+ .tap(CLASS_NAME, resolveOptions => {
768
767
  resolveOptions = cleverMerge(options.resolve, resolveOptions);
769
768
  resolveOptions.fileSystem =
770
769
  /** @type {InputFileSystem} */
@@ -773,7 +772,7 @@ class WebpackOptionsApply extends OptionsApply {
773
772
  });
774
773
  compiler.resolverFactory.hooks.resolveOptions
775
774
  .for("context")
776
- .tap("WebpackOptionsApply", resolveOptions => {
775
+ .tap(CLASS_NAME, resolveOptions => {
777
776
  resolveOptions = cleverMerge(options.resolve, resolveOptions);
778
777
  resolveOptions.fileSystem =
779
778
  /** @type {InputFileSystem} */
@@ -783,7 +782,7 @@ class WebpackOptionsApply extends OptionsApply {
783
782
  });
784
783
  compiler.resolverFactory.hooks.resolveOptions
785
784
  .for("loader")
786
- .tap("WebpackOptionsApply", resolveOptions => {
785
+ .tap(CLASS_NAME, resolveOptions => {
787
786
  resolveOptions = cleverMerge(options.resolveLoader, resolveOptions);
788
787
  resolveOptions.fileSystem =
789
788
  /** @type {InputFileSystem} */
@@ -33,6 +33,7 @@ const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
33
33
  /** @typedef {import("../../declarations/WebpackOptions").AssetModuleFilename} AssetModuleFilename */
34
34
  /** @typedef {import("../../declarations/WebpackOptions").AssetModuleOutputPath} AssetModuleOutputPath */
35
35
  /** @typedef {import("../../declarations/WebpackOptions").AssetResourceGeneratorOptions} AssetResourceGeneratorOptions */
36
+ /** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
36
37
  /** @typedef {import("../../declarations/WebpackOptions").RawPublicPath} RawPublicPath */
37
38
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
38
39
  /** @typedef {import("../Compilation")} Compilation */
@@ -51,7 +52,6 @@ const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
51
52
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
52
53
  /** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
53
54
  /** @typedef {import("../util/Hash")} Hash */
54
- /** @typedef {import("../util/createHash").Algorithm} Algorithm */
55
55
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
56
56
 
57
57
  /**
@@ -232,7 +232,7 @@ class AssetGenerator extends Generator {
232
232
  */
233
233
  static getFullContentHash(module, runtimeTemplate) {
234
234
  const hash = createHash(
235
- /** @type {Algorithm} */
235
+ /** @type {HashFunction} */
236
236
  (runtimeTemplate.outputOptions.hashFunction)
237
237
  );
238
238
 
@@ -10,6 +10,8 @@ const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency
10
10
  /** @typedef {import("../Compiler")} Compiler */
11
11
  /** @typedef {import("../Module")} Module */
12
12
 
13
+ const PLUGIN_NAME = "InferAsyncModulesPlugin";
14
+
13
15
  class InferAsyncModulesPlugin {
14
16
  /**
15
17
  * Apply the plugin
@@ -17,37 +19,34 @@ class InferAsyncModulesPlugin {
17
19
  * @returns {void}
18
20
  */
19
21
  apply(compiler) {
20
- compiler.hooks.compilation.tap("InferAsyncModulesPlugin", compilation => {
22
+ compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
21
23
  const { moduleGraph } = compilation;
22
- compilation.hooks.finishModules.tap(
23
- "InferAsyncModulesPlugin",
24
- modules => {
25
- /** @type {Set<Module>} */
26
- const queue = new Set();
27
- for (const module of modules) {
28
- if (module.buildMeta && module.buildMeta.async) {
29
- queue.add(module);
30
- }
24
+ compilation.hooks.finishModules.tap(PLUGIN_NAME, modules => {
25
+ /** @type {Set<Module>} */
26
+ const queue = new Set();
27
+ for (const module of modules) {
28
+ if (module.buildMeta && module.buildMeta.async) {
29
+ queue.add(module);
31
30
  }
32
- for (const module of queue) {
33
- moduleGraph.setAsync(module);
34
- for (const [
35
- originModule,
36
- connections
37
- ] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
38
- if (
39
- connections.some(
40
- c =>
41
- c.dependency instanceof HarmonyImportDependency &&
42
- c.isTargetActive(undefined)
43
- )
44
- ) {
45
- queue.add(/** @type {Module} */ (originModule));
46
- }
31
+ }
32
+ for (const module of queue) {
33
+ moduleGraph.setAsync(module);
34
+ for (const [
35
+ originModule,
36
+ connections
37
+ ] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
38
+ if (
39
+ connections.some(
40
+ c =>
41
+ c.dependency instanceof HarmonyImportDependency &&
42
+ c.isTargetActive(undefined)
43
+ )
44
+ ) {
45
+ queue.add(/** @type {Module} */ (originModule));
47
46
  }
48
47
  }
49
48
  }
50
- );
49
+ });
51
50
  });
52
51
  }
53
52
  }