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.
- package/README.md +3 -0
- package/bin/webpack.js +1 -3
- package/hot/log.js +0 -2
- package/lib/APIPlugin.js +17 -13
- package/lib/ChunkGraph.js +1 -1
- package/lib/CleanPlugin.js +12 -12
- package/lib/Compilation.js +26 -17
- package/lib/Compiler.js +13 -0
- package/lib/ConcatenationScope.js +2 -2
- package/lib/ConditionalInitFragment.js +3 -3
- package/lib/ContextModule.js +4 -4
- package/lib/ContextModuleFactory.js +1 -1
- package/lib/DefinePlugin.js +47 -26
- package/lib/DependencyTemplate.js +3 -1
- package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
- package/lib/EvalDevToolModulePlugin.js +1 -1
- package/lib/EvalSourceMapDevToolPlugin.js +2 -2
- package/lib/ExportsInfoApiPlugin.js +2 -2
- package/lib/ExternalModule.js +47 -12
- package/lib/ExternalModuleFactoryPlugin.js +1 -1
- package/lib/FileSystemInfo.js +20 -3
- package/lib/FlagDependencyExportsPlugin.js +1 -1
- package/lib/Generator.js +1 -0
- package/lib/HotModuleReplacementPlugin.js +3 -3
- package/lib/InitFragment.js +7 -7
- package/lib/LibManifestPlugin.js +4 -1
- package/lib/Module.js +2 -1
- package/lib/ModuleFilenameHelpers.js +1 -1
- package/lib/ModuleInfoHeaderPlugin.js +1 -1
- package/lib/MultiStats.js +2 -2
- package/lib/NodeStuffPlugin.js +48 -0
- package/lib/NormalModule.js +13 -11
- package/lib/NormalModuleFactory.js +7 -7
- package/lib/RuntimeTemplate.js +15 -11
- package/lib/SourceMapDevToolPlugin.js +2 -2
- package/lib/Stats.js +4 -0
- package/lib/WebpackOptionsApply.js +4 -3
- package/lib/asset/AssetModulesPlugin.js +2 -3
- package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
- package/lib/buildChunkGraph.js +53 -0
- package/lib/cache/AddManagedPathsPlugin.js +6 -1
- package/lib/cache/IdleFileCachePlugin.js +12 -5
- package/lib/cache/PackFileCacheStrategy.js +3 -3
- package/lib/cache/ResolverCachePlugin.js +2 -2
- package/lib/config/browserslistTargetHandler.js +35 -14
- package/lib/config/defaults.js +88 -52
- package/lib/config/normalization.js +17 -18
- package/lib/config/target.js +5 -0
- package/lib/container/ContainerReferencePlugin.js +1 -1
- package/lib/css/CssExportsGenerator.js +14 -1
- package/lib/css/CssGenerator.js +14 -1
- package/lib/css/CssLoadingRuntimeModule.js +23 -23
- package/lib/css/CssModulesPlugin.js +68 -32
- package/lib/css/CssParser.js +8 -3
- package/lib/debug/ProfilingPlugin.js +2 -2
- package/lib/dependencies/AMDDefineDependency.js +4 -4
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +126 -34
- package/lib/dependencies/AMDPlugin.js +11 -4
- package/lib/dependencies/AMDRequireArrayDependency.js +13 -1
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +159 -43
- package/lib/dependencies/AMDRequireDependency.js +2 -2
- package/lib/dependencies/AMDRequireItemDependency.js +1 -1
- package/lib/dependencies/CachedConstDependency.js +8 -1
- package/lib/dependencies/CommonJsImportsParserPlugin.js +1 -1
- package/lib/dependencies/ContextElementDependency.js +1 -1
- package/lib/dependencies/ExternalModuleDependency.js +107 -0
- package/lib/dependencies/ExternalModuleInitFragment.js +131 -0
- package/lib/dependencies/HarmonyAcceptDependency.js +1 -1
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +7 -1
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +18 -18
- package/lib/dependencies/HarmonyExportInitFragment.js +6 -6
- package/lib/dependencies/HarmonyImportDependency.js +4 -4
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +6 -6
- package/lib/dependencies/ImportDependency.js +26 -6
- package/lib/dependencies/JsonExportsDependency.js +1 -1
- package/lib/dependencies/LoaderPlugin.js +2 -1
- package/lib/dependencies/LocalModuleDependency.js +1 -1
- package/lib/dependencies/PureExpressionDependency.js +12 -4
- package/lib/dependencies/RequireIncludeDependency.js +1 -1
- package/lib/dependencies/WebpackIsIncludedDependency.js +1 -1
- package/lib/dependencies/WorkerPlugin.js +10 -3
- package/lib/dependencies/getFunctionExpression.js +2 -2
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +6 -6
- package/lib/hmr/HotModuleReplacement.runtime.js +3 -5
- package/lib/hmr/lazyCompilationBackend.js +4 -4
- package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
- package/lib/index.js +4 -0
- package/lib/javascript/JavascriptGenerator.js +16 -1
- package/lib/javascript/JavascriptModulesPlugin.js +33 -33
- package/lib/javascript/JavascriptParser.js +220 -74
- package/lib/json/JsonGenerator.js +1 -1
- package/lib/library/AmdLibraryPlugin.js +5 -1
- package/lib/library/AssignLibraryPlugin.js +1 -1
- package/lib/library/SystemLibraryPlugin.js +1 -1
- package/lib/library/UmdLibraryPlugin.js +39 -39
- package/lib/logging/createConsoleLogger.js +1 -19
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +8 -8
- package/lib/node/RequireChunkLoadingRuntimeModule.js +8 -8
- package/lib/node/nodeConsole.js +1 -5
- package/lib/optimize/ConcatenatedModule.js +7 -7
- package/lib/optimize/InnerGraphPlugin.js +9 -1
- package/lib/optimize/MangleExportsPlugin.js +5 -1
- package/lib/optimize/ModuleConcatenationPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +123 -47
- package/lib/optimize/SideEffectsFlagPlugin.js +15 -3
- package/lib/optimize/SplitChunksPlugin.js +16 -16
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -2
- package/lib/rules/RuleSetCompiler.js +1 -1
- package/lib/runtime/AutoPublicPathRuntimeModule.js +2 -2
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +4 -4
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +4 -4
- package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +23 -22
- package/lib/runtime/StartupEntrypointRuntimeModule.js +2 -2
- package/lib/schemes/HttpUriPlugin.js +1 -1
- package/lib/serialization/FileMiddleware.js +4 -4
- package/lib/serialization/ObjectMiddleware.js +4 -4
- package/lib/sharing/ConsumeSharedPlugin.js +5 -5
- package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -4
- package/lib/sharing/ProvideSharedModule.js +2 -2
- package/lib/sharing/SharePlugin.js +2 -2
- package/lib/sharing/ShareRuntimeModule.js +1 -1
- package/lib/sharing/utils.js +24 -28
- package/lib/stats/DefaultStatsFactoryPlugin.js +10 -10
- package/lib/stats/DefaultStatsPresetPlugin.js +3 -7
- package/lib/stats/DefaultStatsPrinterPlugin.js +34 -31
- package/lib/util/chainedImports.js +7 -6
- package/lib/util/cleverMerge.js +4 -4
- package/lib/util/comparators.js +59 -23
- package/lib/util/hash/xxhash64.js +2 -2
- package/lib/util/identifier.js +2 -2
- package/lib/util/internalSerializables.js +6 -0
- package/lib/util/numberHash.js +64 -52
- package/lib/util/runtime.js +18 -1
- package/lib/util/semver.js +19 -24
- package/lib/util/smartGrouping.js +1 -1
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +53 -28
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +2 -2
- package/lib/wasm-async/AsyncWebAssemblyParser.js +6 -0
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +2 -2
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +2 -2
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +13 -13
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -6
- package/package.json +25 -80
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +140 -32
- package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
- package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
- package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- 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 {
|
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)
|
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)
|
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)
|
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()
|
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(
|
700
|
-
|
701
|
-
|
702
|
-
const
|
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(
|
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(
|
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(
|
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(
|
878
|
-
|
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(
|
892
|
-
|
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(
|
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(
|
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([
|
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
|
-
|
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 =
|
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 (
|
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 (
|
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
|
-
|
3805
|
-
|
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 (
|
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 {
|
4265
|
+
* @returns {Comment[]} comments in the range
|
4147
4266
|
*/
|
4148
4267
|
getComments(range) {
|
4149
4268
|
const [rangeStart, rangeEnd] = range;
|
4150
|
-
|
4151
|
-
|
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 (
|
4154
|
-
|
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 &&
|
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(
|
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.
|
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;
|