webpack 5.95.0 → 5.96.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 (145) hide show
  1. package/README.md +1 -1
  2. package/lib/AsyncDependenciesBlock.js +1 -1
  3. package/lib/BannerPlugin.js +2 -1
  4. package/lib/Chunk.js +30 -0
  5. package/lib/ChunkGraph.js +11 -6
  6. package/lib/ChunkGroup.js +2 -2
  7. package/lib/CleanPlugin.js +4 -5
  8. package/lib/CodeGenerationResults.js +6 -5
  9. package/lib/Compilation.js +71 -48
  10. package/lib/Compiler.js +7 -5
  11. package/lib/ConcatenationScope.js +7 -20
  12. package/lib/ContextModule.js +7 -8
  13. package/lib/CssModule.js +25 -21
  14. package/lib/DefinePlugin.js +14 -8
  15. package/lib/DelegatedModule.js +3 -3
  16. package/lib/DllModule.js +4 -4
  17. package/lib/DynamicEntryPlugin.js +29 -22
  18. package/lib/EvalDevToolModulePlugin.js +5 -2
  19. package/lib/EvalSourceMapDevToolPlugin.js +5 -2
  20. package/lib/ExternalModule.js +40 -7
  21. package/lib/ExternalModuleFactoryPlugin.js +33 -9
  22. package/lib/FileSystemInfo.js +12 -8
  23. package/lib/Generator.js +5 -4
  24. package/lib/HotModuleReplacementPlugin.js +8 -6
  25. package/lib/IgnorePlugin.js +19 -1
  26. package/lib/LoaderOptionsPlugin.js +3 -1
  27. package/lib/Module.js +9 -8
  28. package/lib/ModuleSourceTypesConstants.js +100 -0
  29. package/lib/NormalModule.js +27 -17
  30. package/lib/NormalModuleFactory.js +38 -22
  31. package/lib/OptionsApply.js +12 -1
  32. package/lib/ProgressPlugin.js +50 -10
  33. package/lib/RawModule.js +3 -4
  34. package/lib/RuntimeModule.js +3 -4
  35. package/lib/RuntimePlugin.js +11 -4
  36. package/lib/RuntimeTemplate.js +13 -42
  37. package/lib/SourceMapDevToolPlugin.js +10 -7
  38. package/lib/Watching.js +2 -2
  39. package/lib/WebpackOptionsApply.js +42 -21
  40. package/lib/asset/AssetGenerator.js +347 -194
  41. package/lib/asset/AssetModulesPlugin.js +2 -1
  42. package/lib/asset/AssetSourceGenerator.js +82 -27
  43. package/lib/asset/RawDataUrlModule.js +5 -4
  44. package/lib/buildChunkGraph.js +2 -2
  45. package/lib/cache/PackFileCacheStrategy.js +69 -31
  46. package/lib/cache/ResolverCachePlugin.js +248 -173
  47. package/lib/config/defaults.js +134 -126
  48. package/lib/container/ContainerEntryModule.js +3 -4
  49. package/lib/container/ContainerPlugin.js +8 -0
  50. package/lib/container/FallbackModule.js +2 -2
  51. package/lib/container/HoistContainerReferencesPlugin.js +250 -0
  52. package/lib/container/ModuleFederationPlugin.js +38 -1
  53. package/lib/container/RemoteModule.js +4 -2
  54. package/lib/container/RemoteRuntimeModule.js +4 -2
  55. package/lib/css/CssExportsGenerator.js +16 -12
  56. package/lib/css/CssGenerator.js +22 -16
  57. package/lib/css/CssLoadingRuntimeModule.js +7 -6
  58. package/lib/css/CssModulesPlugin.js +122 -77
  59. package/lib/css/CssParser.js +655 -526
  60. package/lib/css/walkCssTokens.js +1168 -338
  61. package/lib/debug/ProfilingPlugin.js +5 -0
  62. package/lib/dependencies/CommonJsExportsParserPlugin.js +5 -2
  63. package/lib/dependencies/CommonJsImportsParserPlugin.js +3 -6
  64. package/lib/dependencies/CssExportDependency.js +3 -3
  65. package/lib/dependencies/CssLocalIdentifierDependency.js +26 -17
  66. package/lib/dependencies/CssUrlDependency.js +33 -3
  67. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +3 -3
  68. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +39 -14
  69. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +15 -82
  70. package/lib/dependencies/HarmonyImportSpecifierDependency.js +5 -2
  71. package/lib/dependencies/ImportParserPlugin.js +9 -7
  72. package/lib/dependencies/LoaderPlugin.js +19 -0
  73. package/lib/dependencies/SystemPlugin.js +2 -1
  74. package/lib/dependencies/URLPlugin.js +7 -1
  75. package/lib/dependencies/WorkerPlugin.js +1 -1
  76. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +4 -2
  77. package/lib/hmr/HotModuleReplacement.runtime.js +1 -0
  78. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +1 -0
  79. package/lib/hmr/LazyCompilationPlugin.js +16 -4
  80. package/lib/hmr/lazyCompilationBackend.js +1 -7
  81. package/lib/index.js +35 -6
  82. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  83. package/lib/javascript/JavascriptGenerator.js +8 -8
  84. package/lib/javascript/JavascriptModulesPlugin.js +126 -73
  85. package/lib/javascript/JavascriptParser.js +338 -117
  86. package/lib/json/JsonGenerator.js +5 -5
  87. package/lib/library/EnableLibraryPlugin.js +2 -2
  88. package/lib/library/ExportPropertyLibraryPlugin.js +1 -1
  89. package/lib/library/UmdLibraryPlugin.js +16 -8
  90. package/lib/logging/Logger.js +11 -11
  91. package/lib/logging/createConsoleLogger.js +14 -14
  92. package/lib/logging/truncateArgs.js +1 -1
  93. package/lib/node/NodeWatchFileSystem.js +3 -1
  94. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +20 -18
  95. package/lib/node/ReadFileCompileWasmPlugin.js +1 -2
  96. package/lib/node/nodeConsole.js +11 -8
  97. package/lib/optimize/AggressiveSplittingPlugin.js +21 -7
  98. package/lib/optimize/ConcatenatedModule.js +43 -145
  99. package/lib/optimize/FlagIncludedChunksPlugin.js +6 -0
  100. package/lib/optimize/InnerGraphPlugin.js +57 -16
  101. package/lib/optimize/LimitChunkCountPlugin.js +2 -4
  102. package/lib/optimize/ModuleConcatenationPlugin.js +4 -2
  103. package/lib/optimize/RealContentHashPlugin.js +1 -1
  104. package/lib/optimize/SideEffectsFlagPlugin.js +6 -3
  105. package/lib/rules/RuleSetCompiler.js +2 -2
  106. package/lib/runtime/GetChunkFilenameRuntimeModule.js +2 -2
  107. package/lib/schemes/DataUriPlugin.js +1 -1
  108. package/lib/serialization/BinaryMiddleware.js +32 -19
  109. package/lib/serialization/ObjectMiddleware.js +23 -9
  110. package/lib/serialization/SerializerMiddleware.js +3 -2
  111. package/lib/serialization/types.js +2 -2
  112. package/lib/sharing/ConsumeSharedModule.js +2 -3
  113. package/lib/sharing/ConsumeSharedRuntimeModule.js +3 -1
  114. package/lib/sharing/ProvideSharedModule.js +2 -3
  115. package/lib/stats/DefaultStatsFactoryPlugin.js +22 -20
  116. package/lib/stats/StatsFactory.js +12 -12
  117. package/lib/stats/StatsPrinter.js +7 -7
  118. package/lib/util/AsyncQueue.js +17 -1
  119. package/lib/util/IterableHelpers.js +1 -1
  120. package/lib/util/SetHelpers.js +1 -1
  121. package/lib/util/cleverMerge.js +48 -24
  122. package/lib/util/concatenate.js +227 -0
  123. package/lib/util/create-schema-validation.js +22 -9
  124. package/lib/util/deprecation.js +86 -28
  125. package/lib/util/fs.js +9 -9
  126. package/lib/util/hash/wasm-hash.js +12 -1
  127. package/lib/util/magicComment.js +21 -0
  128. package/lib/util/makeSerializable.js +24 -1
  129. package/lib/util/memoize.js +2 -1
  130. package/lib/util/runtime.js +4 -1
  131. package/lib/util/semver.js +130 -23
  132. package/lib/wasm/EnableWasmLoadingPlugin.js +2 -2
  133. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +3 -3
  134. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +5 -5
  135. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -5
  136. package/lib/wasm-sync/WebAssemblyGenerator.js +8 -9
  137. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -5
  138. package/lib/web/FetchCompileAsyncWasmPlugin.js +1 -2
  139. package/lib/web/FetchCompileWasmPlugin.js +1 -2
  140. package/lib/web/JsonpChunkLoadingRuntimeModule.js +6 -6
  141. package/package.json +17 -18
  142. package/schemas/WebpackOptions.check.js +1 -1
  143. package/schemas/WebpackOptions.json +8 -2
  144. package/types.d.ts +801 -259
  145. package/lib/util/mergeScope.js +0 -76
@@ -31,13 +31,21 @@ const Template = require("../Template");
31
31
  const { last, someInIterable } = require("../util/IterableHelpers");
32
32
  const StringXor = require("../util/StringXor");
33
33
  const { compareModulesByIdentifier } = require("../util/comparators");
34
+ const {
35
+ getPathInAst,
36
+ getAllReferences,
37
+ RESERVED_NAMES,
38
+ findNewName,
39
+ addScopeSymbols,
40
+ getUsedNamesInScopeInfo
41
+ } = require("../util/concatenate");
34
42
  const createHash = require("../util/createHash");
35
- const { getPathInAst, getAllReferences } = require("../util/mergeScope");
36
43
  const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
37
44
  const { intersectRuntime } = require("../util/runtime");
38
45
  const JavascriptGenerator = require("./JavascriptGenerator");
39
46
  const JavascriptParser = require("./JavascriptParser");
40
47
 
48
+ /** @typedef {import("eslint-scope").Reference} Reference */
41
49
  /** @typedef {import("eslint-scope").Scope} Scope */
42
50
  /** @typedef {import("eslint-scope").Variable} Variable */
43
51
  /** @typedef {import("webpack-sources").Source} Source */
@@ -46,6 +54,7 @@ const JavascriptParser = require("./JavascriptParser");
46
54
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
47
55
  /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
48
56
  /** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
57
+ /** @typedef {import("../Compilation").ModuleObject} ModuleObject */
49
58
  /** @typedef {import("../Compiler")} Compiler */
50
59
  /** @typedef {import("../DependencyTemplates")} DependencyTemplates */
51
60
  /** @typedef {import("../Entrypoint")} Entrypoint */
@@ -54,8 +63,10 @@ const JavascriptParser = require("./JavascriptParser");
54
63
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
55
64
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
56
65
  /** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
66
+ /** @typedef {import("../WebpackError")} WebpackError */
57
67
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
58
68
  /** @typedef {import("../util/Hash")} Hash */
69
+ /** @typedef {import("../util/createHash").Algorithm} Algorithm */
59
70
 
60
71
  /**
61
72
  * @param {Chunk} chunk a chunk
@@ -70,6 +81,25 @@ const chunkHasJs = (chunk, chunkGraph) => {
70
81
  );
71
82
  };
72
83
 
84
+ /**
85
+ * @param {Chunk} chunk a chunk
86
+ * @param {ChunkGraph} chunkGraph the chunk graph
87
+ * @returns {boolean} true, when a JS file is needed for this chunk
88
+ */
89
+ const chunkHasRuntimeOrJs = (chunk, chunkGraph) => {
90
+ if (
91
+ chunkGraph.getChunkModulesIterableBySourceType(
92
+ chunk,
93
+ WEBPACK_MODULE_TYPE_RUNTIME
94
+ )
95
+ )
96
+ return true;
97
+
98
+ return Boolean(
99
+ chunkGraph.getChunkModulesIterableBySourceType(chunk, "javascript")
100
+ );
101
+ };
102
+
73
103
  /**
74
104
  * @param {Module} module a module
75
105
  * @param {string} code the code
@@ -152,11 +182,11 @@ const printGeneratedCodeForStack = (module, code) => {
152
182
  * @property {SyncWaterfallHook<[Source, RenderContext]>} render
153
183
  * @property {SyncWaterfallHook<[Source, Module, StartupRenderContext]>} renderStartup
154
184
  * @property {SyncWaterfallHook<[string, RenderBootstrapContext]>} renderRequire
155
- * @property {SyncBailHook<[Module, RenderBootstrapContext], string>} inlineInRuntimeBailout
185
+ * @property {SyncBailHook<[Module, RenderBootstrapContext], string | void>} inlineInRuntimeBailout
156
186
  * @property {SyncBailHook<[Module, RenderContext], string | void>} embedInRuntimeBailout
157
187
  * @property {SyncBailHook<[RenderContext], string | void>} strictRuntimeBailout
158
188
  * @property {SyncHook<[Chunk, Hash, ChunkHashContext]>} chunkHash
159
- * @property {SyncBailHook<[Chunk, RenderContext], boolean>} useSourceMap
189
+ * @property {SyncBailHook<[Chunk, RenderContext], boolean | void>} useSourceMap
160
190
  */
161
191
 
162
192
  /** @type {WeakMap<Compilation, CompilationHooks>} */
@@ -263,13 +293,14 @@ class JavascriptModulesPlugin {
263
293
  } = options;
264
294
 
265
295
  const hotUpdateChunk = chunk instanceof HotUpdateChunk ? chunk : null;
266
-
267
- let render;
268
296
  const filenameTemplate =
269
297
  JavascriptModulesPlugin.getChunkFilenameTemplate(
270
298
  chunk,
271
299
  outputOptions
272
300
  );
301
+
302
+ let render;
303
+
273
304
  if (hotUpdateChunk) {
274
305
  render = () =>
275
306
  this.renderChunk(
@@ -285,6 +316,10 @@ class JavascriptModulesPlugin {
285
316
  hooks
286
317
  );
287
318
  } else if (chunk.hasRuntime()) {
319
+ if (!chunkHasRuntimeOrJs(chunk, chunkGraph)) {
320
+ return result;
321
+ }
322
+
288
323
  render = () =>
289
324
  this.renderMain(
290
325
  {
@@ -370,7 +405,7 @@ class JavascriptModulesPlugin {
370
405
  hashFunction
371
406
  }
372
407
  } = compilation;
373
- const hash = createHash(hashFunction);
408
+ const hash = createHash(/** @type {Algorithm} */ (hashFunction));
374
409
  if (hashSalt) hash.update(hashSalt);
375
410
  if (chunk.hasRuntime()) {
376
411
  this.updateHashWithBootstrap(
@@ -420,7 +455,8 @@ class JavascriptModulesPlugin {
420
455
  const digest = /** @type {string} */ (hash.digest(hashDigest));
421
456
  chunk.contentHash.javascript = nonNumericOnlyHash(
422
457
  digest,
423
- hashDigestLength
458
+ /** @type {number} */
459
+ (hashDigestLength)
424
460
  );
425
461
  });
426
462
  compilation.hooks.additionalTreeRuntimeRequirements.tap(
@@ -439,7 +475,7 @@ class JavascriptModulesPlugin {
439
475
  compilation.hooks.executeModule.tap(PLUGIN_NAME, (options, context) => {
440
476
  const source = options.codeGenerationResult.sources.get("javascript");
441
477
  if (source === undefined) return;
442
- const { module, moduleObject } = options;
478
+ const { module } = options;
443
479
  const code = source.source();
444
480
 
445
481
  const fn = vm.runInThisContext(
@@ -449,6 +485,11 @@ class JavascriptModulesPlugin {
449
485
  lineOffset: -1
450
486
  }
451
487
  );
488
+
489
+ const moduleObject =
490
+ /** @type {ModuleObject} */
491
+ (options.moduleObject);
492
+
452
493
  try {
453
494
  fn.call(
454
495
  moduleObject.exports,
@@ -621,7 +662,8 @@ class JavascriptModulesPlugin {
621
662
  "JavascriptModulesPlugin.getCompilationHooks().renderModulePackage"
622
663
  );
623
664
  } catch (err) {
624
- err.module = module;
665
+ /** @type {WebpackError} */
666
+ (err).module = module;
625
667
  throw err;
626
668
  }
627
669
  }
@@ -870,20 +912,20 @@ class JavascriptModulesPlugin {
870
912
  const webpackExports =
871
913
  exports && m.exportsArgument === RuntimeGlobals.exports;
872
914
  const iife = innerStrict
873
- ? "it need to be in strict mode."
915
+ ? "it needs to be in strict mode."
874
916
  : inlinedModules.size > 1
875
917
  ? // TODO check globals and top-level declarations of other entries and chunk modules
876
918
  // to make a better decision
877
- "it need to be isolated against other entry modules."
919
+ "it needs to be isolated against other entry modules."
878
920
  : chunkModules && !renamedInlinedModule
879
- ? "it need to be isolated against other modules in the chunk."
921
+ ? "it needs to be isolated against other modules in the chunk."
880
922
  : exports && !webpackExports
881
923
  ? `it uses a non-standard name for the exports (${m.exportsArgument}).`
882
924
  : hooks.embedInRuntimeBailout.call(m, renderContext);
883
925
  let footer;
884
926
  if (iife !== undefined) {
885
927
  startupSource.add(
886
- `// This entry need to be wrapped in an IIFE because ${iife}\n`
928
+ `// This entry needs to be wrapped in an IIFE because ${iife}\n`
887
929
  );
888
930
  const arrow = runtimeTemplate.supportsArrowFunction();
889
931
  if (arrow) {
@@ -1141,6 +1183,10 @@ class JavascriptModulesPlugin {
1141
1183
  entryModule,
1142
1184
  entrypoint
1143
1185
  ] of chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)) {
1186
+ if (!chunkGraph.getModuleSourceTypes(entryModule).has("javascript")) {
1187
+ i--;
1188
+ continue;
1189
+ }
1144
1190
  const chunks =
1145
1191
  /** @type {Entrypoint} */
1146
1192
  (entrypoint).chunks.filter(c => c !== chunk);
@@ -1429,7 +1475,7 @@ class JavascriptModulesPlugin {
1429
1475
  * @param {Set<Module>} inlinedModules inlinedModules
1430
1476
  * @param {ChunkRenderContext} chunkRenderContext chunkRenderContext
1431
1477
  * @param {CompilationHooks} hooks hooks
1432
- * @param {boolean} allStrict allStrict
1478
+ * @param {boolean | undefined} allStrict allStrict
1433
1479
  * @param {boolean} hasChunkModules hasChunkModules
1434
1480
  * @returns {Map<Module, Source> | false} renamed inlined modules
1435
1481
  */
@@ -1442,7 +1488,9 @@ class JavascriptModulesPlugin {
1442
1488
  allStrict,
1443
1489
  hasChunkModules
1444
1490
  ) {
1445
- const innerStrict = !allStrict && allModules.every(m => m.buildInfo.strict);
1491
+ const innerStrict =
1492
+ !allStrict &&
1493
+ allModules.every(m => /** @type {BuildInfo} */ (m.buildInfo).strict);
1446
1494
  const isMultipleEntries = inlinedModules.size > 1;
1447
1495
  const singleEntryWithModules = inlinedModules.size === 1 && hasChunkModules;
1448
1496
 
@@ -1458,8 +1506,8 @@ class JavascriptModulesPlugin {
1458
1506
  const renamedInlinedModules = new Map();
1459
1507
  const { runtimeTemplate } = renderContext;
1460
1508
 
1461
- /** @typedef {{ source: Source, ast: any, variables: Set<Variable>, usedInNonInlined: Set<Variable>}} InlinedModulesInfo */
1462
- /** @type {Map<Module, InlinedModulesInfo>} */
1509
+ /** @typedef {{ source: Source, module: Module, ast: any, variables: Set<Variable>, through: Set<Reference>, usedInNonInlined: Set<Variable>, moduleScope: Scope }} Info */
1510
+ /** @type {Map<Module, Info>} */
1463
1511
  const inlinedModulesToInfo = new Map();
1464
1512
  /** @type {Set<string>} */
1465
1513
  const nonInlinedModuleThroughIdentifiers = new Set();
@@ -1493,8 +1541,11 @@ class JavascriptModulesPlugin {
1493
1541
  inlinedModulesToInfo.set(m, {
1494
1542
  source: moduleSource,
1495
1543
  ast,
1544
+ module: m,
1496
1545
  variables: new Set(moduleScope.variables),
1497
- usedInNonInlined: new Set()
1546
+ through: new Set(moduleScope.through),
1547
+ usedInNonInlined: new Set(),
1548
+ moduleScope
1498
1549
  });
1499
1550
  } else {
1500
1551
  for (const ref of globalScope.through) {
@@ -1505,7 +1556,10 @@ class JavascriptModulesPlugin {
1505
1556
 
1506
1557
  for (const [, { variables, usedInNonInlined }] of inlinedModulesToInfo) {
1507
1558
  for (const variable of variables) {
1508
- if (nonInlinedModuleThroughIdentifiers.has(variable.name)) {
1559
+ if (
1560
+ nonInlinedModuleThroughIdentifiers.has(variable.name) ||
1561
+ RESERVED_NAMES.has(variable.name)
1562
+ ) {
1509
1563
  usedInNonInlined.add(variable);
1510
1564
  }
1511
1565
  }
@@ -1519,39 +1573,70 @@ class JavascriptModulesPlugin {
1519
1573
  continue;
1520
1574
  }
1521
1575
 
1522
- const usedNames = new Set(
1523
- Array.from(
1524
- /** @type {InlinedModulesInfo} */
1525
- (inlinedModulesToInfo.get(m)).variables
1526
- ).map(v => v.name)
1576
+ const info = /** @type {Info} */ (inlinedModulesToInfo.get(m));
1577
+ const allUsedNames = new Set(
1578
+ Array.from(info.through, v => v.identifier.name)
1527
1579
  );
1528
1580
 
1529
1581
  for (const variable of usedInNonInlined) {
1582
+ allUsedNames.add(variable.name);
1583
+ }
1584
+
1585
+ for (const variable of info.variables) {
1586
+ allUsedNames.add(variable.name);
1530
1587
  const references = getAllReferences(variable);
1531
1588
  const allIdentifiers = new Set(
1532
1589
  references.map(r => r.identifier).concat(variable.identifiers)
1533
1590
  );
1534
1591
 
1535
- const newName = this.findNewName(
1536
- variable.name,
1537
- usedNames,
1538
- m.readableIdentifier(runtimeTemplate.requestShortener)
1592
+ const usedNamesInScopeInfo = new Map();
1593
+ const ignoredScopes = new Set();
1594
+
1595
+ const name = variable.name;
1596
+ const { usedNames, alreadyCheckedScopes } = getUsedNamesInScopeInfo(
1597
+ usedNamesInScopeInfo,
1598
+ info.module.identifier(),
1599
+ name
1539
1600
  );
1540
- usedNames.add(newName);
1541
- for (const identifier of allIdentifiers) {
1542
- const r = /** @type {Range} */ (identifier.range);
1543
- const path = getPathInAst(ast, identifier);
1544
- if (path && path.length > 1) {
1545
- const maybeProperty =
1546
- path[1].type === "AssignmentPattern" && path[1].left === path[0]
1547
- ? path[2]
1548
- : path[1];
1549
- if (maybeProperty.type === "Property" && maybeProperty.shorthand) {
1550
- source.insert(r[1], `: ${newName}`);
1551
- continue;
1601
+
1602
+ if (allUsedNames.has(name) || usedNames.has(name)) {
1603
+ const references = getAllReferences(variable);
1604
+ for (const ref of references) {
1605
+ addScopeSymbols(
1606
+ ref.from,
1607
+ usedNames,
1608
+ alreadyCheckedScopes,
1609
+ ignoredScopes
1610
+ );
1611
+ }
1612
+
1613
+ const newName = findNewName(
1614
+ variable.name,
1615
+ allUsedNames,
1616
+ usedNames,
1617
+ m.readableIdentifier(runtimeTemplate.requestShortener)
1618
+ );
1619
+ allUsedNames.add(newName);
1620
+ for (const identifier of allIdentifiers) {
1621
+ const r = /** @type {Range} */ (identifier.range);
1622
+ const path = getPathInAst(ast, identifier);
1623
+ if (path && path.length > 1) {
1624
+ const maybeProperty =
1625
+ path[1].type === "AssignmentPattern" && path[1].left === path[0]
1626
+ ? path[2]
1627
+ : path[1];
1628
+ if (
1629
+ maybeProperty.type === "Property" &&
1630
+ maybeProperty.shorthand
1631
+ ) {
1632
+ source.insert(r[1], `: ${newName}`);
1633
+ continue;
1634
+ }
1552
1635
  }
1636
+ source.replace(r[0], r[1] - 1, newName);
1553
1637
  }
1554
- source.replace(r[0], r[1] - 1, newName);
1638
+ } else {
1639
+ allUsedNames.add(name);
1555
1640
  }
1556
1641
  }
1557
1642
 
@@ -1560,38 +1645,6 @@ class JavascriptModulesPlugin {
1560
1645
 
1561
1646
  return renamedInlinedModules;
1562
1647
  }
1563
-
1564
- /**
1565
- * @param {string} oldName oldName
1566
- * @param {Set<string>} usedName usedName
1567
- * @param {string} extraInfo extraInfo
1568
- * @returns {string} extraInfo
1569
- */
1570
- findNewName(oldName, usedName, extraInfo) {
1571
- let name = oldName;
1572
-
1573
- // Remove uncool stuff
1574
- extraInfo = extraInfo.replace(
1575
- /\.+\/|(\/index)?\.([a-zA-Z0-9]{1,4})($|\s|\?)|\s*\+\s*\d+\s*modules/g,
1576
- ""
1577
- );
1578
- const splittedInfo = extraInfo.split("/");
1579
- while (splittedInfo.length) {
1580
- name = splittedInfo.pop() + (name ? `_${name}` : "");
1581
- const nameIdent = Template.toIdentifier(name);
1582
- if (!usedName.has(nameIdent)) {
1583
- return nameIdent;
1584
- }
1585
- }
1586
-
1587
- let i = 0;
1588
- let nameWithNumber = Template.toIdentifier(`${name}_${i}`);
1589
- while (usedName.has(nameWithNumber)) {
1590
- i++;
1591
- nameWithNumber = Template.toIdentifier(`${name}_${i}`);
1592
- }
1593
- return nameWithNumber;
1594
- }
1595
1648
  }
1596
1649
 
1597
1650
  module.exports = JavascriptModulesPlugin;