@nudojs/cli 0.2.1 → 0.3.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/dist/{chunk-3HCPXPEW.js → chunk-YDM4HHQ4.js} +1783 -1421
- package/dist/evaluator-api.d.ts +12 -1
- package/dist/evaluator-api.js +52 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +366 -3572
- package/package.json +23 -11
- package/CHANGELOG.md +0 -41
- package/examples/real-world.js +0 -66
- package/examples/validate-real-world.ts +0 -160
- package/src/__tests__/builtin-advanced.test.ts +0 -292
- package/src/__tests__/builtin-api.test.ts +0 -308
- package/src/__tests__/builtin-functions.test.ts +0 -313
- package/src/__tests__/builtin-map.test.ts +0 -129
- package/src/__tests__/builtin-promise.test.ts +0 -150
- package/src/__tests__/builtin-regexp.test.ts +0 -133
- package/src/__tests__/builtin-set.test.ts +0 -163
- package/src/__tests__/builtin-url.test.ts +0 -256
- package/src/__tests__/builtin-web.test.ts +0 -340
- package/src/__tests__/combination-scenarios.test.ts +0 -384
- package/src/__tests__/edge-cases.test.ts +0 -749
- package/src/__tests__/evaluator-loops.test.ts +0 -283
- package/src/__tests__/evaluator-nullish-coalescing.test.ts +0 -86
- package/src/__tests__/evaluator-optional-chaining.test.ts +0 -37
- package/src/__tests__/evaluator-phase2.test.ts +0 -564
- package/src/__tests__/evaluator-phase3.test.ts +0 -864
- package/src/__tests__/evaluator-refined.test.ts +0 -121
- package/src/__tests__/evaluator-string-methods.test.ts +0 -151
- package/src/__tests__/evaluator.test.ts +0 -943
- package/src/__tests__/mock-arrow-function.test.ts +0 -169
- package/src/__tests__/mock-comparison.test.ts +0 -221
- package/src/__tests__/mock-comprehensive.test.ts +0 -250
- package/src/__tests__/mock-final-integration.test.ts +0 -263
- package/src/__tests__/mock-helpers.test.ts +0 -174
- package/src/__tests__/mock-realworld.test.ts +0 -191
- package/src/__tests__/mock-rest-debug.test.ts +0 -110
- package/src/__tests__/mock-rest-edge.test.ts +0 -176
- package/src/__tests__/mock-sinon-runtime.test.ts +0 -168
- package/src/__tests__/narrowing-discriminated.test.ts +0 -35
- package/src/__tests__/narrowing-in-operator.test.ts +0 -56
- package/src/__tests__/narrowing-switch.test.ts +0 -56
- package/src/__tests__/narrowing-truthiness.test.ts +0 -52
- package/src/__tests__/narrowing.test.ts +0 -82
- package/src/__tests__/nudo-mock-syntax.test.ts +0 -245
- package/src/__tests__/realworld-patterns.test.ts +0 -430
- package/src/__tests__/syntax-sugar.test.ts +0 -345
- package/src/builtins/builtin-intl.ts +0 -17
- package/src/builtins/builtin-map.ts +0 -174
- package/src/builtins/builtin-promise.ts +0 -116
- package/src/builtins/builtin-reflect.ts +0 -30
- package/src/builtins/builtin-regexp.ts +0 -34
- package/src/builtins/builtin-set.ts +0 -131
- package/src/builtins/builtin-symbol.ts +0 -16
- package/src/builtins/builtin-url.ts +0 -58
- package/src/builtins/builtin-weak.ts +0 -22
- package/src/builtins/builtin-web.ts +0 -111
- package/src/builtins/index.ts +0 -61
- package/src/config.ts +0 -32
- package/src/env-loader.ts +0 -174
- package/src/evaluator-api.ts +0 -36
- package/src/evaluator.ts +0 -5623
- package/src/index.ts +0 -931
- package/src/narrowing.ts +0 -537
- package/src/resolve-npm.ts +0 -63
- package/tsconfig.json +0 -9
|
@@ -1,34 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
-
}) : x)(function(x) {
|
|
10
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
-
});
|
|
13
|
-
var __commonJS = (cb, mod) => function __require2() {
|
|
14
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
-
};
|
|
16
|
-
var __copyProps = (to, from, except, desc) => {
|
|
17
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
-
for (let key of __getOwnPropNames(from))
|
|
19
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
-
}
|
|
22
|
-
return to;
|
|
23
|
-
};
|
|
24
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
-
mod
|
|
31
|
-
));
|
|
1
|
+
import { createRequire as __nudoCreateRequire } from "module";
|
|
2
|
+
const require = __nudoCreateRequire(import.meta.url);
|
|
32
3
|
|
|
33
4
|
// src/narrowing.ts
|
|
34
5
|
import {
|
|
@@ -38,8 +9,79 @@ import {
|
|
|
38
9
|
getPrimitiveTypeOf,
|
|
39
10
|
typeValueEquals,
|
|
40
11
|
isSubtypeOf,
|
|
41
|
-
createRange
|
|
12
|
+
createRange,
|
|
13
|
+
v as termVar2
|
|
42
14
|
} from "@nudojs/core";
|
|
15
|
+
|
|
16
|
+
// src/term-registry.ts
|
|
17
|
+
import { v as termVar, lit } from "@nudojs/core";
|
|
18
|
+
var termByTv = /* @__PURE__ */ new WeakMap();
|
|
19
|
+
var predByTv = /* @__PURE__ */ new WeakMap();
|
|
20
|
+
function attachTerm(tv, term) {
|
|
21
|
+
if (tv && typeof tv === "object") termByTv.set(tv, term);
|
|
22
|
+
}
|
|
23
|
+
function getTerm(tv) {
|
|
24
|
+
if (tv && typeof tv === "object") return termByTv.get(tv);
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
function getPred(tv) {
|
|
28
|
+
if (tv && typeof tv === "object") return predByTv.get(tv);
|
|
29
|
+
return void 0;
|
|
30
|
+
}
|
|
31
|
+
function tagParamArg(arg, paramName) {
|
|
32
|
+
if (!paramName || paramName.startsWith("...")) return arg;
|
|
33
|
+
if (arg.kind === "function" || arg.kind === "instance") return arg;
|
|
34
|
+
const cloned = cloneTypeValue(arg);
|
|
35
|
+
if (cloned.kind === "primitive" && cloned.type === "number") {
|
|
36
|
+
attachTerm(cloned, termVar(paramName));
|
|
37
|
+
} else if (cloned.kind === "literal" && typeof cloned.value === "number") {
|
|
38
|
+
attachTerm(cloned, lit(cloned.value));
|
|
39
|
+
} else if (cloned.kind === "refined") {
|
|
40
|
+
attachTerm(cloned, termVar(paramName));
|
|
41
|
+
}
|
|
42
|
+
return cloned;
|
|
43
|
+
}
|
|
44
|
+
function cloneTypeValue(tv) {
|
|
45
|
+
switch (tv.kind) {
|
|
46
|
+
case "literal":
|
|
47
|
+
return { kind: "literal", value: tv.value };
|
|
48
|
+
case "primitive":
|
|
49
|
+
return { kind: "primitive", type: tv.type };
|
|
50
|
+
case "refined":
|
|
51
|
+
return { kind: "refined", base: tv.base, refinement: tv.refinement };
|
|
52
|
+
case "object":
|
|
53
|
+
return { kind: "object", properties: tv.properties, id: tv.id };
|
|
54
|
+
case "array":
|
|
55
|
+
return { kind: "array", element: tv.element };
|
|
56
|
+
case "tuple":
|
|
57
|
+
return { kind: "tuple", elements: tv.elements };
|
|
58
|
+
case "function":
|
|
59
|
+
return {
|
|
60
|
+
kind: "function",
|
|
61
|
+
params: tv.params,
|
|
62
|
+
body: tv.body,
|
|
63
|
+
closure: tv.closure
|
|
64
|
+
};
|
|
65
|
+
case "promise":
|
|
66
|
+
return { kind: "promise", value: tv.value };
|
|
67
|
+
case "instance":
|
|
68
|
+
return {
|
|
69
|
+
kind: "instance",
|
|
70
|
+
className: tv.className,
|
|
71
|
+
properties: tv.properties
|
|
72
|
+
};
|
|
73
|
+
case "union":
|
|
74
|
+
return { kind: "union", members: tv.members };
|
|
75
|
+
case "never":
|
|
76
|
+
return { kind: "never" };
|
|
77
|
+
case "unknown":
|
|
78
|
+
return { kind: "unknown" };
|
|
79
|
+
default:
|
|
80
|
+
return tv;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/narrowing.ts
|
|
43
85
|
function narrow(test, env) {
|
|
44
86
|
if (test.type === "LogicalExpression" && (test.operator === "||" || test.operator === "&&")) {
|
|
45
87
|
const [trueOfLeft, falseOfLeft] = narrow(test.left, env);
|
|
@@ -271,6 +313,9 @@ function narrowByComparison(varName, op, value, env) {
|
|
|
271
313
|
const falseEnv = env.extend({});
|
|
272
314
|
const trueRange = op === ">=" ? createRange({ min: value }) : op === ">" ? createRange({ min: value + 1 }) : op === "<=" ? createRange({ max: value }) : createRange({ max: value - 1 });
|
|
273
315
|
const falseRange = op === ">=" ? createRange({ max: value - 1 }) : op === ">" ? createRange({ max: value }) : op === "<=" ? createRange({ min: value + 1 }) : createRange({ min: value });
|
|
316
|
+
const term = termVar2(varName);
|
|
317
|
+
attachTerm(trueRange, term);
|
|
318
|
+
attachTerm(falseRange, term);
|
|
274
319
|
trueEnv.bind(varName, trueRange);
|
|
275
320
|
falseEnv.bind(varName, falseRange);
|
|
276
321
|
return [trueEnv, falseEnv];
|
|
@@ -338,121 +383,11 @@ function narrowByTruthy(varName, env) {
|
|
|
338
383
|
return [trueEnv, falseEnv];
|
|
339
384
|
}
|
|
340
385
|
|
|
341
|
-
// src/
|
|
342
|
-
import {
|
|
343
|
-
T as T12,
|
|
344
|
-
simplifyUnion as simplifyUnion4,
|
|
345
|
-
dispatchBinaryOp,
|
|
346
|
-
dispatchMethod,
|
|
347
|
-
dispatchProperty,
|
|
348
|
-
Ops,
|
|
349
|
-
createEnvironment,
|
|
350
|
-
typeValueEquals as typeValueEquals4,
|
|
351
|
-
typeValueToString,
|
|
352
|
-
isSubtypeOf as isSubtypeOf2,
|
|
353
|
-
widenLiteral,
|
|
354
|
-
collapseLiteralUnion,
|
|
355
|
-
createTemplate,
|
|
356
|
-
subtractType as subtractType2,
|
|
357
|
-
getFnSig
|
|
358
|
-
} from "@nudojs/core";
|
|
359
|
-
import { extractInlineDirectives } from "@nudojs/parser";
|
|
360
|
-
|
|
361
|
-
// src/builtins/builtin-promise.ts
|
|
362
|
-
import { T as T2, simplifyUnion } from "@nudojs/core";
|
|
363
|
-
var PROMISE_STATIC_METHODS = {
|
|
364
|
-
resolve: T2.unknown,
|
|
365
|
-
reject: T2.never,
|
|
366
|
-
all: T2.unknown,
|
|
367
|
-
race: T2.unknown,
|
|
368
|
-
allSettled: T2.unknown,
|
|
369
|
-
any: T2.unknown
|
|
370
|
-
};
|
|
371
|
-
function evaluatePromiseStaticMethod(methodName, args) {
|
|
372
|
-
if (methodName === "resolve") {
|
|
373
|
-
if (args.length > 0) return T2.promise(args[0]);
|
|
374
|
-
return T2.promise(T2.undefined);
|
|
375
|
-
}
|
|
376
|
-
if (methodName === "reject") {
|
|
377
|
-
return T2.promise(T2.never);
|
|
378
|
-
}
|
|
379
|
-
if (methodName === "all") {
|
|
380
|
-
if (args.length > 0 && args[0].kind === "tuple") {
|
|
381
|
-
const elemTypes = args[0].elements.map((e) => {
|
|
382
|
-
if (e.kind === "promise") return e.value;
|
|
383
|
-
return T2.unknown;
|
|
384
|
-
});
|
|
385
|
-
return T2.promise(T2.tuple(elemTypes));
|
|
386
|
-
}
|
|
387
|
-
if (args.length > 0 && args[0].kind === "array") {
|
|
388
|
-
return T2.promise(T2.array(args[0].element));
|
|
389
|
-
}
|
|
390
|
-
return T2.promise(T2.array(T2.unknown));
|
|
391
|
-
}
|
|
392
|
-
if (methodName === "race") {
|
|
393
|
-
if (args.length > 0 && args[0].kind === "tuple") {
|
|
394
|
-
const elemTypes = args[0].elements.map((e) => {
|
|
395
|
-
if (e.kind === "promise") return e.value;
|
|
396
|
-
return T2.unknown;
|
|
397
|
-
});
|
|
398
|
-
return T2.promise(simplifyUnion(elemTypes));
|
|
399
|
-
}
|
|
400
|
-
if (args.length > 0 && args[0].kind === "array") {
|
|
401
|
-
const el = args[0].element;
|
|
402
|
-
return T2.promise(el.kind === "promise" ? el.value : T2.unknown);
|
|
403
|
-
}
|
|
404
|
-
return T2.promise(T2.unknown);
|
|
405
|
-
}
|
|
406
|
-
if (methodName === "allSettled") {
|
|
407
|
-
const settledOf = (e) => T2.object({
|
|
408
|
-
status: T2.union(T2.literal("fulfilled"), T2.literal("rejected")),
|
|
409
|
-
value: e.kind === "promise" ? e.value : T2.unknown
|
|
410
|
-
});
|
|
411
|
-
if (args.length > 0 && args[0].kind === "tuple") {
|
|
412
|
-
return T2.promise(T2.tuple(args[0].elements.map(settledOf)));
|
|
413
|
-
}
|
|
414
|
-
if (args.length > 0 && args[0].kind === "array") {
|
|
415
|
-
return T2.promise(T2.array(settledOf(args[0].element)));
|
|
416
|
-
}
|
|
417
|
-
return T2.promise(T2.array(T2.unknown));
|
|
418
|
-
}
|
|
419
|
-
if (methodName === "any") {
|
|
420
|
-
if (args.length > 0 && args[0].kind === "tuple") {
|
|
421
|
-
const elemTypes = args[0].elements.map((e) => {
|
|
422
|
-
if (e.kind === "promise") return e.value;
|
|
423
|
-
return T2.unknown;
|
|
424
|
-
});
|
|
425
|
-
return T2.promise(simplifyUnion(elemTypes));
|
|
426
|
-
}
|
|
427
|
-
if (args.length > 0 && args[0].kind === "array") {
|
|
428
|
-
const el = args[0].element;
|
|
429
|
-
return T2.promise(el.kind === "promise" ? el.value : T2.unknown);
|
|
430
|
-
}
|
|
431
|
-
return T2.promise(T2.unknown);
|
|
432
|
-
}
|
|
433
|
-
return null;
|
|
434
|
-
}
|
|
435
|
-
function evaluatePromiseInstanceMethod(promiseValue, methodName, args) {
|
|
436
|
-
if (methodName === "then") {
|
|
437
|
-
if (promiseValue.kind === "promise") {
|
|
438
|
-
return T2.promise(T2.unknown);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
if (methodName === "catch") {
|
|
442
|
-
if (promiseValue.kind === "promise") {
|
|
443
|
-
return promiseValue;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
if (methodName === "finally") {
|
|
447
|
-
if (promiseValue.kind === "promise") {
|
|
448
|
-
return promiseValue;
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
return null;
|
|
452
|
-
}
|
|
386
|
+
// src/builtins/builtin-prototype.ts
|
|
387
|
+
import { T as T4, simplifyUnion as simplifyUnion3 } from "@nudojs/core";
|
|
453
388
|
|
|
454
389
|
// src/builtins/builtin-map.ts
|
|
455
|
-
import { T as
|
|
390
|
+
import { T as T2, simplifyUnion, typeValueEquals as typeValueEquals2 } from "@nudojs/core";
|
|
456
391
|
function entryKeyTrackable(key) {
|
|
457
392
|
return key?.kind === "literal" || key?.kind === "instance";
|
|
458
393
|
}
|
|
@@ -460,11 +395,11 @@ function lookupEntries(entries, key) {
|
|
|
460
395
|
if (key.kind === "union") {
|
|
461
396
|
const results = key.members.map((m) => lookupEntries(entries, m));
|
|
462
397
|
if (results.some((r) => r === null)) return null;
|
|
463
|
-
return
|
|
398
|
+
return simplifyUnion(results);
|
|
464
399
|
}
|
|
465
400
|
if (!entryKeyTrackable(key)) return null;
|
|
466
401
|
const hit = entries.find((e) => typeValueEquals2(e.key, key));
|
|
467
|
-
return hit ? hit.value :
|
|
402
|
+
return hit ? hit.value : T2.undefined;
|
|
468
403
|
}
|
|
469
404
|
var MAP_INSTANCE_METHODS = {
|
|
470
405
|
get: (key, map) => {
|
|
@@ -474,15 +409,15 @@ var MAP_INSTANCE_METHODS = {
|
|
|
474
409
|
if (looked !== null) return looked;
|
|
475
410
|
}
|
|
476
411
|
const typeArgs = map?._typeArgs;
|
|
477
|
-
if (typeArgs?.V) return
|
|
478
|
-
return
|
|
412
|
+
if (typeArgs?.V) return T2.union(typeArgs.V, T2.undefined);
|
|
413
|
+
return T2.unknown;
|
|
479
414
|
},
|
|
480
415
|
set: (key, value, map) => {
|
|
481
416
|
if (map) {
|
|
482
|
-
const typeArgs = map._typeArgs || { K:
|
|
417
|
+
const typeArgs = map._typeArgs || { K: T2.unknown, V: T2.unknown };
|
|
483
418
|
map._typeArgs = {
|
|
484
|
-
K: typeArgs.K.kind === "unknown" ? key :
|
|
485
|
-
V: typeArgs.V.kind === "unknown" ? value :
|
|
419
|
+
K: typeArgs.K.kind === "unknown" ? key : simplifyUnion([typeArgs.K, key]),
|
|
420
|
+
V: typeArgs.V.kind === "unknown" ? value : simplifyUnion([typeArgs.V, value])
|
|
486
421
|
};
|
|
487
422
|
if (entryKeyTrackable(key)) {
|
|
488
423
|
if (map._entries === void 0 && map._entriesExact !== false) {
|
|
@@ -499,14 +434,14 @@ var MAP_INSTANCE_METHODS = {
|
|
|
499
434
|
map._entriesExact = false;
|
|
500
435
|
}
|
|
501
436
|
}
|
|
502
|
-
return map ??
|
|
437
|
+
return map ?? T2.unknown;
|
|
503
438
|
},
|
|
504
439
|
has: (key, map) => {
|
|
505
440
|
const entries = exactMapEntries(map);
|
|
506
441
|
if (entries && entryKeyTrackable(key)) {
|
|
507
|
-
return
|
|
442
|
+
return T2.literal(entries.some((e) => typeValueEquals2(e.key, key)));
|
|
508
443
|
}
|
|
509
|
-
return
|
|
444
|
+
return T2.boolean;
|
|
510
445
|
},
|
|
511
446
|
delete: (key, map) => {
|
|
512
447
|
const entries = exactMapEntries(map);
|
|
@@ -514,33 +449,33 @@ var MAP_INSTANCE_METHODS = {
|
|
|
514
449
|
const idx = entries.findIndex((e) => typeValueEquals2(e.key, key));
|
|
515
450
|
if (idx >= 0) {
|
|
516
451
|
entries.splice(idx, 1);
|
|
517
|
-
return
|
|
452
|
+
return T2.literal(true);
|
|
518
453
|
}
|
|
519
|
-
return
|
|
454
|
+
return T2.literal(false);
|
|
520
455
|
}
|
|
521
|
-
return
|
|
456
|
+
return T2.boolean;
|
|
522
457
|
},
|
|
523
458
|
clear: (value, map) => {
|
|
524
459
|
const target = map ?? value;
|
|
525
460
|
if (target && target._entriesExact) {
|
|
526
461
|
target._entries = [];
|
|
527
462
|
}
|
|
528
|
-
return
|
|
463
|
+
return T2.undefined;
|
|
529
464
|
},
|
|
530
|
-
forEach: () =>
|
|
465
|
+
forEach: () => T2.undefined,
|
|
531
466
|
keys: (map) => {
|
|
532
467
|
const entries = exactMapEntries(map);
|
|
533
|
-
if (entries) return
|
|
468
|
+
if (entries) return T2.tuple(entries.map((e) => e.key));
|
|
534
469
|
const typeArgs = map?._typeArgs;
|
|
535
|
-
if (typeArgs?.K) return
|
|
536
|
-
return
|
|
470
|
+
if (typeArgs?.K) return T2.array(typeArgs.K);
|
|
471
|
+
return T2.array(T2.unknown);
|
|
537
472
|
},
|
|
538
473
|
values: (map) => {
|
|
539
474
|
const entries = exactMapEntries(map);
|
|
540
|
-
if (entries) return
|
|
475
|
+
if (entries) return T2.tuple(entries.map((e) => e.value));
|
|
541
476
|
const typeArgs = map?._typeArgs;
|
|
542
|
-
if (typeArgs?.V) return
|
|
543
|
-
return
|
|
477
|
+
if (typeArgs?.V) return T2.array(typeArgs.V);
|
|
478
|
+
return T2.array(T2.unknown);
|
|
544
479
|
},
|
|
545
480
|
entries: (map) => mapEntriesIterable(map)
|
|
546
481
|
};
|
|
@@ -550,13 +485,13 @@ function exactMapEntries(map) {
|
|
|
550
485
|
}
|
|
551
486
|
function mapEntriesIterable(map) {
|
|
552
487
|
const entries = exactMapEntries(map);
|
|
553
|
-
if (entries) return
|
|
488
|
+
if (entries) return T2.tuple(entries.map((e) => T2.tuple([e.key, e.value])));
|
|
554
489
|
const typeArgs = map?._typeArgs;
|
|
555
|
-
if (typeArgs?.K && typeArgs?.V) return
|
|
556
|
-
return
|
|
490
|
+
if (typeArgs?.K && typeArgs?.V) return T2.array(T2.tuple([typeArgs.K, typeArgs.V]));
|
|
491
|
+
return T2.array(T2.tuple([T2.unknown, T2.unknown]));
|
|
557
492
|
}
|
|
558
493
|
function createMapType(args) {
|
|
559
|
-
const obj =
|
|
494
|
+
const obj = T2.instanceOf("Map", {});
|
|
560
495
|
if (args && args.length > 0) {
|
|
561
496
|
const arg = args[0];
|
|
562
497
|
if (arg.kind === "tuple" || arg.kind === "array") {
|
|
@@ -577,7 +512,7 @@ function createMapType(args) {
|
|
|
577
512
|
}
|
|
578
513
|
}
|
|
579
514
|
if (keys.length > 0) {
|
|
580
|
-
obj._typeArgs = { K:
|
|
515
|
+
obj._typeArgs = { K: simplifyUnion(keys), V: simplifyUnion(values) };
|
|
581
516
|
}
|
|
582
517
|
if (exact && entries.length > 0) {
|
|
583
518
|
obj._entries = entries;
|
|
@@ -588,13 +523,13 @@ function createMapType(args) {
|
|
|
588
523
|
}
|
|
589
524
|
}
|
|
590
525
|
if (!obj._typeArgs) {
|
|
591
|
-
obj._typeArgs = { K:
|
|
526
|
+
obj._typeArgs = { K: T2.unknown, V: T2.unknown };
|
|
592
527
|
}
|
|
593
528
|
return obj;
|
|
594
529
|
}
|
|
595
530
|
|
|
596
531
|
// src/builtins/builtin-set.ts
|
|
597
|
-
import { T as
|
|
532
|
+
import { T as T3, simplifyUnion as simplifyUnion2, typeValueEquals as typeValueEquals3 } from "@nudojs/core";
|
|
598
533
|
function valueTrackable(v) {
|
|
599
534
|
return v?.kind === "literal" || v?.kind === "instance";
|
|
600
535
|
}
|
|
@@ -610,9 +545,9 @@ function lookupValues(values, value) {
|
|
|
610
545
|
var SET_INSTANCE_METHODS = {
|
|
611
546
|
add: (value, set) => {
|
|
612
547
|
if (set) {
|
|
613
|
-
const typeArgs = set._typeArgs || { T:
|
|
548
|
+
const typeArgs = set._typeArgs || { T: T3.unknown };
|
|
614
549
|
set._typeArgs = {
|
|
615
|
-
T: typeArgs.T.kind === "unknown" ? value :
|
|
550
|
+
T: typeArgs.T.kind === "unknown" ? value : simplifyUnion2([typeArgs.T, value])
|
|
616
551
|
};
|
|
617
552
|
if (valueTrackable(value)) {
|
|
618
553
|
if (set._values === void 0 && set._valuesExact !== false) {
|
|
@@ -627,15 +562,15 @@ var SET_INSTANCE_METHODS = {
|
|
|
627
562
|
set._valuesExact = false;
|
|
628
563
|
}
|
|
629
564
|
}
|
|
630
|
-
return set ??
|
|
565
|
+
return set ?? T3.unknown;
|
|
631
566
|
},
|
|
632
567
|
has: (value, set) => {
|
|
633
568
|
const values = exactSetValues(set);
|
|
634
569
|
if (values) {
|
|
635
570
|
const looked = lookupValues(values, value);
|
|
636
|
-
if (looked !== null) return
|
|
571
|
+
if (looked !== null) return T3.literal(looked);
|
|
637
572
|
}
|
|
638
|
-
return
|
|
573
|
+
return T3.boolean;
|
|
639
574
|
},
|
|
640
575
|
delete: (value, set) => {
|
|
641
576
|
const values = exactSetValues(set);
|
|
@@ -643,29 +578,29 @@ var SET_INSTANCE_METHODS = {
|
|
|
643
578
|
const idx = values.findIndex((v) => typeValueEquals3(v, value));
|
|
644
579
|
if (idx >= 0) {
|
|
645
580
|
values.splice(idx, 1);
|
|
646
|
-
return
|
|
581
|
+
return T3.literal(true);
|
|
647
582
|
}
|
|
648
|
-
return
|
|
583
|
+
return T3.literal(false);
|
|
649
584
|
}
|
|
650
|
-
return
|
|
585
|
+
return T3.boolean;
|
|
651
586
|
},
|
|
652
587
|
clear: (value, set) => {
|
|
653
588
|
const target = set ?? value;
|
|
654
589
|
if (target && target._valuesExact) {
|
|
655
590
|
target._values = [];
|
|
656
591
|
}
|
|
657
|
-
return
|
|
592
|
+
return T3.undefined;
|
|
658
593
|
},
|
|
659
|
-
forEach: () =>
|
|
594
|
+
forEach: () => T3.undefined,
|
|
660
595
|
values: (set) => setValuesIterable(set),
|
|
661
596
|
// For Set, keys() is the same as values()
|
|
662
597
|
keys: (set) => setValuesIterable(set),
|
|
663
598
|
entries: (set) => {
|
|
664
599
|
const values = exactSetValues(set);
|
|
665
|
-
if (values) return
|
|
600
|
+
if (values) return T3.tuple(values.map((v) => T3.tuple([v, v])));
|
|
666
601
|
const typeArgs = set?._typeArgs;
|
|
667
|
-
if (typeArgs?.T) return
|
|
668
|
-
return
|
|
602
|
+
if (typeArgs?.T) return T3.array(T3.tuple([typeArgs.T, typeArgs.T]));
|
|
603
|
+
return T3.array(T3.tuple([T3.unknown, T3.unknown]));
|
|
669
604
|
}
|
|
670
605
|
};
|
|
671
606
|
function exactSetValues(set) {
|
|
@@ -674,18 +609,18 @@ function exactSetValues(set) {
|
|
|
674
609
|
}
|
|
675
610
|
function setValuesIterable(set) {
|
|
676
611
|
const values = exactSetValues(set);
|
|
677
|
-
if (values) return
|
|
612
|
+
if (values) return T3.tuple([...values]);
|
|
678
613
|
const typeArgs = set?._typeArgs;
|
|
679
|
-
if (typeArgs?.T) return
|
|
680
|
-
return
|
|
614
|
+
if (typeArgs?.T) return T3.array(typeArgs.T);
|
|
615
|
+
return T3.array(T3.unknown);
|
|
681
616
|
}
|
|
682
617
|
function createSetType(args) {
|
|
683
|
-
const obj =
|
|
618
|
+
const obj = T3.instanceOf("Set", {});
|
|
684
619
|
if (args && args.length > 0) {
|
|
685
620
|
const arg = args[0];
|
|
686
621
|
if (arg.kind === "tuple" || arg.kind === "array") {
|
|
687
622
|
const elements = arg.kind === "tuple" ? arg.elements : [arg.element];
|
|
688
|
-
obj._typeArgs = { T:
|
|
623
|
+
obj._typeArgs = { T: simplifyUnion2(elements) };
|
|
689
624
|
const exact = elements.every(valueTrackable);
|
|
690
625
|
if (exact && elements.length > 0) {
|
|
691
626
|
obj._values = elements;
|
|
@@ -696,248 +631,918 @@ function createSetType(args) {
|
|
|
696
631
|
}
|
|
697
632
|
}
|
|
698
633
|
if (!obj._typeArgs) {
|
|
699
|
-
obj._typeArgs = { T:
|
|
634
|
+
obj._typeArgs = { T: T3.unknown };
|
|
700
635
|
}
|
|
701
636
|
return obj;
|
|
702
637
|
}
|
|
703
638
|
|
|
704
|
-
// src/builtins/builtin-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
test: () => T5.boolean,
|
|
708
|
-
exec: () => T5.union(T5.null, T5.object({})),
|
|
709
|
-
toString: () => T5.string
|
|
710
|
-
};
|
|
711
|
-
var REGEXP_PROPS = {
|
|
712
|
-
source: T5.string,
|
|
713
|
-
flags: T5.string,
|
|
714
|
-
global: T5.boolean,
|
|
715
|
-
ignoreCase: T5.boolean,
|
|
716
|
-
multiline: T5.boolean,
|
|
717
|
-
dotAll: T5.boolean,
|
|
718
|
-
unicode: T5.boolean,
|
|
719
|
-
sticky: T5.boolean
|
|
720
|
-
};
|
|
721
|
-
function createRegExpType() {
|
|
722
|
-
return T5.instanceOf("RegExp", {
|
|
723
|
-
source: T5.string,
|
|
724
|
-
flags: T5.string,
|
|
725
|
-
global: T5.boolean,
|
|
726
|
-
ignoreCase: T5.boolean,
|
|
727
|
-
multiline: T5.boolean,
|
|
728
|
-
dotAll: T5.boolean,
|
|
729
|
-
unicode: T5.boolean,
|
|
730
|
-
sticky: T5.boolean,
|
|
731
|
-
test: T5.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
732
|
-
exec: T5.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
733
|
-
toString: T5.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
734
|
-
});
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
// src/builtins/builtin-url.ts
|
|
738
|
-
import { T as T6 } from "@nudojs/core";
|
|
739
|
-
var URL_PROPS = {
|
|
740
|
-
href: T6.string,
|
|
741
|
-
origin: T6.string,
|
|
742
|
-
protocol: T6.string,
|
|
743
|
-
host: T6.string,
|
|
744
|
-
hostname: T6.string,
|
|
745
|
-
port: T6.string,
|
|
746
|
-
pathname: T6.string,
|
|
747
|
-
search: T6.string,
|
|
748
|
-
hash: T6.string,
|
|
749
|
-
username: T6.string,
|
|
750
|
-
password: T6.string
|
|
751
|
-
};
|
|
752
|
-
var URL_INSTANCE_METHODS = {
|
|
753
|
-
toString: () => T6.string
|
|
754
|
-
};
|
|
755
|
-
var URLSearchParams_INSTANCE_METHODS = {
|
|
756
|
-
get: () => T6.union(T6.string, T6.null),
|
|
757
|
-
set: () => T6.undefined,
|
|
758
|
-
has: () => T6.boolean,
|
|
759
|
-
delete: () => T6.undefined,
|
|
760
|
-
append: () => T6.undefined,
|
|
761
|
-
toString: () => T6.string,
|
|
762
|
-
getAll: () => T6.array(T6.string)
|
|
763
|
-
};
|
|
764
|
-
function createURLType() {
|
|
765
|
-
return T6.instanceOf("URL", {
|
|
766
|
-
href: T6.string,
|
|
767
|
-
origin: T6.string,
|
|
768
|
-
protocol: T6.string,
|
|
769
|
-
host: T6.string,
|
|
770
|
-
hostname: T6.string,
|
|
771
|
-
port: T6.string,
|
|
772
|
-
pathname: T6.string,
|
|
773
|
-
search: T6.string,
|
|
774
|
-
hash: T6.string,
|
|
775
|
-
username: T6.string,
|
|
776
|
-
password: T6.string,
|
|
777
|
-
toString: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
778
|
-
});
|
|
779
|
-
}
|
|
780
|
-
function createURLSearchParamsType() {
|
|
781
|
-
return T6.instanceOf("URLSearchParams", {
|
|
782
|
-
get: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
783
|
-
set: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
784
|
-
has: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
785
|
-
delete: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
786
|
-
append: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
787
|
-
toString: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
788
|
-
getAll: T6.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
789
|
-
});
|
|
639
|
+
// src/builtins/builtin-prototype.ts
|
|
640
|
+
function hasOwnProp(props, name) {
|
|
641
|
+
return Object.prototype.hasOwnProperty.call(props, name);
|
|
790
642
|
}
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
var FORMDATA_INSTANCE_METHODS = {
|
|
826
|
-
get: () => T7.union(T7.string, T7.null),
|
|
827
|
-
set: () => T7.undefined,
|
|
828
|
-
has: () => T7.boolean,
|
|
829
|
-
delete: () => T7.undefined,
|
|
830
|
-
append: () => T7.undefined,
|
|
831
|
-
getAll: () => T7.array(T7.unknown),
|
|
832
|
-
entries: () => T7.unknown,
|
|
833
|
-
keys: () => T7.unknown,
|
|
834
|
-
values: () => T7.unknown,
|
|
835
|
-
forEach: () => T7.undefined
|
|
836
|
-
};
|
|
837
|
-
var ABORTCONTROLLER_PROPS = {
|
|
838
|
-
signal: T7.unknown
|
|
643
|
+
var BUILTIN_ERROR_CLASSES = /* @__PURE__ */ new Set([
|
|
644
|
+
"Error",
|
|
645
|
+
"TypeError",
|
|
646
|
+
"SyntaxError",
|
|
647
|
+
"RangeError",
|
|
648
|
+
"ReferenceError",
|
|
649
|
+
"URIError",
|
|
650
|
+
"EvalError"
|
|
651
|
+
]);
|
|
652
|
+
var BUILTIN_PROTOTYPE_CLASSES = /* @__PURE__ */ new Set([
|
|
653
|
+
...BUILTIN_ERROR_CLASSES,
|
|
654
|
+
"Date",
|
|
655
|
+
"Object",
|
|
656
|
+
"Map",
|
|
657
|
+
"Set",
|
|
658
|
+
"Promise",
|
|
659
|
+
"RegExp",
|
|
660
|
+
"Array",
|
|
661
|
+
"Function",
|
|
662
|
+
"String",
|
|
663
|
+
"Number",
|
|
664
|
+
"Boolean",
|
|
665
|
+
"Symbol",
|
|
666
|
+
"WeakMap",
|
|
667
|
+
"WeakSet",
|
|
668
|
+
"Buffer"
|
|
669
|
+
]);
|
|
670
|
+
var OBJECT_PROTOTYPE_METHODS = {
|
|
671
|
+
hasOwnProperty: T4.fnSig([T4.unknown], T4.boolean),
|
|
672
|
+
isPrototypeOf: T4.fnSig([T4.unknown], T4.boolean),
|
|
673
|
+
propertyIsEnumerable: T4.fnSig([T4.unknown], T4.boolean),
|
|
674
|
+
toString: T4.fnSig([], T4.string, T4.never, (_args, thisVal) => objectToStringBrand(thisVal)),
|
|
675
|
+
toLocaleString: T4.fnSig([], T4.string),
|
|
676
|
+
valueOf: T4.fnSig([], T4.unknown, T4.never, (_args, thisVal) => thisVal)
|
|
839
677
|
};
|
|
840
|
-
var
|
|
841
|
-
|
|
678
|
+
var BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS = {
|
|
679
|
+
Object: { ...OBJECT_PROTOTYPE_METHODS },
|
|
680
|
+
Array: {
|
|
681
|
+
push: T4.fnSig([T4.unknown], T4.number),
|
|
682
|
+
pop: T4.fnSig([], T4.unknown),
|
|
683
|
+
shift: T4.fnSig([], T4.unknown),
|
|
684
|
+
unshift: T4.fnSig([T4.unknown], T4.number),
|
|
685
|
+
slice: T4.fnSig([T4.number, T4.number], T4.array(T4.unknown)),
|
|
686
|
+
splice: T4.fnSig([T4.number, T4.number], T4.array(T4.unknown)),
|
|
687
|
+
concat: T4.fnSig([T4.unknown], T4.array(T4.unknown)),
|
|
688
|
+
join: T4.fnSig([T4.string], T4.string),
|
|
689
|
+
indexOf: T4.fnSig([T4.unknown], T4.number),
|
|
690
|
+
lastIndexOf: T4.fnSig([T4.unknown], T4.number),
|
|
691
|
+
includes: T4.fnSig([T4.unknown], T4.boolean),
|
|
692
|
+
map: T4.fnSig([T4.unknown], T4.array(T4.unknown)),
|
|
693
|
+
flatMap: T4.fnSig([T4.unknown], T4.array(T4.unknown)),
|
|
694
|
+
filter: T4.fnSig([T4.unknown], T4.array(T4.unknown)),
|
|
695
|
+
forEach: T4.fnSig([T4.unknown], T4.undefined),
|
|
696
|
+
find: T4.fnSig([T4.unknown], T4.unknown),
|
|
697
|
+
findIndex: T4.fnSig([T4.unknown], T4.number),
|
|
698
|
+
some: T4.fnSig([T4.unknown], T4.boolean),
|
|
699
|
+
every: T4.fnSig([T4.unknown], T4.boolean),
|
|
700
|
+
reduce: T4.fnSig([T4.unknown, T4.unknown], T4.unknown),
|
|
701
|
+
sort: T4.fnSig([T4.unknown], T4.array(T4.unknown)),
|
|
702
|
+
reverse: T4.fnSig([], T4.array(T4.unknown)),
|
|
703
|
+
toString: T4.fnSig([], T4.string)
|
|
704
|
+
},
|
|
705
|
+
Function: {
|
|
706
|
+
call: T4.fnSig([T4.unknown], T4.unknown),
|
|
707
|
+
apply: T4.fnSig([T4.unknown, T4.unknown], T4.unknown),
|
|
708
|
+
bind: T4.fnSig([T4.unknown], T4.unknown),
|
|
709
|
+
toString: T4.fnSig([], T4.string)
|
|
710
|
+
},
|
|
711
|
+
Map: {
|
|
712
|
+
// Impl-routed: `Map.prototype.m.call(instance)` (and direct prototype
|
|
713
|
+
// calls) consult the receiver's exact entry side table, making the
|
|
714
|
+
// hoek deepEqual reflection idioms decide literally.
|
|
715
|
+
get: T4.fnSig([T4.unknown], T4.unknown, T4.never, (args, thisVal) => MAP_INSTANCE_METHODS.get(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
716
|
+
set: T4.fnSig([T4.unknown, T4.unknown], T4.unknown, T4.never, (args, thisVal) => MAP_INSTANCE_METHODS.set(args[0] ?? T4.unknown, args[1] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
717
|
+
has: T4.fnSig([T4.unknown], T4.boolean, T4.never, (args, thisVal) => MAP_INSTANCE_METHODS.has(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
718
|
+
delete: T4.fnSig([T4.unknown], T4.boolean, T4.never, (args, thisVal) => MAP_INSTANCE_METHODS.delete(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
719
|
+
clear: T4.fnSig([], T4.undefined, T4.never, (args, thisVal) => MAP_INSTANCE_METHODS.clear(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
720
|
+
forEach: T4.fnSig([T4.unknown], T4.undefined),
|
|
721
|
+
keys: T4.fnSig([], T4.array(T4.unknown), T4.never, (_args, thisVal) => MAP_INSTANCE_METHODS.keys(thisVal ?? T4.unknown)),
|
|
722
|
+
values: T4.fnSig([], T4.array(T4.unknown), T4.never, (_args, thisVal) => MAP_INSTANCE_METHODS.values(thisVal ?? T4.unknown)),
|
|
723
|
+
entries: T4.fnSig([], T4.array(T4.tuple([T4.unknown, T4.unknown])), T4.never, (_args, thisVal) => mapEntriesIterable(thisVal ?? T4.unknown)),
|
|
724
|
+
toString: T4.fnSig([], T4.string)
|
|
725
|
+
},
|
|
726
|
+
Set: {
|
|
727
|
+
// Impl-routed like Map above (Set.prototype.values.call(s) ≡ s.values()).
|
|
728
|
+
add: T4.fnSig([T4.unknown], T4.unknown, T4.never, (args, thisVal) => SET_INSTANCE_METHODS.add(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
729
|
+
has: T4.fnSig([T4.unknown], T4.boolean, T4.never, (args, thisVal) => SET_INSTANCE_METHODS.has(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
730
|
+
delete: T4.fnSig([T4.unknown], T4.boolean, T4.never, (args, thisVal) => SET_INSTANCE_METHODS.delete(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
731
|
+
clear: T4.fnSig([], T4.undefined, T4.never, (args, thisVal) => SET_INSTANCE_METHODS.clear(args[0] ?? T4.unknown, thisVal ?? T4.unknown)),
|
|
732
|
+
forEach: T4.fnSig([T4.unknown], T4.undefined),
|
|
733
|
+
keys: T4.fnSig([], T4.array(T4.unknown), T4.never, (_args, thisVal) => SET_INSTANCE_METHODS.keys(thisVal ?? T4.unknown)),
|
|
734
|
+
values: T4.fnSig([], T4.array(T4.unknown), T4.never, (_args, thisVal) => SET_INSTANCE_METHODS.values(thisVal ?? T4.unknown)),
|
|
735
|
+
entries: T4.fnSig([], T4.array(T4.tuple([T4.unknown, T4.unknown])), T4.never, (_args, thisVal) => SET_INSTANCE_METHODS.entries(thisVal ?? T4.unknown)),
|
|
736
|
+
toString: T4.fnSig([], T4.string)
|
|
737
|
+
},
|
|
738
|
+
WeakMap: {
|
|
739
|
+
get: T4.fnSig([T4.unknown], T4.unknown),
|
|
740
|
+
set: T4.fnSig([T4.unknown, T4.unknown], T4.unknown),
|
|
741
|
+
has: T4.fnSig([T4.unknown], T4.boolean),
|
|
742
|
+
delete: T4.fnSig([T4.unknown], T4.boolean),
|
|
743
|
+
toString: T4.fnSig([], T4.string)
|
|
744
|
+
},
|
|
745
|
+
WeakSet: {
|
|
746
|
+
add: T4.fnSig([T4.unknown], T4.unknown),
|
|
747
|
+
has: T4.fnSig([T4.unknown], T4.boolean),
|
|
748
|
+
delete: T4.fnSig([T4.unknown], T4.boolean),
|
|
749
|
+
toString: T4.fnSig([], T4.string)
|
|
750
|
+
},
|
|
751
|
+
Promise: {
|
|
752
|
+
then: T4.fnSig([T4.unknown], T4.promise(T4.unknown)),
|
|
753
|
+
catch: T4.fnSig([T4.unknown], T4.promise(T4.unknown)),
|
|
754
|
+
finally: T4.fnSig([T4.unknown], T4.promise(T4.unknown)),
|
|
755
|
+
toString: T4.fnSig([], T4.string)
|
|
756
|
+
},
|
|
757
|
+
Date: {
|
|
758
|
+
getTime: T4.fnSig([], T4.number),
|
|
759
|
+
valueOf: T4.fnSig([], T4.number),
|
|
760
|
+
toISOString: T4.fnSig([], T4.string),
|
|
761
|
+
toJSON: T4.fnSig([], T4.string),
|
|
762
|
+
toLocaleString: T4.fnSig([], T4.string),
|
|
763
|
+
toString: T4.fnSig([], T4.string)
|
|
764
|
+
},
|
|
765
|
+
RegExp: {
|
|
766
|
+
test: T4.fnSig([T4.string], T4.boolean),
|
|
767
|
+
exec: T4.fnSig([T4.string], T4.union(T4.object({}), T4.null)),
|
|
768
|
+
toString: T4.fnSig([], T4.string)
|
|
769
|
+
},
|
|
770
|
+
String: {
|
|
771
|
+
charAt: T4.fnSig([T4.number], T4.string),
|
|
772
|
+
charCodeAt: T4.fnSig([T4.number], T4.number),
|
|
773
|
+
indexOf: T4.fnSig([T4.string], T4.number),
|
|
774
|
+
lastIndexOf: T4.fnSig([T4.string], T4.number),
|
|
775
|
+
includes: T4.fnSig([T4.string], T4.boolean),
|
|
776
|
+
startsWith: T4.fnSig([T4.string], T4.boolean),
|
|
777
|
+
endsWith: T4.fnSig([T4.string], T4.boolean),
|
|
778
|
+
slice: T4.fnSig([T4.number, T4.number], T4.string),
|
|
779
|
+
substring: T4.fnSig([T4.number, T4.number], T4.string),
|
|
780
|
+
toUpperCase: T4.fnSig([], T4.string),
|
|
781
|
+
toLowerCase: T4.fnSig([], T4.string),
|
|
782
|
+
trim: T4.fnSig([], T4.string),
|
|
783
|
+
replace: T4.fnSig([T4.unknown, T4.string], T4.string),
|
|
784
|
+
split: T4.fnSig([T4.string], T4.array(T4.string)),
|
|
785
|
+
toString: T4.fnSig([], T4.string),
|
|
786
|
+
valueOf: T4.fnSig([], T4.string)
|
|
787
|
+
},
|
|
788
|
+
Number: {
|
|
789
|
+
toFixed: T4.fnSig([T4.number], T4.string),
|
|
790
|
+
toPrecision: T4.fnSig([T4.number], T4.string),
|
|
791
|
+
valueOf: T4.fnSig([], T4.number),
|
|
792
|
+
toString: T4.fnSig([T4.number], T4.string)
|
|
793
|
+
},
|
|
794
|
+
Boolean: {
|
|
795
|
+
valueOf: T4.fnSig([], T4.boolean),
|
|
796
|
+
toString: T4.fnSig([], T4.string)
|
|
797
|
+
},
|
|
798
|
+
Symbol: {
|
|
799
|
+
toString: T4.fnSig([], T4.string),
|
|
800
|
+
valueOf: T4.fnSig([], T4.symbol)
|
|
801
|
+
},
|
|
802
|
+
Buffer: {
|
|
803
|
+
equals: T4.fnSig([T4.unknown], T4.boolean),
|
|
804
|
+
compare: T4.fnSig([T4.unknown], T4.number),
|
|
805
|
+
toString: T4.fnSig([T4.unknown], T4.string),
|
|
806
|
+
toJSON: T4.fnSig([], T4.unknown)
|
|
807
|
+
},
|
|
808
|
+
Error: {
|
|
809
|
+
toString: T4.fnSig([], T4.string)
|
|
810
|
+
}
|
|
842
811
|
};
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
body: T7.unknown,
|
|
853
|
-
bodyUsed: T7.boolean,
|
|
854
|
-
json: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
855
|
-
text: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
856
|
-
arrayBuffer: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
857
|
-
blob: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
858
|
-
clone: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
859
|
-
formData: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
860
|
-
});
|
|
861
|
-
}
|
|
862
|
-
function createHeadersType() {
|
|
863
|
-
return T7.instanceOf("Headers", {
|
|
864
|
-
get: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
865
|
-
set: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
866
|
-
has: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
867
|
-
delete: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
868
|
-
append: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
869
|
-
entries: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
870
|
-
keys: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
871
|
-
values: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
872
|
-
forEach: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
873
|
-
});
|
|
874
|
-
}
|
|
875
|
-
function createFormDataType() {
|
|
876
|
-
return T7.instanceOf("FormData", {
|
|
877
|
-
get: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
878
|
-
set: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
879
|
-
has: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
880
|
-
delete: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
881
|
-
append: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
882
|
-
getAll: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
883
|
-
entries: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
884
|
-
keys: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
885
|
-
values: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
886
|
-
forEach: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
887
|
-
});
|
|
812
|
+
var _builtinClassValues = /* @__PURE__ */ new Map();
|
|
813
|
+
function builtinClassValue(name) {
|
|
814
|
+
let v = _builtinClassValues.get(name);
|
|
815
|
+
if (v === void 0) {
|
|
816
|
+
v = T4.object({});
|
|
817
|
+
v._builtinName = name;
|
|
818
|
+
_builtinClassValues.set(name, v);
|
|
819
|
+
}
|
|
820
|
+
return v;
|
|
888
821
|
}
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
822
|
+
var BUILTIN_PROTOTYPE_SINGLETONS = /* @__PURE__ */ new Map();
|
|
823
|
+
function builtinPrototype(className) {
|
|
824
|
+
let proto = BUILTIN_PROTOTYPE_SINGLETONS.get(className);
|
|
825
|
+
if (!proto) {
|
|
826
|
+
const methods = hasOwnProp(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS, className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[className] : BUILTIN_ERROR_CLASSES.has(className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Error : {};
|
|
827
|
+
proto = T4.instanceOf(className, { ...methods });
|
|
828
|
+
proto._builtinProto = className;
|
|
829
|
+
BUILTIN_PROTOTYPE_SINGLETONS.set(className, proto);
|
|
830
|
+
}
|
|
831
|
+
return proto;
|
|
894
832
|
}
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
833
|
+
function objectToStringBrand(v) {
|
|
834
|
+
if (!v) return void 0;
|
|
835
|
+
if (v.kind === "union") {
|
|
836
|
+
const parts = v.members.map((m) => objectToStringBrand(m));
|
|
837
|
+
if (parts.some((p) => p === void 0)) return void 0;
|
|
838
|
+
return simplifyUnion3(parts);
|
|
839
|
+
}
|
|
840
|
+
let base = v;
|
|
841
|
+
while (base.kind === "refined") base = base.base;
|
|
842
|
+
switch (base.kind) {
|
|
843
|
+
case "object":
|
|
844
|
+
return T4.literal("[object Object]");
|
|
845
|
+
case "array":
|
|
846
|
+
case "tuple":
|
|
847
|
+
return T4.literal("[object Array]");
|
|
848
|
+
case "function":
|
|
849
|
+
return T4.literal("[object Function]");
|
|
850
|
+
case "promise":
|
|
851
|
+
return T4.literal("[object Promise]");
|
|
852
|
+
case "instance":
|
|
853
|
+
return T4.literal(`[object ${base.className}]`);
|
|
854
|
+
case "literal": {
|
|
855
|
+
if (base.value === null) return T4.literal("[object Null]");
|
|
856
|
+
if (base.value === void 0) return T4.literal("[object Undefined]");
|
|
857
|
+
const t = typeof base.value;
|
|
858
|
+
return T4.literal(`[object ${t === "number" ? "Number" : t === "string" ? "String" : "Boolean"}]`);
|
|
859
|
+
}
|
|
860
|
+
case "primitive": {
|
|
861
|
+
const brands = {
|
|
862
|
+
number: "Number",
|
|
863
|
+
string: "String",
|
|
864
|
+
boolean: "Boolean",
|
|
865
|
+
bigint: "BigInt",
|
|
866
|
+
symbol: "Symbol"
|
|
867
|
+
};
|
|
868
|
+
return T4.literal(`[object ${brands[base.type] ?? "Object"}]`);
|
|
869
|
+
}
|
|
870
|
+
default:
|
|
871
|
+
return void 0;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
function protoOfValue(v) {
|
|
875
|
+
if (!v) return T4.unknown;
|
|
876
|
+
if (v.kind === "union") return simplifyUnion3(v.members.map((m) => protoOfValue(m)));
|
|
877
|
+
let base = v;
|
|
878
|
+
while (base.kind === "refined") base = base.base;
|
|
879
|
+
switch (base.kind) {
|
|
880
|
+
case "object":
|
|
881
|
+
return builtinPrototype("Object");
|
|
882
|
+
case "array":
|
|
883
|
+
case "tuple":
|
|
884
|
+
return builtinPrototype("Array");
|
|
885
|
+
case "function":
|
|
886
|
+
return builtinPrototype("Function");
|
|
887
|
+
case "promise":
|
|
888
|
+
return builtinPrototype("Promise");
|
|
889
|
+
case "instance":
|
|
890
|
+
return builtinPrototype(base.className);
|
|
891
|
+
default:
|
|
892
|
+
return T4.unknown;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
// src/evaluator.ts
|
|
897
|
+
import {
|
|
898
|
+
T as T15,
|
|
899
|
+
simplifyUnion as simplifyUnion8,
|
|
900
|
+
dispatchMethod,
|
|
901
|
+
dispatchProperty,
|
|
902
|
+
Ops,
|
|
903
|
+
createEnvironment,
|
|
904
|
+
typeValueEquals as typeValueEquals4,
|
|
905
|
+
typeValueToString,
|
|
906
|
+
isSubtypeOf as isSubtypeOf2,
|
|
907
|
+
widenLiteral,
|
|
908
|
+
collapseLiteralUnion,
|
|
909
|
+
createTemplate,
|
|
910
|
+
subtractType as subtractType2,
|
|
911
|
+
getFnSig
|
|
912
|
+
} from "@nudojs/core";
|
|
913
|
+
import { extractInlineDirectives } from "@nudojs/parser";
|
|
914
|
+
|
|
915
|
+
// src/abs-route.ts
|
|
916
|
+
import {
|
|
917
|
+
typeValueToAbs,
|
|
918
|
+
absToTypeValue,
|
|
919
|
+
simplifyUnion as simplifyUnion4,
|
|
920
|
+
add as kAdd,
|
|
921
|
+
sub as kSub,
|
|
922
|
+
mul as kMul,
|
|
923
|
+
div as kDiv,
|
|
924
|
+
mod as kMod,
|
|
925
|
+
cmp as kCmp,
|
|
926
|
+
typeofAbs as kTypeof,
|
|
927
|
+
negAbs as kNeg,
|
|
928
|
+
notAbs as kNot,
|
|
929
|
+
strictEqAbs as kStrictEq,
|
|
930
|
+
and as predAnd,
|
|
931
|
+
ge as predGe,
|
|
932
|
+
le as predLe,
|
|
933
|
+
lit as termLit,
|
|
934
|
+
getRangeMeta,
|
|
935
|
+
spread as kSpread,
|
|
936
|
+
joinAbs as kJoinAbs,
|
|
937
|
+
abs as makeAbs,
|
|
938
|
+
boolLit,
|
|
939
|
+
currentPhi,
|
|
940
|
+
pushPhi,
|
|
941
|
+
popPhi,
|
|
942
|
+
resetPhi,
|
|
943
|
+
withPhiConstraint,
|
|
944
|
+
describePhi
|
|
945
|
+
} from "@nudojs/core";
|
|
946
|
+
var ARITH_OPS = /* @__PURE__ */ new Set(["+", "-", "*", "/", "%"]);
|
|
947
|
+
var CMP_OPS = /* @__PURE__ */ new Set(["<", "<=", ">", ">="]);
|
|
948
|
+
var EQ_OPS = /* @__PURE__ */ new Set(["===", "!=="]);
|
|
949
|
+
var UNARY_OPS = /* @__PURE__ */ new Set(["typeof", "!", "-"]);
|
|
950
|
+
function isNumericOperand(tv) {
|
|
951
|
+
if (!tv) return false;
|
|
952
|
+
if (tv.kind === "literal") return typeof tv.value === "number";
|
|
953
|
+
if (tv.kind === "primitive") return tv.type === "number";
|
|
954
|
+
if (tv.kind === "refined") return isNumericOperand(tv.base);
|
|
955
|
+
return false;
|
|
956
|
+
}
|
|
957
|
+
function isStringOperand(tv) {
|
|
958
|
+
if (!tv) return false;
|
|
959
|
+
if (tv.kind === "literal") return typeof tv.value === "string";
|
|
960
|
+
if (tv.kind === "primitive") return tv.type === "string";
|
|
961
|
+
if (tv.kind === "refined") return isStringOperand(tv.base);
|
|
962
|
+
return false;
|
|
963
|
+
}
|
|
964
|
+
function isComparableOperand(tv) {
|
|
965
|
+
if (tv.kind === "literal") {
|
|
966
|
+
return typeof tv.value === "number" || typeof tv.value === "string";
|
|
967
|
+
}
|
|
968
|
+
if (tv.kind === "primitive") return tv.type === "number" || tv.type === "string";
|
|
969
|
+
if (tv.kind === "refined") return isComparableOperand(tv.base);
|
|
970
|
+
return false;
|
|
971
|
+
}
|
|
972
|
+
function hasCustomRefinementOp(tv, op) {
|
|
973
|
+
if (op !== "/" && op !== "%") return false;
|
|
974
|
+
let cur = tv;
|
|
975
|
+
while (cur && cur.kind === "refined") {
|
|
976
|
+
if (cur.refinement.ops?.[op]) return true;
|
|
977
|
+
cur = cur.base;
|
|
978
|
+
}
|
|
979
|
+
return false;
|
|
980
|
+
}
|
|
981
|
+
function canAdd(left, right) {
|
|
982
|
+
if (isNumericOperand(left) && isNumericOperand(right)) return true;
|
|
983
|
+
if (isStringOperand(left) || isStringOperand(right)) return true;
|
|
984
|
+
if (left.kind === "refined" && isStringOperand(left.base)) return true;
|
|
985
|
+
if (right.kind === "refined" && isStringOperand(right.base)) return true;
|
|
986
|
+
return false;
|
|
987
|
+
}
|
|
988
|
+
function toAbsWithTerms(tv) {
|
|
989
|
+
const base = typeValueToAbs(tv);
|
|
990
|
+
const term = getTerm(tv);
|
|
991
|
+
const pred = getPred(tv);
|
|
992
|
+
let abs = !term && !pred && !getRangeMeta(tv) ? base : makeAbs(base.shape, term ?? base.term, pred ?? base.pred, base.conf);
|
|
993
|
+
const range = getRangeMeta(tv);
|
|
994
|
+
if (range && abs.term) {
|
|
995
|
+
const facts = [];
|
|
996
|
+
if (range.min != null) facts.push(predGe(abs.term, termLit(range.min)));
|
|
997
|
+
if (range.max != null) facts.push(predLe(abs.term, termLit(range.max)));
|
|
998
|
+
if (facts.length > 0) {
|
|
999
|
+
const existing = abs.pred && abs.pred.op !== "true" ? abs.pred : void 0;
|
|
1000
|
+
abs = makeAbs(
|
|
1001
|
+
abs.shape,
|
|
1002
|
+
abs.term,
|
|
1003
|
+
existing ? predAnd(existing, ...facts) : predAnd(...facts),
|
|
1004
|
+
abs.conf
|
|
1005
|
+
);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
return abs;
|
|
1009
|
+
}
|
|
1010
|
+
function tryAbsBinary(op, left, right) {
|
|
1011
|
+
if (!ARITH_OPS.has(op) && !CMP_OPS.has(op) && !EQ_OPS.has(op)) return void 0;
|
|
1012
|
+
if (left.kind === "union" || right.kind === "union") {
|
|
1013
|
+
const ls = left.kind === "union" ? left.members : [left];
|
|
1014
|
+
const rs = right.kind === "union" ? right.members : [right];
|
|
1015
|
+
const results = [];
|
|
1016
|
+
for (const l of ls) {
|
|
1017
|
+
for (const r of rs) {
|
|
1018
|
+
const one = tryAbsBinary(op, l, r);
|
|
1019
|
+
if (one === void 0) return void 0;
|
|
1020
|
+
results.push(one);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
return simplifyUnion4(results);
|
|
1024
|
+
}
|
|
1025
|
+
if (hasCustomRefinementOp(left, op) || hasCustomRefinementOp(right, op)) {
|
|
1026
|
+
return void 0;
|
|
1027
|
+
}
|
|
1028
|
+
if (op === "+") {
|
|
1029
|
+
if (!canAdd(left, right)) return void 0;
|
|
1030
|
+
} else if (op === "-" || op === "*" || op === "/" || op === "%") {
|
|
1031
|
+
if (!isNumericOperand(left) || !isNumericOperand(right)) return void 0;
|
|
1032
|
+
} else if (op === "===" || op === "!==") {
|
|
1033
|
+
} else {
|
|
1034
|
+
if (!isComparableOperand(left) || !isComparableOperand(right)) return void 0;
|
|
1035
|
+
}
|
|
1036
|
+
try {
|
|
1037
|
+
const la = toAbsWithTerms(left);
|
|
1038
|
+
const ra = toAbsWithTerms(right);
|
|
1039
|
+
const phi = currentPhi();
|
|
1040
|
+
if (op === "===" || op === "!==") {
|
|
1041
|
+
const eq = kStrictEq(la, ra);
|
|
1042
|
+
if (eq !== void 0) {
|
|
1043
|
+
return absToTypeValue(op === "===" ? boolLit(eq) : boolLit(!eq));
|
|
1044
|
+
}
|
|
1045
|
+
if (isNumericOperand(left) && isNumericOperand(right)) {
|
|
1046
|
+
return absToTypeValue(kCmp(op === "===" ? "eq" : "ne", la, ra, phi));
|
|
1047
|
+
}
|
|
1048
|
+
return void 0;
|
|
1049
|
+
}
|
|
1050
|
+
let result;
|
|
1051
|
+
if (op === "+") result = kAdd(la, ra, phi);
|
|
1052
|
+
else if (op === "-") result = kSub(la, ra, phi);
|
|
1053
|
+
else if (op === "*") result = kMul(la, ra, phi);
|
|
1054
|
+
else if (op === "/") result = kDiv(la, ra, phi);
|
|
1055
|
+
else if (op === "%") result = kMod(la, ra, phi);
|
|
1056
|
+
else if (op === "<") result = kCmp("lt", la, ra, phi);
|
|
1057
|
+
else if (op === "<=") result = kCmp("le", la, ra, phi);
|
|
1058
|
+
else if (op === ">") result = kCmp("gt", la, ra, phi);
|
|
1059
|
+
else if (op === ">=") result = kCmp("ge", la, ra, phi);
|
|
1060
|
+
else return void 0;
|
|
1061
|
+
return absToTypeValue(result);
|
|
1062
|
+
} catch {
|
|
1063
|
+
return void 0;
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
function tryAbsUnary(op, operand) {
|
|
1067
|
+
if (!UNARY_OPS.has(op)) return void 0;
|
|
1068
|
+
if (operand.kind === "union") {
|
|
1069
|
+
const outs = [];
|
|
1070
|
+
for (const m of operand.members) {
|
|
1071
|
+
const one = tryAbsUnary(op, m);
|
|
1072
|
+
if (one === void 0) return void 0;
|
|
1073
|
+
outs.push(one);
|
|
1074
|
+
}
|
|
1075
|
+
return simplifyUnion4(outs);
|
|
1076
|
+
}
|
|
1077
|
+
try {
|
|
1078
|
+
const a = toAbsWithTerms(operand);
|
|
1079
|
+
if (op === "typeof") return absToTypeValue(kTypeof(a));
|
|
1080
|
+
if (op === "!") return absToTypeValue(kNot(a));
|
|
1081
|
+
if (op === "-") {
|
|
1082
|
+
if (!isNumericOperand(operand) && operand.kind !== "unknown") return void 0;
|
|
1083
|
+
return absToTypeValue(kNeg(a, currentPhi()));
|
|
1084
|
+
}
|
|
1085
|
+
return void 0;
|
|
1086
|
+
} catch {
|
|
1087
|
+
return void 0;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
function tryAbsObjectSpread(base, over) {
|
|
1091
|
+
if (base.kind !== "object" && base.kind !== "union") return void 0;
|
|
1092
|
+
if (over.kind !== "object" && over.kind !== "union") return void 0;
|
|
1093
|
+
try {
|
|
1094
|
+
const ba = toAbsWithTerms(base);
|
|
1095
|
+
const oa = toAbsWithTerms(over);
|
|
1096
|
+
const r = kSpread(ba, oa);
|
|
1097
|
+
return absToTypeValue(r);
|
|
1098
|
+
} catch {
|
|
1099
|
+
return void 0;
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
function tryAbsJoinObjects(a, b) {
|
|
1103
|
+
if (a.kind !== "object" || b.kind !== "object") return void 0;
|
|
1104
|
+
try {
|
|
1105
|
+
const r = kJoinAbs(toAbsWithTerms(a), toAbsWithTerms(b));
|
|
1106
|
+
return absToTypeValue(r);
|
|
1107
|
+
} catch {
|
|
1108
|
+
return void 0;
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
// src/eval-binary.ts
|
|
1113
|
+
import {
|
|
1114
|
+
T as T5,
|
|
1115
|
+
simplifyUnion as simplifyUnion5,
|
|
1116
|
+
dispatchBinaryOp
|
|
1117
|
+
} from "@nudojs/core";
|
|
1118
|
+
var MAX_UNION_PRODUCT = 64;
|
|
1119
|
+
function looseLiteralValue(tv) {
|
|
1120
|
+
if (tv.kind === "literal") {
|
|
1121
|
+
const v = tv.value;
|
|
1122
|
+
if (typeof v === "number" || typeof v === "string" || typeof v === "boolean" || v === null || v === void 0) {
|
|
1123
|
+
return { hit: true, v };
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
return { hit: false, v: void 0 };
|
|
1127
|
+
}
|
|
1128
|
+
function distributeBinaryOverUnion(left, right, fn) {
|
|
1129
|
+
if (left.kind === "union" && right.kind === "union") {
|
|
1130
|
+
if (left.members.length * right.members.length > MAX_UNION_PRODUCT) {
|
|
1131
|
+
return T5.unknown;
|
|
1132
|
+
}
|
|
1133
|
+
return simplifyUnion5(
|
|
1134
|
+
left.members.flatMap((l) => right.members.map((r) => fn(l, r)))
|
|
1135
|
+
);
|
|
1136
|
+
}
|
|
1137
|
+
if (left.kind === "union") {
|
|
1138
|
+
return simplifyUnion5(left.members.map((l) => fn(l, right)));
|
|
1139
|
+
}
|
|
1140
|
+
if (right.kind === "union") {
|
|
1141
|
+
return simplifyUnion5(right.members.map((r) => fn(left, r)));
|
|
1142
|
+
}
|
|
1143
|
+
return fn(left, right);
|
|
1144
|
+
}
|
|
1145
|
+
var ALGEBRA_OPS = /* @__PURE__ */ new Set([
|
|
1146
|
+
"+",
|
|
1147
|
+
"-",
|
|
1148
|
+
"*",
|
|
1149
|
+
"/",
|
|
1150
|
+
"%",
|
|
1151
|
+
"<",
|
|
1152
|
+
"<=",
|
|
1153
|
+
">",
|
|
1154
|
+
">=",
|
|
1155
|
+
"===",
|
|
1156
|
+
"!=="
|
|
1157
|
+
]);
|
|
1158
|
+
function numberish(tv) {
|
|
1159
|
+
if (!tv) return false;
|
|
1160
|
+
if (tv.kind === "unknown") return true;
|
|
1161
|
+
if (tv.kind === "literal") return typeof tv.value === "number";
|
|
1162
|
+
if (tv.kind === "primitive") return tv.type === "number";
|
|
1163
|
+
if (tv.kind === "refined") return numberish(tv.base);
|
|
1164
|
+
return false;
|
|
1165
|
+
}
|
|
1166
|
+
function evalBinaryValue(operator, left, right) {
|
|
1167
|
+
if (operator === "instanceof" || operator === "in") return void 0;
|
|
1168
|
+
if (ALGEBRA_OPS.has(operator)) {
|
|
1169
|
+
const absResult = tryAbsBinary(operator, left, right);
|
|
1170
|
+
if (absResult !== void 0) return absResult;
|
|
1171
|
+
}
|
|
1172
|
+
if (operator === "==" || operator === "!=") {
|
|
1173
|
+
const eq = operator === "==";
|
|
1174
|
+
return distributeBinaryOverUnion(left, right, (l, r) => {
|
|
1175
|
+
const lv = looseLiteralValue(l);
|
|
1176
|
+
const rv = looseLiteralValue(r);
|
|
1177
|
+
if (lv.hit && rv.hit) return T5.literal(eq ? lv.v == rv.v : lv.v != rv.v);
|
|
1178
|
+
return T5.boolean;
|
|
1179
|
+
});
|
|
1180
|
+
}
|
|
1181
|
+
const viaDispatch = distributeBinaryOverUnion(
|
|
1182
|
+
left,
|
|
1183
|
+
right,
|
|
1184
|
+
(l, r) => dispatchBinaryOp(operator, l, r)
|
|
1185
|
+
);
|
|
1186
|
+
if (viaDispatch.kind === "unknown" && (operator === "-" || operator === "*" || operator === "/" || operator === "%") && (numberish(left) || numberish(right))) {
|
|
1187
|
+
return T5.number;
|
|
1188
|
+
}
|
|
1189
|
+
return viaDispatch;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
// src/phi-from-test.ts
|
|
1193
|
+
import { pTrue as pTrue2, and as phiAnd, gt, ge, lt, le, v as termVar3, lit as lit2 } from "@nudojs/core";
|
|
1194
|
+
function phiFromTest(test) {
|
|
1195
|
+
if (test.type !== "BinaryExpression") {
|
|
1196
|
+
return { whenTrue: pTrue2, whenFalse: pTrue2 };
|
|
1197
|
+
}
|
|
1198
|
+
const op = test.operator;
|
|
1199
|
+
const left = test.left;
|
|
1200
|
+
const right = test.right;
|
|
1201
|
+
if (left.type === "Identifier" && right.type === "NumericLiteral" && (op === ">" || op === ">=" || op === "<" || op === "<=")) {
|
|
1202
|
+
const t = termVar3(left.name);
|
|
1203
|
+
const n = lit2(right.value);
|
|
1204
|
+
const pred = op === ">" ? gt(t, n) : op === ">=" ? ge(t, n) : op === "<" ? lt(t, n) : le(t, n);
|
|
1205
|
+
const dual = op === ">" ? le(t, n) : op === ">=" ? lt(t, n) : op === "<" ? ge(t, n) : gt(t, n);
|
|
1206
|
+
return { whenTrue: pred, whenFalse: dual };
|
|
1207
|
+
}
|
|
1208
|
+
return { whenTrue: pTrue2, whenFalse: pTrue2 };
|
|
1209
|
+
}
|
|
1210
|
+
function combinePhi(base, extra) {
|
|
1211
|
+
if (extra.op === "true") return base;
|
|
1212
|
+
if (base.op === "true") return extra;
|
|
1213
|
+
return phiAnd(base, extra);
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
// src/builtins/builtin-promise.ts
|
|
1217
|
+
import { T as T6, simplifyUnion as simplifyUnion6 } from "@nudojs/core";
|
|
1218
|
+
var PROMISE_STATIC_METHODS = {
|
|
1219
|
+
resolve: T6.unknown,
|
|
1220
|
+
reject: T6.never,
|
|
1221
|
+
all: T6.unknown,
|
|
1222
|
+
race: T6.unknown,
|
|
1223
|
+
allSettled: T6.unknown,
|
|
1224
|
+
any: T6.unknown
|
|
1225
|
+
};
|
|
1226
|
+
function evaluatePromiseStaticMethod(methodName, args) {
|
|
1227
|
+
if (methodName === "resolve") {
|
|
1228
|
+
if (args.length > 0) return T6.promise(args[0]);
|
|
1229
|
+
return T6.promise(T6.undefined);
|
|
1230
|
+
}
|
|
1231
|
+
if (methodName === "reject") {
|
|
1232
|
+
return T6.promise(T6.never);
|
|
1233
|
+
}
|
|
1234
|
+
if (methodName === "all") {
|
|
1235
|
+
if (args.length > 0 && args[0].kind === "tuple") {
|
|
1236
|
+
const elemTypes = args[0].elements.map((e) => {
|
|
1237
|
+
if (e.kind === "promise") return e.value;
|
|
1238
|
+
return T6.unknown;
|
|
1239
|
+
});
|
|
1240
|
+
return T6.promise(T6.tuple(elemTypes));
|
|
1241
|
+
}
|
|
1242
|
+
if (args.length > 0 && args[0].kind === "array") {
|
|
1243
|
+
return T6.promise(T6.array(args[0].element));
|
|
1244
|
+
}
|
|
1245
|
+
return T6.promise(T6.array(T6.unknown));
|
|
1246
|
+
}
|
|
1247
|
+
if (methodName === "race") {
|
|
1248
|
+
if (args.length > 0 && args[0].kind === "tuple") {
|
|
1249
|
+
const elemTypes = args[0].elements.map((e) => {
|
|
1250
|
+
if (e.kind === "promise") return e.value;
|
|
1251
|
+
return T6.unknown;
|
|
1252
|
+
});
|
|
1253
|
+
return T6.promise(simplifyUnion6(elemTypes));
|
|
1254
|
+
}
|
|
1255
|
+
if (args.length > 0 && args[0].kind === "array") {
|
|
1256
|
+
const el = args[0].element;
|
|
1257
|
+
return T6.promise(el.kind === "promise" ? el.value : T6.unknown);
|
|
1258
|
+
}
|
|
1259
|
+
return T6.promise(T6.unknown);
|
|
1260
|
+
}
|
|
1261
|
+
if (methodName === "allSettled") {
|
|
1262
|
+
const settledOf = (e) => T6.object({
|
|
1263
|
+
status: T6.union(T6.literal("fulfilled"), T6.literal("rejected")),
|
|
1264
|
+
value: e.kind === "promise" ? e.value : T6.unknown
|
|
1265
|
+
});
|
|
1266
|
+
if (args.length > 0 && args[0].kind === "tuple") {
|
|
1267
|
+
return T6.promise(T6.tuple(args[0].elements.map(settledOf)));
|
|
1268
|
+
}
|
|
1269
|
+
if (args.length > 0 && args[0].kind === "array") {
|
|
1270
|
+
return T6.promise(T6.array(settledOf(args[0].element)));
|
|
1271
|
+
}
|
|
1272
|
+
return T6.promise(T6.array(T6.unknown));
|
|
1273
|
+
}
|
|
1274
|
+
if (methodName === "any") {
|
|
1275
|
+
if (args.length > 0 && args[0].kind === "tuple") {
|
|
1276
|
+
const elemTypes = args[0].elements.map((e) => {
|
|
1277
|
+
if (e.kind === "promise") return e.value;
|
|
1278
|
+
return T6.unknown;
|
|
1279
|
+
});
|
|
1280
|
+
return T6.promise(simplifyUnion6(elemTypes));
|
|
1281
|
+
}
|
|
1282
|
+
if (args.length > 0 && args[0].kind === "array") {
|
|
1283
|
+
const el = args[0].element;
|
|
1284
|
+
return T6.promise(el.kind === "promise" ? el.value : T6.unknown);
|
|
1285
|
+
}
|
|
1286
|
+
return T6.promise(T6.unknown);
|
|
1287
|
+
}
|
|
1288
|
+
return null;
|
|
1289
|
+
}
|
|
1290
|
+
function evaluatePromiseInstanceMethod(promiseValue, methodName, args) {
|
|
1291
|
+
if (methodName === "then") {
|
|
1292
|
+
if (promiseValue.kind === "promise") {
|
|
1293
|
+
return T6.promise(T6.unknown);
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
if (methodName === "catch") {
|
|
1297
|
+
if (promiseValue.kind === "promise") {
|
|
1298
|
+
return promiseValue;
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
if (methodName === "finally") {
|
|
1302
|
+
if (promiseValue.kind === "promise") {
|
|
1303
|
+
return promiseValue;
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
return null;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
// src/builtins/builtin-regexp.ts
|
|
1310
|
+
import { T as T7 } from "@nudojs/core";
|
|
1311
|
+
var REGEXP_INSTANCE_METHODS = {
|
|
1312
|
+
test: () => T7.boolean,
|
|
1313
|
+
exec: () => T7.union(T7.null, T7.object({})),
|
|
1314
|
+
toString: () => T7.string
|
|
1315
|
+
};
|
|
1316
|
+
var REGEXP_PROPS = {
|
|
1317
|
+
source: T7.string,
|
|
1318
|
+
flags: T7.string,
|
|
1319
|
+
global: T7.boolean,
|
|
1320
|
+
ignoreCase: T7.boolean,
|
|
1321
|
+
multiline: T7.boolean,
|
|
1322
|
+
dotAll: T7.boolean,
|
|
1323
|
+
unicode: T7.boolean,
|
|
1324
|
+
sticky: T7.boolean
|
|
1325
|
+
};
|
|
1326
|
+
function createRegExpType() {
|
|
1327
|
+
return T7.instanceOf("RegExp", {
|
|
1328
|
+
source: T7.string,
|
|
1329
|
+
flags: T7.string,
|
|
1330
|
+
global: T7.boolean,
|
|
1331
|
+
ignoreCase: T7.boolean,
|
|
1332
|
+
multiline: T7.boolean,
|
|
1333
|
+
dotAll: T7.boolean,
|
|
1334
|
+
unicode: T7.boolean,
|
|
1335
|
+
sticky: T7.boolean,
|
|
1336
|
+
test: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1337
|
+
exec: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1338
|
+
toString: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1339
|
+
});
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
// src/builtins/builtin-url.ts
|
|
1343
|
+
import { T as T8 } from "@nudojs/core";
|
|
1344
|
+
var URL_PROPS = {
|
|
1345
|
+
href: T8.string,
|
|
1346
|
+
origin: T8.string,
|
|
1347
|
+
protocol: T8.string,
|
|
1348
|
+
host: T8.string,
|
|
1349
|
+
hostname: T8.string,
|
|
1350
|
+
port: T8.string,
|
|
1351
|
+
pathname: T8.string,
|
|
1352
|
+
search: T8.string,
|
|
1353
|
+
hash: T8.string,
|
|
1354
|
+
username: T8.string,
|
|
1355
|
+
password: T8.string
|
|
1356
|
+
};
|
|
1357
|
+
var URL_INSTANCE_METHODS = {
|
|
1358
|
+
toString: () => T8.string
|
|
1359
|
+
};
|
|
1360
|
+
var URLSearchParams_INSTANCE_METHODS = {
|
|
1361
|
+
get: () => T8.union(T8.string, T8.null),
|
|
1362
|
+
set: () => T8.undefined,
|
|
906
1363
|
has: () => T8.boolean,
|
|
907
|
-
delete: () => T8.
|
|
1364
|
+
delete: () => T8.undefined,
|
|
1365
|
+
append: () => T8.undefined,
|
|
1366
|
+
toString: () => T8.string,
|
|
1367
|
+
getAll: () => T8.array(T8.string)
|
|
1368
|
+
};
|
|
1369
|
+
function createURLType() {
|
|
1370
|
+
return T8.instanceOf("URL", {
|
|
1371
|
+
href: T8.string,
|
|
1372
|
+
origin: T8.string,
|
|
1373
|
+
protocol: T8.string,
|
|
1374
|
+
host: T8.string,
|
|
1375
|
+
hostname: T8.string,
|
|
1376
|
+
port: T8.string,
|
|
1377
|
+
pathname: T8.string,
|
|
1378
|
+
search: T8.string,
|
|
1379
|
+
hash: T8.string,
|
|
1380
|
+
username: T8.string,
|
|
1381
|
+
password: T8.string,
|
|
1382
|
+
toString: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1383
|
+
});
|
|
1384
|
+
}
|
|
1385
|
+
function createURLSearchParamsType() {
|
|
1386
|
+
return T8.instanceOf("URLSearchParams", {
|
|
1387
|
+
get: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1388
|
+
set: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1389
|
+
has: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1390
|
+
delete: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1391
|
+
append: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1392
|
+
toString: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1393
|
+
getAll: T8.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
// src/builtins/builtin-web.ts
|
|
1398
|
+
import { T as T9 } from "@nudojs/core";
|
|
1399
|
+
var RESPONSE_PROPS = {
|
|
1400
|
+
ok: T9.boolean,
|
|
1401
|
+
status: T9.number,
|
|
1402
|
+
statusText: T9.string,
|
|
1403
|
+
url: T9.string,
|
|
1404
|
+
type: T9.string,
|
|
1405
|
+
redirected: T9.boolean,
|
|
1406
|
+
headers: T9.unknown,
|
|
1407
|
+
// Headers instance
|
|
1408
|
+
body: T9.unknown,
|
|
1409
|
+
bodyUsed: T9.boolean
|
|
1410
|
+
};
|
|
1411
|
+
var RESPONSE_INSTANCE_METHODS = {
|
|
1412
|
+
json: () => T9.promise(T9.unknown),
|
|
1413
|
+
text: () => T9.promise(T9.string),
|
|
1414
|
+
arrayBuffer: () => T9.promise(T9.unknown),
|
|
1415
|
+
blob: () => T9.promise(T9.unknown),
|
|
1416
|
+
clone: () => T9.unknown,
|
|
1417
|
+
formData: () => T9.promise(T9.unknown)
|
|
1418
|
+
};
|
|
1419
|
+
var HEADERS_INSTANCE_METHODS = {
|
|
1420
|
+
get: () => T9.union(T9.string, T9.null),
|
|
1421
|
+
set: () => T9.undefined,
|
|
1422
|
+
has: () => T9.boolean,
|
|
1423
|
+
delete: () => T9.undefined,
|
|
1424
|
+
append: () => T9.undefined,
|
|
1425
|
+
entries: () => T9.unknown,
|
|
1426
|
+
keys: () => T9.unknown,
|
|
1427
|
+
values: () => T9.unknown,
|
|
1428
|
+
forEach: () => T9.undefined
|
|
1429
|
+
};
|
|
1430
|
+
var FORMDATA_INSTANCE_METHODS = {
|
|
1431
|
+
get: () => T9.union(T9.string, T9.null),
|
|
1432
|
+
set: () => T9.undefined,
|
|
1433
|
+
has: () => T9.boolean,
|
|
1434
|
+
delete: () => T9.undefined,
|
|
1435
|
+
append: () => T9.undefined,
|
|
1436
|
+
getAll: () => T9.array(T9.unknown),
|
|
1437
|
+
entries: () => T9.unknown,
|
|
1438
|
+
keys: () => T9.unknown,
|
|
1439
|
+
values: () => T9.unknown,
|
|
1440
|
+
forEach: () => T9.undefined
|
|
1441
|
+
};
|
|
1442
|
+
var ABORTCONTROLLER_PROPS = {
|
|
1443
|
+
signal: T9.unknown
|
|
1444
|
+
};
|
|
1445
|
+
var ABORTCONTROLLER_INSTANCE_METHODS = {
|
|
1446
|
+
abort: () => T9.undefined
|
|
1447
|
+
};
|
|
1448
|
+
function createResponseType() {
|
|
1449
|
+
return T9.instanceOf("Response", {
|
|
1450
|
+
ok: T9.boolean,
|
|
1451
|
+
status: T9.number,
|
|
1452
|
+
statusText: T9.string,
|
|
1453
|
+
url: T9.string,
|
|
1454
|
+
type: T9.string,
|
|
1455
|
+
redirected: T9.boolean,
|
|
1456
|
+
headers: T9.unknown,
|
|
1457
|
+
body: T9.unknown,
|
|
1458
|
+
bodyUsed: T9.boolean,
|
|
1459
|
+
json: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1460
|
+
text: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1461
|
+
arrayBuffer: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1462
|
+
blob: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1463
|
+
clone: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1464
|
+
formData: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1465
|
+
});
|
|
1466
|
+
}
|
|
1467
|
+
function createHeadersType() {
|
|
1468
|
+
return T9.instanceOf("Headers", {
|
|
1469
|
+
get: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1470
|
+
set: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1471
|
+
has: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1472
|
+
delete: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1473
|
+
append: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1474
|
+
entries: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1475
|
+
keys: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1476
|
+
values: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1477
|
+
forEach: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1478
|
+
});
|
|
1479
|
+
}
|
|
1480
|
+
function createFormDataType() {
|
|
1481
|
+
return T9.instanceOf("FormData", {
|
|
1482
|
+
get: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1483
|
+
set: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1484
|
+
has: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1485
|
+
delete: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1486
|
+
append: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1487
|
+
getAll: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1488
|
+
entries: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1489
|
+
keys: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1490
|
+
values: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1491
|
+
forEach: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1492
|
+
});
|
|
1493
|
+
}
|
|
1494
|
+
function createAbortControllerType() {
|
|
1495
|
+
return T9.instanceOf("AbortController", {
|
|
1496
|
+
signal: T9.unknown,
|
|
1497
|
+
abort: T9.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1498
|
+
});
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
// src/builtins/builtin-weak.ts
|
|
1502
|
+
import { T as T10 } from "@nudojs/core";
|
|
1503
|
+
var WEAKMAP_INSTANCE_METHODS = {
|
|
1504
|
+
get: (_key) => T10.union(T10.unknown, T10.undefined),
|
|
1505
|
+
set: (_key, _value, map) => map ?? T10.unknown,
|
|
1506
|
+
has: () => T10.boolean,
|
|
1507
|
+
delete: () => T10.boolean
|
|
1508
|
+
};
|
|
1509
|
+
var WEAKSET_INSTANCE_METHODS = {
|
|
1510
|
+
add: (_value, set) => set ?? T10.unknown,
|
|
1511
|
+
has: () => T10.boolean,
|
|
1512
|
+
delete: () => T10.boolean
|
|
908
1513
|
};
|
|
909
1514
|
function createWeakMapType() {
|
|
910
|
-
return
|
|
1515
|
+
return T10.instanceOf("WeakMap", {});
|
|
911
1516
|
}
|
|
912
1517
|
function createWeakSetType() {
|
|
913
|
-
return
|
|
1518
|
+
return T10.instanceOf("WeakSet", {});
|
|
914
1519
|
}
|
|
915
1520
|
|
|
916
1521
|
// src/builtins/builtin-symbol.ts
|
|
917
|
-
import { T as
|
|
1522
|
+
import { T as T11 } from "@nudojs/core";
|
|
918
1523
|
var SYMBOL_STATIC_METHODS = {
|
|
919
|
-
for:
|
|
920
|
-
keyFor:
|
|
1524
|
+
for: T11.symbol,
|
|
1525
|
+
keyFor: T11.union(T11.string, T11.undefined)
|
|
921
1526
|
};
|
|
922
1527
|
var SYMBOL_STATIC_PROPS = {
|
|
923
|
-
asyncIterator:
|
|
924
|
-
iterator:
|
|
925
|
-
toPrimitive:
|
|
926
|
-
toStringTag:
|
|
927
|
-
hasInstance:
|
|
928
|
-
species:
|
|
929
|
-
isConcatSpreadable:
|
|
1528
|
+
asyncIterator: T11.symbol,
|
|
1529
|
+
iterator: T11.symbol,
|
|
1530
|
+
toPrimitive: T11.symbol,
|
|
1531
|
+
toStringTag: T11.symbol,
|
|
1532
|
+
hasInstance: T11.symbol,
|
|
1533
|
+
species: T11.symbol,
|
|
1534
|
+
isConcatSpreadable: T11.symbol
|
|
930
1535
|
};
|
|
931
1536
|
|
|
932
1537
|
// src/builtins/builtin-reflect.ts
|
|
933
|
-
import { T as
|
|
1538
|
+
import { T as T12 } from "@nudojs/core";
|
|
934
1539
|
var REFLECT_METHODS = {
|
|
935
|
-
has: () =>
|
|
936
|
-
get: () =>
|
|
937
|
-
set: () =>
|
|
938
|
-
deleteProperty: () =>
|
|
939
|
-
apply: () =>
|
|
940
|
-
construct: () =>
|
|
1540
|
+
has: () => T12.boolean,
|
|
1541
|
+
get: () => T12.unknown,
|
|
1542
|
+
set: () => T12.boolean,
|
|
1543
|
+
deleteProperty: () => T12.boolean,
|
|
1544
|
+
apply: () => T12.unknown,
|
|
1545
|
+
construct: () => T12.object({}),
|
|
941
1546
|
// Shape-aware like Object.keys: known receivers list their declared
|
|
942
1547
|
// own-property names (hoek's Utils.keys → clone/flatten key loops then
|
|
943
1548
|
// iterate concrete keys instead of a symbolic string), arrays add the
|
|
@@ -946,76 +1551,80 @@ var REFLECT_METHODS = {
|
|
|
946
1551
|
let base = target;
|
|
947
1552
|
while (base?.kind === "refined") base = base.base;
|
|
948
1553
|
if (base && (base.kind === "object" || base.kind === "instance")) {
|
|
949
|
-
return
|
|
1554
|
+
return T12.tuple(Object.keys(base.properties).map((k) => T12.literal(k)));
|
|
950
1555
|
}
|
|
951
1556
|
if (base?.kind === "tuple") {
|
|
952
|
-
return
|
|
953
|
-
...base.elements.map((_, i) =>
|
|
954
|
-
|
|
1557
|
+
return T12.tuple([
|
|
1558
|
+
...base.elements.map((_, i) => T12.literal(String(i))),
|
|
1559
|
+
T12.literal("length")
|
|
955
1560
|
]);
|
|
956
1561
|
}
|
|
957
|
-
return
|
|
1562
|
+
return T12.array(T12.string);
|
|
958
1563
|
},
|
|
959
|
-
getPrototypeOf: () =>
|
|
960
|
-
getOwnPropertyDescriptor: () =>
|
|
1564
|
+
getPrototypeOf: () => T12.union(T12.object({}), T12.null),
|
|
1565
|
+
getOwnPropertyDescriptor: () => T12.union(T12.object({}), T12.undefined)
|
|
961
1566
|
};
|
|
962
1567
|
|
|
963
1568
|
// src/builtins/builtin-intl.ts
|
|
964
|
-
import { T as
|
|
1569
|
+
import { T as T13 } from "@nudojs/core";
|
|
965
1570
|
var INTL_DATETIMEFORMAT_METHODS = {
|
|
966
|
-
format: () =>
|
|
1571
|
+
format: () => T13.string
|
|
967
1572
|
};
|
|
968
1573
|
var INTL_NUMBERFORMAT_METHODS = {
|
|
969
|
-
format: () =>
|
|
1574
|
+
format: () => T13.string
|
|
970
1575
|
};
|
|
971
1576
|
function createDateTimeFormatType() {
|
|
972
|
-
return
|
|
1577
|
+
return T13.instanceOf("DateTimeFormat", {});
|
|
973
1578
|
}
|
|
974
1579
|
function createNumberFormatType() {
|
|
975
|
-
return
|
|
1580
|
+
return T13.instanceOf("NumberFormat", {});
|
|
976
1581
|
}
|
|
977
1582
|
|
|
978
|
-
// src/
|
|
1583
|
+
// src/builtins/builtin-static.ts
|
|
1584
|
+
import { T as T14, simplifyUnion as simplifyUnion7 } from "@nudojs/core";
|
|
1585
|
+
function hasOwnProp2(props, name) {
|
|
1586
|
+
return Object.prototype.hasOwnProperty.call(props, name);
|
|
1587
|
+
}
|
|
979
1588
|
var BUILTIN_STATIC_METHODS = {
|
|
980
1589
|
// Node CJS 库普遍依赖的 process 全局——缺它时 process.nextTick(cb) 走
|
|
981
1590
|
// 未知全局 → undefined → no-method 假错(hoek wait 的 usage-site 执行)
|
|
982
1591
|
process: {
|
|
983
|
-
nextTick:
|
|
984
|
-
env:
|
|
985
|
-
platform:
|
|
986
|
-
versions:
|
|
987
|
-
argv:
|
|
988
|
-
cwd:
|
|
989
|
-
exit:
|
|
990
|
-
hrtime:
|
|
991
|
-
stdout:
|
|
992
|
-
stderr:
|
|
1592
|
+
nextTick: T14.fn(["callback", "...args"], { type: "BlockStatement", body: [], directives: [] }, void 0),
|
|
1593
|
+
env: T14.object({}),
|
|
1594
|
+
platform: T14.string,
|
|
1595
|
+
versions: T14.object({}),
|
|
1596
|
+
argv: T14.array(T14.string),
|
|
1597
|
+
cwd: T14.fn([], { type: "BlockStatement", body: [], directives: [] }, void 0),
|
|
1598
|
+
exit: T14.fn(["code"], { type: "BlockStatement", body: [], directives: [] }, void 0),
|
|
1599
|
+
hrtime: T14.fn(["time"], { type: "BlockStatement", body: [], directives: [] }, void 0),
|
|
1600
|
+
stdout: T14.instanceOf("Socket"),
|
|
1601
|
+
stderr: T14.instanceOf("Socket")
|
|
993
1602
|
},
|
|
994
1603
|
Date: {
|
|
995
|
-
now:
|
|
996
|
-
parse:
|
|
997
|
-
UTC:
|
|
1604
|
+
now: T14.number,
|
|
1605
|
+
parse: T14.number,
|
|
1606
|
+
UTC: T14.number
|
|
998
1607
|
},
|
|
999
1608
|
Math: {
|
|
1000
|
-
random:
|
|
1001
|
-
floor:
|
|
1002
|
-
ceil:
|
|
1003
|
-
round:
|
|
1004
|
-
abs:
|
|
1005
|
-
max:
|
|
1006
|
-
min:
|
|
1007
|
-
sqrt:
|
|
1008
|
-
pow:
|
|
1609
|
+
random: T14.number,
|
|
1610
|
+
floor: T14.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
|
|
1611
|
+
ceil: T14.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
|
|
1612
|
+
round: T14.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
|
|
1613
|
+
abs: T14.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
|
|
1614
|
+
max: T14.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1615
|
+
min: T14.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1616
|
+
sqrt: T14.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
|
|
1617
|
+
pow: T14.fn(["base", "exp"], { type: "BlockStatement", body: [] }, void 0),
|
|
1009
1618
|
// Math 常量与 @nudo:env es 的 Math 定义对齐(env 绑定优先);无 env
|
|
1010
1619
|
// 指令时也在此解析,避免 Math.PI 走 unknown-property。
|
|
1011
|
-
PI:
|
|
1012
|
-
E:
|
|
1013
|
-
LN2:
|
|
1014
|
-
LN10:
|
|
1015
|
-
LOG2E:
|
|
1016
|
-
LOG10E:
|
|
1017
|
-
SQRT2:
|
|
1018
|
-
SQRT1_2:
|
|
1620
|
+
PI: T14.number,
|
|
1621
|
+
E: T14.number,
|
|
1622
|
+
LN2: T14.number,
|
|
1623
|
+
LN10: T14.number,
|
|
1624
|
+
LOG2E: T14.number,
|
|
1625
|
+
LOG10E: T14.number,
|
|
1626
|
+
SQRT2: T14.number,
|
|
1627
|
+
SQRT1_2: T14.number
|
|
1019
1628
|
},
|
|
1020
1629
|
JSON: {
|
|
1021
1630
|
// JSON.parse(literal-string): evaluate with the real JSON.parse and
|
|
@@ -1026,7 +1635,7 @@ var BUILTIN_STATIC_METHODS = {
|
|
|
1026
1635
|
// the text is not valid JSON. A reviver argument also degrades: it can
|
|
1027
1636
|
// replace every value (and the root) with an arbitrary one, so the
|
|
1028
1637
|
// parse structure is not a sound answer (hoek/json-ext never pass one).
|
|
1029
|
-
parse:
|
|
1638
|
+
parse: T14.fnSig([T14.string], T14.unknown, T14.never, (args) => {
|
|
1030
1639
|
const text = args[0];
|
|
1031
1640
|
if (text?.kind !== "literal" || typeof text.value !== "string") return void 0;
|
|
1032
1641
|
const reviver = args[1];
|
|
@@ -1037,419 +1646,132 @@ var BUILTIN_STATIC_METHODS = {
|
|
|
1037
1646
|
return void 0;
|
|
1038
1647
|
}
|
|
1039
1648
|
}),
|
|
1040
|
-
stringify:
|
|
1649
|
+
stringify: T14.string
|
|
1041
1650
|
},
|
|
1042
1651
|
Object: {
|
|
1043
|
-
keys:
|
|
1044
|
-
values:
|
|
1045
|
-
entries:
|
|
1046
|
-
assign:
|
|
1652
|
+
keys: T14.array(T14.string),
|
|
1653
|
+
values: T14.array(T14.unknown),
|
|
1654
|
+
entries: T14.array(T14.tuple([T14.string, T14.unknown])),
|
|
1655
|
+
assign: T14.fnSig([T14.unknown], T14.unknown, T14.never, (args) => {
|
|
1047
1656
|
const target = args[0];
|
|
1048
|
-
if (target?.kind !== "object") return void 0;
|
|
1049
|
-
const props = { ...target.properties };
|
|
1050
|
-
for (const src of args.slice(1)) {
|
|
1051
|
-
if (src?.kind !== "object") return void 0;
|
|
1052
|
-
Object.assign(props, src.properties);
|
|
1053
|
-
}
|
|
1054
|
-
return
|
|
1055
|
-
}),
|
|
1056
|
-
// Prototype-reflection statics. getPrototypeOf maps receivers onto the
|
|
1057
|
-
// cached prototype singletons so `getPrototypeOf(x) !== getPrototypeOf(y)`
|
|
1058
|
-
// resolves literally; create/setPrototypeOf cover the clone-style
|
|
1059
|
-
// prototype dance; getOwnPropertyDescriptor feeds descriptor.get/set
|
|
1060
|
-
// branches with the property's value type.
|
|
1061
|
-
getPrototypeOf:
|
|
1062
|
-
create:
|
|
1063
|
-
setPrototypeOf:
|
|
1064
|
-
defineProperty:
|
|
1065
|
-
getOwnPropertyDescriptor:
|
|
1066
|
-
const obj = args[0];
|
|
1067
|
-
const key = args[1];
|
|
1068
|
-
if (obj?.kind !== "object" && obj?.kind !== "instance") return
|
|
1069
|
-
if (!key) return
|
|
1070
|
-
if (key.kind === "literal" && typeof key.value === "string") {
|
|
1071
|
-
const prop =
|
|
1072
|
-
if (!prop) return
|
|
1073
|
-
return descriptorOf(prop);
|
|
1074
|
-
}
|
|
1075
|
-
if (key.kind === "primitive" && key.type === "string") {
|
|
1076
|
-
const props = Object.keys(obj.properties);
|
|
1077
|
-
if (props.length === 0) return
|
|
1078
|
-
return descriptorOf(
|
|
1079
|
-
}
|
|
1080
|
-
return
|
|
1081
|
-
})
|
|
1082
|
-
},
|
|
1083
|
-
Buffer: {
|
|
1084
|
-
from: T12.fnSig([T12.unknown], T12.instanceOf("Buffer")),
|
|
1085
|
-
alloc: T12.fnSig([T12.number], T12.instanceOf("Buffer")),
|
|
1086
|
-
concat: T12.fnSig([T12.unknown], T12.instanceOf("Buffer")),
|
|
1087
|
-
byteLength: T12.fnSig([T12.unknown], T12.number),
|
|
1088
|
-
isEncoding: T12.fnSig([T12.unknown], T12.boolean),
|
|
1089
|
-
isBuffer: T12.fnSig([T12.unknown], T12.boolean, T12.never, (args) => {
|
|
1090
|
-
const lit = builtinInstanceTest(args[0], "Buffer");
|
|
1091
|
-
return lit === void 0 ? void 0 : T12.literal(lit);
|
|
1092
|
-
})
|
|
1093
|
-
},
|
|
1094
|
-
Array: {
|
|
1095
|
-
isArray: T12.boolean,
|
|
1096
|
-
from: T12.array(T12.unknown)
|
|
1097
|
-
},
|
|
1098
|
-
Number: {
|
|
1099
|
-
isNaN: T12.boolean,
|
|
1100
|
-
isFinite: T12.boolean,
|
|
1101
|
-
parseInt: T12.number,
|
|
1102
|
-
parseFloat: T12.number,
|
|
1103
|
-
// Number 常量与 @nudo:env es 的 Number 定义对齐(env 绑定优先);
|
|
1104
|
-
// 均为 number(case 序列化器对非有限数返回 null,不产出字面量值)。
|
|
1105
|
-
MAX_SAFE_INTEGER: T12.number,
|
|
1106
|
-
MIN_SAFE_INTEGER: T12.number,
|
|
1107
|
-
MAX_VALUE: T12.number,
|
|
1108
|
-
MIN_VALUE: T12.number,
|
|
1109
|
-
POSITIVE_INFINITY: T12.number,
|
|
1110
|
-
NEGATIVE_INFINITY: T12.number,
|
|
1111
|
-
NaN: T12.number,
|
|
1112
|
-
EPSILON: T12.number
|
|
1113
|
-
},
|
|
1114
|
-
String: {
|
|
1115
|
-
// fromCharCode/fromCodePoint over all-number-literal args evaluate
|
|
1116
|
-
// with the real String static (hoek's escaper builds its 0x2028
|
|
1117
|
-
// separator literal this way before handing it to escapeJson); any
|
|
1118
|
-
// non-literal arg keeps only the string return type (the result is
|
|
1119
|
-
// always a string, just not a knowable one). fromCodePoint also
|
|
1120
|
-
// falls back on out-of-range literals (real RangeError → string).
|
|
1121
|
-
fromCharCode: T12.fnSig([T12.number], T12.string, T12.never, (args) => {
|
|
1122
|
-
const codes = literalCodeUnits(args);
|
|
1123
|
-
return codes === null ? T12.string : T12.literal(String.fromCharCode(...codes));
|
|
1124
|
-
}),
|
|
1125
|
-
fromCodePoint: T12.fnSig([T12.number], T12.string, T12.never, (args) => {
|
|
1126
|
-
const codes = literalCodeUnits(args);
|
|
1127
|
-
if (codes === null) return T12.string;
|
|
1128
|
-
try {
|
|
1129
|
-
return T12.literal(String.fromCodePoint(...codes));
|
|
1130
|
-
} catch {
|
|
1131
|
-
return void 0;
|
|
1132
|
-
}
|
|
1133
|
-
})
|
|
1134
|
-
},
|
|
1135
|
-
Promise: PROMISE_STATIC_METHODS,
|
|
1136
|
-
Symbol: { ...SYMBOL_STATIC_METHODS, ...SYMBOL_STATIC_PROPS },
|
|
1137
|
-
Reflect: REFLECT_METHODS,
|
|
1138
|
-
Intl: {
|
|
1139
|
-
DateTimeFormat: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1140
|
-
NumberFormat: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1141
|
-
},
|
|
1142
|
-
parseInt: T12.number,
|
|
1143
|
-
parseFloat: T12.number,
|
|
1144
|
-
isNaN: T12.boolean,
|
|
1145
|
-
isFinite: T12.boolean,
|
|
1146
|
-
// 全局数值常量:与 @nudo:env es 的 globals 对齐(env 绑定优先)。无 env
|
|
1147
|
-
// 指令时在此解析为 number——否则 Infinity/NaN 命中大写开头的未知全局
|
|
1148
|
-
// 检测,触发 nudo:unknown-global 与 nudo:builtin-unknown 诊断。
|
|
1149
|
-
Infinity: T12.number,
|
|
1150
|
-
NaN: T12.number
|
|
1151
|
-
};
|
|
1152
|
-
function literalCodeUnits(args) {
|
|
1153
|
-
const codes = [];
|
|
1154
|
-
for (const a of args) {
|
|
1155
|
-
if (a?.kind !== "literal" || typeof a.value !== "number") return null;
|
|
1156
|
-
codes.push(a.value);
|
|
1157
|
-
}
|
|
1158
|
-
return codes;
|
|
1159
|
-
}
|
|
1160
|
-
function looseLiteralValue(tv) {
|
|
1161
|
-
if (tv.kind === "literal") {
|
|
1162
|
-
const v = tv.value;
|
|
1163
|
-
if (typeof v === "number" || typeof v === "string" || typeof v === "boolean" || v === null || v === void 0) {
|
|
1164
|
-
return { hit: true, v };
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
return { hit: false, v: void 0 };
|
|
1168
|
-
}
|
|
1169
|
-
var BUILTIN_ERROR_CLASSES = /* @__PURE__ */ new Set([
|
|
1170
|
-
"Error",
|
|
1171
|
-
"TypeError",
|
|
1172
|
-
"SyntaxError",
|
|
1173
|
-
"RangeError",
|
|
1174
|
-
"ReferenceError",
|
|
1175
|
-
"URIError",
|
|
1176
|
-
"EvalError"
|
|
1177
|
-
]);
|
|
1178
|
-
var BUILTIN_PROTOTYPE_CLASSES = /* @__PURE__ */ new Set([
|
|
1179
|
-
...BUILTIN_ERROR_CLASSES,
|
|
1180
|
-
"Date",
|
|
1181
|
-
"Object",
|
|
1182
|
-
"Map",
|
|
1183
|
-
"Set",
|
|
1184
|
-
"Promise",
|
|
1185
|
-
"RegExp",
|
|
1186
|
-
"Array",
|
|
1187
|
-
"Function",
|
|
1188
|
-
"String",
|
|
1189
|
-
"Number",
|
|
1190
|
-
"Boolean",
|
|
1191
|
-
"Symbol",
|
|
1192
|
-
"WeakMap",
|
|
1193
|
-
"WeakSet",
|
|
1194
|
-
"Buffer"
|
|
1195
|
-
]);
|
|
1196
|
-
var OBJECT_PROTOTYPE_METHODS = {
|
|
1197
|
-
hasOwnProperty: T12.fnSig([T12.unknown], T12.boolean),
|
|
1198
|
-
isPrototypeOf: T12.fnSig([T12.unknown], T12.boolean),
|
|
1199
|
-
propertyIsEnumerable: T12.fnSig([T12.unknown], T12.boolean),
|
|
1200
|
-
toString: T12.fnSig([], T12.string, T12.never, (_args, thisVal) => objectToStringBrand(thisVal)),
|
|
1201
|
-
toLocaleString: T12.fnSig([], T12.string),
|
|
1202
|
-
valueOf: T12.fnSig([], T12.unknown, T12.never, (_args, thisVal) => thisVal)
|
|
1203
|
-
};
|
|
1204
|
-
var BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS = {
|
|
1205
|
-
Object: { ...OBJECT_PROTOTYPE_METHODS },
|
|
1206
|
-
Array: {
|
|
1207
|
-
push: T12.fnSig([T12.unknown], T12.number),
|
|
1208
|
-
pop: T12.fnSig([], T12.unknown),
|
|
1209
|
-
shift: T12.fnSig([], T12.unknown),
|
|
1210
|
-
unshift: T12.fnSig([T12.unknown], T12.number),
|
|
1211
|
-
slice: T12.fnSig([T12.number, T12.number], T12.array(T12.unknown)),
|
|
1212
|
-
splice: T12.fnSig([T12.number, T12.number], T12.array(T12.unknown)),
|
|
1213
|
-
concat: T12.fnSig([T12.unknown], T12.array(T12.unknown)),
|
|
1214
|
-
join: T12.fnSig([T12.string], T12.string),
|
|
1215
|
-
indexOf: T12.fnSig([T12.unknown], T12.number),
|
|
1216
|
-
lastIndexOf: T12.fnSig([T12.unknown], T12.number),
|
|
1217
|
-
includes: T12.fnSig([T12.unknown], T12.boolean),
|
|
1218
|
-
map: T12.fnSig([T12.unknown], T12.array(T12.unknown)),
|
|
1219
|
-
filter: T12.fnSig([T12.unknown], T12.array(T12.unknown)),
|
|
1220
|
-
forEach: T12.fnSig([T12.unknown], T12.undefined),
|
|
1221
|
-
find: T12.fnSig([T12.unknown], T12.unknown),
|
|
1222
|
-
findIndex: T12.fnSig([T12.unknown], T12.number),
|
|
1223
|
-
some: T12.fnSig([T12.unknown], T12.boolean),
|
|
1224
|
-
every: T12.fnSig([T12.unknown], T12.boolean),
|
|
1225
|
-
reduce: T12.fnSig([T12.unknown, T12.unknown], T12.unknown),
|
|
1226
|
-
sort: T12.fnSig([T12.unknown], T12.array(T12.unknown)),
|
|
1227
|
-
reverse: T12.fnSig([], T12.array(T12.unknown)),
|
|
1228
|
-
toString: T12.fnSig([], T12.string)
|
|
1229
|
-
},
|
|
1230
|
-
Function: {
|
|
1231
|
-
call: T12.fnSig([T12.unknown], T12.unknown),
|
|
1232
|
-
apply: T12.fnSig([T12.unknown, T12.unknown], T12.unknown),
|
|
1233
|
-
bind: T12.fnSig([T12.unknown], T12.unknown),
|
|
1234
|
-
toString: T12.fnSig([], T12.string)
|
|
1235
|
-
},
|
|
1236
|
-
Map: {
|
|
1237
|
-
// Impl-routed: `Map.prototype.m.call(instance)` (and direct prototype
|
|
1238
|
-
// calls) consult the receiver's exact entry side table, making the
|
|
1239
|
-
// hoek deepEqual reflection idioms decide literally.
|
|
1240
|
-
get: T12.fnSig([T12.unknown], T12.unknown, T12.never, (args, thisVal) => MAP_INSTANCE_METHODS.get(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1241
|
-
set: T12.fnSig([T12.unknown, T12.unknown], T12.unknown, T12.never, (args, thisVal) => MAP_INSTANCE_METHODS.set(args[0] ?? T12.unknown, args[1] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1242
|
-
has: T12.fnSig([T12.unknown], T12.boolean, T12.never, (args, thisVal) => MAP_INSTANCE_METHODS.has(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1243
|
-
delete: T12.fnSig([T12.unknown], T12.boolean, T12.never, (args, thisVal) => MAP_INSTANCE_METHODS.delete(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1244
|
-
clear: T12.fnSig([], T12.undefined, T12.never, (args, thisVal) => MAP_INSTANCE_METHODS.clear(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1245
|
-
forEach: T12.fnSig([T12.unknown], T12.undefined),
|
|
1246
|
-
keys: T12.fnSig([], T12.array(T12.unknown), T12.never, (_args, thisVal) => MAP_INSTANCE_METHODS.keys(thisVal ?? T12.unknown)),
|
|
1247
|
-
values: T12.fnSig([], T12.array(T12.unknown), T12.never, (_args, thisVal) => MAP_INSTANCE_METHODS.values(thisVal ?? T12.unknown)),
|
|
1248
|
-
entries: T12.fnSig([], T12.array(T12.tuple([T12.unknown, T12.unknown])), T12.never, (_args, thisVal) => mapEntriesIterable(thisVal ?? T12.unknown)),
|
|
1249
|
-
toString: T12.fnSig([], T12.string)
|
|
1250
|
-
},
|
|
1251
|
-
Set: {
|
|
1252
|
-
// Impl-routed like Map above (Set.prototype.values.call(s) ≡ s.values()).
|
|
1253
|
-
add: T12.fnSig([T12.unknown], T12.unknown, T12.never, (args, thisVal) => SET_INSTANCE_METHODS.add(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1254
|
-
has: T12.fnSig([T12.unknown], T12.boolean, T12.never, (args, thisVal) => SET_INSTANCE_METHODS.has(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1255
|
-
delete: T12.fnSig([T12.unknown], T12.boolean, T12.never, (args, thisVal) => SET_INSTANCE_METHODS.delete(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1256
|
-
clear: T12.fnSig([], T12.undefined, T12.never, (args, thisVal) => SET_INSTANCE_METHODS.clear(args[0] ?? T12.unknown, thisVal ?? T12.unknown)),
|
|
1257
|
-
forEach: T12.fnSig([T12.unknown], T12.undefined),
|
|
1258
|
-
keys: T12.fnSig([], T12.array(T12.unknown), T12.never, (_args, thisVal) => SET_INSTANCE_METHODS.keys(thisVal ?? T12.unknown)),
|
|
1259
|
-
values: T12.fnSig([], T12.array(T12.unknown), T12.never, (_args, thisVal) => SET_INSTANCE_METHODS.values(thisVal ?? T12.unknown)),
|
|
1260
|
-
entries: T12.fnSig([], T12.array(T12.tuple([T12.unknown, T12.unknown])), T12.never, (_args, thisVal) => SET_INSTANCE_METHODS.entries(thisVal ?? T12.unknown)),
|
|
1261
|
-
toString: T12.fnSig([], T12.string)
|
|
1262
|
-
},
|
|
1263
|
-
WeakMap: {
|
|
1264
|
-
get: T12.fnSig([T12.unknown], T12.unknown),
|
|
1265
|
-
set: T12.fnSig([T12.unknown, T12.unknown], T12.unknown),
|
|
1266
|
-
has: T12.fnSig([T12.unknown], T12.boolean),
|
|
1267
|
-
delete: T12.fnSig([T12.unknown], T12.boolean),
|
|
1268
|
-
toString: T12.fnSig([], T12.string)
|
|
1269
|
-
},
|
|
1270
|
-
WeakSet: {
|
|
1271
|
-
add: T12.fnSig([T12.unknown], T12.unknown),
|
|
1272
|
-
has: T12.fnSig([T12.unknown], T12.boolean),
|
|
1273
|
-
delete: T12.fnSig([T12.unknown], T12.boolean),
|
|
1274
|
-
toString: T12.fnSig([], T12.string)
|
|
1275
|
-
},
|
|
1276
|
-
Promise: {
|
|
1277
|
-
then: T12.fnSig([T12.unknown], T12.promise(T12.unknown)),
|
|
1278
|
-
catch: T12.fnSig([T12.unknown], T12.promise(T12.unknown)),
|
|
1279
|
-
finally: T12.fnSig([T12.unknown], T12.promise(T12.unknown)),
|
|
1280
|
-
toString: T12.fnSig([], T12.string)
|
|
1281
|
-
},
|
|
1282
|
-
Date: {
|
|
1283
|
-
getTime: T12.fnSig([], T12.number),
|
|
1284
|
-
valueOf: T12.fnSig([], T12.number),
|
|
1285
|
-
toISOString: T12.fnSig([], T12.string),
|
|
1286
|
-
toJSON: T12.fnSig([], T12.string),
|
|
1287
|
-
toLocaleString: T12.fnSig([], T12.string),
|
|
1288
|
-
toString: T12.fnSig([], T12.string)
|
|
1657
|
+
if (target?.kind !== "object") return void 0;
|
|
1658
|
+
const props = { ...target.properties };
|
|
1659
|
+
for (const src of args.slice(1)) {
|
|
1660
|
+
if (src?.kind !== "object") return void 0;
|
|
1661
|
+
Object.assign(props, src.properties);
|
|
1662
|
+
}
|
|
1663
|
+
return T14.object(props);
|
|
1664
|
+
}),
|
|
1665
|
+
// Prototype-reflection statics. getPrototypeOf maps receivers onto the
|
|
1666
|
+
// cached prototype singletons so `getPrototypeOf(x) !== getPrototypeOf(y)`
|
|
1667
|
+
// resolves literally; create/setPrototypeOf cover the clone-style
|
|
1668
|
+
// prototype dance; getOwnPropertyDescriptor feeds descriptor.get/set
|
|
1669
|
+
// branches with the property's value type.
|
|
1670
|
+
getPrototypeOf: T14.fnSig([T14.unknown], T14.unknown, T14.never, (args) => protoOfValue(args[0])),
|
|
1671
|
+
create: T14.fnSig([T14.unknown], T14.object({}), T14.never, () => T14.object({})),
|
|
1672
|
+
setPrototypeOf: T14.fnSig([T14.unknown, T14.unknown], T14.unknown, T14.never, (args) => args[0]),
|
|
1673
|
+
defineProperty: T14.fnSig([T14.unknown, T14.unknown, T14.unknown], T14.unknown, T14.never, (args) => args[0]),
|
|
1674
|
+
getOwnPropertyDescriptor: T14.fnSig([T14.unknown, T14.unknown], T14.union(T14.object({}), T14.undefined), T14.never, (args) => {
|
|
1675
|
+
const obj = args[0];
|
|
1676
|
+
const key = args[1];
|
|
1677
|
+
if (obj?.kind !== "object" && obj?.kind !== "instance") return T14.undefined;
|
|
1678
|
+
if (!key) return T14.undefined;
|
|
1679
|
+
if (key.kind === "literal" && typeof key.value === "string") {
|
|
1680
|
+
const prop = hasOwnProp2(obj.properties, key.value) ? obj.properties[key.value] : void 0;
|
|
1681
|
+
if (!prop) return T14.undefined;
|
|
1682
|
+
return descriptorOf(prop);
|
|
1683
|
+
}
|
|
1684
|
+
if (key.kind === "primitive" && key.type === "string") {
|
|
1685
|
+
const props = Object.keys(obj.properties);
|
|
1686
|
+
if (props.length === 0) return T14.undefined;
|
|
1687
|
+
return descriptorOf(simplifyUnion7(props.map((k) => obj.properties[k])));
|
|
1688
|
+
}
|
|
1689
|
+
return T14.undefined;
|
|
1690
|
+
})
|
|
1289
1691
|
},
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1692
|
+
Buffer: {
|
|
1693
|
+
from: T14.fnSig([T14.unknown], T14.instanceOf("Buffer")),
|
|
1694
|
+
alloc: T14.fnSig([T14.number], T14.instanceOf("Buffer")),
|
|
1695
|
+
concat: T14.fnSig([T14.unknown], T14.instanceOf("Buffer")),
|
|
1696
|
+
byteLength: T14.fnSig([T14.unknown], T14.number),
|
|
1697
|
+
isEncoding: T14.fnSig([T14.unknown], T14.boolean),
|
|
1698
|
+
isBuffer: T14.fnSig([T14.unknown], T14.boolean, T14.never, (args) => {
|
|
1699
|
+
const lit3 = builtinInstanceTest(args[0], "Buffer");
|
|
1700
|
+
return lit3 === void 0 ? void 0 : T14.literal(lit3);
|
|
1701
|
+
})
|
|
1294
1702
|
},
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
indexOf: T12.fnSig([T12.string], T12.number),
|
|
1299
|
-
lastIndexOf: T12.fnSig([T12.string], T12.number),
|
|
1300
|
-
includes: T12.fnSig([T12.string], T12.boolean),
|
|
1301
|
-
startsWith: T12.fnSig([T12.string], T12.boolean),
|
|
1302
|
-
endsWith: T12.fnSig([T12.string], T12.boolean),
|
|
1303
|
-
slice: T12.fnSig([T12.number, T12.number], T12.string),
|
|
1304
|
-
substring: T12.fnSig([T12.number, T12.number], T12.string),
|
|
1305
|
-
toUpperCase: T12.fnSig([], T12.string),
|
|
1306
|
-
toLowerCase: T12.fnSig([], T12.string),
|
|
1307
|
-
trim: T12.fnSig([], T12.string),
|
|
1308
|
-
replace: T12.fnSig([T12.unknown, T12.string], T12.string),
|
|
1309
|
-
split: T12.fnSig([T12.string], T12.array(T12.string)),
|
|
1310
|
-
toString: T12.fnSig([], T12.string),
|
|
1311
|
-
valueOf: T12.fnSig([], T12.string)
|
|
1703
|
+
Array: {
|
|
1704
|
+
isArray: T14.boolean,
|
|
1705
|
+
from: T14.array(T14.unknown)
|
|
1312
1706
|
},
|
|
1313
1707
|
Number: {
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1708
|
+
isNaN: T14.boolean,
|
|
1709
|
+
isFinite: T14.boolean,
|
|
1710
|
+
parseInt: T14.number,
|
|
1711
|
+
parseFloat: T14.number,
|
|
1712
|
+
// Number 常量与 @nudo:env es 的 Number 定义对齐(env 绑定优先);
|
|
1713
|
+
// 均为 number(case 序列化器对非有限数返回 null,不产出字面量值)。
|
|
1714
|
+
MAX_SAFE_INTEGER: T14.number,
|
|
1715
|
+
MIN_SAFE_INTEGER: T14.number,
|
|
1716
|
+
MAX_VALUE: T14.number,
|
|
1717
|
+
MIN_VALUE: T14.number,
|
|
1718
|
+
POSITIVE_INFINITY: T14.number,
|
|
1719
|
+
NEGATIVE_INFINITY: T14.number,
|
|
1720
|
+
NaN: T14.number,
|
|
1721
|
+
EPSILON: T14.number
|
|
1322
1722
|
},
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1723
|
+
String: {
|
|
1724
|
+
// fromCharCode/fromCodePoint over all-number-literal args evaluate
|
|
1725
|
+
// with the real String static (hoek's escaper builds its 0x2028
|
|
1726
|
+
// separator literal this way before handing it to escapeJson); any
|
|
1727
|
+
// non-literal arg keeps only the string return type (the result is
|
|
1728
|
+
// always a string, just not a knowable one). fromCodePoint also
|
|
1729
|
+
// falls back on out-of-range literals (real RangeError → string).
|
|
1730
|
+
fromCharCode: T14.fnSig([T14.number], T14.string, T14.never, (args) => {
|
|
1731
|
+
const codes = literalCodeUnits(args);
|
|
1732
|
+
return codes === null ? T14.string : T14.literal(String.fromCharCode(...codes));
|
|
1733
|
+
}),
|
|
1734
|
+
fromCodePoint: T14.fnSig([T14.number], T14.string, T14.never, (args) => {
|
|
1735
|
+
const codes = literalCodeUnits(args);
|
|
1736
|
+
if (codes === null) return T14.string;
|
|
1737
|
+
try {
|
|
1738
|
+
return T14.literal(String.fromCodePoint(...codes));
|
|
1739
|
+
} catch {
|
|
1740
|
+
return void 0;
|
|
1741
|
+
}
|
|
1742
|
+
})
|
|
1326
1743
|
},
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1744
|
+
Promise: PROMISE_STATIC_METHODS,
|
|
1745
|
+
Symbol: { ...SYMBOL_STATIC_METHODS, ...SYMBOL_STATIC_PROPS },
|
|
1746
|
+
Reflect: REFLECT_METHODS,
|
|
1747
|
+
Intl: {
|
|
1748
|
+
DateTimeFormat: T14.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
1749
|
+
NumberFormat: T14.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
1332
1750
|
},
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1751
|
+
parseInt: T14.number,
|
|
1752
|
+
parseFloat: T14.number,
|
|
1753
|
+
isNaN: T14.boolean,
|
|
1754
|
+
isFinite: T14.boolean,
|
|
1755
|
+
// 全局数值常量:与 @nudo:env es 的 globals 对齐(env 绑定优先)。无 env
|
|
1756
|
+
// 指令时在此解析为 number——否则 Infinity/NaN 命中大写开头的未知全局
|
|
1757
|
+
// 检测,触发 nudo:unknown-global 与 nudo:builtin-unknown 诊断。
|
|
1758
|
+
Infinity: T14.number,
|
|
1759
|
+
NaN: T14.number
|
|
1336
1760
|
};
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
v._builtinName = name;
|
|
1343
|
-
_builtinClassValues.set(name, v);
|
|
1344
|
-
}
|
|
1345
|
-
return v;
|
|
1346
|
-
}
|
|
1347
|
-
function memberMayExistOn(tv, propName) {
|
|
1348
|
-
if (tv.kind === "primitive" || tv.kind === "literal") {
|
|
1349
|
-
return wrapperPrototypeMember(tv, propName) !== void 0;
|
|
1350
|
-
}
|
|
1351
|
-
if (tv.kind === "instance") {
|
|
1352
|
-
const className = tv.className;
|
|
1353
|
-
const table = hasOwnProp(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS, className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[className] : BUILTIN_ERROR_CLASSES.has(className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Error : void 0;
|
|
1354
|
-
if (table && hasOwnProp(table, propName)) return true;
|
|
1355
|
-
return true;
|
|
1356
|
-
}
|
|
1357
|
-
return false;
|
|
1358
|
-
}
|
|
1359
|
-
function wrapperPrototypeMember(obj, propName) {
|
|
1360
|
-
let className;
|
|
1361
|
-
if (obj.kind === "primitive") {
|
|
1362
|
-
className = obj.type === "bigint" ? void 0 : obj.type[0].toUpperCase() + obj.type.slice(1);
|
|
1363
|
-
} else if (obj.kind === "literal") {
|
|
1364
|
-
if (typeof obj.value === "string") className = "String";
|
|
1365
|
-
else if (typeof obj.value === "number") className = "Number";
|
|
1366
|
-
else if (typeof obj.value === "boolean") className = "Boolean";
|
|
1367
|
-
}
|
|
1368
|
-
if (!className) return void 0;
|
|
1369
|
-
if (propName === "constructor") return builtinClassValue(className);
|
|
1370
|
-
const table = BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[className];
|
|
1371
|
-
if (table && hasOwnProp(table, propName)) return table[propName];
|
|
1372
|
-
return void 0;
|
|
1373
|
-
}
|
|
1374
|
-
var BUILTIN_PROTOTYPE_SINGLETONS = /* @__PURE__ */ new Map();
|
|
1375
|
-
function builtinPrototype(className) {
|
|
1376
|
-
let proto = BUILTIN_PROTOTYPE_SINGLETONS.get(className);
|
|
1377
|
-
if (!proto) {
|
|
1378
|
-
const methods = hasOwnProp(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS, className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[className] : BUILTIN_ERROR_CLASSES.has(className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Error : {};
|
|
1379
|
-
proto = T12.instanceOf(className, { ...methods });
|
|
1380
|
-
proto._builtinProto = className;
|
|
1381
|
-
BUILTIN_PROTOTYPE_SINGLETONS.set(className, proto);
|
|
1382
|
-
}
|
|
1383
|
-
return proto;
|
|
1384
|
-
}
|
|
1385
|
-
function objectToStringBrand(v) {
|
|
1386
|
-
if (!v) return void 0;
|
|
1387
|
-
if (v.kind === "union") {
|
|
1388
|
-
const parts = v.members.map((m) => objectToStringBrand(m));
|
|
1389
|
-
if (parts.some((p) => p === void 0)) return void 0;
|
|
1390
|
-
return simplifyUnion4(parts);
|
|
1391
|
-
}
|
|
1392
|
-
let base = v;
|
|
1393
|
-
while (base.kind === "refined") base = base.base;
|
|
1394
|
-
switch (base.kind) {
|
|
1395
|
-
case "object":
|
|
1396
|
-
return T12.literal("[object Object]");
|
|
1397
|
-
case "array":
|
|
1398
|
-
case "tuple":
|
|
1399
|
-
return T12.literal("[object Array]");
|
|
1400
|
-
case "function":
|
|
1401
|
-
return T12.literal("[object Function]");
|
|
1402
|
-
case "promise":
|
|
1403
|
-
return T12.literal("[object Promise]");
|
|
1404
|
-
case "instance":
|
|
1405
|
-
return T12.literal(`[object ${base.className}]`);
|
|
1406
|
-
case "literal": {
|
|
1407
|
-
if (base.value === null) return T12.literal("[object Null]");
|
|
1408
|
-
if (base.value === void 0) return T12.literal("[object Undefined]");
|
|
1409
|
-
const t = typeof base.value;
|
|
1410
|
-
return T12.literal(`[object ${t === "number" ? "Number" : t === "string" ? "String" : "Boolean"}]`);
|
|
1411
|
-
}
|
|
1412
|
-
case "primitive": {
|
|
1413
|
-
const brands = {
|
|
1414
|
-
number: "Number",
|
|
1415
|
-
string: "String",
|
|
1416
|
-
boolean: "Boolean",
|
|
1417
|
-
bigint: "BigInt",
|
|
1418
|
-
symbol: "Symbol"
|
|
1419
|
-
};
|
|
1420
|
-
return T12.literal(`[object ${brands[base.type] ?? "Object"}]`);
|
|
1421
|
-
}
|
|
1422
|
-
default:
|
|
1423
|
-
return void 0;
|
|
1424
|
-
}
|
|
1425
|
-
}
|
|
1426
|
-
function protoOfValue(v) {
|
|
1427
|
-
if (!v) return T12.unknown;
|
|
1428
|
-
if (v.kind === "union") return simplifyUnion4(v.members.map((m) => protoOfValue(m)));
|
|
1429
|
-
let base = v;
|
|
1430
|
-
while (base.kind === "refined") base = base.base;
|
|
1431
|
-
switch (base.kind) {
|
|
1432
|
-
case "object":
|
|
1433
|
-
return builtinPrototype("Object");
|
|
1434
|
-
case "array":
|
|
1435
|
-
case "tuple":
|
|
1436
|
-
return builtinPrototype("Array");
|
|
1437
|
-
case "function":
|
|
1438
|
-
return builtinPrototype("Function");
|
|
1439
|
-
case "promise":
|
|
1440
|
-
return builtinPrototype("Promise");
|
|
1441
|
-
case "instance":
|
|
1442
|
-
return builtinPrototype(base.className);
|
|
1443
|
-
default:
|
|
1444
|
-
return T12.unknown;
|
|
1761
|
+
function literalCodeUnits(args) {
|
|
1762
|
+
const codes = [];
|
|
1763
|
+
for (const a of args) {
|
|
1764
|
+
if (a?.kind !== "literal" || typeof a.value !== "number") return null;
|
|
1765
|
+
codes.push(a.value);
|
|
1445
1766
|
}
|
|
1767
|
+
return codes;
|
|
1446
1768
|
}
|
|
1447
1769
|
function descriptorOf(prop) {
|
|
1448
|
-
return
|
|
1770
|
+
return T14.object({
|
|
1449
1771
|
value: prop,
|
|
1450
|
-
writable:
|
|
1451
|
-
enumerable:
|
|
1452
|
-
configurable:
|
|
1772
|
+
writable: T14.boolean,
|
|
1773
|
+
enumerable: T14.boolean,
|
|
1774
|
+
configurable: T14.boolean
|
|
1453
1775
|
});
|
|
1454
1776
|
}
|
|
1455
1777
|
function builtinInstanceTest(v, className) {
|
|
@@ -1473,6 +1795,55 @@ function builtinInstanceTest(v, className) {
|
|
|
1473
1795
|
return void 0;
|
|
1474
1796
|
}
|
|
1475
1797
|
}
|
|
1798
|
+
function jsonToTypeValue(v) {
|
|
1799
|
+
if (v === null) return T14.literal(null);
|
|
1800
|
+
if (typeof v === "string") return T14.literal(v);
|
|
1801
|
+
if (typeof v === "number") return T14.literal(v);
|
|
1802
|
+
if (typeof v === "boolean") return T14.literal(v);
|
|
1803
|
+
if (Array.isArray(v)) return T14.tuple(v.map(jsonToTypeValue));
|
|
1804
|
+
if (typeof v === "object") {
|
|
1805
|
+
const props = {};
|
|
1806
|
+
for (const [k, val] of Object.entries(v)) {
|
|
1807
|
+
Object.defineProperty(props, k, {
|
|
1808
|
+
value: jsonToTypeValue(val),
|
|
1809
|
+
enumerable: true,
|
|
1810
|
+
writable: true,
|
|
1811
|
+
configurable: true
|
|
1812
|
+
});
|
|
1813
|
+
}
|
|
1814
|
+
return T14.object(props);
|
|
1815
|
+
}
|
|
1816
|
+
return T14.unknown;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
// src/evaluator.ts
|
|
1820
|
+
function memberMayExistOn(tv, propName) {
|
|
1821
|
+
if (tv.kind === "primitive" || tv.kind === "literal") {
|
|
1822
|
+
return wrapperPrototypeMember(tv, propName) !== void 0;
|
|
1823
|
+
}
|
|
1824
|
+
if (tv.kind === "instance") {
|
|
1825
|
+
const className = tv.className;
|
|
1826
|
+
const table = hasOwnProp3(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS, className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[className] : BUILTIN_ERROR_CLASSES.has(className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Error : void 0;
|
|
1827
|
+
if (table && hasOwnProp3(table, propName)) return true;
|
|
1828
|
+
return true;
|
|
1829
|
+
}
|
|
1830
|
+
return false;
|
|
1831
|
+
}
|
|
1832
|
+
function wrapperPrototypeMember(obj, propName) {
|
|
1833
|
+
let className;
|
|
1834
|
+
if (obj.kind === "primitive") {
|
|
1835
|
+
className = obj.type === "bigint" ? void 0 : obj.type[0].toUpperCase() + obj.type.slice(1);
|
|
1836
|
+
} else if (obj.kind === "literal") {
|
|
1837
|
+
if (typeof obj.value === "string") className = "String";
|
|
1838
|
+
else if (typeof obj.value === "number") className = "Number";
|
|
1839
|
+
else if (typeof obj.value === "boolean") className = "Boolean";
|
|
1840
|
+
}
|
|
1841
|
+
if (!className) return void 0;
|
|
1842
|
+
if (propName === "constructor") return builtinClassValue(className);
|
|
1843
|
+
const table = BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[className];
|
|
1844
|
+
if (table && hasOwnProp3(table, propName)) return table[propName];
|
|
1845
|
+
return void 0;
|
|
1846
|
+
}
|
|
1476
1847
|
function arrayIsArrayLiteral(v) {
|
|
1477
1848
|
let base = v;
|
|
1478
1849
|
while (base.kind === "refined") base = base.base;
|
|
@@ -1522,17 +1893,24 @@ function definiteBoolean(tv) {
|
|
|
1522
1893
|
return null;
|
|
1523
1894
|
}
|
|
1524
1895
|
}
|
|
1896
|
+
function joinOrUnion(a, b) {
|
|
1897
|
+
if (a.kind === "object" && b.kind === "object") {
|
|
1898
|
+
const joined = tryAbsJoinObjects(a, b);
|
|
1899
|
+
if (joined) return joined;
|
|
1900
|
+
}
|
|
1901
|
+
return simplifyUnion8([a, b]);
|
|
1902
|
+
}
|
|
1525
1903
|
function bindObjectProtoMethod(fn, receiver) {
|
|
1526
1904
|
const sig = getFnSig(fn);
|
|
1527
1905
|
if (!sig?.impl) return fn;
|
|
1528
|
-
return
|
|
1906
|
+
return T15.fnSig(sig.paramTypes, sig.returnType, sig.throwsType, (args, thisVal) => sig.impl(args, thisVal ?? receiver));
|
|
1529
1907
|
}
|
|
1530
1908
|
function valueOfBinding(receiver) {
|
|
1531
1909
|
switch (receiver.kind) {
|
|
1532
1910
|
case "literal": {
|
|
1533
1911
|
const v = receiver.value;
|
|
1534
1912
|
if (v === null || v === void 0) {
|
|
1535
|
-
return
|
|
1913
|
+
return T15.fnSig([], T15.never, T15.instanceOf("TypeError"));
|
|
1536
1914
|
}
|
|
1537
1915
|
return bindObjectProtoMethod(OBJECT_PROTOTYPE_METHODS["valueOf"], receiver);
|
|
1538
1916
|
}
|
|
@@ -1592,7 +1970,7 @@ var _wellKnownSymbols = /* @__PURE__ */ new Map();
|
|
|
1592
1970
|
function wellKnownSymbol(name) {
|
|
1593
1971
|
let v = _wellKnownSymbols.get(name);
|
|
1594
1972
|
if (v === void 0) {
|
|
1595
|
-
v = { ...
|
|
1973
|
+
v = { ...T15.symbol, _symbolName: name };
|
|
1596
1974
|
_wellKnownSymbols.set(name, v);
|
|
1597
1975
|
}
|
|
1598
1976
|
return v;
|
|
@@ -1631,15 +2009,15 @@ function evaluateInMember(key, container) {
|
|
|
1631
2009
|
while (k.kind === "refined") k = k.base;
|
|
1632
2010
|
let c = container;
|
|
1633
2011
|
while (c.kind === "refined") c = c.base;
|
|
1634
|
-
if (c.kind === "unknown") return
|
|
2012
|
+
if (c.kind === "unknown") return T15.unknown;
|
|
1635
2013
|
const symName = wellKnownSymbolName(k);
|
|
1636
2014
|
if (symName !== void 0) {
|
|
1637
2015
|
if (symName === "iterator") {
|
|
1638
2016
|
const iter = iteratorInReceiver(c);
|
|
1639
|
-
return iter === void 0 ?
|
|
2017
|
+
return iter === void 0 ? T15.boolean : T15.literal(iter);
|
|
1640
2018
|
}
|
|
1641
|
-
if (c.kind === "instance" && !BUILTIN_PROTOTYPE_CLASSES.has(c.className)) return
|
|
1642
|
-
return
|
|
2019
|
+
if (c.kind === "instance" && !BUILTIN_PROTOTYPE_CLASSES.has(c.className)) return T15.boolean;
|
|
2020
|
+
return T15.literal(false);
|
|
1643
2021
|
}
|
|
1644
2022
|
const strKey = k.kind === "literal" && typeof k.value === "string" ? k.value : void 0;
|
|
1645
2023
|
if (strKey === void 0) {
|
|
@@ -1650,54 +2028,54 @@ function evaluateInMember(key, container) {
|
|
|
1650
2028
|
case "function":
|
|
1651
2029
|
case "array":
|
|
1652
2030
|
case "tuple":
|
|
1653
|
-
return
|
|
2031
|
+
return T15.boolean;
|
|
1654
2032
|
case "literal":
|
|
1655
2033
|
case "primitive":
|
|
1656
|
-
return
|
|
2034
|
+
return T15.literal(false);
|
|
1657
2035
|
default:
|
|
1658
|
-
return
|
|
2036
|
+
return T15.unknown;
|
|
1659
2037
|
}
|
|
1660
2038
|
}
|
|
1661
2039
|
const isArrayIndex = (s) => /^\d+$/.test(s);
|
|
1662
2040
|
switch (c.kind) {
|
|
1663
2041
|
case "object":
|
|
1664
|
-
return
|
|
2042
|
+
return T15.literal(hasOwnProp3(c.properties, strKey) || hasOwnProp3(OBJECT_PROTOTYPE_METHODS, strKey));
|
|
1665
2043
|
case "tuple":
|
|
1666
|
-
if (strKey === "length") return
|
|
1667
|
-
if (isArrayIndex(strKey)) return
|
|
1668
|
-
return
|
|
1669
|
-
|
|
2044
|
+
if (strKey === "length") return T15.literal(true);
|
|
2045
|
+
if (isArrayIndex(strKey)) return T15.literal(Number(strKey) < c.elements.length);
|
|
2046
|
+
return T15.literal(
|
|
2047
|
+
hasOwnProp3(OBJECT_PROTOTYPE_METHODS, strKey) || hasOwnProp3(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Array, strKey)
|
|
1670
2048
|
);
|
|
1671
2049
|
case "array":
|
|
1672
|
-
return
|
|
1673
|
-
strKey === "length" || isArrayIndex(strKey) ||
|
|
2050
|
+
return T15.literal(
|
|
2051
|
+
strKey === "length" || isArrayIndex(strKey) || hasOwnProp3(OBJECT_PROTOTYPE_METHODS, strKey) || hasOwnProp3(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Array, strKey)
|
|
1674
2052
|
);
|
|
1675
2053
|
case "instance": {
|
|
1676
|
-
if (
|
|
1677
|
-
if (
|
|
1678
|
-
const approx =
|
|
1679
|
-
if (approx &&
|
|
1680
|
-
if ((c.className === "Set" || c.className === "Map") && strKey === "size") return
|
|
1681
|
-
return
|
|
2054
|
+
if (hasOwnProp3(c.properties, strKey)) return T15.literal(true);
|
|
2055
|
+
if (hasOwnProp3(OBJECT_PROTOTYPE_METHODS, strKey)) return T15.literal(true);
|
|
2056
|
+
const approx = hasOwnProp3(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS, c.className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[c.className] : void 0;
|
|
2057
|
+
if (approx && hasOwnProp3(approx, strKey)) return T15.literal(true);
|
|
2058
|
+
if ((c.className === "Set" || c.className === "Map") && strKey === "size") return T15.literal(true);
|
|
2059
|
+
return T15.literal(false);
|
|
1682
2060
|
}
|
|
1683
2061
|
case "function":
|
|
1684
|
-
return
|
|
2062
|
+
return T15.literal(
|
|
1685
2063
|
strKey === "prototype" || strKey === "name" || strKey === "length" || strKey === "call" || strKey === "apply" || strKey === "bind" || strKey === "toString"
|
|
1686
2064
|
);
|
|
1687
2065
|
case "promise":
|
|
1688
|
-
return
|
|
1689
|
-
strKey === "then" || strKey === "catch" || strKey === "finally" ||
|
|
2066
|
+
return T15.literal(
|
|
2067
|
+
strKey === "then" || strKey === "catch" || strKey === "finally" || hasOwnProp3(OBJECT_PROTOTYPE_METHODS, strKey)
|
|
1690
2068
|
);
|
|
1691
2069
|
case "literal":
|
|
1692
2070
|
if (typeof c.value === "string") {
|
|
1693
|
-
return
|
|
2071
|
+
return T15.literal(strKey === "length" || isArrayIndex(strKey) && Number(strKey) < c.value.length);
|
|
1694
2072
|
}
|
|
1695
|
-
return
|
|
2073
|
+
return T15.literal(false);
|
|
1696
2074
|
case "primitive":
|
|
1697
|
-
if (c.type === "string") return
|
|
1698
|
-
return
|
|
2075
|
+
if (c.type === "string") return T15.literal(strKey === "length" || isArrayIndex(strKey));
|
|
2076
|
+
return T15.literal(false);
|
|
1699
2077
|
default:
|
|
1700
|
-
return
|
|
2078
|
+
return T15.boolean;
|
|
1701
2079
|
}
|
|
1702
2080
|
}
|
|
1703
2081
|
var _currentSource = "";
|
|
@@ -1746,10 +2124,10 @@ function isThrow(v) {
|
|
|
1746
2124
|
}
|
|
1747
2125
|
var LOOP_SIGNAL_KIND = Symbol("LoopSignalKind");
|
|
1748
2126
|
function makeBreak() {
|
|
1749
|
-
return { [THROW_SIGNAL]: true, [LOOP_SIGNAL_KIND]: "break", thrown:
|
|
2127
|
+
return { [THROW_SIGNAL]: true, [LOOP_SIGNAL_KIND]: "break", thrown: T15.never };
|
|
1750
2128
|
}
|
|
1751
2129
|
function makeContinue() {
|
|
1752
|
-
return { [THROW_SIGNAL]: true, [LOOP_SIGNAL_KIND]: "continue", thrown:
|
|
2130
|
+
return { [THROW_SIGNAL]: true, [LOOP_SIGNAL_KIND]: "continue", thrown: T15.never };
|
|
1753
2131
|
}
|
|
1754
2132
|
function loopSignalKind(v) {
|
|
1755
2133
|
if (typeof v !== "object" || v === null) return null;
|
|
@@ -1871,17 +2249,17 @@ function tagModuleExports(env, filePath) {
|
|
|
1871
2249
|
tagExport(v, filePath, name);
|
|
1872
2250
|
}
|
|
1873
2251
|
}
|
|
1874
|
-
var _cjsRequireValue =
|
|
2252
|
+
var _cjsRequireValue = T15.fn(["specifier"], { type: "BlockStatement", body: [] }, void 0);
|
|
1875
2253
|
function bindCommonJsGlobals(env) {
|
|
1876
2254
|
if (env.has("module")) return;
|
|
1877
|
-
const exportsObj =
|
|
2255
|
+
const exportsObj = T15.object({});
|
|
1878
2256
|
exportsObj.__cjsExportsRoot = true;
|
|
1879
|
-
const moduleObj =
|
|
2257
|
+
const moduleObj = T15.object({ exports: exportsObj });
|
|
1880
2258
|
env.bind("exports", exportsObj);
|
|
1881
2259
|
env.bind("module", moduleObj);
|
|
1882
2260
|
env.bind("require", _cjsRequireValue);
|
|
1883
|
-
env.bind("__dirname",
|
|
1884
|
-
env.bind("__filename",
|
|
2261
|
+
env.bind("__dirname", T15.string);
|
|
2262
|
+
env.bind("__filename", T15.string);
|
|
1885
2263
|
}
|
|
1886
2264
|
function tagCommonJsExports(env, filePath) {
|
|
1887
2265
|
if (!env.has("module")) return;
|
|
@@ -1932,6 +2310,11 @@ var _provenanceEnabled = false;
|
|
|
1932
2310
|
function setProvenanceTracking(enabled) {
|
|
1933
2311
|
_provenanceEnabled = enabled;
|
|
1934
2312
|
}
|
|
2313
|
+
function copyOrigin(from, to) {
|
|
2314
|
+
if (!_provenanceEnabled || !from || !to) return;
|
|
2315
|
+
const o = _originMap.get(from);
|
|
2316
|
+
if (o) _originMap.set(to, o);
|
|
2317
|
+
}
|
|
1935
2318
|
function extractOrigin(tv) {
|
|
1936
2319
|
if (!_provenanceEnabled || !tv) return void 0;
|
|
1937
2320
|
const direct = _originMap.get(tv);
|
|
@@ -1949,7 +2332,7 @@ function extractOrigin(tv) {
|
|
|
1949
2332
|
}
|
|
1950
2333
|
return void 0;
|
|
1951
2334
|
}
|
|
1952
|
-
function
|
|
2335
|
+
function hasOwnProp3(props, name) {
|
|
1953
2336
|
return Object.prototype.hasOwnProperty.call(props, name);
|
|
1954
2337
|
}
|
|
1955
2338
|
function recordUnknown(r) {
|
|
@@ -1964,7 +2347,7 @@ function recordUnknown(r) {
|
|
|
1964
2347
|
}
|
|
1965
2348
|
function distributeOverUnion(tv, fn) {
|
|
1966
2349
|
if (tv.kind === "union") {
|
|
1967
|
-
return
|
|
2350
|
+
return simplifyUnion8(tv.members.map(fn));
|
|
1968
2351
|
}
|
|
1969
2352
|
return fn(tv);
|
|
1970
2353
|
}
|
|
@@ -2020,19 +2403,19 @@ function keySetStructureKey(tv) {
|
|
|
2020
2403
|
}
|
|
2021
2404
|
function objectKeySetAccess(obj) {
|
|
2022
2405
|
const keys = Object.keys(obj.properties);
|
|
2023
|
-
if (keys.length === 0) return
|
|
2024
|
-
if (keys.length > MAX_KEYSET_PROPS) return
|
|
2406
|
+
if (keys.length === 0) return T15.undefined;
|
|
2407
|
+
if (keys.length > MAX_KEYSET_PROPS) return T15.unknown;
|
|
2025
2408
|
const values = keys.map((k) => obj.properties[k]);
|
|
2026
|
-
if (values.every((v) => v.kind === "unknown")) return
|
|
2409
|
+
if (values.every((v) => v.kind === "unknown")) return T15.unknown;
|
|
2027
2410
|
const firstKey = keySetStructureKey(values[0]);
|
|
2028
2411
|
if (values.every((v) => keySetStructureKey(v) === firstKey)) {
|
|
2029
2412
|
return values[0];
|
|
2030
2413
|
}
|
|
2031
2414
|
if (values.every((v) => v.kind === "function") && values.length > MAX_KEYSET_TABLE_FNS) {
|
|
2032
|
-
return
|
|
2415
|
+
return T15.unknown;
|
|
2033
2416
|
}
|
|
2034
|
-
const union =
|
|
2035
|
-
if (union.kind === "union" && union.members.length > MAX_KEYSET_MEMBERS) return
|
|
2417
|
+
const union = simplifyUnion8(values);
|
|
2418
|
+
if (union.kind === "union" && union.members.length > MAX_KEYSET_MEMBERS) return T15.unknown;
|
|
2036
2419
|
return union;
|
|
2037
2420
|
}
|
|
2038
2421
|
function isDynamicStringKey(propVal) {
|
|
@@ -2055,13 +2438,13 @@ function unionOfLiteralKind(tv, pred) {
|
|
|
2055
2438
|
function computedMemberOnMember(obj, propVal, markMiss) {
|
|
2056
2439
|
if (obj.kind === "object") {
|
|
2057
2440
|
if (propVal.kind === "literal" && typeof propVal.value === "string") {
|
|
2058
|
-
return (
|
|
2441
|
+
return (hasOwnProp3(obj.properties, propVal.value) ? obj.properties[propVal.value] : void 0) ?? T15.undefined;
|
|
2059
2442
|
}
|
|
2060
2443
|
if (unionOfLiteralKind(propVal, (v) => typeof v === "string")) {
|
|
2061
|
-
return
|
|
2444
|
+
return simplifyUnion8(
|
|
2062
2445
|
propVal.members.map(
|
|
2063
2446
|
(m) => m.value
|
|
2064
|
-
).map((k) => (
|
|
2447
|
+
).map((k) => (hasOwnProp3(obj.properties, k) ? obj.properties[k] : void 0) ?? T15.undefined)
|
|
2065
2448
|
);
|
|
2066
2449
|
}
|
|
2067
2450
|
if (isDynamicStringKey(propVal)) {
|
|
@@ -2070,40 +2453,40 @@ function computedMemberOnMember(obj, propVal, markMiss) {
|
|
|
2070
2453
|
if (propVal.kind === "literal" && typeof propVal.value === "string") {
|
|
2071
2454
|
markMiss();
|
|
2072
2455
|
}
|
|
2073
|
-
return
|
|
2456
|
+
return T15.unknown;
|
|
2074
2457
|
}
|
|
2075
2458
|
if (obj.kind === "array" || obj.kind === "tuple") {
|
|
2076
2459
|
if (propVal.kind === "literal" && typeof propVal.value === "number") {
|
|
2077
|
-
if (obj.kind === "tuple") return obj.elements[propVal.value] ??
|
|
2460
|
+
if (obj.kind === "tuple") return obj.elements[propVal.value] ?? T15.undefined;
|
|
2078
2461
|
return obj.element;
|
|
2079
2462
|
}
|
|
2080
2463
|
if (propVal.kind === "literal" && typeof propVal.value === "string") {
|
|
2081
|
-
return
|
|
2464
|
+
return T15.undefined;
|
|
2082
2465
|
}
|
|
2083
2466
|
if (unionOfLiteralKind(propVal, (v) => typeof v === "number")) {
|
|
2084
2467
|
const indices = propVal.members.map(
|
|
2085
2468
|
(m) => m.value
|
|
2086
2469
|
);
|
|
2087
2470
|
if (obj.kind === "tuple") {
|
|
2088
|
-
return
|
|
2471
|
+
return simplifyUnion8(indices.map((i) => obj.elements[i] ?? T15.undefined));
|
|
2089
2472
|
}
|
|
2090
2473
|
return obj.element;
|
|
2091
2474
|
}
|
|
2092
2475
|
if (isDynamicNumberKey(propVal)) {
|
|
2093
2476
|
if (obj.kind === "tuple") {
|
|
2094
|
-
return obj.elements.length > 0 ?
|
|
2477
|
+
return obj.elements.length > 0 ? simplifyUnion8(obj.elements) : T15.undefined;
|
|
2095
2478
|
}
|
|
2096
2479
|
return obj.element;
|
|
2097
2480
|
}
|
|
2098
|
-
return
|
|
2481
|
+
return T15.unknown;
|
|
2099
2482
|
}
|
|
2100
2483
|
if (obj.kind === "instance" && isDynamicStringKey(propVal)) {
|
|
2101
|
-
return
|
|
2484
|
+
return T15.undefined;
|
|
2102
2485
|
}
|
|
2103
2486
|
if (propVal.kind === "literal" && typeof propVal.value === "string") {
|
|
2104
2487
|
markMiss();
|
|
2105
2488
|
}
|
|
2106
|
-
return
|
|
2489
|
+
return T15.unknown;
|
|
2107
2490
|
}
|
|
2108
2491
|
function evaluateComputedMemberAccess(objVal, propVal, node) {
|
|
2109
2492
|
let propMissed = false;
|
|
@@ -2124,24 +2507,6 @@ function evaluateComputedMemberAccess(objVal, propVal, node) {
|
|
|
2124
2507
|
}
|
|
2125
2508
|
return result;
|
|
2126
2509
|
}
|
|
2127
|
-
var MAX_UNION_PRODUCT = 50;
|
|
2128
|
-
function distributeBinaryOverUnion(left, right, fn) {
|
|
2129
|
-
if (left.kind === "union" && right.kind === "union") {
|
|
2130
|
-
if (left.members.length * right.members.length > MAX_UNION_PRODUCT) {
|
|
2131
|
-
return T12.unknown;
|
|
2132
|
-
}
|
|
2133
|
-
return simplifyUnion4(
|
|
2134
|
-
left.members.flatMap((l) => right.members.map((r) => fn(l, r)))
|
|
2135
|
-
);
|
|
2136
|
-
}
|
|
2137
|
-
if (left.kind === "union") {
|
|
2138
|
-
return simplifyUnion4(left.members.map((l) => fn(l, right)));
|
|
2139
|
-
}
|
|
2140
|
-
if (right.kind === "union") {
|
|
2141
|
-
return simplifyUnion4(right.members.map((r) => fn(left, r)));
|
|
2142
|
-
}
|
|
2143
|
-
return fn(left, right);
|
|
2144
|
-
}
|
|
2145
2510
|
var _unreachableRanges = [];
|
|
2146
2511
|
function collectUnreachable(stmts, fromIndex) {
|
|
2147
2512
|
for (let j = fromIndex; j < stmts.length; j++) {
|
|
@@ -2157,7 +2522,7 @@ function collectUnreachable(stmts, fromIndex) {
|
|
|
2157
2522
|
function evaluateStatements(stmts, env) {
|
|
2158
2523
|
const returnValues = [];
|
|
2159
2524
|
let currentEnv = env;
|
|
2160
|
-
let lastValue =
|
|
2525
|
+
let lastValue = T15.undefined;
|
|
2161
2526
|
for (let i = 0; i < stmts.length; i++) {
|
|
2162
2527
|
const stmt = stmts[i];
|
|
2163
2528
|
const inlineDirectives = extractInlineDirectives(stmt);
|
|
@@ -2177,7 +2542,7 @@ function evaluateStatements(stmts, env) {
|
|
|
2177
2542
|
if (isReturn(result)) {
|
|
2178
2543
|
returnValues.push(result.value);
|
|
2179
2544
|
collectUnreachable(stmts, i + 1);
|
|
2180
|
-
return makeReturn(
|
|
2545
|
+
return makeReturn(simplifyUnion8(returnValues));
|
|
2181
2546
|
}
|
|
2182
2547
|
if (isBranch(result)) {
|
|
2183
2548
|
returnValues.push(result.returnedValue);
|
|
@@ -2187,7 +2552,7 @@ function evaluateStatements(stmts, env) {
|
|
|
2187
2552
|
lastValue = result;
|
|
2188
2553
|
}
|
|
2189
2554
|
if (returnValues.length > 0) {
|
|
2190
|
-
return makeBranch(
|
|
2555
|
+
return makeBranch(simplifyUnion8(returnValues), currentEnv);
|
|
2191
2556
|
}
|
|
2192
2557
|
return lastValue;
|
|
2193
2558
|
}
|
|
@@ -2229,18 +2594,18 @@ function evaluateNode(node, env) {
|
|
|
2229
2594
|
if (_activeAsOverride) return _activeAsOverride;
|
|
2230
2595
|
return evaluate(node.expression, env);
|
|
2231
2596
|
case "NumericLiteral":
|
|
2232
|
-
return
|
|
2597
|
+
return T15.literal(node.value);
|
|
2233
2598
|
case "StringLiteral":
|
|
2234
|
-
return
|
|
2599
|
+
return T15.literal(node.value);
|
|
2235
2600
|
case "BooleanLiteral":
|
|
2236
|
-
return
|
|
2601
|
+
return T15.literal(node.value);
|
|
2237
2602
|
case "NullLiteral":
|
|
2238
|
-
return
|
|
2603
|
+
return T15.null;
|
|
2239
2604
|
case "RegExpLiteral":
|
|
2240
2605
|
return createRegExpType();
|
|
2241
2606
|
case "Identifier": {
|
|
2242
|
-
if (node.name === "undefined") return
|
|
2243
|
-
if (
|
|
2607
|
+
if (node.name === "undefined") return T15.undefined;
|
|
2608
|
+
if (hasOwnProp3(BUILTIN_STATIC_METHODS, node.name) && !env.has(node.name)) {
|
|
2244
2609
|
const builtin = BUILTIN_STATIC_METHODS[node.name];
|
|
2245
2610
|
if (typeof builtin === "object" && builtin !== null && !("kind" in builtin)) {
|
|
2246
2611
|
return builtinClassValue(node.name);
|
|
@@ -2260,9 +2625,9 @@ function evaluateNode(node, env) {
|
|
|
2260
2625
|
loc: node.loc,
|
|
2261
2626
|
reason: `unknown global identifier '${node.name}'`
|
|
2262
2627
|
});
|
|
2263
|
-
return
|
|
2628
|
+
return T15.unknown;
|
|
2264
2629
|
}
|
|
2265
|
-
if (!env.has(node.name) &&
|
|
2630
|
+
if (!env.has(node.name) && hasOwnProp3(OBJECT_PROTOTYPE_METHODS, node.name)) {
|
|
2266
2631
|
return OBJECT_PROTOTYPE_METHODS[node.name];
|
|
2267
2632
|
}
|
|
2268
2633
|
return env.lookup(node.name);
|
|
@@ -2270,19 +2635,19 @@ function evaluateNode(node, env) {
|
|
|
2270
2635
|
case "ThisExpression": {
|
|
2271
2636
|
const thisVal = env.lookup("this");
|
|
2272
2637
|
if (thisVal === void 0 || thisVal.kind === "literal" && thisVal.value === void 0) {
|
|
2273
|
-
return
|
|
2638
|
+
return T15.unknown;
|
|
2274
2639
|
}
|
|
2275
2640
|
return thisVal;
|
|
2276
2641
|
}
|
|
2277
2642
|
case "TemplateLiteral": {
|
|
2278
2643
|
if (node.expressions.length === 0 && node.quasis.length === 1) {
|
|
2279
|
-
return
|
|
2644
|
+
return T15.literal(node.quasis[0].value.cooked ?? node.quasis[0].value.raw);
|
|
2280
2645
|
}
|
|
2281
2646
|
const parts = [];
|
|
2282
2647
|
for (let i = 0; i < node.quasis.length; i++) {
|
|
2283
2648
|
const quasi = node.quasis[i];
|
|
2284
2649
|
const raw = quasi.value.cooked ?? quasi.value.raw;
|
|
2285
|
-
if (raw) parts.push(
|
|
2650
|
+
if (raw) parts.push(T15.literal(raw));
|
|
2286
2651
|
if (i < node.expressions.length) {
|
|
2287
2652
|
const exprVal = evaluate(node.expressions[i], env);
|
|
2288
2653
|
if (isReturn(exprVal) || isBranch(exprVal) || isThrow(exprVal)) return exprVal;
|
|
@@ -2293,7 +2658,7 @@ function evaluateNode(node, env) {
|
|
|
2293
2658
|
(p) => p.kind === "literal" && (typeof p.value === "string" || typeof p.value === "number")
|
|
2294
2659
|
);
|
|
2295
2660
|
if (allLiteral) {
|
|
2296
|
-
return
|
|
2661
|
+
return T15.literal(
|
|
2297
2662
|
parts.map((p) => p.kind === "literal" ? String(p.value) : "").join("")
|
|
2298
2663
|
);
|
|
2299
2664
|
}
|
|
@@ -2313,45 +2678,30 @@ function evaluateNode(node, env) {
|
|
|
2313
2678
|
if (node.operator === "===" || node.operator === "!==") {
|
|
2314
2679
|
const identity = builtinProtoIdentityEq(leftVal, rightVal);
|
|
2315
2680
|
if (identity !== null) {
|
|
2316
|
-
return
|
|
2681
|
+
return T15.literal(node.operator === "===" ? identity : !identity);
|
|
2317
2682
|
}
|
|
2318
2683
|
const classIdentity = builtinClassIdentityEq(leftVal, rightVal);
|
|
2319
2684
|
if (classIdentity !== null) {
|
|
2320
|
-
return
|
|
2685
|
+
return T15.literal(node.operator === "===" ? classIdentity : !classIdentity);
|
|
2321
2686
|
}
|
|
2322
2687
|
}
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
const lv = looseLiteralValue(l);
|
|
2327
|
-
const rv = looseLiteralValue(r);
|
|
2328
|
-
if (lv.hit && rv.hit) return T12.literal(eq ? lv.v == rv.v : lv.v != rv.v);
|
|
2329
|
-
return T12.boolean;
|
|
2330
|
-
});
|
|
2331
|
-
}
|
|
2332
|
-
return distributeBinaryOverUnion(
|
|
2333
|
-
leftVal,
|
|
2334
|
-
rightVal,
|
|
2335
|
-
(l, r) => dispatchBinaryOp(node.operator, l, r)
|
|
2336
|
-
);
|
|
2688
|
+
const bin = evalBinaryValue(node.operator, leftVal, rightVal);
|
|
2689
|
+
if (bin !== void 0) return bin;
|
|
2690
|
+
return T15.unknown;
|
|
2337
2691
|
}
|
|
2338
2692
|
case "UnaryExpression": {
|
|
2339
2693
|
const argVal = evaluate(node.argument, env);
|
|
2340
2694
|
if (isReturn(argVal) || isBranch(argVal) || isThrow(argVal)) return argVal;
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
}
|
|
2695
|
+
const unary = tryAbsUnary(node.operator, argVal);
|
|
2696
|
+
if (unary !== void 0) return unary;
|
|
2344
2697
|
if (node.operator === "!") {
|
|
2345
2698
|
return distributeOverUnion(argVal, (v) => {
|
|
2346
2699
|
const decided = definiteBoolean(v);
|
|
2347
|
-
if (decided !== null) return
|
|
2700
|
+
if (decided !== null) return T15.literal(!decided);
|
|
2348
2701
|
return Ops.not(v);
|
|
2349
2702
|
});
|
|
2350
2703
|
}
|
|
2351
|
-
|
|
2352
|
-
return distributeOverUnion(argVal, (v) => Ops.neg(v));
|
|
2353
|
-
}
|
|
2354
|
-
return T12.unknown;
|
|
2704
|
+
return T15.unknown;
|
|
2355
2705
|
}
|
|
2356
2706
|
case "LogicalExpression": {
|
|
2357
2707
|
const leftVal = evaluate(node.left, env);
|
|
@@ -2369,8 +2719,8 @@ function evaluateNode(node, env) {
|
|
|
2369
2719
|
}
|
|
2370
2720
|
if (leftTruthy === false) return leftVal;
|
|
2371
2721
|
const rv = evaluate(node.right, env);
|
|
2372
|
-
const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ?
|
|
2373
|
-
return
|
|
2722
|
+
const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ? T15.unknown : rv;
|
|
2723
|
+
return simplifyUnion8([leftVal, rightTV]);
|
|
2374
2724
|
}
|
|
2375
2725
|
if (node.operator === "||") {
|
|
2376
2726
|
if (leftVal.kind === "literal" && leftVal.value) return leftVal;
|
|
@@ -2385,8 +2735,8 @@ function evaluateNode(node, env) {
|
|
|
2385
2735
|
return isReturn(rv2) || isBranch(rv2) || isThrow(rv2) ? rv2 : rv2;
|
|
2386
2736
|
}
|
|
2387
2737
|
const rv = evaluate(node.right, env);
|
|
2388
|
-
const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ?
|
|
2389
|
-
return
|
|
2738
|
+
const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ? T15.unknown : rv;
|
|
2739
|
+
return simplifyUnion8([leftVal, rightTV]);
|
|
2390
2740
|
}
|
|
2391
2741
|
if (node.operator === "??") {
|
|
2392
2742
|
if (leftVal.kind === "literal" && leftVal.value !== null && leftVal.value !== void 0) {
|
|
@@ -2404,10 +2754,10 @@ function evaluateNode(node, env) {
|
|
|
2404
2754
|
return narrowedLeft;
|
|
2405
2755
|
}
|
|
2406
2756
|
const rv = evaluate(node.right, env);
|
|
2407
|
-
const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ?
|
|
2757
|
+
const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ? T15.unknown : rv;
|
|
2408
2758
|
return rightTV;
|
|
2409
2759
|
}
|
|
2410
|
-
return
|
|
2760
|
+
return T15.unknown;
|
|
2411
2761
|
}
|
|
2412
2762
|
case "ConditionalExpression": {
|
|
2413
2763
|
const test = node.test;
|
|
@@ -2423,15 +2773,16 @@ function evaluateNode(node, env) {
|
|
|
2423
2773
|
}
|
|
2424
2774
|
const cResult = evaluate(node.consequent, trueEnv);
|
|
2425
2775
|
const aResult = evaluate(node.alternate, falseEnv);
|
|
2426
|
-
const cVal = isReturn(cResult) ? cResult.value : isBranch(cResult) ? cResult.returnedValue : isThrow(cResult) ?
|
|
2427
|
-
const aVal = isReturn(aResult) ? aResult.value : isBranch(aResult) ? aResult.returnedValue : isThrow(aResult) ?
|
|
2428
|
-
return
|
|
2776
|
+
const cVal = isReturn(cResult) ? cResult.value : isBranch(cResult) ? cResult.returnedValue : isThrow(cResult) ? T15.never : cResult;
|
|
2777
|
+
const aVal = isReturn(aResult) ? aResult.value : isBranch(aResult) ? aResult.returnedValue : isThrow(aResult) ? T15.never : aResult;
|
|
2778
|
+
return joinOrUnion(cVal, aVal);
|
|
2429
2779
|
}
|
|
2430
2780
|
case "IfStatement": {
|
|
2431
2781
|
const test = node.test;
|
|
2432
2782
|
const [trueEnv, falseEnv] = narrow(test, env);
|
|
2433
2783
|
const testVal = evaluate(test, env);
|
|
2434
2784
|
if (isReturn(testVal) || isBranch(testVal) || isThrow(testVal)) return testVal;
|
|
2785
|
+
const phis = phiFromTest(test);
|
|
2435
2786
|
if (testVal.kind === "literal") {
|
|
2436
2787
|
if (testVal.value) {
|
|
2437
2788
|
if (node.alternate?.loc) {
|
|
@@ -2440,7 +2791,12 @@ function evaluateNode(node, env) {
|
|
|
2440
2791
|
end: { line: node.alternate.loc.end.line, column: node.alternate.loc.end.column }
|
|
2441
2792
|
});
|
|
2442
2793
|
}
|
|
2443
|
-
|
|
2794
|
+
pushPhi(combinePhi(currentPhi(), phis.whenTrue));
|
|
2795
|
+
try {
|
|
2796
|
+
return evaluate(node.consequent, trueEnv);
|
|
2797
|
+
} finally {
|
|
2798
|
+
popPhi();
|
|
2799
|
+
}
|
|
2444
2800
|
}
|
|
2445
2801
|
if (node.consequent.loc) {
|
|
2446
2802
|
_unreachableRanges.push({
|
|
@@ -2448,17 +2804,46 @@ function evaluateNode(node, env) {
|
|
|
2448
2804
|
end: { line: node.consequent.loc.end.line, column: node.consequent.loc.end.column }
|
|
2449
2805
|
});
|
|
2450
2806
|
}
|
|
2451
|
-
|
|
2807
|
+
if (!node.alternate) return T15.undefined;
|
|
2808
|
+
pushPhi(combinePhi(currentPhi(), phis.whenFalse));
|
|
2809
|
+
try {
|
|
2810
|
+
return evaluate(node.alternate, falseEnv);
|
|
2811
|
+
} finally {
|
|
2812
|
+
popPhi();
|
|
2813
|
+
}
|
|
2452
2814
|
}
|
|
2453
2815
|
const decided = definiteBoolean(testVal);
|
|
2454
2816
|
if (decided !== null) {
|
|
2455
2817
|
if (decided) {
|
|
2456
|
-
|
|
2818
|
+
pushPhi(combinePhi(currentPhi(), phis.whenTrue));
|
|
2819
|
+
try {
|
|
2820
|
+
return evaluate(node.consequent, trueEnv);
|
|
2821
|
+
} finally {
|
|
2822
|
+
popPhi();
|
|
2823
|
+
}
|
|
2457
2824
|
}
|
|
2458
|
-
|
|
2825
|
+
if (!node.alternate) return T15.undefined;
|
|
2826
|
+
pushPhi(combinePhi(currentPhi(), phis.whenFalse));
|
|
2827
|
+
try {
|
|
2828
|
+
return evaluate(node.alternate, falseEnv);
|
|
2829
|
+
} finally {
|
|
2830
|
+
popPhi();
|
|
2831
|
+
}
|
|
2832
|
+
}
|
|
2833
|
+
pushPhi(combinePhi(currentPhi(), phis.whenTrue));
|
|
2834
|
+
let consequentResult;
|
|
2835
|
+
try {
|
|
2836
|
+
consequentResult = evaluate(node.consequent, trueEnv);
|
|
2837
|
+
} finally {
|
|
2838
|
+
popPhi();
|
|
2839
|
+
}
|
|
2840
|
+
pushPhi(combinePhi(currentPhi(), phis.whenFalse));
|
|
2841
|
+
let alternateResult = null;
|
|
2842
|
+
try {
|
|
2843
|
+
alternateResult = node.alternate ? evaluate(node.alternate, falseEnv) : null;
|
|
2844
|
+
} finally {
|
|
2845
|
+
popPhi();
|
|
2459
2846
|
}
|
|
2460
|
-
const consequentResult = evaluate(node.consequent, trueEnv);
|
|
2461
|
-
const alternateResult = node.alternate ? evaluate(node.alternate, falseEnv) : null;
|
|
2462
2847
|
const cReturns = isReturn(consequentResult);
|
|
2463
2848
|
const cBranches = isBranch(consequentResult);
|
|
2464
2849
|
const cThrows = isThrow(consequentResult);
|
|
@@ -2469,7 +2854,7 @@ function evaluateNode(node, env) {
|
|
|
2469
2854
|
return consequentResult;
|
|
2470
2855
|
}
|
|
2471
2856
|
if (cThrows && !node.alternate) {
|
|
2472
|
-
return makeBranch(
|
|
2857
|
+
return makeBranch(T15.never, falseEnv);
|
|
2473
2858
|
}
|
|
2474
2859
|
if (cThrows) {
|
|
2475
2860
|
const aVal2 = aReturns ? alternateResult.value : aBranches ? alternateResult.returnedValue : alternateResult;
|
|
@@ -2482,14 +2867,14 @@ function evaluateNode(node, env) {
|
|
|
2482
2867
|
const cVal = cReturns ? consequentResult.value : cBranches ? consequentResult.returnedValue : consequentResult;
|
|
2483
2868
|
const aVal = aReturns ? alternateResult.value : aBranches ? alternateResult.returnedValue : alternateResult;
|
|
2484
2869
|
if (cReturns && aReturns) {
|
|
2485
|
-
return makeReturn(
|
|
2870
|
+
return makeReturn(joinOrUnion(cVal, aVal));
|
|
2486
2871
|
}
|
|
2487
2872
|
if (cReturns && !node.alternate) {
|
|
2488
2873
|
return makeBranch(cVal, falseEnv);
|
|
2489
2874
|
}
|
|
2490
2875
|
if (cReturns && node.alternate) {
|
|
2491
2876
|
if (aReturns) {
|
|
2492
|
-
return makeReturn(
|
|
2877
|
+
return makeReturn(joinOrUnion(cVal, aVal));
|
|
2493
2878
|
}
|
|
2494
2879
|
return makeBranch(cVal, falseEnv);
|
|
2495
2880
|
}
|
|
@@ -2498,8 +2883,8 @@ function evaluateNode(node, env) {
|
|
|
2498
2883
|
}
|
|
2499
2884
|
const allVals = [cVal];
|
|
2500
2885
|
if (aVal !== null) allVals.push(aVal);
|
|
2501
|
-
else allVals.push(
|
|
2502
|
-
return
|
|
2886
|
+
else allVals.push(T15.undefined);
|
|
2887
|
+
return simplifyUnion8(allVals);
|
|
2503
2888
|
}
|
|
2504
2889
|
case "BlockStatement": {
|
|
2505
2890
|
const blockEnv = env.fork();
|
|
@@ -2509,14 +2894,14 @@ function evaluateNode(node, env) {
|
|
|
2509
2894
|
case "ReturnStatement": {
|
|
2510
2895
|
if (_activeAsOverride) return makeReturn(_activeAsOverride);
|
|
2511
2896
|
const arg = node.argument;
|
|
2512
|
-
if (!arg) return makeReturn(
|
|
2897
|
+
if (!arg) return makeReturn(T15.undefined);
|
|
2513
2898
|
const val = evaluate(arg, env);
|
|
2514
2899
|
if (isReturn(val) || isBranch(val) || isThrow(val)) return val;
|
|
2515
2900
|
return makeReturn(val);
|
|
2516
2901
|
}
|
|
2517
2902
|
case "VariableDeclaration": {
|
|
2518
2903
|
for (const decl of node.declarations) {
|
|
2519
|
-
const init = _activeAsOverride ?? (decl.init ? evaluate(decl.init, env) :
|
|
2904
|
+
const init = _activeAsOverride ?? (decl.init ? evaluate(decl.init, env) : T15.undefined);
|
|
2520
2905
|
if (isReturn(init) || isBranch(init) || isThrow(init)) return init;
|
|
2521
2906
|
if (init.kind === "function" && decl.id.type === "Identifier" && !init._name) {
|
|
2522
2907
|
init._name = decl.id.name;
|
|
@@ -2526,7 +2911,7 @@ function evaluateNode(node, env) {
|
|
|
2526
2911
|
recordNodeType(decl.id, init);
|
|
2527
2912
|
}
|
|
2528
2913
|
}
|
|
2529
|
-
return
|
|
2914
|
+
return T15.undefined;
|
|
2530
2915
|
}
|
|
2531
2916
|
case "AssignmentExpression": {
|
|
2532
2917
|
if (node.left.type === "Identifier") {
|
|
@@ -2537,7 +2922,7 @@ function evaluateNode(node, env) {
|
|
|
2537
2922
|
const leftVal = env.lookup(node.left.name);
|
|
2538
2923
|
if (leftVal && leftVal.kind !== "unknown") {
|
|
2539
2924
|
const binaryOp = node.operator.slice(0, -1);
|
|
2540
|
-
val =
|
|
2925
|
+
val = evalBinaryValue(binaryOp, leftVal, rightVal) ?? T15.unknown;
|
|
2541
2926
|
}
|
|
2542
2927
|
}
|
|
2543
2928
|
if (!env.update(node.left.name, val)) {
|
|
@@ -2580,7 +2965,7 @@ function evaluateNode(node, env) {
|
|
|
2580
2965
|
bindPattern(node.left, val, env);
|
|
2581
2966
|
return val;
|
|
2582
2967
|
}
|
|
2583
|
-
return
|
|
2968
|
+
return T15.unknown;
|
|
2584
2969
|
}
|
|
2585
2970
|
case "ForOfStatement": {
|
|
2586
2971
|
const rightVal = evaluate(node.right, env);
|
|
@@ -2602,22 +2987,22 @@ function evaluateNode(node, env) {
|
|
|
2602
2987
|
return evaluateDoWhileStatement(node, env);
|
|
2603
2988
|
}
|
|
2604
2989
|
case "FunctionDeclaration": {
|
|
2605
|
-
if (!node.id) return
|
|
2990
|
+
if (!node.id) return T15.undefined;
|
|
2606
2991
|
const paramNames = node.params.map(describeParam);
|
|
2607
|
-
const fnType =
|
|
2992
|
+
const fnType = T15.fn(paramNames, node.body, env);
|
|
2608
2993
|
fnType._paramPatterns = node.params;
|
|
2609
2994
|
if (node.id) fnType._name = node.id.name;
|
|
2610
2995
|
if (node.async) fnType._async = true;
|
|
2611
2996
|
fnType._hasArguments = true;
|
|
2612
2997
|
tagFnModule(fnType);
|
|
2613
2998
|
env.bind(node.id.name, fnType);
|
|
2614
|
-
return
|
|
2999
|
+
return T15.undefined;
|
|
2615
3000
|
}
|
|
2616
3001
|
case "FunctionExpression":
|
|
2617
3002
|
case "ArrowFunctionExpression": {
|
|
2618
3003
|
const paramNames = node.params.map(describeParam);
|
|
2619
3004
|
const body = node.body;
|
|
2620
|
-
const fnType =
|
|
3005
|
+
const fnType = T15.fn(paramNames, body, env);
|
|
2621
3006
|
fnType._paramPatterns = node.params;
|
|
2622
3007
|
if (node.id) fnType._name = node.id.name;
|
|
2623
3008
|
if (node.async) fnType._async = true;
|
|
@@ -2669,7 +3054,7 @@ function evaluateNode(node, env) {
|
|
|
2669
3054
|
}
|
|
2670
3055
|
}
|
|
2671
3056
|
}
|
|
2672
|
-
return
|
|
3057
|
+
return T15.undefined;
|
|
2673
3058
|
}
|
|
2674
3059
|
case "ExportDefaultDeclaration": {
|
|
2675
3060
|
const decl = node.declaration;
|
|
@@ -2682,7 +3067,7 @@ function evaluateNode(node, env) {
|
|
|
2682
3067
|
} else {
|
|
2683
3068
|
env.bind(`__export_default`, result);
|
|
2684
3069
|
}
|
|
2685
|
-
return
|
|
3070
|
+
return T15.undefined;
|
|
2686
3071
|
}
|
|
2687
3072
|
case "CallExpression": {
|
|
2688
3073
|
const callee = node.callee;
|
|
@@ -2719,7 +3104,7 @@ function evaluateNode(node, env) {
|
|
|
2719
3104
|
return full.value;
|
|
2720
3105
|
}
|
|
2721
3106
|
return distributeOverUnion(calleeVal, (fn) => {
|
|
2722
|
-
if (fn.kind !== "function") return
|
|
3107
|
+
if (fn.kind !== "function") return T15.unknown;
|
|
2723
3108
|
return callFunction(fn, argVals, thisVal);
|
|
2724
3109
|
});
|
|
2725
3110
|
}
|
|
@@ -2729,7 +3114,7 @@ function evaluateNode(node, env) {
|
|
|
2729
3114
|
const objVal = evaluate(callee.object, env);
|
|
2730
3115
|
if (isReturn(objVal) || isBranch(objVal) || isThrow(objVal)) return objVal;
|
|
2731
3116
|
if (objVal.kind === "literal" && (objVal.value === null || objVal.value === void 0)) {
|
|
2732
|
-
return
|
|
3117
|
+
return T15.undefined;
|
|
2733
3118
|
}
|
|
2734
3119
|
const methodResult = evaluateMethodCall(callee, node.arguments, env);
|
|
2735
3120
|
if (methodResult !== null) return methodResult;
|
|
@@ -2737,7 +3122,7 @@ function evaluateNode(node, env) {
|
|
|
2737
3122
|
const calleeVal = evaluate(callee, env);
|
|
2738
3123
|
if (isReturn(calleeVal) || isBranch(calleeVal) || isThrow(calleeVal)) return calleeVal;
|
|
2739
3124
|
if (calleeVal.kind === "literal" && (calleeVal.value === null || calleeVal.value === void 0)) {
|
|
2740
|
-
return
|
|
3125
|
+
return T15.undefined;
|
|
2741
3126
|
}
|
|
2742
3127
|
const argVals = evaluateArgs(node.arguments, env);
|
|
2743
3128
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
@@ -2759,7 +3144,7 @@ function evaluateNode(node, env) {
|
|
|
2759
3144
|
return full.value;
|
|
2760
3145
|
}
|
|
2761
3146
|
return distributeOverUnion(calleeVal, (fn) => {
|
|
2762
|
-
if (fn.kind !== "function") return
|
|
3147
|
+
if (fn.kind !== "function") return T15.unknown;
|
|
2763
3148
|
return callFunction(fn, argVals, thisVal);
|
|
2764
3149
|
});
|
|
2765
3150
|
}
|
|
@@ -2781,10 +3166,10 @@ function evaluateNode(node, env) {
|
|
|
2781
3166
|
if (bound !== void 0) return bound;
|
|
2782
3167
|
}
|
|
2783
3168
|
const builtinName = obj._builtinName;
|
|
2784
|
-
if (builtinName &&
|
|
3169
|
+
if (builtinName && hasOwnProp3(BUILTIN_STATIC_METHODS, builtinName)) {
|
|
2785
3170
|
const builtin = BUILTIN_STATIC_METHODS[builtinName];
|
|
2786
|
-
if (typeof builtin === "object" &&
|
|
2787
|
-
if (builtinName === "Symbol" &&
|
|
3171
|
+
if (typeof builtin === "object" && hasOwnProp3(builtin, propName)) {
|
|
3172
|
+
if (builtinName === "Symbol" && hasOwnProp3(SYMBOL_STATIC_PROPS, propName)) {
|
|
2788
3173
|
return wellKnownSymbol(propName);
|
|
2789
3174
|
}
|
|
2790
3175
|
return builtin[propName];
|
|
@@ -2794,65 +3179,65 @@ function evaluateNode(node, env) {
|
|
|
2794
3179
|
return builtinPrototype(builtinName);
|
|
2795
3180
|
}
|
|
2796
3181
|
if (obj.kind === "instance" && obj.className === "Map" && propName === "size") {
|
|
2797
|
-
return
|
|
3182
|
+
return T15.number;
|
|
2798
3183
|
}
|
|
2799
3184
|
if (obj.kind === "instance" && obj.className === "Set" && propName === "size") {
|
|
2800
|
-
return
|
|
3185
|
+
return T15.number;
|
|
2801
3186
|
}
|
|
2802
3187
|
if (obj.kind === "object") {
|
|
2803
|
-
const ownVal =
|
|
3188
|
+
const ownVal = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
|
|
2804
3189
|
if (ownVal) return ownVal;
|
|
2805
|
-
const protoFn =
|
|
3190
|
+
const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
|
|
2806
3191
|
if (protoFn) return bindObjectProtoMethod(protoFn, obj);
|
|
2807
|
-
return
|
|
3192
|
+
return T15.undefined;
|
|
2808
3193
|
}
|
|
2809
3194
|
if (obj.kind === "instance") {
|
|
2810
|
-
const own =
|
|
3195
|
+
const own = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
|
|
2811
3196
|
if (own) return own;
|
|
2812
|
-
const protoFn =
|
|
3197
|
+
const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
|
|
2813
3198
|
if (protoFn) return bindObjectProtoMethod(protoFn, obj);
|
|
2814
3199
|
if (propName === "constructor") return builtinClassValue(obj.className);
|
|
2815
3200
|
const knownInstanceMethods = {
|
|
2816
|
-
values:
|
|
2817
|
-
keys:
|
|
2818
|
-
entries:
|
|
2819
|
-
get:
|
|
2820
|
-
has:
|
|
2821
|
-
add:
|
|
2822
|
-
set:
|
|
2823
|
-
delete:
|
|
2824
|
-
forEach:
|
|
2825
|
-
call:
|
|
2826
|
-
apply:
|
|
2827
|
-
bind:
|
|
3201
|
+
values: T15.fnSig([], T15.array(T15.unknown)),
|
|
3202
|
+
keys: T15.fnSig([], T15.array(T15.unknown)),
|
|
3203
|
+
entries: T15.fnSig([], T15.array(T15.tuple([T15.unknown, T15.unknown]))),
|
|
3204
|
+
get: T15.fnSig([T15.unknown], T15.unknown),
|
|
3205
|
+
has: T15.fnSig([T15.unknown], T15.boolean),
|
|
3206
|
+
add: T15.fnSig([T15.unknown], T15.unknown),
|
|
3207
|
+
set: T15.fnSig([T15.unknown, T15.unknown], T15.unknown),
|
|
3208
|
+
delete: T15.fnSig([T15.unknown], T15.boolean),
|
|
3209
|
+
forEach: T15.fnSig([T15.unknown], T15.undefined),
|
|
3210
|
+
call: T15.fnSig([T15.unknown], T15.unknown),
|
|
3211
|
+
apply: T15.fnSig([T15.unknown], T15.unknown),
|
|
3212
|
+
bind: T15.fnSig([T15.unknown], T15.unknown)
|
|
2828
3213
|
};
|
|
2829
|
-
const knownFn =
|
|
3214
|
+
const knownFn = hasOwnProp3(knownInstanceMethods, propName) ? knownInstanceMethods[propName] : void 0;
|
|
2830
3215
|
if (knownFn) return knownFn;
|
|
2831
|
-
return
|
|
3216
|
+
return T15.fnSig([T15.unknown], T15.unknown);
|
|
2832
3217
|
}
|
|
2833
3218
|
if (propName === "length" && (obj.kind === "array" || obj.kind === "tuple")) {
|
|
2834
|
-
return obj.kind === "tuple" ?
|
|
3219
|
+
return obj.kind === "tuple" ? T15.literal(obj.elements.length) : T15.number;
|
|
2835
3220
|
}
|
|
2836
3221
|
if (obj.kind === "array" || obj.kind === "tuple") {
|
|
2837
|
-
return
|
|
3222
|
+
return T15.undefined;
|
|
2838
3223
|
}
|
|
2839
3224
|
if (propName === "length" && obj.kind === "literal" && typeof obj.value === "string") {
|
|
2840
|
-
return
|
|
3225
|
+
return T15.literal(obj.value.length);
|
|
2841
3226
|
}
|
|
2842
3227
|
if (propName === "length" && obj.kind === "primitive" && obj.type === "string") {
|
|
2843
|
-
return
|
|
3228
|
+
return T15.number;
|
|
2844
3229
|
}
|
|
2845
3230
|
if (obj.kind === "promise") {
|
|
2846
|
-
const protoFn =
|
|
3231
|
+
const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
|
|
2847
3232
|
if (protoFn) return bindObjectProtoMethod(protoFn, obj);
|
|
2848
3233
|
const promiseMethods = BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Promise;
|
|
2849
|
-
if (promiseMethods &&
|
|
3234
|
+
if (promiseMethods && hasOwnProp3(promiseMethods, propName)) {
|
|
2850
3235
|
return promiseMethods[propName];
|
|
2851
3236
|
}
|
|
2852
3237
|
}
|
|
2853
3238
|
if (obj.kind === "primitive" || obj.kind === "literal" && (typeof obj.value === "string" || typeof obj.value === "number" || typeof obj.value === "boolean")) {
|
|
2854
3239
|
const wrapper2 = wrapperPrototypeMember(obj, propName);
|
|
2855
|
-
return wrapper2 !== void 0 ? wrapper2 :
|
|
3240
|
+
return wrapper2 !== void 0 ? wrapper2 : T15.undefined;
|
|
2856
3241
|
}
|
|
2857
3242
|
const wrapper = wrapperPrototypeMember(obj, propName);
|
|
2858
3243
|
if (wrapper !== void 0) return wrapper;
|
|
@@ -2861,7 +3246,7 @@ function evaluateNode(node, env) {
|
|
|
2861
3246
|
if (result2 !== void 0) return result2;
|
|
2862
3247
|
}
|
|
2863
3248
|
propMissed = true;
|
|
2864
|
-
return
|
|
3249
|
+
return T15.unknown;
|
|
2865
3250
|
});
|
|
2866
3251
|
if (propMissed) {
|
|
2867
3252
|
recordUnknown({
|
|
@@ -2874,13 +3259,13 @@ function evaluateNode(node, env) {
|
|
|
2874
3259
|
}
|
|
2875
3260
|
return result;
|
|
2876
3261
|
}
|
|
2877
|
-
return
|
|
3262
|
+
return T15.unknown;
|
|
2878
3263
|
}
|
|
2879
3264
|
case "OptionalMemberExpression": {
|
|
2880
3265
|
const objVal = evaluate(node.object, env);
|
|
2881
3266
|
if (isReturn(objVal) || isBranch(objVal) || isThrow(objVal)) return objVal;
|
|
2882
3267
|
if (objVal.kind === "literal" && (objVal.value === null || objVal.value === void 0)) {
|
|
2883
|
-
return
|
|
3268
|
+
return T15.undefined;
|
|
2884
3269
|
}
|
|
2885
3270
|
node._receiverVal = objVal;
|
|
2886
3271
|
if (node.computed) {
|
|
@@ -2901,59 +3286,59 @@ function evaluateNode(node, env) {
|
|
|
2901
3286
|
return builtinPrototype(optBuiltinName);
|
|
2902
3287
|
}
|
|
2903
3288
|
if (obj.kind === "object") {
|
|
2904
|
-
const ownVal =
|
|
3289
|
+
const ownVal = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
|
|
2905
3290
|
if (ownVal) return ownVal;
|
|
2906
|
-
const protoFn =
|
|
3291
|
+
const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
|
|
2907
3292
|
if (protoFn) return bindObjectProtoMethod(protoFn, obj);
|
|
2908
|
-
return
|
|
3293
|
+
return T15.undefined;
|
|
2909
3294
|
}
|
|
2910
3295
|
if (obj.kind === "instance") {
|
|
2911
|
-
const own =
|
|
3296
|
+
const own = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
|
|
2912
3297
|
if (own) return own;
|
|
2913
|
-
const protoFn =
|
|
3298
|
+
const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
|
|
2914
3299
|
if (protoFn) return bindObjectProtoMethod(protoFn, obj);
|
|
2915
3300
|
if (propName === "constructor") return builtinClassValue(obj.className);
|
|
2916
3301
|
const knownInstanceMethods = {
|
|
2917
|
-
values:
|
|
2918
|
-
keys:
|
|
2919
|
-
entries:
|
|
2920
|
-
get:
|
|
2921
|
-
has:
|
|
2922
|
-
add:
|
|
2923
|
-
set:
|
|
2924
|
-
delete:
|
|
2925
|
-
forEach:
|
|
2926
|
-
call:
|
|
2927
|
-
apply:
|
|
2928
|
-
bind:
|
|
3302
|
+
values: T15.fnSig([], T15.array(T15.unknown)),
|
|
3303
|
+
keys: T15.fnSig([], T15.array(T15.unknown)),
|
|
3304
|
+
entries: T15.fnSig([], T15.array(T15.tuple([T15.unknown, T15.unknown]))),
|
|
3305
|
+
get: T15.fnSig([T15.unknown], T15.unknown),
|
|
3306
|
+
has: T15.fnSig([T15.unknown], T15.boolean),
|
|
3307
|
+
add: T15.fnSig([T15.unknown], T15.unknown),
|
|
3308
|
+
set: T15.fnSig([T15.unknown, T15.unknown], T15.unknown),
|
|
3309
|
+
delete: T15.fnSig([T15.unknown], T15.boolean),
|
|
3310
|
+
forEach: T15.fnSig([T15.unknown], T15.undefined),
|
|
3311
|
+
call: T15.fnSig([T15.unknown], T15.unknown),
|
|
3312
|
+
apply: T15.fnSig([T15.unknown], T15.unknown),
|
|
3313
|
+
bind: T15.fnSig([T15.unknown], T15.unknown)
|
|
2929
3314
|
};
|
|
2930
|
-
const knownFn =
|
|
3315
|
+
const knownFn = hasOwnProp3(knownInstanceMethods, propName) ? knownInstanceMethods[propName] : void 0;
|
|
2931
3316
|
if (knownFn) return knownFn;
|
|
2932
|
-
return
|
|
3317
|
+
return T15.fnSig([T15.unknown], T15.unknown);
|
|
2933
3318
|
}
|
|
2934
3319
|
if (propName === "length" && (obj.kind === "array" || obj.kind === "tuple")) {
|
|
2935
|
-
return obj.kind === "tuple" ?
|
|
3320
|
+
return obj.kind === "tuple" ? T15.literal(obj.elements.length) : T15.number;
|
|
2936
3321
|
}
|
|
2937
3322
|
if (obj.kind === "array" || obj.kind === "tuple") {
|
|
2938
|
-
return
|
|
3323
|
+
return T15.undefined;
|
|
2939
3324
|
}
|
|
2940
3325
|
if (propName === "length" && obj.kind === "literal" && typeof obj.value === "string") {
|
|
2941
|
-
return
|
|
3326
|
+
return T15.literal(obj.value.length);
|
|
2942
3327
|
}
|
|
2943
3328
|
if (propName === "length" && obj.kind === "primitive" && obj.type === "string") {
|
|
2944
|
-
return
|
|
3329
|
+
return T15.number;
|
|
2945
3330
|
}
|
|
2946
3331
|
if (obj.kind === "promise") {
|
|
2947
|
-
const protoFn =
|
|
3332
|
+
const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
|
|
2948
3333
|
if (protoFn) return bindObjectProtoMethod(protoFn, obj);
|
|
2949
3334
|
const promiseMethods = BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Promise;
|
|
2950
|
-
if (promiseMethods &&
|
|
3335
|
+
if (promiseMethods && hasOwnProp3(promiseMethods, propName)) {
|
|
2951
3336
|
return promiseMethods[propName];
|
|
2952
3337
|
}
|
|
2953
3338
|
}
|
|
2954
3339
|
if (obj.kind === "primitive" || obj.kind === "literal" && (typeof obj.value === "string" || typeof obj.value === "number" || typeof obj.value === "boolean")) {
|
|
2955
3340
|
const wrapper2 = wrapperPrototypeMember(obj, propName);
|
|
2956
|
-
return wrapper2 !== void 0 ? wrapper2 :
|
|
3341
|
+
return wrapper2 !== void 0 ? wrapper2 : T15.undefined;
|
|
2957
3342
|
}
|
|
2958
3343
|
const wrapper = wrapperPrototypeMember(obj, propName);
|
|
2959
3344
|
if (wrapper !== void 0) return wrapper;
|
|
@@ -2962,7 +3347,7 @@ function evaluateNode(node, env) {
|
|
|
2962
3347
|
if (result2 !== void 0) return result2;
|
|
2963
3348
|
}
|
|
2964
3349
|
propMissed = true;
|
|
2965
|
-
return
|
|
3350
|
+
return T15.unknown;
|
|
2966
3351
|
});
|
|
2967
3352
|
if (propMissed) {
|
|
2968
3353
|
recordUnknown({
|
|
@@ -2975,7 +3360,7 @@ function evaluateNode(node, env) {
|
|
|
2975
3360
|
}
|
|
2976
3361
|
return result;
|
|
2977
3362
|
}
|
|
2978
|
-
return
|
|
3363
|
+
return T15.unknown;
|
|
2979
3364
|
}
|
|
2980
3365
|
case "ObjectExpression": {
|
|
2981
3366
|
const props = {};
|
|
@@ -2998,11 +3383,18 @@ function evaluateNode(node, env) {
|
|
|
2998
3383
|
if (p.type === "RestElement" && p.argument.type === "Identifier") return `...${p.argument.name}`;
|
|
2999
3384
|
return `__param`;
|
|
3000
3385
|
});
|
|
3001
|
-
props[key] =
|
|
3386
|
+
props[key] = T15.fn(params, prop.body, env);
|
|
3002
3387
|
}
|
|
3003
3388
|
} else if (prop.type === "SpreadElement") {
|
|
3004
3389
|
const spreadVal = evaluate(prop.argument, env);
|
|
3005
3390
|
if (isReturn(spreadVal) || isBranch(spreadVal) || isThrow(spreadVal)) return spreadVal;
|
|
3391
|
+
const absSpread = tryAbsObjectSpread(T15.object(props), spreadVal);
|
|
3392
|
+
if (absSpread !== void 0 && absSpread.kind === "object") {
|
|
3393
|
+
for (const [k, v] of Object.entries(absSpread.properties)) {
|
|
3394
|
+
props[k] = v;
|
|
3395
|
+
}
|
|
3396
|
+
continue;
|
|
3397
|
+
}
|
|
3006
3398
|
if (spreadVal.kind === "object") {
|
|
3007
3399
|
Object.assign(props, spreadVal.properties);
|
|
3008
3400
|
} else if (spreadVal.kind === "union") {
|
|
@@ -3017,20 +3409,20 @@ function evaluateNode(node, env) {
|
|
|
3017
3409
|
for (const key of allKeys) {
|
|
3018
3410
|
const values = objectMembers.filter((m) => m.kind === "object" && key in m.properties).map((m) => m.properties[key]);
|
|
3019
3411
|
if (values.length > 0) {
|
|
3020
|
-
props[key] =
|
|
3412
|
+
props[key] = simplifyUnion8(values);
|
|
3021
3413
|
}
|
|
3022
3414
|
}
|
|
3023
3415
|
}
|
|
3024
3416
|
}
|
|
3025
3417
|
}
|
|
3026
3418
|
}
|
|
3027
|
-
return
|
|
3419
|
+
return T15.object(props);
|
|
3028
3420
|
}
|
|
3029
3421
|
case "ArrayExpression": {
|
|
3030
3422
|
const elements = [];
|
|
3031
3423
|
for (const elem of node.elements) {
|
|
3032
3424
|
if (!elem) {
|
|
3033
|
-
elements.push(
|
|
3425
|
+
elements.push(T15.undefined);
|
|
3034
3426
|
continue;
|
|
3035
3427
|
}
|
|
3036
3428
|
if (elem.type === "SpreadElement") {
|
|
@@ -3039,19 +3431,19 @@ function evaluateNode(node, env) {
|
|
|
3039
3431
|
if (spreadVal.kind === "tuple") {
|
|
3040
3432
|
elements.push(...spreadVal.elements);
|
|
3041
3433
|
} else if (spreadVal.kind === "array") {
|
|
3042
|
-
return
|
|
3434
|
+
return T15.array(simplifyUnion8([...elements, spreadVal.element]));
|
|
3043
3435
|
} else {
|
|
3044
3436
|
const iterable = iterableSpreadValue(spreadVal);
|
|
3045
3437
|
if (iterable) {
|
|
3046
3438
|
if (iterable.kind === "tuple") {
|
|
3047
3439
|
elements.push(...iterable.elements);
|
|
3048
3440
|
} else if (iterable.kind === "array") {
|
|
3049
|
-
return
|
|
3441
|
+
return T15.array(simplifyUnion8([...elements, iterable.element]));
|
|
3050
3442
|
} else {
|
|
3051
|
-
elements.push(
|
|
3443
|
+
elements.push(T15.unknown);
|
|
3052
3444
|
}
|
|
3053
3445
|
} else {
|
|
3054
|
-
elements.push(
|
|
3446
|
+
elements.push(T15.unknown);
|
|
3055
3447
|
}
|
|
3056
3448
|
}
|
|
3057
3449
|
continue;
|
|
@@ -3060,10 +3452,10 @@ function evaluateNode(node, env) {
|
|
|
3060
3452
|
if (isReturn(val) || isBranch(val) || isThrow(val)) return val;
|
|
3061
3453
|
elements.push(val);
|
|
3062
3454
|
}
|
|
3063
|
-
return
|
|
3455
|
+
return T15.tuple(elements);
|
|
3064
3456
|
}
|
|
3065
3457
|
case "ThrowStatement": {
|
|
3066
|
-
const argVal = node.argument ? evaluate(node.argument, env) :
|
|
3458
|
+
const argVal = node.argument ? evaluate(node.argument, env) : T15.undefined;
|
|
3067
3459
|
if (isReturn(argVal) || isBranch(argVal) || isThrow(argVal)) return argVal;
|
|
3068
3460
|
const throwLoc = node.loc ? {
|
|
3069
3461
|
start: { line: node.loc.start.line, column: node.loc.start.column },
|
|
@@ -3088,21 +3480,21 @@ function evaluateNode(node, env) {
|
|
|
3088
3480
|
if (node.argument.type === "Identifier") {
|
|
3089
3481
|
const current = env.lookup(node.argument.name);
|
|
3090
3482
|
if (current.kind === "literal" && typeof current.value === "number") {
|
|
3091
|
-
const newVal = node.operator === "++" ?
|
|
3483
|
+
const newVal = node.operator === "++" ? T15.literal(current.value + 1) : T15.literal(current.value - 1);
|
|
3092
3484
|
if (!env.update(node.argument.name, newVal)) {
|
|
3093
3485
|
env.bind(node.argument.name, newVal);
|
|
3094
3486
|
}
|
|
3095
3487
|
return node.prefix ? newVal : current;
|
|
3096
3488
|
}
|
|
3097
|
-
if (!env.update(node.argument.name,
|
|
3098
|
-
env.bind(node.argument.name,
|
|
3489
|
+
if (!env.update(node.argument.name, T15.number)) {
|
|
3490
|
+
env.bind(node.argument.name, T15.number);
|
|
3099
3491
|
}
|
|
3100
|
-
return
|
|
3492
|
+
return T15.number;
|
|
3101
3493
|
}
|
|
3102
|
-
return
|
|
3494
|
+
return T15.number;
|
|
3103
3495
|
}
|
|
3104
3496
|
default:
|
|
3105
|
-
return
|
|
3497
|
+
return T15.unknown;
|
|
3106
3498
|
}
|
|
3107
3499
|
}
|
|
3108
3500
|
function getMemberKey(node, env) {
|
|
@@ -3130,7 +3522,7 @@ function bindPattern(pattern, value, env) {
|
|
|
3130
3522
|
}
|
|
3131
3523
|
if (pattern.type === "AssignmentPattern") {
|
|
3132
3524
|
const defaultVal = evaluate(pattern.right, env);
|
|
3133
|
-
const resolved = value.kind === "literal" && value.value === void 0 ? !isReturn(defaultVal) && !isBranch(defaultVal) && !isThrow(defaultVal) ? defaultVal :
|
|
3525
|
+
const resolved = value.kind === "literal" && value.value === void 0 ? !isReturn(defaultVal) && !isBranch(defaultVal) && !isThrow(defaultVal) ? defaultVal : T15.unknown : value;
|
|
3134
3526
|
bindPattern(pattern.left, resolved, env);
|
|
3135
3527
|
return;
|
|
3136
3528
|
}
|
|
@@ -3143,9 +3535,9 @@ function bindPattern(pattern, value, env) {
|
|
|
3143
3535
|
for (const [k, v] of Object.entries(value.properties)) {
|
|
3144
3536
|
if (!restKeys.includes(k)) remaining[k] = v;
|
|
3145
3537
|
}
|
|
3146
|
-
bindPattern(prop.argument,
|
|
3538
|
+
bindPattern(prop.argument, T15.object(remaining), env);
|
|
3147
3539
|
} else {
|
|
3148
|
-
bindPattern(prop.argument,
|
|
3540
|
+
bindPattern(prop.argument, T15.object({}), env);
|
|
3149
3541
|
}
|
|
3150
3542
|
continue;
|
|
3151
3543
|
}
|
|
@@ -3153,7 +3545,7 @@ function bindPattern(pattern, value, env) {
|
|
|
3153
3545
|
const key = prop.key.type === "Identifier" ? prop.key.name : prop.key.type === "StringLiteral" ? prop.key.value : null;
|
|
3154
3546
|
if (!key) continue;
|
|
3155
3547
|
restKeys.push(key);
|
|
3156
|
-
const propVal = value.kind === "object" ?
|
|
3548
|
+
const propVal = value.kind === "object" ? hasOwnProp3(value.properties, key) ? value.properties[key] : hasOwnProp3(OBJECT_PROTOTYPE_METHODS, key) ? bindObjectProtoMethod(OBJECT_PROTOTYPE_METHODS[key], value) : T15.undefined : T15.unknown;
|
|
3157
3549
|
bindPattern(prop.value, propVal, env);
|
|
3158
3550
|
}
|
|
3159
3551
|
return;
|
|
@@ -3164,15 +3556,15 @@ function bindPattern(pattern, value, env) {
|
|
|
3164
3556
|
if (!elem) continue;
|
|
3165
3557
|
if (elem.type === "RestElement") {
|
|
3166
3558
|
if (value.kind === "tuple") {
|
|
3167
|
-
bindPattern(elem.argument,
|
|
3559
|
+
bindPattern(elem.argument, T15.tuple(value.elements.slice(i)), env);
|
|
3168
3560
|
} else if (value.kind === "array") {
|
|
3169
3561
|
bindPattern(elem.argument, value, env);
|
|
3170
3562
|
} else {
|
|
3171
|
-
bindPattern(elem.argument,
|
|
3563
|
+
bindPattern(elem.argument, T15.tuple([]), env);
|
|
3172
3564
|
}
|
|
3173
3565
|
continue;
|
|
3174
3566
|
}
|
|
3175
|
-
const elemVal = value.kind === "tuple" ? value.elements[i] ??
|
|
3567
|
+
const elemVal = value.kind === "tuple" ? value.elements[i] ?? T15.undefined : value.kind === "array" ? value.element : T15.unknown;
|
|
3176
3568
|
bindPattern(elem, elemVal, env);
|
|
3177
3569
|
}
|
|
3178
3570
|
return;
|
|
@@ -3196,10 +3588,10 @@ function evaluateArgs(args, env) {
|
|
|
3196
3588
|
} else if (iterable.kind === "array") {
|
|
3197
3589
|
result.push(iterable.element);
|
|
3198
3590
|
} else {
|
|
3199
|
-
result.push(
|
|
3591
|
+
result.push(T15.unknown);
|
|
3200
3592
|
}
|
|
3201
3593
|
} else {
|
|
3202
|
-
result.push(
|
|
3594
|
+
result.push(T15.unknown);
|
|
3203
3595
|
}
|
|
3204
3596
|
}
|
|
3205
3597
|
continue;
|
|
@@ -3218,53 +3610,53 @@ function evaluateBuiltinCall(name, args, env) {
|
|
|
3218
3610
|
const argVals = evaluateArgs(args, env);
|
|
3219
3611
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3220
3612
|
if (argVals.length === 0) {
|
|
3221
|
-
if (name === "String") return
|
|
3222
|
-
if (name === "Number") return
|
|
3223
|
-
if (name === "Boolean") return
|
|
3613
|
+
if (name === "String") return T15.literal("");
|
|
3614
|
+
if (name === "Number") return T15.literal(0);
|
|
3615
|
+
if (name === "Boolean") return T15.literal(false);
|
|
3224
3616
|
}
|
|
3225
3617
|
if (argVals.length === 1) {
|
|
3226
3618
|
const arg = argVals[0];
|
|
3227
3619
|
if (name === "String") {
|
|
3228
|
-
if (arg.kind === "literal") return
|
|
3229
|
-
return
|
|
3620
|
+
if (arg.kind === "literal") return T15.literal(String(arg.value));
|
|
3621
|
+
return T15.string;
|
|
3230
3622
|
}
|
|
3231
3623
|
if (name === "Number") {
|
|
3232
3624
|
if (arg.kind === "literal") {
|
|
3233
|
-
if (arg.value === null) return
|
|
3234
|
-
if (arg.value === void 0) return
|
|
3235
|
-
if (typeof arg.value === "boolean") return
|
|
3625
|
+
if (arg.value === null) return T15.literal(0);
|
|
3626
|
+
if (arg.value === void 0) return T15.literal(NaN);
|
|
3627
|
+
if (typeof arg.value === "boolean") return T15.literal(arg.value ? 1 : 0);
|
|
3236
3628
|
if (typeof arg.value === "number") return arg;
|
|
3237
3629
|
if (typeof arg.value === "string") {
|
|
3238
3630
|
const num = Number(arg.value);
|
|
3239
|
-
if (!isNaN(num)) return
|
|
3240
|
-
return
|
|
3631
|
+
if (!isNaN(num)) return T15.literal(num);
|
|
3632
|
+
return T15.literal(NaN);
|
|
3241
3633
|
}
|
|
3242
3634
|
}
|
|
3243
|
-
return
|
|
3635
|
+
return T15.number;
|
|
3244
3636
|
}
|
|
3245
3637
|
if (name === "Boolean") {
|
|
3246
|
-
if (arg.kind === "literal") return
|
|
3247
|
-
return
|
|
3638
|
+
if (arg.kind === "literal") return T15.literal(Boolean(arg.value));
|
|
3639
|
+
return T15.boolean;
|
|
3248
3640
|
}
|
|
3249
3641
|
}
|
|
3250
|
-
if (name === "String") return
|
|
3251
|
-
if (name === "Number") return
|
|
3252
|
-
if (name === "Boolean") return
|
|
3642
|
+
if (name === "String") return T15.string;
|
|
3643
|
+
if (name === "Number") return T15.number;
|
|
3644
|
+
if (name === "Boolean") return T15.boolean;
|
|
3253
3645
|
}
|
|
3254
3646
|
if (name === "parseInt" || name === "parseFloat") {
|
|
3255
3647
|
const argVals = evaluateArgs(args, env);
|
|
3256
3648
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3257
|
-
return
|
|
3649
|
+
return T15.number;
|
|
3258
3650
|
}
|
|
3259
3651
|
if (name === "isNaN" || name === "isFinite") {
|
|
3260
3652
|
const argVals = evaluateArgs(args, env);
|
|
3261
3653
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3262
|
-
return
|
|
3654
|
+
return T15.boolean;
|
|
3263
3655
|
}
|
|
3264
3656
|
if (name === "encodeURIComponent" || name === "decodeURIComponent" || name === "encodeURI" || name === "decodeURI") {
|
|
3265
3657
|
const argVals = evaluateArgs(args, env);
|
|
3266
3658
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3267
|
-
return
|
|
3659
|
+
return T15.string;
|
|
3268
3660
|
}
|
|
3269
3661
|
if (name === "Math") {
|
|
3270
3662
|
return null;
|
|
@@ -3273,7 +3665,7 @@ function evaluateBuiltinCall(name, args, env) {
|
|
|
3273
3665
|
return null;
|
|
3274
3666
|
}
|
|
3275
3667
|
if (name === "fetch") {
|
|
3276
|
-
return
|
|
3668
|
+
return T15.promise(createResponseType());
|
|
3277
3669
|
}
|
|
3278
3670
|
return null;
|
|
3279
3671
|
}
|
|
@@ -3292,7 +3684,7 @@ function evaluateFunctionPrototypeMethod(fnVal, methodName, argVals) {
|
|
|
3292
3684
|
if (listArg?.kind === "tuple") {
|
|
3293
3685
|
spreadArgs = listArg.elements;
|
|
3294
3686
|
} else {
|
|
3295
|
-
const el = listArg?.kind === "array" ? listArg.element :
|
|
3687
|
+
const el = listArg?.kind === "array" ? listArg.element : T15.unknown;
|
|
3296
3688
|
spreadArgs = fnVal.params.map(() => el);
|
|
3297
3689
|
}
|
|
3298
3690
|
const full = callFunctionFull(fnVal, spreadArgs, argVals[0]);
|
|
@@ -3351,11 +3743,11 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3351
3743
|
methodMissed = true;
|
|
3352
3744
|
}
|
|
3353
3745
|
if (memberResult !== null && typeof memberResult === "object") {
|
|
3354
|
-
if (THROW_SIGNAL in memberResult) return
|
|
3746
|
+
if (THROW_SIGNAL in memberResult) return T15.never;
|
|
3355
3747
|
if (RETURN_SIGNAL in memberResult) return memberResult.value;
|
|
3356
3748
|
if (BRANCH_SIGNAL in memberResult) return memberResult.returnedValue;
|
|
3357
3749
|
}
|
|
3358
|
-
return memberResult ??
|
|
3750
|
+
return memberResult ?? T15.unknown;
|
|
3359
3751
|
});
|
|
3360
3752
|
if (methodMissed) {
|
|
3361
3753
|
recordUnknown({
|
|
@@ -3377,7 +3769,7 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3377
3769
|
if (callee.object.type === "Identifier" && callee.object.name === "console" && !env.has("console")) {
|
|
3378
3770
|
const argVals = evaluateArgs(args, env);
|
|
3379
3771
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3380
|
-
return
|
|
3772
|
+
return T15.undefined;
|
|
3381
3773
|
}
|
|
3382
3774
|
if (callee.object.type === "Identifier" && callee.object.name === "Math" && !env.has("Math")) {
|
|
3383
3775
|
const argVals = evaluateArgs(args, env);
|
|
@@ -3404,27 +3796,27 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3404
3796
|
"atan",
|
|
3405
3797
|
"atan2"
|
|
3406
3798
|
].includes(methodName)) {
|
|
3407
|
-
return
|
|
3799
|
+
return T15.number;
|
|
3408
3800
|
}
|
|
3409
3801
|
if (["PI", "E", "LN2", "LN10", "LOG2E", "LOG10E", "SQRT1_2", "SQRT2"].includes(methodName)) {
|
|
3410
|
-
return
|
|
3802
|
+
return T15.number;
|
|
3411
3803
|
}
|
|
3412
|
-
return
|
|
3804
|
+
return T15.number;
|
|
3413
3805
|
}
|
|
3414
3806
|
if (callee.object.type === "Identifier" && callee.object.name === "Date" && !env.has("Date")) {
|
|
3415
3807
|
const argVals = evaluateArgs(args, env);
|
|
3416
3808
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3417
3809
|
if (["now", "parse", "UTC"].includes(methodName)) {
|
|
3418
|
-
return
|
|
3810
|
+
return T15.number;
|
|
3419
3811
|
}
|
|
3420
3812
|
if (methodName === "constructor") {
|
|
3421
|
-
return
|
|
3422
|
-
getTime:
|
|
3423
|
-
getFullYear:
|
|
3424
|
-
toISOString:
|
|
3813
|
+
return T15.instanceOf("Date", {
|
|
3814
|
+
getTime: T15.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
3815
|
+
getFullYear: T15.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
|
|
3816
|
+
toISOString: T15.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
|
|
3425
3817
|
});
|
|
3426
3818
|
}
|
|
3427
|
-
return
|
|
3819
|
+
return T15.unknown;
|
|
3428
3820
|
}
|
|
3429
3821
|
if (callee.object.type === "Identifier" && callee.object.name === "JSON" && !env.has("JSON")) {
|
|
3430
3822
|
const argVals = evaluateArgs(args, env);
|
|
@@ -3436,9 +3828,9 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3436
3828
|
);
|
|
3437
3829
|
}
|
|
3438
3830
|
if (methodName === "stringify") {
|
|
3439
|
-
return
|
|
3831
|
+
return T15.string;
|
|
3440
3832
|
}
|
|
3441
|
-
return
|
|
3833
|
+
return T15.unknown;
|
|
3442
3834
|
}
|
|
3443
3835
|
if (callee.object.type === "Identifier" && callee.object.name === "Array" && !env.has("Array")) {
|
|
3444
3836
|
const argVals = evaluateArgs(args, env);
|
|
@@ -3448,7 +3840,7 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3448
3840
|
const iterable = argVals[0];
|
|
3449
3841
|
if (iterable.kind === "instance" && iterable.className === "Set") {
|
|
3450
3842
|
const typeArgs = iterable._typeArgs;
|
|
3451
|
-
if (typeArgs?.T) return
|
|
3843
|
+
if (typeArgs?.T) return T15.array(typeArgs.T);
|
|
3452
3844
|
}
|
|
3453
3845
|
if (iterable.kind === "tuple") {
|
|
3454
3846
|
return iterable;
|
|
@@ -3457,36 +3849,36 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3457
3849
|
return iterable;
|
|
3458
3850
|
}
|
|
3459
3851
|
}
|
|
3460
|
-
return
|
|
3852
|
+
return T15.array(T15.unknown);
|
|
3461
3853
|
}
|
|
3462
3854
|
if (methodName === "isArray") {
|
|
3463
|
-
return distributeOverUnion(argVals[0] ??
|
|
3464
|
-
const
|
|
3465
|
-
return
|
|
3855
|
+
return distributeOverUnion(argVals[0] ?? T15.undefined, (v) => {
|
|
3856
|
+
const lit3 = arrayIsArrayLiteral(v);
|
|
3857
|
+
return lit3 === void 0 ? T15.boolean : T15.literal(lit3);
|
|
3466
3858
|
});
|
|
3467
3859
|
}
|
|
3468
|
-
return
|
|
3860
|
+
return T15.unknown;
|
|
3469
3861
|
}
|
|
3470
3862
|
if (callee.object.type === "Identifier" && callee.object.name === "Promise" && !env.has("Promise")) {
|
|
3471
3863
|
const argVals = evaluateArgs(args, env);
|
|
3472
3864
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3473
3865
|
const result = evaluatePromiseStaticMethod(methodName, argVals);
|
|
3474
3866
|
if (result !== null) return result;
|
|
3475
|
-
return
|
|
3867
|
+
return T15.unknown;
|
|
3476
3868
|
}
|
|
3477
3869
|
if (callee.object.type === "Identifier" && callee.object.name === "Symbol" && !env.has("Symbol")) {
|
|
3478
3870
|
const argVals = evaluateArgs(args, env);
|
|
3479
3871
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3480
|
-
if (methodName === "for") return
|
|
3481
|
-
if (methodName === "keyFor") return
|
|
3482
|
-
return
|
|
3872
|
+
if (methodName === "for") return T15.symbol;
|
|
3873
|
+
if (methodName === "keyFor") return T15.union(T15.string, T15.undefined);
|
|
3874
|
+
return T15.unknown;
|
|
3483
3875
|
}
|
|
3484
3876
|
if (callee.object.type === "Identifier" && callee.object.name === "Reflect" && !env.has("Reflect")) {
|
|
3485
3877
|
const argVals = evaluateArgs(args, env);
|
|
3486
3878
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3487
3879
|
const method = REFLECT_METHODS[methodName];
|
|
3488
3880
|
if (method) return method(...argVals);
|
|
3489
|
-
return
|
|
3881
|
+
return T15.unknown;
|
|
3490
3882
|
}
|
|
3491
3883
|
if (objVal.kind === "promise") {
|
|
3492
3884
|
const argVals = evaluateArgs(args, env);
|
|
@@ -3643,12 +4035,12 @@ function evaluateMethodCall(callee, args, env) {
|
|
|
3643
4035
|
const argVals = evaluateArgs(args, env);
|
|
3644
4036
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
3645
4037
|
if (methodName === "toString") {
|
|
3646
|
-
return objVal.kind === "literal" && typeof objVal.value === "number" ?
|
|
4038
|
+
return objVal.kind === "literal" && typeof objVal.value === "number" ? T15.literal(String(objVal.value)) : T15.string;
|
|
3647
4039
|
}
|
|
3648
4040
|
if (methodName === "valueOf") {
|
|
3649
|
-
return objVal.kind === "literal" && typeof objVal.value === "number" ? objVal :
|
|
4041
|
+
return objVal.kind === "literal" && typeof objVal.value === "number" ? objVal : T15.number;
|
|
3650
4042
|
}
|
|
3651
|
-
if (methodName === "toFixed" || methodName === "toPrecision") return
|
|
4043
|
+
if (methodName === "toFixed" || methodName === "toPrecision") return T15.string;
|
|
3652
4044
|
}
|
|
3653
4045
|
if (objVal.kind === "refined") {
|
|
3654
4046
|
const argVals = evaluateArgs(args, env);
|
|
@@ -3695,112 +4087,112 @@ function evaluateStringMethodLiteral(str, method, args) {
|
|
|
3695
4087
|
// String.prototype.toString/valueOf return the receiver string itself
|
|
3696
4088
|
case "toString":
|
|
3697
4089
|
case "valueOf":
|
|
3698
|
-
return
|
|
4090
|
+
return T15.literal(str);
|
|
3699
4091
|
case "toUpperCase":
|
|
3700
|
-
return
|
|
4092
|
+
return T15.literal(str.toUpperCase());
|
|
3701
4093
|
case "toLowerCase":
|
|
3702
|
-
return
|
|
4094
|
+
return T15.literal(str.toLowerCase());
|
|
3703
4095
|
case "trim":
|
|
3704
|
-
return
|
|
4096
|
+
return T15.literal(str.trim());
|
|
3705
4097
|
case "trimStart":
|
|
3706
|
-
return
|
|
4098
|
+
return T15.literal(str.trimStart());
|
|
3707
4099
|
case "trimEnd":
|
|
3708
|
-
return
|
|
4100
|
+
return T15.literal(str.trimEnd());
|
|
3709
4101
|
case "charAt": {
|
|
3710
4102
|
const idx = litArg(0);
|
|
3711
|
-
return typeof idx === "number" ?
|
|
4103
|
+
return typeof idx === "number" ? T15.literal(str.charAt(idx)) : T15.string;
|
|
3712
4104
|
}
|
|
3713
4105
|
case "charCodeAt": {
|
|
3714
4106
|
const idx = litArg(0);
|
|
3715
|
-
return typeof idx === "number" ?
|
|
4107
|
+
return typeof idx === "number" ? T15.literal(str.charCodeAt(idx)) : T15.number;
|
|
3716
4108
|
}
|
|
3717
4109
|
case "at": {
|
|
3718
4110
|
const idx = litArg(0);
|
|
3719
4111
|
if (typeof idx === "number") {
|
|
3720
4112
|
const ch = str.at(idx);
|
|
3721
|
-
return ch !== void 0 ?
|
|
4113
|
+
return ch !== void 0 ? T15.literal(ch) : T15.undefined;
|
|
3722
4114
|
}
|
|
3723
|
-
return
|
|
4115
|
+
return T15.union(T15.string, T15.undefined);
|
|
3724
4116
|
}
|
|
3725
4117
|
case "startsWith": {
|
|
3726
4118
|
const search = litArg(0);
|
|
3727
|
-
return typeof search === "string" ?
|
|
4119
|
+
return typeof search === "string" ? T15.literal(str.startsWith(search)) : T15.boolean;
|
|
3728
4120
|
}
|
|
3729
4121
|
case "endsWith": {
|
|
3730
4122
|
const search = litArg(0);
|
|
3731
|
-
return typeof search === "string" ?
|
|
4123
|
+
return typeof search === "string" ? T15.literal(str.endsWith(search)) : T15.boolean;
|
|
3732
4124
|
}
|
|
3733
4125
|
case "includes": {
|
|
3734
4126
|
const search = litArg(0);
|
|
3735
|
-
return typeof search === "string" ?
|
|
4127
|
+
return typeof search === "string" ? T15.literal(str.includes(search)) : T15.boolean;
|
|
3736
4128
|
}
|
|
3737
4129
|
case "indexOf": {
|
|
3738
4130
|
const search = litArg(0);
|
|
3739
|
-
return typeof search === "string" ?
|
|
4131
|
+
return typeof search === "string" ? T15.literal(str.indexOf(search)) : T15.number;
|
|
3740
4132
|
}
|
|
3741
4133
|
case "lastIndexOf": {
|
|
3742
4134
|
const search = litArg(0);
|
|
3743
|
-
return typeof search === "string" ?
|
|
4135
|
+
return typeof search === "string" ? T15.literal(str.lastIndexOf(search)) : T15.number;
|
|
3744
4136
|
}
|
|
3745
4137
|
case "slice": {
|
|
3746
4138
|
const start = litArg(0);
|
|
3747
4139
|
const end = litArg(1);
|
|
3748
4140
|
if (typeof start === "number") {
|
|
3749
|
-
return
|
|
4141
|
+
return T15.literal(str.slice(start, typeof end === "number" ? end : void 0));
|
|
3750
4142
|
}
|
|
3751
|
-
return
|
|
4143
|
+
return T15.string;
|
|
3752
4144
|
}
|
|
3753
4145
|
case "substring": {
|
|
3754
4146
|
const start = litArg(0);
|
|
3755
4147
|
const end = litArg(1);
|
|
3756
4148
|
if (typeof start === "number") {
|
|
3757
|
-
return
|
|
4149
|
+
return T15.literal(str.substring(start, typeof end === "number" ? end : void 0));
|
|
3758
4150
|
}
|
|
3759
|
-
return
|
|
4151
|
+
return T15.string;
|
|
3760
4152
|
}
|
|
3761
4153
|
case "split": {
|
|
3762
4154
|
const sep = litArg(0);
|
|
3763
4155
|
if (typeof sep === "string") {
|
|
3764
4156
|
const parts = str.split(sep);
|
|
3765
|
-
return
|
|
4157
|
+
return T15.tuple(parts.map((p) => T15.literal(p)));
|
|
3766
4158
|
}
|
|
3767
|
-
return
|
|
4159
|
+
return T15.array(T15.string);
|
|
3768
4160
|
}
|
|
3769
4161
|
case "replace": {
|
|
3770
4162
|
const search = litArg(0);
|
|
3771
4163
|
const replacement = litArg(1);
|
|
3772
4164
|
if (typeof search === "string" && typeof replacement === "string") {
|
|
3773
|
-
return
|
|
4165
|
+
return T15.literal(str.replace(search, replacement));
|
|
3774
4166
|
}
|
|
3775
|
-
return
|
|
4167
|
+
return T15.string;
|
|
3776
4168
|
}
|
|
3777
4169
|
case "replaceAll": {
|
|
3778
4170
|
const search = litArg(0);
|
|
3779
4171
|
const replacement = litArg(1);
|
|
3780
4172
|
if (typeof search === "string" && typeof replacement === "string") {
|
|
3781
|
-
return
|
|
4173
|
+
return T15.literal(str.replaceAll(search, replacement));
|
|
3782
4174
|
}
|
|
3783
|
-
return
|
|
4175
|
+
return T15.string;
|
|
3784
4176
|
}
|
|
3785
4177
|
case "repeat": {
|
|
3786
4178
|
const count = litArg(0);
|
|
3787
|
-
return typeof count === "number" ?
|
|
4179
|
+
return typeof count === "number" ? T15.literal(str.repeat(count)) : T15.string;
|
|
3788
4180
|
}
|
|
3789
4181
|
case "padStart": {
|
|
3790
4182
|
const len = litArg(0);
|
|
3791
4183
|
const fill = litArg(1);
|
|
3792
4184
|
if (typeof len === "number") {
|
|
3793
|
-
return
|
|
4185
|
+
return T15.literal(str.padStart(len, typeof fill === "string" ? fill : void 0));
|
|
3794
4186
|
}
|
|
3795
|
-
return
|
|
4187
|
+
return T15.string;
|
|
3796
4188
|
}
|
|
3797
4189
|
case "padEnd": {
|
|
3798
4190
|
const len = litArg(0);
|
|
3799
4191
|
const fill = litArg(1);
|
|
3800
4192
|
if (typeof len === "number") {
|
|
3801
|
-
return
|
|
4193
|
+
return T15.literal(str.padEnd(len, typeof fill === "string" ? fill : void 0));
|
|
3802
4194
|
}
|
|
3803
|
-
return
|
|
4195
|
+
return T15.string;
|
|
3804
4196
|
}
|
|
3805
4197
|
default:
|
|
3806
4198
|
return null;
|
|
@@ -3810,7 +4202,7 @@ function evaluateStringMethodAbstract(method, _args) {
|
|
|
3810
4202
|
switch (method) {
|
|
3811
4203
|
case "toString":
|
|
3812
4204
|
case "valueOf":
|
|
3813
|
-
return
|
|
4205
|
+
return T15.string;
|
|
3814
4206
|
case "toUpperCase":
|
|
3815
4207
|
case "toLowerCase":
|
|
3816
4208
|
case "trim":
|
|
@@ -3824,19 +4216,19 @@ function evaluateStringMethodAbstract(method, _args) {
|
|
|
3824
4216
|
case "repeat":
|
|
3825
4217
|
case "padStart":
|
|
3826
4218
|
case "padEnd":
|
|
3827
|
-
return
|
|
4219
|
+
return T15.string;
|
|
3828
4220
|
case "charCodeAt":
|
|
3829
4221
|
case "indexOf":
|
|
3830
4222
|
case "lastIndexOf":
|
|
3831
|
-
return
|
|
4223
|
+
return T15.number;
|
|
3832
4224
|
case "at":
|
|
3833
|
-
return
|
|
4225
|
+
return T15.union(T15.string, T15.undefined);
|
|
3834
4226
|
case "startsWith":
|
|
3835
4227
|
case "endsWith":
|
|
3836
4228
|
case "includes":
|
|
3837
|
-
return
|
|
4229
|
+
return T15.boolean;
|
|
3838
4230
|
case "split":
|
|
3839
|
-
return
|
|
4231
|
+
return T15.array(T15.string);
|
|
3840
4232
|
default:
|
|
3841
4233
|
return null;
|
|
3842
4234
|
}
|
|
@@ -3844,12 +4236,12 @@ function evaluateStringMethodAbstract(method, _args) {
|
|
|
3844
4236
|
function evaluateObjectStaticMethod(method, obj) {
|
|
3845
4237
|
if (obj.kind === "instance") {
|
|
3846
4238
|
if (method === "keys" || method === "getOwnPropertyNames") {
|
|
3847
|
-
return
|
|
4239
|
+
return T15.tuple(Object.keys(obj.properties).map((k) => T15.literal(k)));
|
|
3848
4240
|
}
|
|
3849
|
-
if (method === "values") return
|
|
4241
|
+
if (method === "values") return T15.tuple(Object.values(obj.properties));
|
|
3850
4242
|
if (method === "entries") {
|
|
3851
|
-
return
|
|
3852
|
-
Object.keys(obj.properties).map((k) =>
|
|
4243
|
+
return T15.tuple(
|
|
4244
|
+
Object.keys(obj.properties).map((k) => T15.tuple([T15.literal(k), obj.properties[k]]))
|
|
3853
4245
|
);
|
|
3854
4246
|
}
|
|
3855
4247
|
return null;
|
|
@@ -3860,52 +4252,52 @@ function evaluateObjectStaticMethod(method, obj) {
|
|
|
3860
4252
|
const literals = [];
|
|
3861
4253
|
for (const r of per) {
|
|
3862
4254
|
if (r?.kind === "tuple") literals.push(...r.elements);
|
|
3863
|
-
else return
|
|
4255
|
+
else return T15.array(T15.string);
|
|
3864
4256
|
}
|
|
3865
|
-
if (literals.length > 64) return
|
|
3866
|
-
return
|
|
4257
|
+
if (literals.length > 64) return T15.array(T15.string);
|
|
4258
|
+
return T15.tuple(literals);
|
|
3867
4259
|
}
|
|
3868
4260
|
if (method === "values") {
|
|
3869
4261
|
const vals = per.filter((r) => r && r.kind !== "unknown").flatMap((r) => r.kind === "tuple" ? r.elements : [r]);
|
|
3870
|
-
if (per.some((r) => !r || r.kind === "unknown") || vals.length > 64) return
|
|
3871
|
-
return
|
|
4262
|
+
if (per.some((r) => !r || r.kind === "unknown") || vals.length > 64) return T15.array(T15.unknown);
|
|
4263
|
+
return T15.tuple(vals);
|
|
3872
4264
|
}
|
|
3873
4265
|
if (method === "entries") {
|
|
3874
|
-
return
|
|
4266
|
+
return T15.array(T15.tuple([T15.string, T15.unknown]));
|
|
3875
4267
|
}
|
|
3876
4268
|
return null;
|
|
3877
4269
|
}
|
|
3878
4270
|
if (obj.kind === "tuple") {
|
|
3879
4271
|
if (method === "keys" || method === "getOwnPropertyNames") {
|
|
3880
|
-
return
|
|
4272
|
+
return T15.tuple(obj.elements.map((_, i) => T15.literal(String(i))));
|
|
3881
4273
|
}
|
|
3882
|
-
if (method === "values") return
|
|
4274
|
+
if (method === "values") return T15.tuple([...obj.elements]);
|
|
3883
4275
|
if (method === "entries") {
|
|
3884
|
-
return
|
|
4276
|
+
return T15.tuple(obj.elements.map((el, i) => T15.tuple([T15.literal(String(i)), el])));
|
|
3885
4277
|
}
|
|
3886
4278
|
return null;
|
|
3887
4279
|
}
|
|
3888
4280
|
if (obj.kind !== "object") {
|
|
3889
|
-
if (method === "keys") return
|
|
3890
|
-
if (method === "values") return
|
|
3891
|
-
if (method === "entries") return
|
|
4281
|
+
if (method === "keys") return T15.array(T15.string);
|
|
4282
|
+
if (method === "values") return T15.array(T15.unknown);
|
|
4283
|
+
if (method === "entries") return T15.array(T15.tuple([T15.string, T15.unknown]));
|
|
3892
4284
|
return null;
|
|
3893
4285
|
}
|
|
3894
4286
|
const keys = Object.keys(obj.properties);
|
|
3895
4287
|
const values = Object.values(obj.properties);
|
|
3896
4288
|
if (method === "keys") {
|
|
3897
|
-
return
|
|
4289
|
+
return T15.tuple(keys.map((k) => T15.literal(k)));
|
|
3898
4290
|
}
|
|
3899
4291
|
if (method === "values") {
|
|
3900
|
-
return
|
|
4292
|
+
return T15.tuple(values);
|
|
3901
4293
|
}
|
|
3902
4294
|
if (method === "entries") {
|
|
3903
|
-
return
|
|
3904
|
-
keys.map((k) =>
|
|
4295
|
+
return T15.tuple(
|
|
4296
|
+
keys.map((k) => T15.tuple([T15.literal(k), obj.properties[k]]))
|
|
3905
4297
|
);
|
|
3906
4298
|
}
|
|
3907
4299
|
if (method === "getOwnPropertyNames") {
|
|
3908
|
-
return
|
|
4300
|
+
return T15.tuple(keys.map((k) => T15.literal(k)));
|
|
3909
4301
|
}
|
|
3910
4302
|
return null;
|
|
3911
4303
|
}
|
|
@@ -3919,51 +4311,51 @@ function evaluateArrayMethodValues(arr, method, argVals) {
|
|
|
3919
4311
|
if (method === "push") {
|
|
3920
4312
|
if (arr.kind === "tuple") {
|
|
3921
4313
|
arr.elements.push(...argVals);
|
|
3922
|
-
return
|
|
4314
|
+
return T15.literal(arr.elements.length);
|
|
3923
4315
|
}
|
|
3924
|
-
return
|
|
4316
|
+
return T15.number;
|
|
3925
4317
|
}
|
|
3926
4318
|
if (method === "length") {
|
|
3927
|
-
return arr.kind === "tuple" ?
|
|
4319
|
+
return arr.kind === "tuple" ? T15.literal(arr.elements.length) : T15.number;
|
|
3928
4320
|
}
|
|
3929
4321
|
if (method === "pop" || method === "shift") {
|
|
3930
4322
|
if (arr.kind === "tuple") {
|
|
3931
|
-
if (arr.elements.length === 0) return
|
|
3932
|
-
return
|
|
4323
|
+
if (arr.elements.length === 0) return T15.undefined;
|
|
4324
|
+
return T15.union(...arr.elements);
|
|
3933
4325
|
}
|
|
3934
|
-
return
|
|
4326
|
+
return T15.unknown;
|
|
3935
4327
|
}
|
|
3936
4328
|
if (method === "unshift") {
|
|
3937
4329
|
if (arr.kind === "tuple") {
|
|
3938
|
-
return
|
|
4330
|
+
return T15.literal(arr.elements.length + argVals.length);
|
|
3939
4331
|
}
|
|
3940
|
-
return
|
|
4332
|
+
return T15.number;
|
|
3941
4333
|
}
|
|
3942
4334
|
if (method === "indexOf" || method === "lastIndexOf") {
|
|
3943
|
-
return
|
|
4335
|
+
return T15.number;
|
|
3944
4336
|
}
|
|
3945
4337
|
if (method === "includes") {
|
|
3946
4338
|
if (arr.kind === "tuple" && argVals[0]?.kind === "literal") {
|
|
3947
4339
|
const searchVal = argVals[0];
|
|
3948
4340
|
const found = arr.elements.some((e) => typeValueEquals4(e, searchVal));
|
|
3949
|
-
return
|
|
4341
|
+
return T15.literal(found);
|
|
3950
4342
|
}
|
|
3951
|
-
return
|
|
4343
|
+
return T15.boolean;
|
|
3952
4344
|
}
|
|
3953
4345
|
if (method === "join") {
|
|
3954
|
-
return
|
|
4346
|
+
return T15.string;
|
|
3955
4347
|
}
|
|
3956
4348
|
if (method === "concat") {
|
|
3957
4349
|
if (arr.kind === "tuple") {
|
|
3958
4350
|
const otherElements = [];
|
|
3959
4351
|
for (const a of argVals) {
|
|
3960
4352
|
if (a.kind === "tuple") otherElements.push(...a.elements);
|
|
3961
|
-
else if (a.kind === "array") return
|
|
4353
|
+
else if (a.kind === "array") return T15.array(simplifyUnion8([...arr.elements, a.element]));
|
|
3962
4354
|
else otherElements.push(a);
|
|
3963
4355
|
}
|
|
3964
|
-
return
|
|
4356
|
+
return T15.tuple([...arr.elements, ...otherElements]);
|
|
3965
4357
|
}
|
|
3966
|
-
return
|
|
4358
|
+
return T15.array(arr.element);
|
|
3967
4359
|
}
|
|
3968
4360
|
if (method === "slice") {
|
|
3969
4361
|
if (arr.kind === "tuple") {
|
|
@@ -3971,103 +4363,130 @@ function evaluateArrayMethodValues(arr, method, argVals) {
|
|
|
3971
4363
|
const end = argVals[1];
|
|
3972
4364
|
const startIdx = start?.kind === "literal" && typeof start.value === "number" ? start.value : 0;
|
|
3973
4365
|
const endIdx = end?.kind === "literal" && typeof end.value === "number" ? end.value : arr.elements.length;
|
|
3974
|
-
return
|
|
4366
|
+
return T15.tuple(arr.elements.slice(startIdx, endIdx));
|
|
3975
4367
|
}
|
|
3976
|
-
return
|
|
4368
|
+
return T15.array(arr.element);
|
|
3977
4369
|
}
|
|
3978
4370
|
if (callbackFn && callbackFn.kind === "union" && callbackFn.members.length > 0 && callbackFn.members.every((m) => m.kind === "function")) {
|
|
3979
4371
|
return distributeOverUnion(callbackFn, (member) => {
|
|
3980
4372
|
const r = evaluateArrayMethodValues(arr, method, [member, ...argVals.slice(1)]);
|
|
3981
|
-
return r === null ?
|
|
4373
|
+
return r === null ? T15.unknown : r;
|
|
3982
4374
|
});
|
|
3983
4375
|
}
|
|
3984
4376
|
if (!callbackFn || callbackFn.kind !== "function") {
|
|
3985
|
-
if (method === "map") return arr.kind === "tuple" ?
|
|
3986
|
-
if (method === "filter") return arr.kind === "tuple" ?
|
|
3987
|
-
if (method === "find") return arr.kind === "tuple" ?
|
|
3988
|
-
if (method === "some" || method === "every") return
|
|
3989
|
-
if (method === "reduce") return argVals[1] ??
|
|
3990
|
-
if (method === "forEach") return
|
|
3991
|
-
if (method === "flatMap") return
|
|
4377
|
+
if (method === "map") return arr.kind === "tuple" ? T15.tuple(arr.elements.map(() => T15.unknown)) : T15.array(T15.unknown);
|
|
4378
|
+
if (method === "filter") return arr.kind === "tuple" ? T15.array(simplifyUnion8(arr.elements)) : arr;
|
|
4379
|
+
if (method === "find") return arr.kind === "tuple" ? simplifyUnion8([...arr.elements, T15.undefined]) : simplifyUnion8([arr.element, T15.undefined]);
|
|
4380
|
+
if (method === "some" || method === "every") return T15.boolean;
|
|
4381
|
+
if (method === "reduce") return argVals[1] ?? T15.unknown;
|
|
4382
|
+
if (method === "forEach") return T15.undefined;
|
|
4383
|
+
if (method === "flatMap") return T15.array(T15.unknown);
|
|
3992
4384
|
return null;
|
|
3993
4385
|
}
|
|
3994
4386
|
const fn = callbackFn;
|
|
4387
|
+
const tagEl = (el, name) => {
|
|
4388
|
+
const tagged = tagParamArg(el, name);
|
|
4389
|
+
copyOrigin(el, tagged);
|
|
4390
|
+
return tagged;
|
|
4391
|
+
};
|
|
3995
4392
|
if (method === "map") {
|
|
3996
4393
|
if (arr.kind === "tuple") {
|
|
3997
4394
|
const mapped = arr.elements.map(
|
|
3998
|
-
(el, i) => callFunction(fn, [el,
|
|
4395
|
+
(el, i) => callFunction(fn, [tagEl(el, fn.params[0] ?? "item"), T15.literal(i), arr])
|
|
3999
4396
|
);
|
|
4000
|
-
return
|
|
4397
|
+
return T15.tuple(mapped);
|
|
4001
4398
|
}
|
|
4002
|
-
return
|
|
4399
|
+
return T15.array(
|
|
4400
|
+
callFunction(fn, [tagEl(arr.element, fn.params[0] ?? "item"), T15.number, arr])
|
|
4401
|
+
);
|
|
4003
4402
|
}
|
|
4004
4403
|
if (method === "filter") {
|
|
4005
4404
|
if (arr.kind === "tuple") {
|
|
4006
4405
|
const kept = [];
|
|
4007
4406
|
for (let i = 0; i < arr.elements.length; i++) {
|
|
4008
|
-
const result = callFunction(fn, [
|
|
4407
|
+
const result = callFunction(fn, [
|
|
4408
|
+
tagEl(arr.elements[i], fn.params[0] ?? "item"),
|
|
4409
|
+
T15.literal(i),
|
|
4410
|
+
arr
|
|
4411
|
+
]);
|
|
4009
4412
|
if (result.kind === "literal" && !result.value) continue;
|
|
4010
4413
|
kept.push(arr.elements[i]);
|
|
4011
4414
|
}
|
|
4012
|
-
if (kept.length === 0) return
|
|
4013
|
-
return
|
|
4415
|
+
if (kept.length === 0) return T15.tuple([]);
|
|
4416
|
+
return T15.array(simplifyUnion8(kept));
|
|
4014
4417
|
}
|
|
4015
|
-
return
|
|
4418
|
+
return T15.array(arr.element);
|
|
4016
4419
|
}
|
|
4017
4420
|
if (method === "reduce") {
|
|
4018
4421
|
const init = argVals[1];
|
|
4019
4422
|
if (arr.kind === "tuple") {
|
|
4020
|
-
let acc2 = init ?? arr.elements[0] ??
|
|
4423
|
+
let acc2 = init ?? arr.elements[0] ?? T15.unknown;
|
|
4021
4424
|
const startIdx = init ? 0 : 1;
|
|
4022
4425
|
for (let i = startIdx; i < arr.elements.length; i++) {
|
|
4023
|
-
acc2 = callFunction(fn, [
|
|
4426
|
+
acc2 = callFunction(fn, [
|
|
4427
|
+
acc2,
|
|
4428
|
+
tagEl(arr.elements[i], fn.params[1] ?? "item"),
|
|
4429
|
+
T15.literal(i),
|
|
4430
|
+
arr
|
|
4431
|
+
]);
|
|
4024
4432
|
}
|
|
4025
4433
|
return acc2;
|
|
4026
4434
|
}
|
|
4027
|
-
const
|
|
4028
|
-
|
|
4029
|
-
|
|
4435
|
+
const acc0 = init ?? arr.element;
|
|
4436
|
+
let acc = acc0;
|
|
4437
|
+
for (let i = 0; i < 6; i++) {
|
|
4438
|
+
const next = callFunction(fn, [
|
|
4439
|
+
acc,
|
|
4440
|
+
tagEl(arr.element, fn.params[1] ?? "item"),
|
|
4441
|
+
T15.number,
|
|
4442
|
+
arr
|
|
4443
|
+
]);
|
|
4444
|
+
if (typeValueEquals4(acc, next)) return next;
|
|
4445
|
+
if (next.kind === "unknown") return acc;
|
|
4446
|
+
acc = simplifyUnion8([acc, next]);
|
|
4447
|
+
}
|
|
4448
|
+
return acc;
|
|
4030
4449
|
}
|
|
4031
4450
|
if (method === "find") {
|
|
4032
|
-
const elementType = arr.kind === "tuple" ?
|
|
4033
|
-
return
|
|
4451
|
+
const elementType = arr.kind === "tuple" ? simplifyUnion8(arr.elements) : arr.element;
|
|
4452
|
+
return simplifyUnion8([elementType, T15.undefined]);
|
|
4034
4453
|
}
|
|
4035
4454
|
if (method === "some" || method === "every") {
|
|
4036
4455
|
if (arr.kind === "tuple") {
|
|
4037
4456
|
const results = arr.elements.map(
|
|
4038
|
-
(el, i) => callFunction(fn, [el,
|
|
4457
|
+
(el, i) => callFunction(fn, [el, T15.literal(i), arr])
|
|
4039
4458
|
);
|
|
4040
4459
|
const allLiteral = results.every((r) => r.kind === "literal");
|
|
4041
4460
|
if (allLiteral) {
|
|
4042
4461
|
const boolVals = results.map((r) => !!r.value);
|
|
4043
|
-
return
|
|
4462
|
+
return T15.literal(method === "some" ? boolVals.some(Boolean) : boolVals.every(Boolean));
|
|
4044
4463
|
}
|
|
4045
4464
|
}
|
|
4046
|
-
return
|
|
4465
|
+
return T15.boolean;
|
|
4047
4466
|
}
|
|
4048
4467
|
if (method === "forEach") {
|
|
4049
4468
|
if (arr.kind === "tuple") {
|
|
4050
|
-
arr.elements.forEach((el, i) => callFunction(fn, [el,
|
|
4469
|
+
arr.elements.forEach((el, i) => callFunction(fn, [el, T15.literal(i), arr]));
|
|
4051
4470
|
} else {
|
|
4052
|
-
callFunction(fn, [arr.element,
|
|
4471
|
+
callFunction(fn, [arr.element, T15.number, arr]);
|
|
4053
4472
|
}
|
|
4054
|
-
return
|
|
4473
|
+
return T15.undefined;
|
|
4055
4474
|
}
|
|
4056
4475
|
if (method === "flatMap") {
|
|
4057
4476
|
if (arr.kind === "tuple") {
|
|
4058
4477
|
const results = [];
|
|
4059
4478
|
for (let i = 0; i < arr.elements.length; i++) {
|
|
4060
|
-
const r2 = callFunction(fn, [arr.elements[i],
|
|
4479
|
+
const r2 = callFunction(fn, [arr.elements[i], T15.literal(i), arr]);
|
|
4061
4480
|
if (r2.kind === "tuple") results.push(...r2.elements);
|
|
4062
|
-
else if (r2.kind === "array") return
|
|
4481
|
+
else if (r2.kind === "array") return T15.array(r2.element);
|
|
4063
4482
|
else results.push(r2);
|
|
4064
4483
|
}
|
|
4065
|
-
return
|
|
4484
|
+
return T15.tuple(results);
|
|
4066
4485
|
}
|
|
4067
|
-
const r = callFunction(fn, [arr.element,
|
|
4068
|
-
if (r.kind === "tuple") return
|
|
4069
|
-
if (r.kind === "array") return
|
|
4070
|
-
return
|
|
4486
|
+
const r = callFunction(fn, [arr.element, T15.number, arr]);
|
|
4487
|
+
if (r.kind === "tuple") return T15.array(simplifyUnion8(r.elements));
|
|
4488
|
+
if (r.kind === "array") return T15.array(r.element);
|
|
4489
|
+
return T15.array(r);
|
|
4071
4490
|
}
|
|
4072
4491
|
return null;
|
|
4073
4492
|
}
|
|
@@ -4076,16 +4495,16 @@ function iterableSpreadValue(v) {
|
|
|
4076
4495
|
if (v.kind === "instance" && v.className === "Set") {
|
|
4077
4496
|
const values = exactSetValues(v);
|
|
4078
4497
|
if (values) {
|
|
4079
|
-
return values.length <= MAX_ITERABLE_SPREAD ?
|
|
4498
|
+
return values.length <= MAX_ITERABLE_SPREAD ? T15.tuple([...values]) : setValuesIterable(v);
|
|
4080
4499
|
}
|
|
4081
4500
|
const t = v._typeArgs?.T;
|
|
4082
|
-
return t && t.kind !== "unknown" ?
|
|
4501
|
+
return t && t.kind !== "unknown" ? T15.array(t) : void 0;
|
|
4083
4502
|
}
|
|
4084
4503
|
if (v.kind === "instance" && v.className === "Map") {
|
|
4085
4504
|
const entries = exactMapEntries(v);
|
|
4086
4505
|
if (entries && entries.length > MAX_ITERABLE_SPREAD) {
|
|
4087
4506
|
const ta = v._typeArgs ?? {};
|
|
4088
|
-
return
|
|
4507
|
+
return T15.array(T15.tuple([ta.K ?? T15.unknown, ta.V ?? T15.unknown]));
|
|
4089
4508
|
}
|
|
4090
4509
|
return mapEntriesIterable(v);
|
|
4091
4510
|
}
|
|
@@ -4099,7 +4518,7 @@ function evaluateForOf(node, iterable, env) {
|
|
|
4099
4518
|
const memberResult = evaluateForOf(node, member, currentEnv);
|
|
4100
4519
|
if (isReturn(memberResult)) {
|
|
4101
4520
|
returnValues.push(memberResult.value);
|
|
4102
|
-
return makeReturn(
|
|
4521
|
+
return makeReturn(simplifyUnion8(returnValues));
|
|
4103
4522
|
}
|
|
4104
4523
|
if (isBranch(memberResult)) {
|
|
4105
4524
|
returnValues.push(memberResult.returnedValue);
|
|
@@ -4107,9 +4526,9 @@ function evaluateForOf(node, iterable, env) {
|
|
|
4107
4526
|
}
|
|
4108
4527
|
}
|
|
4109
4528
|
if (returnValues.length > 0) {
|
|
4110
|
-
return makeBranch(
|
|
4529
|
+
return makeBranch(simplifyUnion8(returnValues), currentEnv);
|
|
4111
4530
|
}
|
|
4112
|
-
return
|
|
4531
|
+
return T15.undefined;
|
|
4113
4532
|
}
|
|
4114
4533
|
if (iterable.kind === "tuple") {
|
|
4115
4534
|
const returnValues = [];
|
|
@@ -4120,7 +4539,7 @@ function evaluateForOf(node, iterable, env) {
|
|
|
4120
4539
|
const result = evaluate(node.body, loopEnv);
|
|
4121
4540
|
if (isReturn(result)) {
|
|
4122
4541
|
returnValues.push(result.value);
|
|
4123
|
-
return makeReturn(
|
|
4542
|
+
return makeReturn(simplifyUnion8(returnValues));
|
|
4124
4543
|
}
|
|
4125
4544
|
if (isBranch(result)) {
|
|
4126
4545
|
returnValues.push(result.returnedValue);
|
|
@@ -4129,36 +4548,36 @@ function evaluateForOf(node, iterable, env) {
|
|
|
4129
4548
|
if (loopSignalKind(result) === "break") break;
|
|
4130
4549
|
}
|
|
4131
4550
|
if (returnValues.length > 0) {
|
|
4132
|
-
return makeBranch(
|
|
4551
|
+
return makeBranch(simplifyUnion8(returnValues), currentEnv);
|
|
4133
4552
|
}
|
|
4134
|
-
return
|
|
4553
|
+
return T15.undefined;
|
|
4135
4554
|
}
|
|
4136
4555
|
if (iterable.kind === "array") {
|
|
4137
4556
|
const loopEnv = env.fork();
|
|
4138
4557
|
bindForLoopVar(node.left, iterable.element, loopEnv);
|
|
4139
4558
|
const result = evaluate(node.body, loopEnv);
|
|
4140
4559
|
if (isReturn(result)) return makeBranch(result.value, env);
|
|
4141
|
-
return
|
|
4560
|
+
return T15.undefined;
|
|
4142
4561
|
}
|
|
4143
4562
|
if (iterable.kind === "instance" && iterable.className === "Set") {
|
|
4144
4563
|
const values = exactSetValues(iterable);
|
|
4145
4564
|
if (values && values.length > 0) {
|
|
4146
|
-
return evaluateForOf(node,
|
|
4565
|
+
return evaluateForOf(node, T15.tuple([...values]), env);
|
|
4147
4566
|
}
|
|
4148
|
-
return
|
|
4567
|
+
return T15.undefined;
|
|
4149
4568
|
}
|
|
4150
4569
|
if (iterable.kind === "instance" && iterable.className === "Map") {
|
|
4151
4570
|
const entries = exactMapEntries(iterable);
|
|
4152
4571
|
if (entries && entries.length > 0) {
|
|
4153
4572
|
return evaluateForOf(
|
|
4154
4573
|
node,
|
|
4155
|
-
|
|
4574
|
+
T15.tuple(entries.map((e) => T15.tuple([e.key, e.value]))),
|
|
4156
4575
|
env
|
|
4157
4576
|
);
|
|
4158
4577
|
}
|
|
4159
|
-
return
|
|
4578
|
+
return T15.undefined;
|
|
4160
4579
|
}
|
|
4161
|
-
return
|
|
4580
|
+
return T15.undefined;
|
|
4162
4581
|
}
|
|
4163
4582
|
function evaluateForIn(node, obj, env) {
|
|
4164
4583
|
if (obj.kind === "object") {
|
|
@@ -4168,11 +4587,11 @@ function evaluateForIn(node, obj, env) {
|
|
|
4168
4587
|
let currentEnv = env;
|
|
4169
4588
|
for (const key of keys) {
|
|
4170
4589
|
const loopEnv2 = currentEnv.extend({});
|
|
4171
|
-
bindForLoopVar(node.left,
|
|
4590
|
+
bindForLoopVar(node.left, T15.literal(key), loopEnv2);
|
|
4172
4591
|
const result = evaluate(node.body, loopEnv2);
|
|
4173
4592
|
if (isReturn(result)) {
|
|
4174
4593
|
returnValues.push(result.value);
|
|
4175
|
-
return makeReturn(
|
|
4594
|
+
return makeReturn(simplifyUnion8(returnValues));
|
|
4176
4595
|
}
|
|
4177
4596
|
if (isBranch(result)) {
|
|
4178
4597
|
returnValues.push(result.returnedValue);
|
|
@@ -4181,15 +4600,15 @@ function evaluateForIn(node, obj, env) {
|
|
|
4181
4600
|
if (loopSignalKind(result) === "break") break;
|
|
4182
4601
|
}
|
|
4183
4602
|
if (returnValues.length > 0) {
|
|
4184
|
-
return makeBranch(
|
|
4603
|
+
return makeBranch(simplifyUnion8(returnValues), currentEnv);
|
|
4185
4604
|
}
|
|
4186
|
-
return
|
|
4605
|
+
return T15.undefined;
|
|
4187
4606
|
}
|
|
4188
4607
|
}
|
|
4189
4608
|
const loopEnv = env.fork();
|
|
4190
|
-
bindForLoopVar(node.left,
|
|
4609
|
+
bindForLoopVar(node.left, T15.string, loopEnv);
|
|
4191
4610
|
evaluate(node.body, loopEnv);
|
|
4192
|
-
return
|
|
4611
|
+
return T15.undefined;
|
|
4193
4612
|
}
|
|
4194
4613
|
function bindForLoopVar(left, value, env) {
|
|
4195
4614
|
if (left.type === "VariableDeclaration") {
|
|
@@ -4290,9 +4709,9 @@ function evaluateForStatement(node, env) {
|
|
|
4290
4709
|
if (!env.update(name, val)) env.bind(name, val);
|
|
4291
4710
|
}
|
|
4292
4711
|
if (returnValues.length > 0) {
|
|
4293
|
-
return makeBranch(
|
|
4712
|
+
return makeBranch(simplifyUnion8(returnValues), env);
|
|
4294
4713
|
}
|
|
4295
|
-
return
|
|
4714
|
+
return T15.undefined;
|
|
4296
4715
|
}
|
|
4297
4716
|
function evaluateWhileStatement(node, env) {
|
|
4298
4717
|
const returnValues = [];
|
|
@@ -4312,9 +4731,9 @@ function evaluateWhileStatement(node, env) {
|
|
|
4312
4731
|
if (loopSignalKind(bodyResult) === "break") break;
|
|
4313
4732
|
}
|
|
4314
4733
|
if (returnValues.length > 0) {
|
|
4315
|
-
return makeBranch(
|
|
4734
|
+
return makeBranch(simplifyUnion8(returnValues), env);
|
|
4316
4735
|
}
|
|
4317
|
-
return
|
|
4736
|
+
return T15.undefined;
|
|
4318
4737
|
}
|
|
4319
4738
|
function evaluateDoWhileStatement(node, env) {
|
|
4320
4739
|
const returnValues = [];
|
|
@@ -4334,9 +4753,9 @@ function evaluateDoWhileStatement(node, env) {
|
|
|
4334
4753
|
if (tv.kind !== "literal") break;
|
|
4335
4754
|
}
|
|
4336
4755
|
if (returnValues.length > 0) {
|
|
4337
|
-
return makeBranch(
|
|
4756
|
+
return makeBranch(simplifyUnion8(returnValues), env);
|
|
4338
4757
|
}
|
|
4339
|
-
return
|
|
4758
|
+
return T15.undefined;
|
|
4340
4759
|
}
|
|
4341
4760
|
function moduleLabel(pathOrSpecifier) {
|
|
4342
4761
|
const base = pathOrSpecifier.replace(/^.*\//, "");
|
|
@@ -4407,7 +4826,7 @@ function namespaceFromExportBindings(env) {
|
|
|
4407
4826
|
exports[k === "__export_default" ? "default" : k.slice("__export_".length)] = v;
|
|
4408
4827
|
}
|
|
4409
4828
|
if (Object.keys(exports).length === 0) return null;
|
|
4410
|
-
return
|
|
4829
|
+
return T15.object(exports);
|
|
4411
4830
|
}
|
|
4412
4831
|
function commonJsExportsValue(moduleEnv) {
|
|
4413
4832
|
if (moduleEnv.has("module")) {
|
|
@@ -4422,27 +4841,7 @@ function commonJsExportsValue(moduleEnv) {
|
|
|
4422
4841
|
}
|
|
4423
4842
|
}
|
|
4424
4843
|
}
|
|
4425
|
-
return
|
|
4426
|
-
}
|
|
4427
|
-
function jsonToTypeValue(v) {
|
|
4428
|
-
if (v === null) return T12.literal(null);
|
|
4429
|
-
if (typeof v === "string") return T12.literal(v);
|
|
4430
|
-
if (typeof v === "number") return T12.literal(v);
|
|
4431
|
-
if (typeof v === "boolean") return T12.literal(v);
|
|
4432
|
-
if (Array.isArray(v)) return T12.tuple(v.map(jsonToTypeValue));
|
|
4433
|
-
if (typeof v === "object") {
|
|
4434
|
-
const props = {};
|
|
4435
|
-
for (const [k, val] of Object.entries(v)) {
|
|
4436
|
-
Object.defineProperty(props, k, {
|
|
4437
|
-
value: jsonToTypeValue(val),
|
|
4438
|
-
enumerable: true,
|
|
4439
|
-
writable: true,
|
|
4440
|
-
configurable: true
|
|
4441
|
-
});
|
|
4442
|
-
}
|
|
4443
|
-
return T12.object(props);
|
|
4444
|
-
}
|
|
4445
|
-
return T12.unknown;
|
|
4844
|
+
return T15.unknown;
|
|
4446
4845
|
}
|
|
4447
4846
|
function evaluateRequireCall(node, _env) {
|
|
4448
4847
|
const arg = node.arguments[0];
|
|
@@ -4453,7 +4852,7 @@ function evaluateRequireCall(node, _env) {
|
|
|
4453
4852
|
loc: node.loc,
|
|
4454
4853
|
reason: "require() with non-literal specifier"
|
|
4455
4854
|
});
|
|
4456
|
-
return
|
|
4855
|
+
return T15.unknown;
|
|
4457
4856
|
}
|
|
4458
4857
|
const specifier = arg.value;
|
|
4459
4858
|
if (!specifier.startsWith(".") && !specifier.startsWith("/")) {
|
|
@@ -4463,9 +4862,9 @@ function evaluateRequireCall(node, _env) {
|
|
|
4463
4862
|
loc: node.loc,
|
|
4464
4863
|
reason: `bare module specifier '${specifier}' is not resolved (npm packages unsupported)`
|
|
4465
4864
|
});
|
|
4466
|
-
return
|
|
4865
|
+
return T15.unknown;
|
|
4467
4866
|
}
|
|
4468
|
-
if (!currentModuleResolver) return
|
|
4867
|
+
if (!currentModuleResolver) return T15.unknown;
|
|
4469
4868
|
const resolved = currentModuleResolver(specifier, currentFileDir);
|
|
4470
4869
|
if (!resolved) {
|
|
4471
4870
|
recordUnknown({
|
|
@@ -4474,7 +4873,7 @@ function evaluateRequireCall(node, _env) {
|
|
|
4474
4873
|
loc: node.loc,
|
|
4475
4874
|
reason: `Cannot resolve require('${specifier}'): no file at ${attemptedFullPath(currentFileDir, specifier)} (with or without .js/.ts/.mjs extension)`
|
|
4476
4875
|
});
|
|
4477
|
-
return
|
|
4876
|
+
return T15.unknown;
|
|
4478
4877
|
}
|
|
4479
4878
|
if ("json" in resolved && resolved.json !== void 0) {
|
|
4480
4879
|
return jsonToTypeValue(resolved.json);
|
|
@@ -4498,15 +4897,15 @@ function evaluateImportDeclaration(node, env) {
|
|
|
4498
4897
|
if (spec.type === "ImportSpecifier") {
|
|
4499
4898
|
const importedName = spec.imported.type === "Identifier" ? spec.imported.name : null;
|
|
4500
4899
|
if (importedName && mockModule.names.includes(importedName)) {
|
|
4501
|
-
const val = mockEnv.has(`__export_${importedName}`) ? mockEnv.lookup(`__export_${importedName}`) :
|
|
4900
|
+
const val = mockEnv.has(`__export_${importedName}`) ? mockEnv.lookup(`__export_${importedName}`) : T15.unknown;
|
|
4502
4901
|
env.bind(spec.local.name, val);
|
|
4503
4902
|
} else if (importedName && originalEnv) {
|
|
4504
|
-
const val = originalEnv.has(`__export_${importedName}`) ? originalEnv.lookup(`__export_${importedName}`) :
|
|
4903
|
+
const val = originalEnv.has(`__export_${importedName}`) ? originalEnv.lookup(`__export_${importedName}`) : T15.unknown;
|
|
4505
4904
|
env.bind(spec.local.name, val);
|
|
4506
4905
|
}
|
|
4507
4906
|
} else if (spec.type === "ImportDefaultSpecifier") {
|
|
4508
4907
|
const sourceEnv = originalEnv ?? mockEnv;
|
|
4509
|
-
const val = sourceEnv.has(`__export_default`) ? sourceEnv.lookup(`__export_default`) :
|
|
4908
|
+
const val = sourceEnv.has(`__export_default`) ? sourceEnv.lookup(`__export_default`) : T15.unknown;
|
|
4510
4909
|
env.bind(spec.local.name, val);
|
|
4511
4910
|
} else if (spec.type === "ImportNamespaceSpecifier") {
|
|
4512
4911
|
const exports = {};
|
|
@@ -4527,19 +4926,19 @@ function evaluateImportDeclaration(node, env) {
|
|
|
4527
4926
|
}
|
|
4528
4927
|
}
|
|
4529
4928
|
}
|
|
4530
|
-
env.bind(spec.local.name,
|
|
4929
|
+
env.bind(spec.local.name, T15.object(exports));
|
|
4531
4930
|
}
|
|
4532
4931
|
}
|
|
4533
|
-
return
|
|
4932
|
+
return T15.undefined;
|
|
4534
4933
|
}
|
|
4535
4934
|
for (const spec of node.specifiers) {
|
|
4536
4935
|
if (spec.type === "ImportDefaultSpecifier") {
|
|
4537
|
-
const val = mockEnv.has(`__export_default`) ? mockEnv.lookup(`__export_default`) :
|
|
4936
|
+
const val = mockEnv.has(`__export_default`) ? mockEnv.lookup(`__export_default`) : T15.unknown;
|
|
4538
4937
|
env.bind(spec.local.name, val);
|
|
4539
4938
|
} else if (spec.type === "ImportSpecifier") {
|
|
4540
4939
|
const importedName = spec.imported.type === "Identifier" ? spec.imported.name : null;
|
|
4541
4940
|
if (importedName) {
|
|
4542
|
-
const val = mockEnv.has(`__export_${importedName}`) ? mockEnv.lookup(`__export_${importedName}`) :
|
|
4941
|
+
const val = mockEnv.has(`__export_${importedName}`) ? mockEnv.lookup(`__export_${importedName}`) : T15.unknown;
|
|
4543
4942
|
env.bind(spec.local.name, val);
|
|
4544
4943
|
}
|
|
4545
4944
|
} else if (spec.type === "ImportNamespaceSpecifier") {
|
|
@@ -4550,10 +4949,10 @@ function evaluateImportDeclaration(node, env) {
|
|
|
4550
4949
|
exports[k.slice("__export_".length)] = v;
|
|
4551
4950
|
}
|
|
4552
4951
|
}
|
|
4553
|
-
env.bind(spec.local.name,
|
|
4952
|
+
env.bind(spec.local.name, T15.object(exports));
|
|
4554
4953
|
}
|
|
4555
4954
|
}
|
|
4556
|
-
return
|
|
4955
|
+
return T15.undefined;
|
|
4557
4956
|
}
|
|
4558
4957
|
recordUnknown({
|
|
4559
4958
|
kind: "global",
|
|
@@ -4567,20 +4966,20 @@ function evaluateImportDeclaration(node, env) {
|
|
|
4567
4966
|
for (const spec of node.specifiers) {
|
|
4568
4967
|
if (spec.type === "ImportDefaultSpecifier") {
|
|
4569
4968
|
const defaultExport = envModule["default"];
|
|
4570
|
-
env.bind(spec.local.name, defaultExport ??
|
|
4969
|
+
env.bind(spec.local.name, defaultExport ?? T15.unknown);
|
|
4571
4970
|
} else if (spec.type === "ImportSpecifier") {
|
|
4572
4971
|
const importedName = spec.imported.type === "Identifier" ? spec.imported.name : null;
|
|
4573
4972
|
if (importedName) {
|
|
4574
|
-
env.bind(spec.local.name, envModule[importedName] ??
|
|
4973
|
+
env.bind(spec.local.name, envModule[importedName] ?? T15.unknown);
|
|
4575
4974
|
}
|
|
4576
4975
|
} else if (spec.type === "ImportNamespaceSpecifier") {
|
|
4577
4976
|
const { default: _default, ...rest } = envModule;
|
|
4578
|
-
env.bind(spec.local.name,
|
|
4977
|
+
env.bind(spec.local.name, T15.object(rest));
|
|
4579
4978
|
}
|
|
4580
4979
|
}
|
|
4581
|
-
return
|
|
4980
|
+
return T15.undefined;
|
|
4582
4981
|
}
|
|
4583
|
-
if (!currentModuleResolver) return
|
|
4982
|
+
if (!currentModuleResolver) return T15.undefined;
|
|
4584
4983
|
const resolved = currentModuleResolver(source, currentFileDir);
|
|
4585
4984
|
if (!resolved) {
|
|
4586
4985
|
if (source.startsWith(".") || source.startsWith("/")) {
|
|
@@ -4591,17 +4990,17 @@ function evaluateImportDeclaration(node, env) {
|
|
|
4591
4990
|
reason: `Cannot resolve import '${source}': no file at ${attemptedFullPath(currentFileDir, source)} (with or without .js/.ts/.mjs extension)`
|
|
4592
4991
|
});
|
|
4593
4992
|
}
|
|
4594
|
-
return
|
|
4993
|
+
return T15.undefined;
|
|
4595
4994
|
}
|
|
4596
4995
|
const moduleEnv = loadModuleEnv(resolved, node.loc);
|
|
4597
4996
|
for (const spec of node.specifiers) {
|
|
4598
4997
|
if (spec.type === "ImportDefaultSpecifier") {
|
|
4599
|
-
const val = moduleEnv.has(`__export_default`) ? moduleEnv.lookup(`__export_default`) :
|
|
4998
|
+
const val = moduleEnv.has(`__export_default`) ? moduleEnv.lookup(`__export_default`) : T15.unknown;
|
|
4600
4999
|
env.bind(spec.local.name, val);
|
|
4601
5000
|
} else if (spec.type === "ImportSpecifier") {
|
|
4602
5001
|
const importedName = spec.imported.type === "Identifier" ? spec.imported.name : null;
|
|
4603
5002
|
if (importedName) {
|
|
4604
|
-
const val = moduleEnv.has(`__export_${importedName}`) ? moduleEnv.lookup(`__export_${importedName}`) :
|
|
5003
|
+
const val = moduleEnv.has(`__export_${importedName}`) ? moduleEnv.lookup(`__export_${importedName}`) : T15.unknown;
|
|
4605
5004
|
env.bind(spec.local.name, val);
|
|
4606
5005
|
}
|
|
4607
5006
|
} else if (spec.type === "ImportNamespaceSpecifier") {
|
|
@@ -4612,10 +5011,10 @@ function evaluateImportDeclaration(node, env) {
|
|
|
4612
5011
|
exports[k.slice("__export_".length)] = v;
|
|
4613
5012
|
}
|
|
4614
5013
|
}
|
|
4615
|
-
env.bind(spec.local.name,
|
|
5014
|
+
env.bind(spec.local.name, T15.object(exports));
|
|
4616
5015
|
}
|
|
4617
5016
|
}
|
|
4618
|
-
return
|
|
5017
|
+
return T15.undefined;
|
|
4619
5018
|
}
|
|
4620
5019
|
function evaluateClassDeclaration(node, env) {
|
|
4621
5020
|
const className = node.id?.name ?? "<anonymous>";
|
|
@@ -4628,7 +5027,7 @@ function evaluateClassDeclaration(node, env) {
|
|
|
4628
5027
|
const paramNames = member.params.map(
|
|
4629
5028
|
(p) => p.type === "Identifier" ? p.name : `_p${Math.random().toString(36).slice(2, 6)}`
|
|
4630
5029
|
);
|
|
4631
|
-
const fnType =
|
|
5030
|
+
const fnType = T15.fn(paramNames, member.body, env);
|
|
4632
5031
|
fnType._paramPatterns = member.params;
|
|
4633
5032
|
fnType._name = `${className}.${methodName}`;
|
|
4634
5033
|
if (member.async) fnType._async = true;
|
|
@@ -4639,33 +5038,33 @@ function evaluateClassDeclaration(node, env) {
|
|
|
4639
5038
|
methods[methodName] = fnType;
|
|
4640
5039
|
}
|
|
4641
5040
|
}
|
|
4642
|
-
const ctorFn = constructorFn ??
|
|
5041
|
+
const ctorFn = constructorFn ?? T15.fn([], { type: "BlockStatement", body: [], directives: [] }, env);
|
|
4643
5042
|
ctorFn._classInfo = { className, methods };
|
|
4644
5043
|
if (node.id) {
|
|
4645
5044
|
env.bind(className, ctorFn);
|
|
4646
5045
|
}
|
|
4647
|
-
return
|
|
5046
|
+
return T15.undefined;
|
|
4648
5047
|
}
|
|
4649
5048
|
function evaluateInstanceof(left, _right, rightNode, _env) {
|
|
4650
5049
|
const className = rightNode.type === "Identifier" ? rightNode.name : null;
|
|
4651
|
-
if (!className) return
|
|
5050
|
+
if (!className) return T15.boolean;
|
|
4652
5051
|
return distributeOverUnion(left, (lv) => {
|
|
4653
5052
|
if (lv.kind === "instance") {
|
|
4654
|
-
const matches = lv.className === className || isSubtypeOf2(lv,
|
|
4655
|
-
return
|
|
5053
|
+
const matches = lv.className === className || isSubtypeOf2(lv, T15.instanceOf(className));
|
|
5054
|
+
return T15.literal(matches);
|
|
4656
5055
|
}
|
|
4657
5056
|
const structural = builtinInstanceTest(lv, className);
|
|
4658
|
-
if (structural !== void 0) return
|
|
4659
|
-
return
|
|
5057
|
+
if (structural !== void 0) return T15.literal(structural);
|
|
5058
|
+
return T15.boolean;
|
|
4660
5059
|
});
|
|
4661
5060
|
}
|
|
4662
5061
|
var PROMISE_SCAN_MAX_SITES = 16;
|
|
4663
5062
|
var PROMISE_SCAN_MAX_NODES = 2e3;
|
|
4664
5063
|
var _promiseCollectors = /* @__PURE__ */ new WeakSet();
|
|
4665
5064
|
function makePromiseCollector(sink) {
|
|
4666
|
-
const collector =
|
|
4667
|
-
sink.push(args[0] ??
|
|
4668
|
-
return
|
|
5065
|
+
const collector = T15.fnSig([T15.unknown], T15.undefined, T15.never, (args) => {
|
|
5066
|
+
sink.push(args[0] ?? T15.undefined);
|
|
5067
|
+
return T15.undefined;
|
|
4669
5068
|
});
|
|
4670
5069
|
_promiseCollectors.add(collector);
|
|
4671
5070
|
return collector;
|
|
@@ -4722,7 +5121,7 @@ function evaluatePromiseExecutor(executor) {
|
|
|
4722
5121
|
const cur = callEnv.lookup(name);
|
|
4723
5122
|
if (isNullish(cur)) {
|
|
4724
5123
|
const snap = preBodySnapshot.lookup(name);
|
|
4725
|
-
if (!isNullish(snap) && snap !==
|
|
5124
|
+
if (!isNullish(snap) && snap !== T15.undefined) return snap;
|
|
4726
5125
|
}
|
|
4727
5126
|
return cur;
|
|
4728
5127
|
},
|
|
@@ -4742,27 +5141,32 @@ function evaluatePromiseExecutor(executor) {
|
|
|
4742
5141
|
resolveCollected.push(argVal);
|
|
4743
5142
|
}
|
|
4744
5143
|
}
|
|
4745
|
-
return
|
|
5144
|
+
return T15.promise(T15.union(...resolveCollected));
|
|
4746
5145
|
}
|
|
4747
5146
|
function applyPromiseThenCallback(promiseValue, argVals) {
|
|
4748
5147
|
const cb = argVals[0];
|
|
4749
5148
|
if (!cb || cb.kind !== "function") return null;
|
|
4750
5149
|
const result = callFunctionFull(cb, [promiseValue.value]).value;
|
|
4751
|
-
return result.kind === "promise" ? result :
|
|
5150
|
+
return result.kind === "promise" ? result : T15.promise(result);
|
|
4752
5151
|
}
|
|
4753
5152
|
function bindFunctionParams(fn, args, callEnv) {
|
|
4754
5153
|
const paramPatterns = fn._paramPatterns;
|
|
4755
5154
|
for (let i = 0; i < fn.params.length; i++) {
|
|
4756
5155
|
const paramName = fn.params[i];
|
|
4757
5156
|
if (paramName.startsWith("...")) {
|
|
4758
|
-
const restValue =
|
|
5157
|
+
const restValue = T15.tuple(args.slice(i));
|
|
4759
5158
|
if (paramPatterns && paramPatterns[i]) {
|
|
4760
5159
|
bindPattern(paramPatterns[i], restValue, callEnv);
|
|
4761
5160
|
} else {
|
|
4762
5161
|
callEnv.bind(paramName.slice(3), restValue);
|
|
4763
5162
|
}
|
|
4764
5163
|
} else {
|
|
4765
|
-
|
|
5164
|
+
let argVal = args[i] ?? T15.undefined;
|
|
5165
|
+
{
|
|
5166
|
+
const tagged = tagParamArg(argVal, paramName);
|
|
5167
|
+
copyOrigin(argVal, tagged);
|
|
5168
|
+
argVal = tagged;
|
|
5169
|
+
}
|
|
4766
5170
|
if (paramPatterns && paramPatterns[i]) {
|
|
4767
5171
|
bindPattern(paramPatterns[i], argVal, callEnv);
|
|
4768
5172
|
} else {
|
|
@@ -4771,7 +5175,7 @@ function bindFunctionParams(fn, args, callEnv) {
|
|
|
4771
5175
|
}
|
|
4772
5176
|
}
|
|
4773
5177
|
if (fn._hasArguments) {
|
|
4774
|
-
callEnv.bind("arguments",
|
|
5178
|
+
callEnv.bind("arguments", T15.tuple(args));
|
|
4775
5179
|
}
|
|
4776
5180
|
}
|
|
4777
5181
|
function evaluateNewExpression(node, env) {
|
|
@@ -4779,8 +5183,8 @@ function evaluateNewExpression(node, env) {
|
|
|
4779
5183
|
if (callee.type === "Identifier" && BUILTIN_ERROR_CLASSES.has(callee.name) && !env.has(callee.name)) {
|
|
4780
5184
|
const argVals = evaluateArgs(node.arguments, env);
|
|
4781
5185
|
if (isReturn(argVals) || isBranch(argVals) || isThrow(argVals)) return argVals;
|
|
4782
|
-
const msgVal = argVals[0] ??
|
|
4783
|
-
return
|
|
5186
|
+
const msgVal = argVals[0] ?? T15.undefined;
|
|
5187
|
+
return T15.instanceOf(callee.name, { message: msgVal });
|
|
4784
5188
|
}
|
|
4785
5189
|
if (callee.type === "Identifier" && callee.name === "Map" && !env.has("Map")) {
|
|
4786
5190
|
const argVals = evaluateArgs(node.arguments, env);
|
|
@@ -4826,7 +5230,7 @@ function evaluateNewExpression(node, env) {
|
|
|
4826
5230
|
if (executor && executor.kind === "function") {
|
|
4827
5231
|
return evaluatePromiseExecutor(executor);
|
|
4828
5232
|
}
|
|
4829
|
-
return
|
|
5233
|
+
return T15.promise(T15.unknown);
|
|
4830
5234
|
}
|
|
4831
5235
|
if (callee.type === "MemberExpression" && !callee.computed) {
|
|
4832
5236
|
const obj = callee.object;
|
|
@@ -4846,14 +5250,14 @@ function evaluateNewExpression(node, env) {
|
|
|
4846
5250
|
if (protoClassName) {
|
|
4847
5251
|
if (protoClassName === "Set") return createSetType();
|
|
4848
5252
|
if (protoClassName === "Map") return createMapType();
|
|
4849
|
-
if (protoClassName === "Array") return
|
|
4850
|
-
return
|
|
5253
|
+
if (protoClassName === "Array") return T15.array(T15.unknown);
|
|
5254
|
+
return T15.instanceOf(protoClassName);
|
|
4851
5255
|
}
|
|
4852
5256
|
const classNamespace = calleeVal.kind === "object" ? calleeVal._builtinName : void 0;
|
|
4853
5257
|
if (classNamespace) {
|
|
4854
|
-
if (classNamespace === "Array") return
|
|
4855
|
-
if (classNamespace === "Object") return
|
|
4856
|
-
return
|
|
5258
|
+
if (classNamespace === "Array") return T15.array(T15.unknown);
|
|
5259
|
+
if (classNamespace === "Object") return T15.object({});
|
|
5260
|
+
return T15.instanceOf(classNamespace);
|
|
4857
5261
|
}
|
|
4858
5262
|
if (calleeVal.kind === "function") {
|
|
4859
5263
|
const argVals = evaluateArgs(node.arguments, env);
|
|
@@ -4862,7 +5266,7 @@ function evaluateNewExpression(node, env) {
|
|
|
4862
5266
|
if (classInfo) {
|
|
4863
5267
|
const instanceProps = {};
|
|
4864
5268
|
const constructEnv = calleeVal.closure.extend({});
|
|
4865
|
-
const thisObj =
|
|
5269
|
+
const thisObj = T15.object(instanceProps);
|
|
4866
5270
|
constructEnv.bind("this", thisObj);
|
|
4867
5271
|
bindFunctionParams(calleeVal, argVals, constructEnv);
|
|
4868
5272
|
const result = evaluate(calleeVal.body, constructEnv);
|
|
@@ -4872,11 +5276,11 @@ function evaluateNewExpression(node, env) {
|
|
|
4872
5276
|
for (const [k, v] of Object.entries(classInfo.methods)) {
|
|
4873
5277
|
props[k] = v;
|
|
4874
5278
|
}
|
|
4875
|
-
return
|
|
5279
|
+
return T15.instanceOf(classInfo.className, props);
|
|
4876
5280
|
}
|
|
4877
5281
|
return callFunction(calleeVal, argVals);
|
|
4878
5282
|
}
|
|
4879
|
-
return
|
|
5283
|
+
return T15.unknown;
|
|
4880
5284
|
}
|
|
4881
5285
|
function evaluateTryStatement(node, env) {
|
|
4882
5286
|
const tryResult = evaluateStatements(node.block.body, env.fork());
|
|
@@ -4899,7 +5303,7 @@ function evaluateTryStatement(node, env) {
|
|
|
4899
5303
|
if (isThrow(catchResult)) return catchResult;
|
|
4900
5304
|
if (isReturn(catchResult)) {
|
|
4901
5305
|
if (tryValue !== null && isReturn(tryValue)) {
|
|
4902
|
-
return makeReturn(
|
|
5306
|
+
return makeReturn(simplifyUnion8([tryValue.value, catchResult.value]));
|
|
4903
5307
|
}
|
|
4904
5308
|
return catchResult;
|
|
4905
5309
|
}
|
|
@@ -4915,7 +5319,7 @@ function evaluateTryStatement(node, env) {
|
|
|
4915
5319
|
return makeThrow(thrownType);
|
|
4916
5320
|
}
|
|
4917
5321
|
if (tryValue !== null) return tryValue;
|
|
4918
|
-
return
|
|
5322
|
+
return T15.undefined;
|
|
4919
5323
|
}
|
|
4920
5324
|
function evaluateSwitchStatement(node, env) {
|
|
4921
5325
|
const discriminant = evaluate(node.discriminant, env);
|
|
@@ -4949,9 +5353,9 @@ function evaluateSwitchStatement(node, env) {
|
|
|
4949
5353
|
}
|
|
4950
5354
|
}
|
|
4951
5355
|
if (returnValues2.length > 0) {
|
|
4952
|
-
return makeBranch(
|
|
5356
|
+
return makeBranch(simplifyUnion8(returnValues2), env);
|
|
4953
5357
|
}
|
|
4954
|
-
return
|
|
5358
|
+
return T15.undefined;
|
|
4955
5359
|
}
|
|
4956
5360
|
const returnValues = [];
|
|
4957
5361
|
for (const caseNode of node.cases) {
|
|
@@ -4984,9 +5388,9 @@ function evaluateSwitchStatement(node, env) {
|
|
|
4984
5388
|
}
|
|
4985
5389
|
}
|
|
4986
5390
|
if (returnValues.length > 0) {
|
|
4987
|
-
return makeBranch(
|
|
5391
|
+
return makeBranch(simplifyUnion8(returnValues), env);
|
|
4988
5392
|
}
|
|
4989
|
-
return
|
|
5393
|
+
return T15.undefined;
|
|
4990
5394
|
}
|
|
4991
5395
|
var MAX_CALL_DEPTH = 64;
|
|
4992
5396
|
var MAX_TOTAL_CALLS = 2e5;
|
|
@@ -5013,7 +5417,7 @@ function recordFnResultObs(fn, value) {
|
|
|
5013
5417
|
function observedResultFallback(fn) {
|
|
5014
5418
|
const obs = _fnResultObs.get(fn);
|
|
5015
5419
|
if (!obs || obs.length === 0) return void 0;
|
|
5016
|
-
const union = collapseLiteralUnion(
|
|
5420
|
+
const union = collapseLiteralUnion(simplifyUnion8(obs), 4);
|
|
5017
5421
|
return union.kind === "never" ? void 0 : union;
|
|
5018
5422
|
}
|
|
5019
5423
|
var cycleArgKeyCache = /* @__PURE__ */ new WeakMap();
|
|
@@ -5074,7 +5478,7 @@ function callBudgetExhausted(fnName, loc) {
|
|
|
5074
5478
|
loc,
|
|
5075
5479
|
reason: `recursive call truncated to unknown (cycle, depth > ${MAX_CALL_DEPTH}, or work budget)`
|
|
5076
5480
|
});
|
|
5077
|
-
return { value:
|
|
5481
|
+
return { value: T15.unknown, throws: T15.never };
|
|
5078
5482
|
}
|
|
5079
5483
|
function callFunctionFull(fn, args, thisVal) {
|
|
5080
5484
|
const callKey = fnCallKey(fn, args, thisVal);
|
|
@@ -5102,7 +5506,7 @@ function callFunctionFull(fn, args, thisVal) {
|
|
|
5102
5506
|
function callFunctionUnchecked(fn, args, thisVal) {
|
|
5103
5507
|
const directReturn = fn._directReturn;
|
|
5104
5508
|
if (directReturn) {
|
|
5105
|
-
return { value: directReturn, throws:
|
|
5509
|
+
return { value: directReturn, throws: T15.never };
|
|
5106
5510
|
}
|
|
5107
5511
|
const sig = getFnSig(fn);
|
|
5108
5512
|
if (sig) {
|
|
@@ -5121,28 +5525,28 @@ function callFunctionUnchecked(fn, args, thisVal) {
|
|
|
5121
5525
|
if (cached !== void 0) {
|
|
5122
5526
|
_unreachableRanges = savedUnreachable;
|
|
5123
5527
|
if (cached === MEMO_IN_PROGRESS) {
|
|
5124
|
-
return { value:
|
|
5528
|
+
return { value: T15.unknown, throws: T15.never };
|
|
5125
5529
|
}
|
|
5126
|
-
return { value: cached, throws:
|
|
5530
|
+
return { value: cached, throws: T15.never };
|
|
5127
5531
|
}
|
|
5128
5532
|
callMemo.set(memoKey, MEMO_IN_PROGRESS);
|
|
5129
5533
|
const result2 = evaluate(fn.body, callEnv);
|
|
5130
5534
|
_unreachableRanges = savedUnreachable;
|
|
5131
|
-
const value2 = isReturn(result2) ? result2.value : isBranch(result2) ? result2.returnedValue : isThrow(result2) ?
|
|
5132
|
-
const throws = isThrow(result2) ? result2.thrown :
|
|
5535
|
+
const value2 = isReturn(result2) ? result2.value : isBranch(result2) ? result2.returnedValue : isThrow(result2) ? T15.never : result2;
|
|
5536
|
+
const throws = isThrow(result2) ? result2.thrown : T15.never;
|
|
5133
5537
|
const throwLoc = isThrow(result2) ? result2.loc : void 0;
|
|
5134
|
-
const wrapped2 = isAsync ?
|
|
5538
|
+
const wrapped2 = isAsync ? T15.promise(value2) : value2;
|
|
5135
5539
|
callMemo.set(memoKey, wrapped2);
|
|
5136
5540
|
return { value: wrapped2, throws, throwLoc };
|
|
5137
5541
|
}
|
|
5138
5542
|
const result = evaluate(fn.body, callEnv);
|
|
5139
5543
|
_unreachableRanges = savedUnreachable;
|
|
5140
5544
|
if (isThrow(result)) {
|
|
5141
|
-
return { value:
|
|
5545
|
+
return { value: T15.never, throws: result.thrown, throwLoc: result.loc };
|
|
5142
5546
|
}
|
|
5143
5547
|
const value = isReturn(result) ? result.value : isBranch(result) ? result.returnedValue : result;
|
|
5144
|
-
const wrapped = isAsync ?
|
|
5145
|
-
return { value: wrapped, throws:
|
|
5548
|
+
const wrapped = isAsync ? T15.promise(value) : value;
|
|
5549
|
+
return { value: wrapped, throws: T15.never };
|
|
5146
5550
|
}
|
|
5147
5551
|
function callFunction(fn, args, thisVal) {
|
|
5148
5552
|
return callFunctionFull(fn, args, thisVal).value;
|
|
@@ -5168,32 +5572,40 @@ function evaluateFunctionFull(fnNode, args, env) {
|
|
|
5168
5572
|
const fnName = actualNode.id?.name;
|
|
5169
5573
|
if (fnName) {
|
|
5170
5574
|
const paramNames = actualNode.params.map(describeParam);
|
|
5171
|
-
const selfRef =
|
|
5575
|
+
const selfRef = T15.fn(paramNames, actualNode.body, callEnv);
|
|
5172
5576
|
selfRef._paramPatterns = actualNode.params;
|
|
5173
5577
|
selfRef._name = fnName;
|
|
5174
5578
|
if (isAsync) selfRef._async = true;
|
|
5175
5579
|
callEnv.bind(fnName, selfRef);
|
|
5176
5580
|
}
|
|
5177
5581
|
for (let i = 0; i < actualNode.params.length; i++) {
|
|
5178
|
-
|
|
5582
|
+
const pname = describeParam(actualNode.params[i]);
|
|
5583
|
+
let argVal = args[i] ?? T15.undefined;
|
|
5584
|
+
{
|
|
5585
|
+
const tagged = tagParamArg(argVal, pname);
|
|
5586
|
+
copyOrigin(argVal, tagged);
|
|
5587
|
+
argVal = tagged;
|
|
5588
|
+
}
|
|
5589
|
+
bindPattern(actualNode.params[i], argVal, callEnv);
|
|
5179
5590
|
}
|
|
5180
5591
|
const result = evaluate(actualNode.body, callEnv);
|
|
5181
|
-
if (isThrow(result)) return { value:
|
|
5592
|
+
if (isThrow(result)) return { value: T15.never, throws: result.thrown, throwLoc: result.loc };
|
|
5182
5593
|
const value = isReturn(result) ? result.value : isBranch(result) ? result.returnedValue : result;
|
|
5183
|
-
const wrapped = isAsync ? value.kind === "promise" ? value :
|
|
5184
|
-
return { value: wrapped, throws:
|
|
5594
|
+
const wrapped = isAsync ? value.kind === "promise" ? value : T15.promise(value) : value;
|
|
5595
|
+
return { value: wrapped, throws: T15.never };
|
|
5185
5596
|
} finally {
|
|
5186
5597
|
_callDepth--;
|
|
5187
5598
|
}
|
|
5188
5599
|
}
|
|
5189
|
-
return { value:
|
|
5600
|
+
return { value: T15.unknown, throws: T15.never };
|
|
5190
5601
|
}
|
|
5191
5602
|
function evaluateProgram(node, env) {
|
|
5192
5603
|
bindCommonJsGlobals(env);
|
|
5604
|
+
resetPhi();
|
|
5193
5605
|
const result = evaluate(node, env);
|
|
5194
5606
|
if (isReturn(result)) return result.value;
|
|
5195
5607
|
if (isBranch(result)) return result.returnedValue;
|
|
5196
|
-
if (isThrow(result)) return
|
|
5608
|
+
if (isThrow(result)) return T15.never;
|
|
5197
5609
|
return result;
|
|
5198
5610
|
}
|
|
5199
5611
|
function getUnreachableRanges() {
|
|
@@ -5206,58 +5618,9 @@ function setCurrentFileDir(dir) {
|
|
|
5206
5618
|
currentFileDir = dir;
|
|
5207
5619
|
}
|
|
5208
5620
|
|
|
5209
|
-
// src/resolve-npm.ts
|
|
5210
|
-
import { readFileSync, existsSync } from "fs";
|
|
5211
|
-
import { resolve, join, dirname } from "path";
|
|
5212
|
-
function findNodeModules(startDir) {
|
|
5213
|
-
let dir = resolve(startDir);
|
|
5214
|
-
const root = resolve("/");
|
|
5215
|
-
while (dir !== root) {
|
|
5216
|
-
const nmPath = join(dir, "node_modules");
|
|
5217
|
-
if (existsSync(nmPath)) return nmPath;
|
|
5218
|
-
const parent = dirname(dir);
|
|
5219
|
-
if (parent === dir) break;
|
|
5220
|
-
dir = parent;
|
|
5221
|
-
}
|
|
5222
|
-
return null;
|
|
5223
|
-
}
|
|
5224
|
-
function resolveExportsNudo(exports, subpath) {
|
|
5225
|
-
if (!exports || typeof exports !== "object") return null;
|
|
5226
|
-
const entry = exports[subpath];
|
|
5227
|
-
if (!entry) return null;
|
|
5228
|
-
if (typeof entry === "object" && entry !== null && "nudo" in entry) {
|
|
5229
|
-
const nudoEntry = entry["nudo"];
|
|
5230
|
-
if (typeof nudoEntry === "string") return nudoEntry;
|
|
5231
|
-
}
|
|
5232
|
-
return null;
|
|
5233
|
-
}
|
|
5234
|
-
function resolveNpmNudo(source, fromDir) {
|
|
5235
|
-
const isRelative = source.startsWith(".") || source.startsWith("/");
|
|
5236
|
-
if (isRelative) return null;
|
|
5237
|
-
const parts = source.startsWith("@") ? source.split("/").slice(0, 2) : source.split("/").slice(0, 1);
|
|
5238
|
-
const pkgName = parts.join("/");
|
|
5239
|
-
const subpath = source.slice(pkgName.length) || ".";
|
|
5240
|
-
const nodeModules = findNodeModules(fromDir);
|
|
5241
|
-
if (!nodeModules) return null;
|
|
5242
|
-
const pkgJsonPath = join(nodeModules, pkgName, "package.json");
|
|
5243
|
-
if (!existsSync(pkgJsonPath)) return null;
|
|
5244
|
-
try {
|
|
5245
|
-
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
|
5246
|
-
const nudoEntry = resolveExportsNudo(pkg.exports, subpath);
|
|
5247
|
-
if (nudoEntry) {
|
|
5248
|
-
const resolved = resolve(dirname(pkgJsonPath), nudoEntry);
|
|
5249
|
-
if (existsSync(resolved)) return resolved;
|
|
5250
|
-
}
|
|
5251
|
-
} catch {
|
|
5252
|
-
}
|
|
5253
|
-
return null;
|
|
5254
|
-
}
|
|
5255
|
-
|
|
5256
5621
|
export {
|
|
5257
|
-
__require,
|
|
5258
|
-
__commonJS,
|
|
5259
|
-
__toESM,
|
|
5260
5622
|
narrow,
|
|
5623
|
+
BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS,
|
|
5261
5624
|
memberMayExistOn,
|
|
5262
5625
|
setCurrentSource,
|
|
5263
5626
|
resetMemo,
|
|
@@ -5281,6 +5644,5 @@ export {
|
|
|
5281
5644
|
evaluateProgram,
|
|
5282
5645
|
getUnreachableRanges,
|
|
5283
5646
|
resetUnreachableRanges,
|
|
5284
|
-
setCurrentFileDir
|
|
5285
|
-
resolveNpmNudo
|
|
5647
|
+
setCurrentFileDir
|
|
5286
5648
|
};
|