webpack 5.108.4 → 5.109.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.
- package/bin/webpack.js +12 -0
- package/lib/APIPlugin.js +48 -29
- package/lib/CacheFacade.js +8 -0
- package/lib/ChunkGraph.js +17 -15
- package/lib/ChunkGroup.js +1 -0
- package/lib/CompatibilityPlugin.js +62 -29
- package/lib/Compilation.js +58 -6
- package/lib/ConstPlugin.js +11 -11
- package/lib/ContextModule.js +239 -6
- package/lib/ContextModuleFactory.js +139 -14
- package/lib/DefinePlugin.js +433 -112
- package/lib/Entrypoint.js +1 -1
- package/lib/ExportsInfo.js +22 -5
- package/lib/ExportsInfoApiPlugin.js +2 -2
- package/lib/ExternalModule.js +107 -5
- package/lib/ExternalModuleFactoryPlugin.js +20 -1
- package/lib/FileSystemInfo.js +256 -100
- package/lib/FlagDependencyUsagePlugin.js +33 -12
- package/lib/HotModuleReplacementPlugin.js +18 -15
- package/lib/InitFragment.js +20 -32
- package/lib/Module.js +3 -0
- package/lib/ModuleFilenameHelpers.js +2 -2
- package/lib/ModuleTypeConstants.js +8 -1
- package/lib/MultiCompiler.js +13 -2
- package/lib/MultiWatching.js +1 -0
- package/lib/NodeStuffPlugin.js +51 -33
- package/lib/NormalModule.js +175 -401
- package/lib/NormalModuleFactory.js +76 -2
- package/lib/ProgressPlugin.js +211 -119
- package/lib/ProvidePlugin.js +2 -2
- package/lib/RuntimeGlobals.js +47 -0
- package/lib/RuntimePlugin.js +67 -107
- package/lib/RuntimeTemplate.js +304 -16
- package/lib/Template.js +23 -3
- package/lib/UseStrictPlugin.js +1 -1
- package/lib/WebpackIsIncludedPlugin.js +1 -1
- package/lib/WebpackOptionsApply.js +24 -19
- package/lib/asset/AssetGenerator.js +110 -28
- package/lib/asset/AssetModulesPlugin.js +92 -2
- package/lib/asset/WebManifestGenerator.js +164 -0
- package/lib/asset/WebManifestParser.js +130 -0
- package/lib/async-modules/AwaitDependenciesInitFragment.js +14 -4
- package/lib/async-modules/isGeneratorLowered.js +26 -0
- package/lib/cache/PackFileCacheStrategy.js +9 -3
- package/lib/config/browserslistTargetHandler.js +40 -0
- package/lib/config/defaults.js +219 -29
- package/lib/config/normalization.js +26 -0
- package/lib/config/target.js +9 -1
- package/lib/container/HoistContainerReferencesPlugin.js +47 -55
- package/lib/css/CssGenerator.js +40 -31
- package/lib/css/CssLoadingRuntimeModule.js +5 -1
- package/lib/css/CssModulesPlugin.js +13 -0
- package/lib/css/CssParser.js +729 -313
- package/lib/css/syntax.js +1371 -861
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -6
- package/lib/dependencies/AMDPlugin.js +2 -2
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +13 -13
- package/lib/dependencies/CommonJsDependencyHelpers.js +39 -0
- package/lib/dependencies/CommonJsExportRequireDependency.js +19 -0
- package/lib/dependencies/CommonJsExportsDependency.js +47 -2
- package/lib/dependencies/CommonJsExportsParserPlugin.js +10 -10
- package/lib/dependencies/CommonJsImportsParserPlugin.js +18 -18
- package/lib/dependencies/CommonJsPlugin.js +2 -2
- package/lib/dependencies/CommonJsRequireDependency.js +26 -1
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +32 -1
- package/lib/dependencies/ContextDependencyHelpers.js +3 -3
- package/lib/dependencies/CreateRequireParserPlugin.js +6 -6
- package/lib/dependencies/CssIcssExportDependency.js +162 -71
- package/lib/dependencies/CssUrlDependency.js +35 -4
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +2 -2
- package/lib/dependencies/HarmonyCompatibilityDependency.js +32 -14
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +43 -13
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +2 -1
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +7 -19
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +17 -9
- package/lib/dependencies/HarmonyImportDependency.js +13 -2
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +11 -11
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +10 -7
- package/lib/dependencies/HarmonyModulesPlugin.js +6 -0
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -1
- package/lib/dependencies/HtmlEntryDependency.js +797 -172
- package/lib/dependencies/HtmlSourceDependency.js +26 -0
- package/lib/dependencies/ImportDependency.js +43 -1
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +31 -18
- package/lib/dependencies/ImportMetaContextPlugin.js +38 -7
- package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
- package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
- package/lib/dependencies/ImportMetaPlugin.js +532 -180
- package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
- package/lib/dependencies/ImportParserPlugin.js +80 -17
- package/lib/dependencies/ImportPhase.js +10 -8
- package/lib/dependencies/LoaderPlugin.js +5 -1
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +3 -6
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +4 -11
- package/lib/dependencies/SystemPlugin.js +2 -4
- package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
- package/lib/dependencies/URLDependency.js +141 -21
- package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +324 -112
- package/lib/dependencies/WorkerDependency.js +86 -18
- package/lib/dependencies/WorkletDependency.js +278 -0
- package/lib/dll/DelegatedModuleFactoryPlugin.js +19 -0
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +1 -1
- package/lib/errors/LoaderLoadingError.js +20 -0
- package/lib/errors/ModuleParseError.js +39 -22
- package/lib/errors/NodeStuffInWebError.js +1 -1
- package/lib/esm/ModuleChunkFormatPlugin.js +47 -14
- package/lib/esm/ModuleChunkLoadingPlugin.js +8 -1
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +29 -1
- package/lib/hmr/lazyCompilationBackend.js +51 -12
- package/lib/html/HtmlGenerator.js +907 -15
- package/lib/html/HtmlModule.js +2 -2
- package/lib/html/HtmlModulesPlugin.js +610 -166
- package/lib/html/HtmlParser.js +603 -247
- package/lib/html/favicon.svg +1 -0
- package/lib/html/syntax.js +3451 -2762
- package/lib/ids/IdHelpers.js +25 -11
- package/lib/index.js +6 -0
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
- package/lib/javascript/BasicEvaluatedExpression.js +366 -48
- package/lib/javascript/JavascriptGenerator.js +197 -49
- package/lib/javascript/JavascriptModulesPlugin.js +178 -24
- package/lib/javascript/JavascriptParser.js +704 -355
- package/lib/javascript/JavascriptParserHelpers.js +3 -6
- package/lib/javascript/syntax.js +5037 -0
- package/lib/library/ModuleLibraryPlugin.js +38 -1
- package/lib/loaders/LoaderRunner.js +714 -0
- package/lib/loaders/loadLoader.js +100 -0
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +29 -2
- package/lib/node/ReadFileCompileWasmPlugin.js +24 -2
- package/lib/optimize/AggressiveMergingPlugin.js +19 -15
- package/lib/optimize/ConcatenatedModule.js +139 -31
- package/lib/optimize/FlagIncludedChunksPlugin.js +13 -3
- package/lib/optimize/InnerGraphPlugin.js +50 -30
- package/lib/optimize/ModuleConcatenationPlugin.js +139 -24
- package/lib/optimize/SideEffectsFlagPlugin.js +86 -43
- package/lib/optimize/SplitChunksPlugin.js +146 -44
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +15 -0
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +24 -13
- package/lib/prefetch/ResourceHintPlugin.js +687 -0
- package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
- package/lib/prefetch/parseResourceHintOptions.js +103 -0
- package/lib/rules/RuleSetCompiler.js +114 -0
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
- package/lib/runtime/AsyncModuleRuntimeModule.js +24 -8
- package/lib/runtime/AutoPublicPathRuntimeModule.js +7 -1
- package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +204 -8
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +4 -1
- package/lib/schemes/HttpUriPlugin.js +40 -1
- package/lib/schemes/VirtualUrlPlugin.js +1 -2
- package/lib/serialization/BinaryMiddleware.js +270 -938
- package/lib/serialization/FileMiddleware.js +29 -3
- package/lib/stats/DefaultStatsFactoryPlugin.js +229 -194
- package/lib/stats/DefaultStatsPresetPlugin.js +2 -0
- package/lib/stats/DefaultStatsPrinterPlugin.js +36 -168
- package/lib/stats/StatsFactory.js +46 -17
- package/lib/url/URLParserPlugin.js +66 -13
- package/lib/util/AsyncQueue.js +122 -72
- package/lib/util/SetHelpers.js +1 -1
- package/lib/util/StackedMap.js +122 -48
- package/lib/util/binarySearchBounds.js +2 -2
- package/lib/util/concatenate.js +40 -14
- package/lib/util/createHooksRegistry.js +13 -5
- package/lib/util/dataURL.js +2 -2
- package/lib/util/deterministicGrouping.js +7 -5
- package/lib/util/formatSize.js +6 -2
- package/lib/util/globUtils.js +710 -0
- package/lib/util/identifier.js +23 -6
- package/lib/util/implicitTypeLoaderFallback.js +62 -0
- package/lib/util/internalSerializables.js +88 -71
- package/lib/util/magicComment.js +121 -25
- package/lib/util/numberHash.js +2 -2
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +24 -18
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +33 -22
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +79 -16
- package/lib/web/FetchCompileAsyncWasmPlugin.js +19 -0
- package/lib/web/FetchCompileWasmPlugin.js +14 -0
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -0
- package/lib/webpack.js +65 -0
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +3 -0
- package/module.d.ts +21 -0
- package/package.json +12 -11
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +759 -36
- package/schemas/plugins/HtmlParserOptions.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.json +17 -1
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/types.d.ts +1212 -99
package/lib/ids/IdHelpers.js
CHANGED
|
@@ -18,6 +18,17 @@ const numberHash = require("../util/numberHash");
|
|
|
18
18
|
/** @typedef {import("../Module").BuildMeta} BuildMeta */
|
|
19
19
|
/** @typedef {import("../css/CssModule").CssModuleBuildMeta} CssModuleBuildMeta */
|
|
20
20
|
|
|
21
|
+
// Numbers longer than this are written in exponential form ("...e+xx"), so a
|
|
22
|
+
// longer string can't be a plain integer id.
|
|
23
|
+
const MAX_NUMERIC_STRING_LENGTH = 21;
|
|
24
|
+
// Char codes bounding the "looks like a plain number" fast check in `avoidNumber`.
|
|
25
|
+
const CC_HYPHEN_MINUS = 45;
|
|
26
|
+
const CC_DIGIT_ONE = 49;
|
|
27
|
+
const CC_DIGIT_NINE = 57;
|
|
28
|
+
// Long ids are truncated to this length and disambiguated with a short hash.
|
|
29
|
+
const MAX_SHORTENED_STRING_LENGTH = 100;
|
|
30
|
+
const SHORTENED_STRING_HASH_LENGTH = 6;
|
|
31
|
+
|
|
21
32
|
/**
|
|
22
33
|
* Returns hash.
|
|
23
34
|
* @param {string} str string to hash
|
|
@@ -38,14 +49,12 @@ const getHash = (str, len, hashFunction) => {
|
|
|
38
49
|
* @returns {string} string prefixed by an underscore if it is a number
|
|
39
50
|
*/
|
|
40
51
|
const avoidNumber = (str) => {
|
|
41
|
-
|
|
42
|
-
if (str.length > 21) return str;
|
|
52
|
+
if (str.length > MAX_NUMERIC_STRING_LENGTH) return str;
|
|
43
53
|
const firstChar = str.charCodeAt(0);
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
} else if (firstChar > 57) {
|
|
54
|
+
// Skip everything that doesn't start like a number ("-" or a digit).
|
|
55
|
+
if (firstChar < CC_DIGIT_ONE) {
|
|
56
|
+
if (firstChar !== CC_HYPHEN_MINUS) return str;
|
|
57
|
+
} else if (firstChar > CC_DIGIT_NINE) {
|
|
49
58
|
return str;
|
|
50
59
|
}
|
|
51
60
|
if (str === String(Number(str))) {
|
|
@@ -70,11 +79,16 @@ const requestToId = (request) =>
|
|
|
70
79
|
* @returns {string} string with limited max length to 100 chars
|
|
71
80
|
*/
|
|
72
81
|
const shortenLongString = (string, delimiter, hashFunction) => {
|
|
73
|
-
if (string.length <
|
|
82
|
+
if (string.length < MAX_SHORTENED_STRING_LENGTH) return string;
|
|
74
83
|
return (
|
|
75
|
-
string.slice(
|
|
84
|
+
string.slice(
|
|
85
|
+
0,
|
|
86
|
+
MAX_SHORTENED_STRING_LENGTH -
|
|
87
|
+
SHORTENED_STRING_HASH_LENGTH -
|
|
88
|
+
delimiter.length
|
|
89
|
+
) +
|
|
76
90
|
delimiter +
|
|
77
|
-
getHash(string,
|
|
91
|
+
getHash(string, SHORTENED_STRING_HASH_LENGTH, hashFunction)
|
|
78
92
|
);
|
|
79
93
|
};
|
|
80
94
|
|
|
@@ -363,7 +377,7 @@ const assignNames = (
|
|
|
363
377
|
items.sort(comparator);
|
|
364
378
|
let i = 0;
|
|
365
379
|
for (const item of items) {
|
|
366
|
-
while (
|
|
380
|
+
while (usedIds.has(name + i)) i++;
|
|
367
381
|
assignName(item, name + i);
|
|
368
382
|
usedIds.add(name + i);
|
|
369
383
|
i++;
|
package/lib/index.js
CHANGED
|
@@ -606,6 +606,12 @@ module.exports = mergeExports(fn, {
|
|
|
606
606
|
}
|
|
607
607
|
},
|
|
608
608
|
|
|
609
|
+
html: {
|
|
610
|
+
get HtmlModulesPlugin() {
|
|
611
|
+
return require("./html/HtmlModulesPlugin");
|
|
612
|
+
}
|
|
613
|
+
},
|
|
614
|
+
|
|
609
615
|
library: {
|
|
610
616
|
get AbstractLibraryPlugin() {
|
|
611
617
|
return require("./library/AbstractLibraryPlugin");
|
|
@@ -65,12 +65,11 @@ class ArrayPushCallbackChunkFormatPlugin {
|
|
|
65
65
|
} else {
|
|
66
66
|
const chunkLoadingGlobal =
|
|
67
67
|
runtimeTemplate.outputOptions.chunkLoadingGlobal;
|
|
68
|
+
const chunkLoadingGlobalExpr = `${globalObject}[${JSON.stringify(
|
|
69
|
+
chunkLoadingGlobal
|
|
70
|
+
)}]`;
|
|
68
71
|
source.add(
|
|
69
|
-
`(${
|
|
70
|
-
chunkLoadingGlobal
|
|
71
|
-
)}] = ${globalObject}[${JSON.stringify(
|
|
72
|
-
chunkLoadingGlobal
|
|
73
|
-
)}] || []).push([`
|
|
72
|
+
`(${runtimeTemplate.assignOr(chunkLoadingGlobalExpr, "[]")}).push([`
|
|
74
73
|
);
|
|
75
74
|
source.add(`${JSON.stringify(chunk.ids)},`);
|
|
76
75
|
source.add(modules);
|
|
@@ -31,36 +31,46 @@ const TypeBigInt = 13;
|
|
|
31
31
|
/** @typedef {() => MembersOptionals} GetMembersOptionals */
|
|
32
32
|
/** @typedef {() => MemberRanges} GetMemberRanges */
|
|
33
33
|
|
|
34
|
+
// _flags bit layout: bits 0-3 type, then the boolean facts
|
|
35
|
+
const FLAG_TYPE_MASK = 0b1111;
|
|
36
|
+
const FLAG_TRUTHY = 0b10000;
|
|
37
|
+
const FLAG_FALSY = 0b100000;
|
|
38
|
+
const FLAG_NULLISH_KNOWN = 0b1000000;
|
|
39
|
+
const FLAG_NULLISH = 0b10000000;
|
|
40
|
+
const FLAG_SIDE_EFFECTS = 0b100000000;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* An instance is allocated for a large share of walked expressions, so the
|
|
44
|
+
* boolean facts live in one packed flags slot and the scalar/identifier
|
|
45
|
+
* fields in five slots shared by type, with accessors keeping every public
|
|
46
|
+
* field readable. This shrinks instances from 224 to 144 bytes on V8.
|
|
47
|
+
*/
|
|
34
48
|
class BasicEvaluatedExpression {
|
|
35
49
|
constructor() {
|
|
36
|
-
|
|
37
|
-
this.type = TypeUnknown;
|
|
50
|
+
this._flags = FLAG_SIDE_EFFECTS;
|
|
38
51
|
/** @type {Range | undefined} */
|
|
39
|
-
this.
|
|
40
|
-
/** @type {
|
|
41
|
-
this.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
/** @type {
|
|
45
|
-
this.
|
|
46
|
-
/** @type {
|
|
47
|
-
this.
|
|
48
|
-
/** @type {
|
|
49
|
-
this.
|
|
50
|
-
/** @type {
|
|
51
|
-
this.
|
|
52
|
-
/** @type {
|
|
53
|
-
this.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.string = undefined;
|
|
52
|
+
this._range = undefined;
|
|
53
|
+
/** @type {Node | undefined} */
|
|
54
|
+
this.expression = undefined;
|
|
55
|
+
// _v1..._v5 hold the scalar type-specific fields, the accessors narrow
|
|
56
|
+
// them by type; expression-valued fields get typed slots below
|
|
57
|
+
/** @type {unknown} */
|
|
58
|
+
this._v1 = undefined;
|
|
59
|
+
/** @type {unknown} */
|
|
60
|
+
this._v2 = undefined;
|
|
61
|
+
/** @type {unknown} */
|
|
62
|
+
this._v3 = undefined;
|
|
63
|
+
/** @type {unknown} */
|
|
64
|
+
this._v4 = undefined;
|
|
65
|
+
/** @type {unknown} */
|
|
66
|
+
this._v5 = undefined;
|
|
67
|
+
// expression-valued fields stay plain data properties: a type that
|
|
68
|
+
// references the class inside one of its own accessors makes tsc fork
|
|
69
|
+
// the class into two unrelated identities
|
|
58
70
|
/** @type {BasicEvaluatedExpression[] | undefined} */
|
|
59
71
|
this.quasis = undefined;
|
|
60
72
|
/** @type {BasicEvaluatedExpression[] | undefined} */
|
|
61
73
|
this.parts = undefined;
|
|
62
|
-
/** @type {EXPECTED_ANY[] | undefined} */
|
|
63
|
-
this.array = undefined;
|
|
64
74
|
/** @type {BasicEvaluatedExpression[] | undefined} */
|
|
65
75
|
this.items = undefined;
|
|
66
76
|
/** @type {BasicEvaluatedExpression[] | undefined} */
|
|
@@ -71,18 +81,304 @@ class BasicEvaluatedExpression {
|
|
|
71
81
|
this.postfix = undefined;
|
|
72
82
|
/** @type {BasicEvaluatedExpression[] | undefined} */
|
|
73
83
|
this.wrappedInnerExpressions = undefined;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Served lazily from the attached expression when not set explicitly:
|
|
88
|
+
* `evaluateExpression`'s plain results share the expression's range, and
|
|
89
|
+
* most evaluations never read it, so the node's range array is only
|
|
90
|
+
* materialized on demand.
|
|
91
|
+
* @returns {Range | undefined} range of the evaluated expression
|
|
92
|
+
*/
|
|
93
|
+
get range() {
|
|
94
|
+
const range = this._range;
|
|
95
|
+
if (range !== undefined) return range;
|
|
96
|
+
const expression = this.expression;
|
|
97
|
+
return expression === undefined
|
|
98
|
+
? undefined
|
|
99
|
+
: /** @type {Range} */ (
|
|
100
|
+
/** @type {{ range?: Range }} */ (expression).range
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {Range | undefined} value range of the evaluated expression
|
|
106
|
+
*/
|
|
107
|
+
set range(value) {
|
|
108
|
+
this._range = value;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @returns {number} expression type
|
|
113
|
+
*/
|
|
114
|
+
get type() {
|
|
115
|
+
return this._flags & FLAG_TYPE_MASK;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @param {number} value expression type
|
|
120
|
+
*/
|
|
121
|
+
set type(value) {
|
|
122
|
+
this._flags = (this._flags & ~FLAG_TYPE_MASK) | value;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @returns {boolean} true when the expression is known truthy
|
|
127
|
+
*/
|
|
128
|
+
get truthy() {
|
|
129
|
+
return (this._flags & FLAG_TRUTHY) !== 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @param {boolean} value known truthy
|
|
134
|
+
*/
|
|
135
|
+
set truthy(value) {
|
|
136
|
+
this._flags = value
|
|
137
|
+
? this._flags | FLAG_TRUTHY
|
|
138
|
+
: this._flags & ~FLAG_TRUTHY;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @returns {boolean} true when the expression is known falsy
|
|
143
|
+
*/
|
|
144
|
+
get falsy() {
|
|
145
|
+
return (this._flags & FLAG_FALSY) !== 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @param {boolean} value known falsy
|
|
150
|
+
*/
|
|
151
|
+
set falsy(value) {
|
|
152
|
+
this._flags = value ? this._flags | FLAG_FALSY : this._flags & ~FLAG_FALSY;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @returns {boolean | undefined} whether the value is nullish, when known
|
|
157
|
+
*/
|
|
158
|
+
get nullish() {
|
|
159
|
+
return (this._flags & FLAG_NULLISH_KNOWN) === 0
|
|
160
|
+
? undefined
|
|
161
|
+
: (this._flags & FLAG_NULLISH) !== 0;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @param {boolean | undefined} value whether the value is nullish
|
|
166
|
+
*/
|
|
167
|
+
set nullish(value) {
|
|
168
|
+
this._flags =
|
|
169
|
+
value === undefined
|
|
170
|
+
? this._flags & ~(FLAG_NULLISH_KNOWN | FLAG_NULLISH)
|
|
171
|
+
: value
|
|
172
|
+
? this._flags | FLAG_NULLISH_KNOWN | FLAG_NULLISH
|
|
173
|
+
: (this._flags | FLAG_NULLISH_KNOWN) & ~FLAG_NULLISH;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @returns {boolean} true when the expression could have side effects
|
|
178
|
+
*/
|
|
179
|
+
get sideEffects() {
|
|
180
|
+
return (this._flags & FLAG_SIDE_EFFECTS) !== 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* @param {boolean} value could have side effects
|
|
185
|
+
*/
|
|
186
|
+
set sideEffects(value) {
|
|
187
|
+
this._flags = value
|
|
188
|
+
? this._flags | FLAG_SIDE_EFFECTS
|
|
189
|
+
: this._flags & ~FLAG_SIDE_EFFECTS;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @returns {boolean | undefined} boolean value when boolean-typed
|
|
194
|
+
*/
|
|
195
|
+
get bool() {
|
|
196
|
+
return this.type === TypeBoolean
|
|
197
|
+
? /** @type {boolean} */ (this._v1)
|
|
198
|
+
: undefined;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* @param {boolean | undefined} value boolean value
|
|
203
|
+
*/
|
|
204
|
+
set bool(value) {
|
|
205
|
+
this._v1 = value;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* @returns {number | undefined} number value when number-typed
|
|
210
|
+
*/
|
|
211
|
+
get number() {
|
|
212
|
+
return this.type === TypeNumber
|
|
213
|
+
? /** @type {number} */ (this._v1)
|
|
214
|
+
: undefined;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @param {number | undefined} value number value
|
|
219
|
+
*/
|
|
220
|
+
set number(value) {
|
|
221
|
+
this._v1 = value;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* @returns {bigint | undefined} bigint value when bigint-typed
|
|
226
|
+
*/
|
|
227
|
+
get bigint() {
|
|
228
|
+
return this.type === TypeBigInt
|
|
229
|
+
? /** @type {bigint} */ (this._v1)
|
|
230
|
+
: undefined;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @param {bigint | undefined} value bigint value
|
|
235
|
+
*/
|
|
236
|
+
set bigint(value) {
|
|
237
|
+
this._v1 = value;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* @returns {RegExp | undefined} regexp value when regexp-typed
|
|
242
|
+
*/
|
|
243
|
+
get regExp() {
|
|
244
|
+
return this.type === TypeRegExp
|
|
245
|
+
? /** @type {RegExp} */ (this._v1)
|
|
246
|
+
: undefined;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* @param {RegExp | undefined} value regexp value
|
|
251
|
+
*/
|
|
252
|
+
set regExp(value) {
|
|
253
|
+
this._v1 = value;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @returns {string | undefined} string value when string-typed
|
|
258
|
+
*/
|
|
259
|
+
get string() {
|
|
260
|
+
return this.type === TypeString
|
|
261
|
+
? /** @type {string} */ (this._v1)
|
|
262
|
+
: undefined;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* @param {string | undefined} value string value
|
|
267
|
+
*/
|
|
268
|
+
set string(value) {
|
|
269
|
+
this._v1 = value;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @returns {"cooked" | "raw" | undefined} template string kind
|
|
274
|
+
*/
|
|
275
|
+
get templateStringKind() {
|
|
276
|
+
return this.type === TypeTemplateString
|
|
277
|
+
? /** @type {"cooked" | "raw"} */ (this._v3)
|
|
278
|
+
: undefined;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* @param {"cooked" | "raw" | undefined} value template string kind
|
|
283
|
+
*/
|
|
284
|
+
set templateStringKind(value) {
|
|
285
|
+
this._v3 = value;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* @returns {EXPECTED_ANY[] | undefined} const array values
|
|
290
|
+
*/
|
|
291
|
+
get array() {
|
|
292
|
+
return this.type === TypeConstArray
|
|
293
|
+
? /** @type {unknown[]} */ (this._v1)
|
|
294
|
+
: undefined;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* @param {EXPECTED_ANY[] | undefined} value const array values
|
|
299
|
+
*/
|
|
300
|
+
set array(value) {
|
|
301
|
+
this._v1 = value;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @returns {string | VariableInfo | undefined} identifier
|
|
306
|
+
*/
|
|
307
|
+
get identifier() {
|
|
308
|
+
return this.type === TypeIdentifier
|
|
309
|
+
? /** @type {string | VariableInfo} */ (this._v1)
|
|
310
|
+
: undefined;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* @param {string | VariableInfo | undefined} value identifier
|
|
315
|
+
*/
|
|
316
|
+
set identifier(value) {
|
|
317
|
+
this._v1 = value;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* @returns {string | VariableInfo | undefined} root info
|
|
322
|
+
*/
|
|
323
|
+
get rootInfo() {
|
|
324
|
+
return this.type === TypeIdentifier
|
|
325
|
+
? /** @type {string | VariableInfo} */ (this._v2)
|
|
326
|
+
: undefined;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @param {string | VariableInfo | undefined} value root info
|
|
331
|
+
*/
|
|
332
|
+
set rootInfo(value) {
|
|
333
|
+
this._v2 = value;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* @returns {GetMembers | undefined} members getter
|
|
338
|
+
*/
|
|
339
|
+
get getMembers() {
|
|
340
|
+
return this.type === TypeIdentifier
|
|
341
|
+
? /** @type {GetMembers} */ (this._v3)
|
|
342
|
+
: undefined;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* @param {GetMembers | undefined} value members getter
|
|
347
|
+
*/
|
|
348
|
+
set getMembers(value) {
|
|
349
|
+
this._v3 = value;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* @returns {GetMembersOptionals | undefined} members optionals getter
|
|
354
|
+
*/
|
|
355
|
+
get getMembersOptionals() {
|
|
356
|
+
return this.type === TypeIdentifier
|
|
357
|
+
? /** @type {GetMembersOptionals} */ (this._v4)
|
|
358
|
+
: undefined;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @param {GetMembersOptionals | undefined} value members optionals getter
|
|
363
|
+
*/
|
|
364
|
+
set getMembersOptionals(value) {
|
|
365
|
+
this._v4 = value;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* @returns {GetMemberRanges | undefined} member ranges getter
|
|
370
|
+
*/
|
|
371
|
+
get getMemberRanges() {
|
|
372
|
+
return this.type === TypeIdentifier
|
|
373
|
+
? /** @type {GetMemberRanges} */ (this._v5)
|
|
374
|
+
: undefined;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* @param {GetMemberRanges | undefined} value member ranges getter
|
|
379
|
+
*/
|
|
380
|
+
set getMemberRanges(value) {
|
|
381
|
+
this._v5 = value;
|
|
86
382
|
}
|
|
87
383
|
|
|
88
384
|
isUnknown() {
|
|
@@ -538,7 +834,7 @@ class BasicEvaluatedExpression {
|
|
|
538
834
|
* @returns {this} this
|
|
539
835
|
*/
|
|
540
836
|
setRange(range) {
|
|
541
|
-
this.
|
|
837
|
+
this._range = range;
|
|
542
838
|
return this;
|
|
543
839
|
}
|
|
544
840
|
|
|
@@ -572,34 +868,56 @@ BasicEvaluatedExpression.isValidRegExpFlags = (flags) => {
|
|
|
572
868
|
const len = flags.length;
|
|
573
869
|
|
|
574
870
|
if (len === 0) return true;
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
871
|
+
// 8 standard flags: d g i m s u v y
|
|
872
|
+
if (len > 8) return false;
|
|
873
|
+
|
|
874
|
+
const D = 1; // d hasIndices
|
|
875
|
+
const G = 2; // g global
|
|
876
|
+
const I = 4; // i ignoreCase
|
|
877
|
+
const M = 8; // m multiline
|
|
878
|
+
const S = 16; // s dotAll
|
|
879
|
+
const U = 32; // u unicode
|
|
880
|
+
const V = 64; // v unicodeSets
|
|
881
|
+
const Y = 128; // y sticky
|
|
882
|
+
let seen = 0;
|
|
579
883
|
|
|
580
884
|
for (let i = 0; i < len; i++) {
|
|
885
|
+
let bit;
|
|
581
886
|
switch (flags.charCodeAt(i)) {
|
|
887
|
+
case 100 /* d */:
|
|
888
|
+
bit = D;
|
|
889
|
+
break;
|
|
582
890
|
case 103 /* g */:
|
|
583
|
-
|
|
584
|
-
remaining |= 0b1000;
|
|
891
|
+
bit = G;
|
|
585
892
|
break;
|
|
586
893
|
case 105 /* i */:
|
|
587
|
-
|
|
588
|
-
remaining |= 0b0100;
|
|
894
|
+
bit = I;
|
|
589
895
|
break;
|
|
590
896
|
case 109 /* m */:
|
|
591
|
-
|
|
592
|
-
|
|
897
|
+
bit = M;
|
|
898
|
+
break;
|
|
899
|
+
case 115 /* s */:
|
|
900
|
+
bit = S;
|
|
901
|
+
break;
|
|
902
|
+
case 117 /* u */:
|
|
903
|
+
bit = U;
|
|
904
|
+
break;
|
|
905
|
+
case 118 /* v */:
|
|
906
|
+
bit = V;
|
|
593
907
|
break;
|
|
594
908
|
case 121 /* y */:
|
|
595
|
-
|
|
596
|
-
remaining |= 0b0001;
|
|
909
|
+
bit = Y;
|
|
597
910
|
break;
|
|
598
911
|
default:
|
|
599
912
|
return false;
|
|
600
913
|
}
|
|
914
|
+
if (seen & bit) return false; // duplicate flag
|
|
915
|
+
seen |= bit;
|
|
601
916
|
}
|
|
602
917
|
|
|
918
|
+
// `u` and `v` are mutually exclusive
|
|
919
|
+
if (seen & U && seen & V) return false;
|
|
920
|
+
|
|
603
921
|
return true;
|
|
604
922
|
};
|
|
605
923
|
|