webpack 5.89.0 → 5.90.1

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 (167) hide show
  1. package/README.md +3 -0
  2. package/bin/webpack.js +1 -3
  3. package/hot/log.js +0 -2
  4. package/lib/APIPlugin.js +17 -13
  5. package/lib/ChunkGraph.js +1 -1
  6. package/lib/CleanPlugin.js +12 -12
  7. package/lib/Compilation.js +26 -17
  8. package/lib/Compiler.js +13 -0
  9. package/lib/ConcatenationScope.js +2 -2
  10. package/lib/ConditionalInitFragment.js +3 -3
  11. package/lib/ContextModule.js +4 -4
  12. package/lib/ContextModuleFactory.js +1 -1
  13. package/lib/DefinePlugin.js +47 -26
  14. package/lib/DependencyTemplate.js +3 -1
  15. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  16. package/lib/EvalDevToolModulePlugin.js +1 -1
  17. package/lib/EvalSourceMapDevToolPlugin.js +2 -2
  18. package/lib/ExportsInfoApiPlugin.js +2 -2
  19. package/lib/ExternalModule.js +47 -12
  20. package/lib/ExternalModuleFactoryPlugin.js +1 -1
  21. package/lib/FileSystemInfo.js +20 -3
  22. package/lib/FlagDependencyExportsPlugin.js +1 -1
  23. package/lib/Generator.js +1 -0
  24. package/lib/HotModuleReplacementPlugin.js +3 -3
  25. package/lib/InitFragment.js +7 -7
  26. package/lib/LibManifestPlugin.js +4 -1
  27. package/lib/Module.js +2 -1
  28. package/lib/ModuleFilenameHelpers.js +1 -1
  29. package/lib/ModuleInfoHeaderPlugin.js +1 -1
  30. package/lib/MultiStats.js +2 -2
  31. package/lib/NodeStuffPlugin.js +48 -0
  32. package/lib/NormalModule.js +13 -11
  33. package/lib/NormalModuleFactory.js +7 -7
  34. package/lib/RuntimeTemplate.js +15 -11
  35. package/lib/SourceMapDevToolPlugin.js +2 -2
  36. package/lib/Stats.js +4 -0
  37. package/lib/WebpackOptionsApply.js +4 -3
  38. package/lib/asset/AssetModulesPlugin.js +2 -3
  39. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  40. package/lib/buildChunkGraph.js +53 -0
  41. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  42. package/lib/cache/IdleFileCachePlugin.js +12 -5
  43. package/lib/cache/PackFileCacheStrategy.js +3 -3
  44. package/lib/cache/ResolverCachePlugin.js +2 -2
  45. package/lib/config/browserslistTargetHandler.js +35 -14
  46. package/lib/config/defaults.js +88 -52
  47. package/lib/config/normalization.js +17 -18
  48. package/lib/config/target.js +5 -0
  49. package/lib/container/ContainerReferencePlugin.js +1 -1
  50. package/lib/css/CssExportsGenerator.js +14 -1
  51. package/lib/css/CssGenerator.js +14 -1
  52. package/lib/css/CssLoadingRuntimeModule.js +23 -23
  53. package/lib/css/CssModulesPlugin.js +68 -32
  54. package/lib/css/CssParser.js +8 -3
  55. package/lib/debug/ProfilingPlugin.js +2 -2
  56. package/lib/dependencies/AMDDefineDependency.js +4 -4
  57. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +126 -34
  58. package/lib/dependencies/AMDPlugin.js +11 -4
  59. package/lib/dependencies/AMDRequireArrayDependency.js +13 -1
  60. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +159 -43
  61. package/lib/dependencies/AMDRequireDependency.js +2 -2
  62. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  63. package/lib/dependencies/CachedConstDependency.js +8 -1
  64. package/lib/dependencies/CommonJsImportsParserPlugin.js +1 -1
  65. package/lib/dependencies/ContextElementDependency.js +1 -1
  66. package/lib/dependencies/ExternalModuleDependency.js +107 -0
  67. package/lib/dependencies/ExternalModuleInitFragment.js +131 -0
  68. package/lib/dependencies/HarmonyAcceptDependency.js +1 -1
  69. package/lib/dependencies/HarmonyDetectionParserPlugin.js +7 -1
  70. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +18 -18
  71. package/lib/dependencies/HarmonyExportInitFragment.js +6 -6
  72. package/lib/dependencies/HarmonyImportDependency.js +4 -4
  73. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +6 -6
  74. package/lib/dependencies/ImportDependency.js +26 -6
  75. package/lib/dependencies/JsonExportsDependency.js +1 -1
  76. package/lib/dependencies/LoaderPlugin.js +2 -1
  77. package/lib/dependencies/LocalModuleDependency.js +1 -1
  78. package/lib/dependencies/PureExpressionDependency.js +12 -4
  79. package/lib/dependencies/RequireIncludeDependency.js +1 -1
  80. package/lib/dependencies/WebpackIsIncludedDependency.js +1 -1
  81. package/lib/dependencies/WorkerPlugin.js +10 -3
  82. package/lib/dependencies/getFunctionExpression.js +2 -2
  83. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +6 -6
  84. package/lib/hmr/HotModuleReplacement.runtime.js +3 -5
  85. package/lib/hmr/lazyCompilationBackend.js +4 -4
  86. package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
  87. package/lib/index.js +4 -0
  88. package/lib/javascript/JavascriptGenerator.js +16 -1
  89. package/lib/javascript/JavascriptModulesPlugin.js +33 -33
  90. package/lib/javascript/JavascriptParser.js +220 -74
  91. package/lib/json/JsonGenerator.js +1 -1
  92. package/lib/library/AmdLibraryPlugin.js +5 -1
  93. package/lib/library/AssignLibraryPlugin.js +1 -1
  94. package/lib/library/SystemLibraryPlugin.js +1 -1
  95. package/lib/library/UmdLibraryPlugin.js +39 -39
  96. package/lib/logging/createConsoleLogger.js +1 -19
  97. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +8 -8
  98. package/lib/node/RequireChunkLoadingRuntimeModule.js +8 -8
  99. package/lib/node/nodeConsole.js +1 -5
  100. package/lib/optimize/ConcatenatedModule.js +7 -7
  101. package/lib/optimize/InnerGraphPlugin.js +9 -1
  102. package/lib/optimize/MangleExportsPlugin.js +5 -1
  103. package/lib/optimize/ModuleConcatenationPlugin.js +2 -2
  104. package/lib/optimize/RemoveParentModulesPlugin.js +123 -47
  105. package/lib/optimize/SideEffectsFlagPlugin.js +15 -3
  106. package/lib/optimize/SplitChunksPlugin.js +16 -16
  107. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -2
  108. package/lib/rules/RuleSetCompiler.js +1 -1
  109. package/lib/runtime/AutoPublicPathRuntimeModule.js +2 -2
  110. package/lib/runtime/GetChunkFilenameRuntimeModule.js +4 -4
  111. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +4 -4
  112. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  113. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +23 -22
  114. package/lib/runtime/StartupEntrypointRuntimeModule.js +2 -2
  115. package/lib/schemes/HttpUriPlugin.js +1 -1
  116. package/lib/serialization/FileMiddleware.js +4 -4
  117. package/lib/serialization/ObjectMiddleware.js +4 -4
  118. package/lib/sharing/ConsumeSharedPlugin.js +5 -5
  119. package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -4
  120. package/lib/sharing/ProvideSharedModule.js +2 -2
  121. package/lib/sharing/SharePlugin.js +2 -2
  122. package/lib/sharing/ShareRuntimeModule.js +1 -1
  123. package/lib/sharing/utils.js +24 -28
  124. package/lib/stats/DefaultStatsFactoryPlugin.js +10 -10
  125. package/lib/stats/DefaultStatsPresetPlugin.js +3 -7
  126. package/lib/stats/DefaultStatsPrinterPlugin.js +34 -31
  127. package/lib/util/chainedImports.js +7 -6
  128. package/lib/util/cleverMerge.js +4 -4
  129. package/lib/util/comparators.js +59 -23
  130. package/lib/util/hash/xxhash64.js +2 -2
  131. package/lib/util/identifier.js +2 -2
  132. package/lib/util/internalSerializables.js +6 -0
  133. package/lib/util/numberHash.js +64 -52
  134. package/lib/util/runtime.js +18 -1
  135. package/lib/util/semver.js +19 -24
  136. package/lib/util/smartGrouping.js +1 -1
  137. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +53 -28
  138. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +2 -2
  139. package/lib/wasm-async/AsyncWebAssemblyParser.js +6 -0
  140. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +2 -2
  141. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +2 -2
  142. package/lib/web/JsonpChunkLoadingRuntimeModule.js +13 -13
  143. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -6
  144. package/package.json +25 -80
  145. package/schemas/WebpackOptions.check.js +1 -1
  146. package/schemas/WebpackOptions.json +140 -32
  147. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  148. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  149. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  150. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  151. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  152. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  153. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
  154. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  155. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  156. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  157. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  158. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  159. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  160. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  161. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  162. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  163. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  164. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  165. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  166. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  167. package/types.d.ts +273 -94
@@ -93,7 +93,9 @@ const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
93
93
  /** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
94
94
  /** @typedef {{declaredScope: ScopeInfo, freeName: string | true, tagInfo: TagInfo | undefined}} VariableInfoInterface */
95
95
  /** @typedef {{ name: string | VariableInfo, rootInfo: string | VariableInfo, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[] }} GetInfoResult */
96
+ /** @typedef {Statement | ModuleDeclaration | Expression} StatementPathItem */
96
97
 
98
+ /** @type {string[]} */
97
99
  const EMPTY_ARRAY = [];
98
100
  const ALLOWED_MEMBER_TYPES_CALL_EXPRESSION = 0b01;
99
101
  const ALLOWED_MEMBER_TYPES_EXPRESSION = 0b10;
@@ -422,15 +424,21 @@ class JavascriptParser extends Parser {
422
424
  this.scope = undefined;
423
425
  /** @type {ParserState} */
424
426
  this.state = undefined;
427
+ /** @type {Comment[] | undefined} */
425
428
  this.comments = undefined;
429
+ /** @type {Set<number> | undefined} */
426
430
  this.semicolons = undefined;
427
- /** @type {(Statement | ModuleDeclaration | Expression)[]} */
431
+ /** @type {StatementPathItem[]} */
428
432
  this.statementPath = undefined;
429
433
  /** @type {Statement | ModuleDeclaration | Expression | undefined} */
430
434
  this.prevStatement = undefined;
431
- /** @type {WeakMap<Expression, Set<string>>} */
435
+ /** @type {WeakMap<Expression, Set<string>> | undefined} */
432
436
  this.destructuringAssignmentProperties = undefined;
433
437
  this.currentTagData = undefined;
438
+ this.magicCommentContext = vm.createContext(undefined, {
439
+ name: "Webpack Magic Comment Parser",
440
+ codeGeneration: { strings: false, wasm: false }
441
+ });
434
442
  this._initializeEvaluating();
435
443
  }
436
444
 
@@ -537,34 +545,39 @@ class JavascriptParser extends Parser {
537
545
  let allowedRight;
538
546
  if (expr.operator === "&&") {
539
547
  const leftAsBool = left.asBool();
540
- if (leftAsBool === false) return left.setRange(expr.range);
548
+ if (leftAsBool === false)
549
+ return left.setRange(/** @type {Range} */ (expr.range));
541
550
  returnRight = leftAsBool === true;
542
551
  allowedRight = false;
543
552
  } else if (expr.operator === "||") {
544
553
  const leftAsBool = left.asBool();
545
- if (leftAsBool === true) return left.setRange(expr.range);
554
+ if (leftAsBool === true)
555
+ return left.setRange(/** @type {Range} */ (expr.range));
546
556
  returnRight = leftAsBool === false;
547
557
  allowedRight = true;
548
558
  } else if (expr.operator === "??") {
549
559
  const leftAsNullish = left.asNullish();
550
- if (leftAsNullish === false) return left.setRange(expr.range);
560
+ if (leftAsNullish === false)
561
+ return left.setRange(/** @type {Range} */ (expr.range));
551
562
  if (leftAsNullish !== true) return;
552
563
  returnRight = true;
553
564
  } else return;
554
565
  const right = this.evaluateExpression(expr.right);
555
566
  if (returnRight) {
556
567
  if (left.couldHaveSideEffects()) right.setSideEffects();
557
- return right.setRange(expr.range);
568
+ return right.setRange(/** @type {Range} */ (expr.range));
558
569
  }
559
570
 
560
571
  const asBool = right.asBool();
561
572
 
562
573
  if (allowedRight === true && asBool === true) {
563
574
  return new BasicEvaluatedExpression()
564
- .setRange(expr.range)
575
+ .setRange(/** @type {Range} */ (expr.range))
565
576
  .setTruthy();
566
577
  } else if (allowedRight === false && asBool === false) {
567
- return new BasicEvaluatedExpression().setRange(expr.range).setFalsy();
578
+ return new BasicEvaluatedExpression()
579
+ .setRange(/** @type {Range} */ (expr.range))
580
+ .setFalsy();
568
581
  }
569
582
  });
570
583
 
@@ -677,7 +690,18 @@ class JavascriptParser extends Parser {
677
690
  const isAlwaysDifferent = (a, b) =>
678
691
  (a === true && b === false) || (a === false && b === true);
679
692
 
693
+ /**
694
+ * @param {BasicEvaluatedExpression} left left
695
+ * @param {BasicEvaluatedExpression} right right
696
+ * @param {BasicEvaluatedExpression} res res
697
+ * @param {boolean} eql true for "===" and false for "!=="
698
+ * @returns {BasicEvaluatedExpression | undefined} result
699
+ */
680
700
  const handleTemplateStringCompare = (left, right, res, eql) => {
701
+ /**
702
+ * @param {BasicEvaluatedExpression[]} parts parts
703
+ * @returns {string} value
704
+ */
681
705
  const getPrefix = parts => {
682
706
  let value = "";
683
707
  for (const p of parts) {
@@ -687,6 +711,10 @@ class JavascriptParser extends Parser {
687
711
  }
688
712
  return value;
689
713
  };
714
+ /**
715
+ * @param {BasicEvaluatedExpression[]} parts parts
716
+ * @returns {string} value
717
+ */
690
718
  const getSuffix = parts => {
691
719
  let value = "";
692
720
  for (let i = parts.length - 1; i >= 0; i--) {
@@ -696,10 +724,18 @@ class JavascriptParser extends Parser {
696
724
  }
697
725
  return value;
698
726
  };
699
- const leftPrefix = getPrefix(left.parts);
700
- const rightPrefix = getPrefix(right.parts);
701
- const leftSuffix = getSuffix(left.parts);
702
- const rightSuffix = getSuffix(right.parts);
727
+ const leftPrefix = getPrefix(
728
+ /** @type {BasicEvaluatedExpression[]} */ (left.parts)
729
+ );
730
+ const rightPrefix = getPrefix(
731
+ /** @type {BasicEvaluatedExpression[]} */ (right.parts)
732
+ );
733
+ const leftSuffix = getSuffix(
734
+ /** @type {BasicEvaluatedExpression[]} */ (left.parts)
735
+ );
736
+ const rightSuffix = getSuffix(
737
+ /** @type {BasicEvaluatedExpression[]} */ (right.parts)
738
+ );
703
739
  const lenPrefix = Math.min(leftPrefix.length, rightPrefix.length);
704
740
  const lenSuffix = Math.min(leftSuffix.length, rightSuffix.length);
705
741
  const prefixMismatch =
@@ -790,7 +826,7 @@ class JavascriptParser extends Parser {
790
826
  const left = this.evaluateExpression(expr.left);
791
827
  const right = this.evaluateExpression(expr.right);
792
828
  const res = new BasicEvaluatedExpression();
793
- res.setRange(expr.range);
829
+ res.setRange(/** @type {Range} */ (expr.range));
794
830
 
795
831
  const leftConst = left.isCompileTimeValue();
796
832
  const rightConst = right.isCompileTimeValue();
@@ -825,9 +861,12 @@ class JavascriptParser extends Parser {
825
861
  const res = new BasicEvaluatedExpression();
826
862
  if (left.isString()) {
827
863
  if (right.isString()) {
828
- res.setString(left.string + right.string);
864
+ res.setString(
865
+ /** @type {string} */ (left.string) +
866
+ /** @type {string} */ (right.string)
867
+ );
829
868
  } else if (right.isNumber()) {
830
- res.setString(left.string + right.number);
869
+ res.setString(/** @type {string} */ (left.string) + right.number);
831
870
  } else if (
832
871
  right.isWrapped() &&
833
872
  right.prefix &&
@@ -837,7 +876,10 @@ class JavascriptParser extends Parser {
837
876
  // => ("leftPrefix" + inner + "postfix")
838
877
  res.setWrapped(
839
878
  new BasicEvaluatedExpression()
840
- .setString(left.string + right.prefix.string)
879
+ .setString(
880
+ /** @type {string} */ (left.string) +
881
+ /** @type {string} */ (right.prefix.string)
882
+ )
841
883
  .setRange(joinRanges(left.range, right.prefix.range)),
842
884
  right.postfix,
843
885
  right.wrappedInnerExpressions
@@ -857,7 +899,7 @@ class JavascriptParser extends Parser {
857
899
  }
858
900
  } else if (left.isNumber()) {
859
901
  if (right.isString()) {
860
- res.setString(left.number + right.string);
902
+ res.setString(left.number + /** @type {string} */ (right.string));
861
903
  } else if (right.isNumber()) {
862
904
  res.setNumber(left.number + right.number);
863
905
  } else {
@@ -865,7 +907,10 @@ class JavascriptParser extends Parser {
865
907
  }
866
908
  } else if (left.isBigInt()) {
867
909
  if (right.isBigInt()) {
868
- res.setBigInt(left.bigint + right.bigint);
910
+ res.setBigInt(
911
+ /** @type {bigint} */ (left.bigint) +
912
+ /** @type {bigint} */ (right.bigint)
913
+ );
869
914
  }
870
915
  } else if (left.isWrapped()) {
871
916
  if (left.postfix && left.postfix.isString() && right.isString()) {
@@ -874,8 +919,16 @@ class JavascriptParser extends Parser {
874
919
  res.setWrapped(
875
920
  left.prefix,
876
921
  new BasicEvaluatedExpression()
877
- .setString(left.postfix.string + right.string)
878
- .setRange(joinRanges(left.postfix.range, right.range)),
922
+ .setString(
923
+ /** @type {string} */ (left.postfix.string) +
924
+ /** @type {string} */ (right.string)
925
+ )
926
+ .setRange(
927
+ joinRanges(
928
+ /** @type {Range} */ (left.postfix.range),
929
+ /** @type {Range} */ (right.range)
930
+ )
931
+ ),
879
932
  left.wrappedInnerExpressions
880
933
  );
881
934
  } else if (
@@ -888,8 +941,16 @@ class JavascriptParser extends Parser {
888
941
  res.setWrapped(
889
942
  left.prefix,
890
943
  new BasicEvaluatedExpression()
891
- .setString(left.postfix.string + right.number)
892
- .setRange(joinRanges(left.postfix.range, right.range)),
944
+ .setString(
945
+ /** @type {string} */ (left.postfix.string) +
946
+ /** @type {number} */ (right.number)
947
+ )
948
+ .setRange(
949
+ joinRanges(
950
+ /** @type {Range} */ (left.postfix.range),
951
+ /** @type {Range} */ (right.range)
952
+ )
953
+ ),
893
954
  left.wrappedInnerExpressions
894
955
  );
895
956
  } else if (right.isString()) {
@@ -903,7 +964,7 @@ class JavascriptParser extends Parser {
903
964
  left.prefix,
904
965
  new BasicEvaluatedExpression()
905
966
  .setString(right.number + "")
906
- .setRange(right.range),
967
+ .setRange(/** @type {Range} */ (right.range)),
907
968
  left.wrappedInnerExpressions
908
969
  );
909
970
  } else if (right.isWrapped()) {
@@ -953,7 +1014,7 @@ class JavascriptParser extends Parser {
953
1014
  }
954
1015
  if (left.couldHaveSideEffects() || right.couldHaveSideEffects())
955
1016
  res.setSideEffects();
956
- res.setRange(expr.range);
1017
+ res.setRange(/** @type {Range} */ (expr.range));
957
1018
  return res;
958
1019
  } else if (expr.operator === "-") {
959
1020
  return handleConstOperation((l, r) => l - r);
@@ -1057,7 +1118,7 @@ class JavascriptParser extends Parser {
1057
1118
  case "FunctionExpression": {
1058
1119
  return new BasicEvaluatedExpression()
1059
1120
  .setString("function")
1060
- .setRange(expr.range);
1121
+ .setRange(/** @type {Range} */ (expr.range));
1061
1122
  }
1062
1123
  }
1063
1124
  const arg = this.evaluateExpression(expr.argument);
@@ -1065,44 +1126,44 @@ class JavascriptParser extends Parser {
1065
1126
  if (arg.isString()) {
1066
1127
  return new BasicEvaluatedExpression()
1067
1128
  .setString("string")
1068
- .setRange(expr.range);
1129
+ .setRange(/** @type {Range} */ (expr.range));
1069
1130
  }
1070
1131
  if (arg.isWrapped()) {
1071
1132
  return new BasicEvaluatedExpression()
1072
1133
  .setString("string")
1073
1134
  .setSideEffects()
1074
- .setRange(expr.range);
1135
+ .setRange(/** @type {Range} */ (expr.range));
1075
1136
  }
1076
1137
  if (arg.isUndefined()) {
1077
1138
  return new BasicEvaluatedExpression()
1078
1139
  .setString("undefined")
1079
- .setRange(expr.range);
1140
+ .setRange(/** @type {Range} */ (expr.range));
1080
1141
  }
1081
1142
  if (arg.isNumber()) {
1082
1143
  return new BasicEvaluatedExpression()
1083
1144
  .setString("number")
1084
- .setRange(expr.range);
1145
+ .setRange(/** @type {Range} */ (expr.range));
1085
1146
  }
1086
1147
  if (arg.isBigInt()) {
1087
1148
  return new BasicEvaluatedExpression()
1088
1149
  .setString("bigint")
1089
- .setRange(expr.range);
1150
+ .setRange(/** @type {Range} */ (expr.range));
1090
1151
  }
1091
1152
  if (arg.isBoolean()) {
1092
1153
  return new BasicEvaluatedExpression()
1093
1154
  .setString("boolean")
1094
- .setRange(expr.range);
1155
+ .setRange(/** @type {Range} */ (expr.range));
1095
1156
  }
1096
1157
  if (arg.isConstArray() || arg.isRegExp() || arg.isNull()) {
1097
1158
  return new BasicEvaluatedExpression()
1098
1159
  .setString("object")
1099
- .setRange(expr.range);
1160
+ .setRange(/** @type {Range} */ (expr.range));
1100
1161
  }
1101
1162
  if (arg.isArray()) {
1102
1163
  return new BasicEvaluatedExpression()
1103
1164
  .setString("object")
1104
1165
  .setSideEffects(arg.couldHaveSideEffects())
1105
- .setRange(expr.range);
1166
+ .setRange(/** @type {Range} */ (expr.range));
1106
1167
  }
1107
1168
  } else if (expr.operator === "!") {
1108
1169
  const argument = this.evaluateExpression(expr.argument);
@@ -1111,7 +1172,7 @@ class JavascriptParser extends Parser {
1111
1172
  return new BasicEvaluatedExpression()
1112
1173
  .setBoolean(!bool)
1113
1174
  .setSideEffects(argument.couldHaveSideEffects())
1114
- .setRange(expr.range);
1175
+ .setRange(/** @type {Range} */ (expr.range));
1115
1176
  } else if (expr.operator === "~") {
1116
1177
  return handleConstOperation(v => ~v);
1117
1178
  } else if (expr.operator === "+") {
@@ -1123,13 +1184,13 @@ class JavascriptParser extends Parser {
1123
1184
  this.hooks.evaluateTypeof.for("undefined").tap("JavascriptParser", expr => {
1124
1185
  return new BasicEvaluatedExpression()
1125
1186
  .setString("undefined")
1126
- .setRange(expr.range);
1187
+ .setRange(/** @type {Range} */ (expr.range));
1127
1188
  });
1128
1189
  this.hooks.evaluate.for("Identifier").tap("JavascriptParser", expr => {
1129
1190
  if (/** @type {Identifier} */ (expr).name === "undefined") {
1130
1191
  return new BasicEvaluatedExpression()
1131
1192
  .setUndefined()
1132
- .setRange(expr.range);
1193
+ .setRange(/** @type {Range} */ (expr.range));
1133
1194
  }
1134
1195
  });
1135
1196
  /**
@@ -1177,7 +1238,7 @@ class JavascriptParser extends Parser {
1177
1238
  info.getMembersOptionals,
1178
1239
  info.getMemberRanges
1179
1240
  )
1180
- .setRange(expr.range);
1241
+ .setRange(/** @type {Range} */ (expr.range));
1181
1242
  }
1182
1243
  });
1183
1244
  this.hooks.finish.tap("JavascriptParser", () => {
@@ -1274,14 +1335,17 @@ class JavascriptParser extends Parser {
1274
1335
  if (arg2.type === "SpreadElement") return;
1275
1336
  const arg2Eval = this.evaluateExpression(arg2);
1276
1337
  if (!arg2Eval.isNumber()) return;
1277
- result = param.string.indexOf(arg1Value, arg2Eval.number);
1338
+ result = /** @type {string} */ (param.string).indexOf(
1339
+ arg1Value,
1340
+ arg2Eval.number
1341
+ );
1278
1342
  } else {
1279
- result = param.string.indexOf(arg1Value);
1343
+ result = /** @type {string} */ (param.string).indexOf(arg1Value);
1280
1344
  }
1281
1345
  return new BasicEvaluatedExpression()
1282
1346
  .setNumber(result)
1283
1347
  .setSideEffects(param.couldHaveSideEffects())
1284
- .setRange(expr.range);
1348
+ .setRange(/** @type {Range} */ (expr.range));
1285
1349
  });
1286
1350
  this.hooks.evaluateCallExpressionMember
1287
1351
  .for("replace")
@@ -1297,9 +1361,11 @@ class JavascriptParser extends Parser {
1297
1361
  if (!arg2.isString()) return;
1298
1362
  const arg2Value = arg2.string;
1299
1363
  return new BasicEvaluatedExpression()
1300
- .setString(param.string.replace(arg1Value, arg2Value))
1364
+ .setString(
1365
+ /** @type {string} */ (param.string).replace(arg1Value, arg2Value)
1366
+ )
1301
1367
  .setSideEffects(param.couldHaveSideEffects())
1302
- .setRange(expr.range);
1368
+ .setRange(/** @type {Range} */ (expr.range));
1303
1369
  });
1304
1370
  ["substr", "substring", "slice"].forEach(fn => {
1305
1371
  this.hooks.evaluateCallExpressionMember
@@ -1308,7 +1374,7 @@ class JavascriptParser extends Parser {
1308
1374
  if (!param.isString()) return;
1309
1375
  let arg1;
1310
1376
  let result,
1311
- str = param.string;
1377
+ str = /** @type {string} */ (param.string);
1312
1378
  switch (expr.arguments.length) {
1313
1379
  case 1:
1314
1380
  if (expr.arguments[0].type === "SpreadElement") return;
@@ -1332,7 +1398,7 @@ class JavascriptParser extends Parser {
1332
1398
  return new BasicEvaluatedExpression()
1333
1399
  .setString(result)
1334
1400
  .setSideEffects(param.couldHaveSideEffects())
1335
- .setRange(expr.range);
1401
+ .setRange(/** @type {Range} */ (expr.range));
1336
1402
  });
1337
1403
  });
1338
1404
 
@@ -1365,7 +1431,10 @@ class JavascriptParser extends Parser {
1365
1431
  // is a const string
1366
1432
 
1367
1433
  prevExpr.setString(prevExpr.string + exprAsString + quasi);
1368
- prevExpr.setRange([prevExpr.range[0], quasiExpr.range[1]]);
1434
+ prevExpr.setRange([
1435
+ /** @type {Range} */ (prevExpr.range)[0],
1436
+ /** @type {Range} */ (quasiExpr.range)[1]
1437
+ ]);
1369
1438
  // We unset the expression as it doesn't match to a single expression
1370
1439
  prevExpr.setExpression(undefined);
1371
1440
  continue;
@@ -1437,14 +1506,16 @@ class JavascriptParser extends Parser {
1437
1506
  continue;
1438
1507
  }
1439
1508
 
1509
+ /** @type {string} */
1440
1510
  const value = argExpr.isString()
1441
- ? argExpr.string
1442
- : "" + argExpr.number;
1511
+ ? /** @type {string} */ (argExpr.string)
1512
+ : "" + /** @type {number} */ (argExpr.number);
1443
1513
 
1514
+ /** @type {string} */
1444
1515
  const newString = value + (stringSuffix ? stringSuffix.string : "");
1445
1516
  const newRange = /** @type {Range} */ ([
1446
- argExpr.range[0],
1447
- (stringSuffix || argExpr).range[1]
1517
+ /** @type {Range} */ (argExpr.range)[0],
1518
+ /** @type {Range} */ ((stringSuffix || argExpr).range)[1]
1448
1519
  ]);
1449
1520
  stringSuffix = new BasicEvaluatedExpression()
1450
1521
  .setString(newString)
@@ -1463,7 +1534,7 @@ class JavascriptParser extends Parser {
1463
1534
  : innerExpressions.reverse();
1464
1535
  return new BasicEvaluatedExpression()
1465
1536
  .setWrapped(prefix, stringSuffix, inner)
1466
- .setRange(expr.range);
1537
+ .setRange(/** @type {Range} */ (expr.range));
1467
1538
  } else if (param.isWrapped()) {
1468
1539
  const postfix = stringSuffix || param.postfix;
1469
1540
  const inner = param.wrappedInnerExpressions
@@ -1471,17 +1542,18 @@ class JavascriptParser extends Parser {
1471
1542
  : innerExpressions.reverse();
1472
1543
  return new BasicEvaluatedExpression()
1473
1544
  .setWrapped(param.prefix, postfix, inner)
1474
- .setRange(expr.range);
1545
+ .setRange(/** @type {Range} */ (expr.range));
1475
1546
  } else {
1476
1547
  const newString =
1477
- param.string + (stringSuffix ? stringSuffix.string : "");
1548
+ /** @type {string} */ (param.string) +
1549
+ (stringSuffix ? stringSuffix.string : "");
1478
1550
  return new BasicEvaluatedExpression()
1479
1551
  .setString(newString)
1480
1552
  .setSideEffects(
1481
1553
  (stringSuffix && stringSuffix.couldHaveSideEffects()) ||
1482
1554
  param.couldHaveSideEffects()
1483
1555
  )
1484
- .setRange(expr.range);
1556
+ .setRange(/** @type {Range} */ (expr.range));
1485
1557
  }
1486
1558
  });
1487
1559
  this.hooks.evaluateCallExpressionMember
@@ -1493,9 +1565,11 @@ class JavascriptParser extends Parser {
1493
1565
  let result;
1494
1566
  const arg = this.evaluateExpression(expr.arguments[0]);
1495
1567
  if (arg.isString()) {
1496
- result = param.string.split(arg.string);
1568
+ result =
1569
+ /** @type {string} */
1570
+ (param.string).split(/** @type {string} */ (arg.string));
1497
1571
  } else if (arg.isRegExp()) {
1498
- result = param.string.split(arg.regExp);
1572
+ result = /** @type {string} */ (param.string).split(arg.regExp);
1499
1573
  } else {
1500
1574
  return;
1501
1575
  }
@@ -2284,6 +2358,10 @@ class JavascriptParser extends Parser {
2284
2358
  }
2285
2359
  }
2286
2360
 
2361
+ /**
2362
+ * @param {Declaration} declaration declaration
2363
+ * @param {TODO} onIdent on ident callback
2364
+ */
2287
2365
  enterDeclaration(declaration, onIdent) {
2288
2366
  switch (declaration.type) {
2289
2367
  case "VariableDeclaration":
@@ -2540,10 +2618,16 @@ class JavascriptParser extends Parser {
2540
2618
  declarator.init && this.getRenameIdentifier(declarator.init);
2541
2619
  if (renameIdentifier && declarator.id.type === "Identifier") {
2542
2620
  const hook = this.hooks.canRename.get(renameIdentifier);
2543
- if (hook !== undefined && hook.call(declarator.init)) {
2621
+ if (
2622
+ hook !== undefined &&
2623
+ hook.call(/** @type {Expression} */ (declarator.init))
2624
+ ) {
2544
2625
  // renaming with "var a = b;"
2545
2626
  const hook = this.hooks.rename.get(renameIdentifier);
2546
- if (hook === undefined || !hook.call(declarator.init)) {
2627
+ if (
2628
+ hook === undefined ||
2629
+ !hook.call(/** @type {Expression} */ (declarator.init))
2630
+ ) {
2547
2631
  this.setVariable(declarator.id.name, renameIdentifier);
2548
2632
  }
2549
2633
  break;
@@ -2928,7 +3012,7 @@ class JavascriptParser extends Parser {
2928
3012
  (currentStatement.type === "ExpressionStatement" &&
2929
3013
  currentStatement.expression === expression)
2930
3014
  ) {
2931
- const old = this.statementPath.pop();
3015
+ const old = /** @type {StatementPathItem} */ (this.statementPath.pop());
2932
3016
  for (const expr of expression.expressions) {
2933
3017
  this.statementPath.push(expr);
2934
3018
  this.walkExpression(expr);
@@ -3383,6 +3467,13 @@ class JavascriptParser extends Parser {
3383
3467
  if (expression.computed === true) this.walkExpression(expression.property);
3384
3468
  }
3385
3469
 
3470
+ /**
3471
+ * @param {TODO} expression member expression
3472
+ * @param {string} name name
3473
+ * @param {string | VariableInfo} rootInfo root info
3474
+ * @param {string[]} members members
3475
+ * @param {TODO} onUnhandled on unhandled callback
3476
+ */
3386
3477
  walkMemberExpressionWithExpressionName(
3387
3478
  expression,
3388
3479
  name,
@@ -3436,7 +3527,14 @@ class JavascriptParser extends Parser {
3436
3527
  walkMetaProperty(metaProperty) {
3437
3528
  this.hooks.expression.for(getRootName(metaProperty)).call(metaProperty);
3438
3529
  }
3439
-
3530
+ /**
3531
+ * @template T
3532
+ * @template R
3533
+ * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks the should be called
3534
+ * @param {TODO} expr expression
3535
+ * @param {AsArray<T>} args args for the hook
3536
+ * @returns {R | undefined} result of hook
3537
+ */
3440
3538
  callHooksForExpression(hookMap, expr, ...args) {
3441
3539
  return this.callHooksForExpressionWithFallback(
3442
3540
  hookMap,
@@ -3725,6 +3823,10 @@ class JavascriptParser extends Parser {
3725
3823
  }
3726
3824
  }
3727
3825
 
3826
+ /**
3827
+ * @param {(Pattern | Property)[]} patterns patterns
3828
+ * @param {TODO} onIdent on ident callback
3829
+ */
3728
3830
  enterPatterns(patterns, onIdent) {
3729
3831
  for (const pattern of patterns) {
3730
3832
  if (typeof pattern !== "string") {
@@ -3735,6 +3837,10 @@ class JavascriptParser extends Parser {
3735
3837
  }
3736
3838
  }
3737
3839
 
3840
+ /**
3841
+ * @param {Pattern | Property} pattern pattern
3842
+ * @param {TODO} onIdent on ident callback
3843
+ */
3738
3844
  enterPattern(pattern, onIdent) {
3739
3845
  if (!pattern) return;
3740
3846
  switch (pattern.type) {
@@ -3759,7 +3865,7 @@ class JavascriptParser extends Parser {
3759
3865
  this.enterIdentifier(pattern.value, onIdent);
3760
3866
  this.scope.inShorthand = false;
3761
3867
  } else {
3762
- this.enterPattern(pattern.value, onIdent);
3868
+ this.enterPattern(/** @type {Identifier} */ (pattern.value), onIdent);
3763
3869
  }
3764
3870
  break;
3765
3871
  }
@@ -3801,8 +3907,10 @@ class JavascriptParser extends Parser {
3801
3907
  elementIndex++
3802
3908
  ) {
3803
3909
  const element = pattern.elements[elementIndex];
3804
- // TODO check on `null`?
3805
- this.enterPattern(element, onIdent);
3910
+
3911
+ if (element) {
3912
+ this.enterPattern(element, onIdent);
3913
+ }
3806
3914
  }
3807
3915
  }
3808
3916
 
@@ -4041,7 +4149,10 @@ class JavascriptParser extends Parser {
4041
4149
  case "ClassDeclaration":
4042
4150
  case "ClassExpression": {
4043
4151
  if (expr.body.type !== "ClassBody") return false;
4044
- if (expr.superClass && !this.isPure(expr.superClass, expr.range[0])) {
4152
+ if (
4153
+ expr.superClass &&
4154
+ !this.isPure(expr.superClass, /** @type {Range} */ (expr.range)[0])
4155
+ ) {
4045
4156
  return false;
4046
4157
  }
4047
4158
  const items =
@@ -4071,6 +4182,14 @@ class JavascriptParser extends Parser {
4071
4182
  return false;
4072
4183
  }
4073
4184
 
4185
+ if (
4186
+ expr.superClass &&
4187
+ item.type === "MethodDefinition" &&
4188
+ item.kind === "constructor"
4189
+ ) {
4190
+ return false;
4191
+ }
4192
+
4074
4193
  return true;
4075
4194
  });
4076
4195
  }
@@ -4143,15 +4262,26 @@ class JavascriptParser extends Parser {
4143
4262
 
4144
4263
  /**
4145
4264
  * @param {Range} range range
4146
- * @returns {TODO[]} comments in the range
4265
+ * @returns {Comment[]} comments in the range
4147
4266
  */
4148
4267
  getComments(range) {
4149
4268
  const [rangeStart, rangeEnd] = range;
4150
- const compare = (comment, needle) => comment.range[0] - needle;
4151
- let idx = binarySearchBounds.ge(this.comments, rangeStart, compare);
4269
+ /**
4270
+ * @param {Comment} comment comment
4271
+ * @param {number} needle needle
4272
+ * @returns {number} compared
4273
+ */
4274
+ const compare = (comment, needle) =>
4275
+ /** @type {Range} */ (comment.range)[0] - needle;
4276
+ const comments = /** @type {Comment[]} */ (this.comments);
4277
+ let idx = binarySearchBounds.ge(comments, rangeStart, compare);
4278
+ /** @type {Comment[]} */
4152
4279
  let commentsInRange = [];
4153
- while (this.comments[idx] && this.comments[idx].range[1] <= rangeEnd) {
4154
- commentsInRange.push(this.comments[idx]);
4280
+ while (
4281
+ comments[idx] &&
4282
+ /** @type {Range} */ (comments[idx].range)[1] <= rangeEnd
4283
+ ) {
4284
+ commentsInRange.push(comments[idx]);
4155
4285
  idx++;
4156
4286
  }
4157
4287
 
@@ -4167,14 +4297,17 @@ class JavascriptParser extends Parser {
4167
4297
  if (currentStatement === undefined) throw new Error("Not in statement");
4168
4298
  return (
4169
4299
  // Either asking directly for the end position of the current statement
4170
- (currentStatement.range[1] === pos && this.semicolons.has(pos)) ||
4300
+ (currentStatement.range[1] === pos &&
4301
+ /** @type {Set<number>} */ (this.semicolons).has(pos)) ||
4171
4302
  // Or asking for the start position of the current statement,
4172
4303
  // here we have to check multiple things
4173
4304
  (currentStatement.range[0] === pos &&
4174
4305
  // is there a previous statement which might be relevant?
4175
4306
  this.prevStatement !== undefined &&
4176
4307
  // is the end position of the previous statement an ASI position?
4177
- this.semicolons.has(this.prevStatement.range[1]))
4308
+ /** @type {Set<number>} */ (this.semicolons).has(
4309
+ this.prevStatement.range[1]
4310
+ ))
4178
4311
  );
4179
4312
  }
4180
4313
 
@@ -4183,7 +4316,7 @@ class JavascriptParser extends Parser {
4183
4316
  * @returns {void}
4184
4317
  */
4185
4318
  unsetAsiPosition(pos) {
4186
- this.semicolons.delete(pos);
4319
+ /** @type {Set<number>} */ (this.semicolons).delete(pos);
4187
4320
  }
4188
4321
 
4189
4322
  /**
@@ -4199,6 +4332,11 @@ class JavascriptParser extends Parser {
4199
4332
  );
4200
4333
  }
4201
4334
 
4335
+ /**
4336
+ * @param {string} name name
4337
+ * @param {TODO} tag tag info
4338
+ * @returns {TODO} tag data
4339
+ */
4202
4340
  getTagData(name, tag) {
4203
4341
  const info = this.scope.definitions.get(name);
4204
4342
  if (info instanceof VariableInfo) {
@@ -4210,6 +4348,11 @@ class JavascriptParser extends Parser {
4210
4348
  }
4211
4349
  }
4212
4350
 
4351
+ /**
4352
+ * @param {string} name name
4353
+ * @param {TODO} tag tag info
4354
+ * @param {TODO=} data data
4355
+ */
4213
4356
  tagVariable(name, tag, data) {
4214
4357
  const oldInfo = this.scope.definitions.get(name);
4215
4358
  /** @type {VariableInfo} */
@@ -4326,7 +4469,10 @@ class JavascriptParser extends Parser {
4326
4469
  // try compile only if webpack options comment is present
4327
4470
  try {
4328
4471
  for (let [key, val] of Object.entries(
4329
- vm.runInNewContext(`(function(){return {${value}};})()`)
4472
+ vm.runInContext(
4473
+ `(function(){return {${value}};})()`,
4474
+ this.magicCommentContext
4475
+ )
4330
4476
  )) {
4331
4477
  if (typeof val === "object" && val !== null) {
4332
4478
  if (val.constructor.name === "RegExp") val = new RegExp(val);
@@ -4359,11 +4505,11 @@ class JavascriptParser extends Parser {
4359
4505
  if (expr.computed) {
4360
4506
  if (expr.property.type !== "Literal") break;
4361
4507
  members.push(`${expr.property.value}`); // the literal
4362
- memberRanges.push(expr.object.range); // the range of the expression fragment before the literal
4508
+ memberRanges.push(/** @type {Range} */ (expr.object.range)); // the range of the expression fragment before the literal
4363
4509
  } else {
4364
4510
  if (expr.property.type !== "Identifier") break;
4365
4511
  members.push(expr.property.name); // the identifier
4366
- memberRanges.push(expr.object.range); // the range of the expression fragment before the identifier
4512
+ memberRanges.push(/** @type {Range} */ (expr.object.range)); // the range of the expression fragment before the identifier
4367
4513
  }
4368
4514
  membersOptionals.push(expr.optional);
4369
4515
  expr = expr.object;