@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.
Files changed (64) hide show
  1. package/dist/{chunk-3HCPXPEW.js → chunk-YDM4HHQ4.js} +1783 -1421
  2. package/dist/evaluator-api.d.ts +12 -1
  3. package/dist/evaluator-api.js +52 -2
  4. package/dist/index.d.ts +1 -2
  5. package/dist/index.js +366 -3572
  6. package/package.json +23 -11
  7. package/CHANGELOG.md +0 -41
  8. package/examples/real-world.js +0 -66
  9. package/examples/validate-real-world.ts +0 -160
  10. package/src/__tests__/builtin-advanced.test.ts +0 -292
  11. package/src/__tests__/builtin-api.test.ts +0 -308
  12. package/src/__tests__/builtin-functions.test.ts +0 -313
  13. package/src/__tests__/builtin-map.test.ts +0 -129
  14. package/src/__tests__/builtin-promise.test.ts +0 -150
  15. package/src/__tests__/builtin-regexp.test.ts +0 -133
  16. package/src/__tests__/builtin-set.test.ts +0 -163
  17. package/src/__tests__/builtin-url.test.ts +0 -256
  18. package/src/__tests__/builtin-web.test.ts +0 -340
  19. package/src/__tests__/combination-scenarios.test.ts +0 -384
  20. package/src/__tests__/edge-cases.test.ts +0 -749
  21. package/src/__tests__/evaluator-loops.test.ts +0 -283
  22. package/src/__tests__/evaluator-nullish-coalescing.test.ts +0 -86
  23. package/src/__tests__/evaluator-optional-chaining.test.ts +0 -37
  24. package/src/__tests__/evaluator-phase2.test.ts +0 -564
  25. package/src/__tests__/evaluator-phase3.test.ts +0 -864
  26. package/src/__tests__/evaluator-refined.test.ts +0 -121
  27. package/src/__tests__/evaluator-string-methods.test.ts +0 -151
  28. package/src/__tests__/evaluator.test.ts +0 -943
  29. package/src/__tests__/mock-arrow-function.test.ts +0 -169
  30. package/src/__tests__/mock-comparison.test.ts +0 -221
  31. package/src/__tests__/mock-comprehensive.test.ts +0 -250
  32. package/src/__tests__/mock-final-integration.test.ts +0 -263
  33. package/src/__tests__/mock-helpers.test.ts +0 -174
  34. package/src/__tests__/mock-realworld.test.ts +0 -191
  35. package/src/__tests__/mock-rest-debug.test.ts +0 -110
  36. package/src/__tests__/mock-rest-edge.test.ts +0 -176
  37. package/src/__tests__/mock-sinon-runtime.test.ts +0 -168
  38. package/src/__tests__/narrowing-discriminated.test.ts +0 -35
  39. package/src/__tests__/narrowing-in-operator.test.ts +0 -56
  40. package/src/__tests__/narrowing-switch.test.ts +0 -56
  41. package/src/__tests__/narrowing-truthiness.test.ts +0 -52
  42. package/src/__tests__/narrowing.test.ts +0 -82
  43. package/src/__tests__/nudo-mock-syntax.test.ts +0 -245
  44. package/src/__tests__/realworld-patterns.test.ts +0 -430
  45. package/src/__tests__/syntax-sugar.test.ts +0 -345
  46. package/src/builtins/builtin-intl.ts +0 -17
  47. package/src/builtins/builtin-map.ts +0 -174
  48. package/src/builtins/builtin-promise.ts +0 -116
  49. package/src/builtins/builtin-reflect.ts +0 -30
  50. package/src/builtins/builtin-regexp.ts +0 -34
  51. package/src/builtins/builtin-set.ts +0 -131
  52. package/src/builtins/builtin-symbol.ts +0 -16
  53. package/src/builtins/builtin-url.ts +0 -58
  54. package/src/builtins/builtin-weak.ts +0 -22
  55. package/src/builtins/builtin-web.ts +0 -111
  56. package/src/builtins/index.ts +0 -61
  57. package/src/config.ts +0 -32
  58. package/src/env-loader.ts +0 -174
  59. package/src/evaluator-api.ts +0 -36
  60. package/src/evaluator.ts +0 -5623
  61. package/src/index.ts +0 -931
  62. package/src/narrowing.ts +0 -537
  63. package/src/resolve-npm.ts +0 -63
  64. package/tsconfig.json +0 -9
@@ -1,34 +1,5 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
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/evaluator.ts
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 T3, simplifyUnion as simplifyUnion2, typeValueEquals as typeValueEquals2 } from "@nudojs/core";
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 simplifyUnion2(results);
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 : T3.undefined;
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 T3.union(typeArgs.V, T3.undefined);
478
- return T3.unknown;
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: T3.unknown, V: T3.unknown };
417
+ const typeArgs = map._typeArgs || { K: T2.unknown, V: T2.unknown };
483
418
  map._typeArgs = {
484
- K: typeArgs.K.kind === "unknown" ? key : simplifyUnion2([typeArgs.K, key]),
485
- V: typeArgs.V.kind === "unknown" ? value : simplifyUnion2([typeArgs.V, 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 ?? T3.unknown;
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 T3.literal(entries.some((e) => typeValueEquals2(e.key, key)));
442
+ return T2.literal(entries.some((e) => typeValueEquals2(e.key, key)));
508
443
  }
509
- return T3.boolean;
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 T3.literal(true);
452
+ return T2.literal(true);
518
453
  }
519
- return T3.literal(false);
454
+ return T2.literal(false);
520
455
  }
521
- return T3.boolean;
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 T3.undefined;
463
+ return T2.undefined;
529
464
  },
530
- forEach: () => T3.undefined,
465
+ forEach: () => T2.undefined,
531
466
  keys: (map) => {
532
467
  const entries = exactMapEntries(map);
533
- if (entries) return T3.tuple(entries.map((e) => e.key));
468
+ if (entries) return T2.tuple(entries.map((e) => e.key));
534
469
  const typeArgs = map?._typeArgs;
535
- if (typeArgs?.K) return T3.array(typeArgs.K);
536
- return T3.array(T3.unknown);
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 T3.tuple(entries.map((e) => e.value));
475
+ if (entries) return T2.tuple(entries.map((e) => e.value));
541
476
  const typeArgs = map?._typeArgs;
542
- if (typeArgs?.V) return T3.array(typeArgs.V);
543
- return T3.array(T3.unknown);
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 T3.tuple(entries.map((e) => T3.tuple([e.key, e.value])));
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 T3.array(T3.tuple([typeArgs.K, typeArgs.V]));
556
- return T3.array(T3.tuple([T3.unknown, T3.unknown]));
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 = T3.instanceOf("Map", {});
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: simplifyUnion2(keys), V: simplifyUnion2(values) };
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: T3.unknown, V: T3.unknown };
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 T4, simplifyUnion as simplifyUnion3, typeValueEquals as typeValueEquals3 } from "@nudojs/core";
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: T4.unknown };
548
+ const typeArgs = set._typeArgs || { T: T3.unknown };
614
549
  set._typeArgs = {
615
- T: typeArgs.T.kind === "unknown" ? value : simplifyUnion3([typeArgs.T, 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 ?? T4.unknown;
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 T4.literal(looked);
571
+ if (looked !== null) return T3.literal(looked);
637
572
  }
638
- return T4.boolean;
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 T4.literal(true);
581
+ return T3.literal(true);
647
582
  }
648
- return T4.literal(false);
583
+ return T3.literal(false);
649
584
  }
650
- return T4.boolean;
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 T4.undefined;
592
+ return T3.undefined;
658
593
  },
659
- forEach: () => T4.undefined,
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 T4.tuple(values.map((v) => T4.tuple([v, v])));
600
+ if (values) return T3.tuple(values.map((v) => T3.tuple([v, v])));
666
601
  const typeArgs = set?._typeArgs;
667
- if (typeArgs?.T) return T4.array(T4.tuple([typeArgs.T, typeArgs.T]));
668
- return T4.array(T4.tuple([T4.unknown, T4.unknown]));
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 T4.tuple([...values]);
612
+ if (values) return T3.tuple([...values]);
678
613
  const typeArgs = set?._typeArgs;
679
- if (typeArgs?.T) return T4.array(typeArgs.T);
680
- return T4.array(T4.unknown);
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 = T4.instanceOf("Set", {});
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: simplifyUnion3(elements) };
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: T4.unknown };
634
+ obj._typeArgs = { T: T3.unknown };
700
635
  }
701
636
  return obj;
702
637
  }
703
638
 
704
- // src/builtins/builtin-regexp.ts
705
- import { T as T5 } from "@nudojs/core";
706
- var REGEXP_INSTANCE_METHODS = {
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
- // src/builtins/builtin-web.ts
793
- import { T as T7 } from "@nudojs/core";
794
- var RESPONSE_PROPS = {
795
- ok: T7.boolean,
796
- status: T7.number,
797
- statusText: T7.string,
798
- url: T7.string,
799
- type: T7.string,
800
- redirected: T7.boolean,
801
- headers: T7.unknown,
802
- // Headers instance
803
- body: T7.unknown,
804
- bodyUsed: T7.boolean
805
- };
806
- var RESPONSE_INSTANCE_METHODS = {
807
- json: () => T7.promise(T7.unknown),
808
- text: () => T7.promise(T7.string),
809
- arrayBuffer: () => T7.promise(T7.unknown),
810
- blob: () => T7.promise(T7.unknown),
811
- clone: () => T7.unknown,
812
- formData: () => T7.promise(T7.unknown)
813
- };
814
- var HEADERS_INSTANCE_METHODS = {
815
- get: () => T7.union(T7.string, T7.null),
816
- set: () => T7.undefined,
817
- has: () => T7.boolean,
818
- delete: () => T7.undefined,
819
- append: () => T7.undefined,
820
- entries: () => T7.unknown,
821
- keys: () => T7.unknown,
822
- values: () => T7.unknown,
823
- forEach: () => T7.undefined
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 ABORTCONTROLLER_INSTANCE_METHODS = {
841
- abort: () => T7.undefined
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
- function createResponseType() {
844
- return T7.instanceOf("Response", {
845
- ok: T7.boolean,
846
- status: T7.number,
847
- statusText: T7.string,
848
- url: T7.string,
849
- type: T7.string,
850
- redirected: T7.boolean,
851
- headers: T7.unknown,
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
- function createAbortControllerType() {
890
- return T7.instanceOf("AbortController", {
891
- signal: T7.unknown,
892
- abort: T7.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
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
- // src/builtins/builtin-weak.ts
897
- import { T as T8 } from "@nudojs/core";
898
- var WEAKMAP_INSTANCE_METHODS = {
899
- get: (_key) => T8.union(T8.unknown, T8.undefined),
900
- set: (_key, _value, map) => map ?? T8.unknown,
901
- has: () => T8.boolean,
902
- delete: () => T8.boolean
903
- };
904
- var WEAKSET_INSTANCE_METHODS = {
905
- add: (_value, set) => set ?? T8.unknown,
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.boolean
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 T8.instanceOf("WeakMap", {});
1515
+ return T10.instanceOf("WeakMap", {});
911
1516
  }
912
1517
  function createWeakSetType() {
913
- return T8.instanceOf("WeakSet", {});
1518
+ return T10.instanceOf("WeakSet", {});
914
1519
  }
915
1520
 
916
1521
  // src/builtins/builtin-symbol.ts
917
- import { T as T9 } from "@nudojs/core";
1522
+ import { T as T11 } from "@nudojs/core";
918
1523
  var SYMBOL_STATIC_METHODS = {
919
- for: T9.symbol,
920
- keyFor: T9.union(T9.string, T9.undefined)
1524
+ for: T11.symbol,
1525
+ keyFor: T11.union(T11.string, T11.undefined)
921
1526
  };
922
1527
  var SYMBOL_STATIC_PROPS = {
923
- asyncIterator: T9.symbol,
924
- iterator: T9.symbol,
925
- toPrimitive: T9.symbol,
926
- toStringTag: T9.symbol,
927
- hasInstance: T9.symbol,
928
- species: T9.symbol,
929
- isConcatSpreadable: T9.symbol
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 T10 } from "@nudojs/core";
1538
+ import { T as T12 } from "@nudojs/core";
934
1539
  var REFLECT_METHODS = {
935
- has: () => T10.boolean,
936
- get: () => T10.unknown,
937
- set: () => T10.boolean,
938
- deleteProperty: () => T10.boolean,
939
- apply: () => T10.unknown,
940
- construct: () => T10.object({}),
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 T10.tuple(Object.keys(base.properties).map((k) => T10.literal(k)));
1554
+ return T12.tuple(Object.keys(base.properties).map((k) => T12.literal(k)));
950
1555
  }
951
1556
  if (base?.kind === "tuple") {
952
- return T10.tuple([
953
- ...base.elements.map((_, i) => T10.literal(String(i))),
954
- T10.literal("length")
1557
+ return T12.tuple([
1558
+ ...base.elements.map((_, i) => T12.literal(String(i))),
1559
+ T12.literal("length")
955
1560
  ]);
956
1561
  }
957
- return T10.array(T10.string);
1562
+ return T12.array(T12.string);
958
1563
  },
959
- getPrototypeOf: () => T10.union(T10.object({}), T10.null),
960
- getOwnPropertyDescriptor: () => T10.union(T10.object({}), T10.undefined)
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 T11 } from "@nudojs/core";
1569
+ import { T as T13 } from "@nudojs/core";
965
1570
  var INTL_DATETIMEFORMAT_METHODS = {
966
- format: () => T11.string
1571
+ format: () => T13.string
967
1572
  };
968
1573
  var INTL_NUMBERFORMAT_METHODS = {
969
- format: () => T11.string
1574
+ format: () => T13.string
970
1575
  };
971
1576
  function createDateTimeFormatType() {
972
- return T11.instanceOf("DateTimeFormat", {});
1577
+ return T13.instanceOf("DateTimeFormat", {});
973
1578
  }
974
1579
  function createNumberFormatType() {
975
- return T11.instanceOf("NumberFormat", {});
1580
+ return T13.instanceOf("NumberFormat", {});
976
1581
  }
977
1582
 
978
- // src/evaluator.ts
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: T12.fn(["callback", "...args"], { type: "BlockStatement", body: [], directives: [] }, void 0),
984
- env: T12.object({}),
985
- platform: T12.string,
986
- versions: T12.object({}),
987
- argv: T12.array(T12.string),
988
- cwd: T12.fn([], { type: "BlockStatement", body: [], directives: [] }, void 0),
989
- exit: T12.fn(["code"], { type: "BlockStatement", body: [], directives: [] }, void 0),
990
- hrtime: T12.fn(["time"], { type: "BlockStatement", body: [], directives: [] }, void 0),
991
- stdout: T12.instanceOf("Socket"),
992
- stderr: T12.instanceOf("Socket")
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: T12.number,
996
- parse: T12.number,
997
- UTC: T12.number
1604
+ now: T14.number,
1605
+ parse: T14.number,
1606
+ UTC: T14.number
998
1607
  },
999
1608
  Math: {
1000
- random: T12.number,
1001
- floor: T12.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
1002
- ceil: T12.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
1003
- round: T12.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
1004
- abs: T12.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
1005
- max: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
1006
- min: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
1007
- sqrt: T12.fn(["x"], { type: "BlockStatement", body: [] }, void 0),
1008
- pow: T12.fn(["base", "exp"], { type: "BlockStatement", body: [] }, void 0),
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: T12.number,
1012
- E: T12.number,
1013
- LN2: T12.number,
1014
- LN10: T12.number,
1015
- LOG2E: T12.number,
1016
- LOG10E: T12.number,
1017
- SQRT2: T12.number,
1018
- SQRT1_2: T12.number
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: T12.fnSig([T12.string], T12.unknown, T12.never, (args) => {
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: T12.string
1649
+ stringify: T14.string
1041
1650
  },
1042
1651
  Object: {
1043
- keys: T12.array(T12.string),
1044
- values: T12.array(T12.unknown),
1045
- entries: T12.array(T12.tuple([T12.string, T12.unknown])),
1046
- assign: T12.fnSig([T12.unknown], T12.unknown, T12.never, (args) => {
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 T12.object(props);
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: T12.fnSig([T12.unknown], T12.unknown, T12.never, (args) => protoOfValue(args[0])),
1062
- create: T12.fnSig([T12.unknown], T12.object({}), T12.never, () => T12.object({})),
1063
- setPrototypeOf: T12.fnSig([T12.unknown, T12.unknown], T12.unknown, T12.never, (args) => args[0]),
1064
- defineProperty: T12.fnSig([T12.unknown, T12.unknown, T12.unknown], T12.unknown, T12.never, (args) => args[0]),
1065
- getOwnPropertyDescriptor: T12.fnSig([T12.unknown, T12.unknown], T12.union(T12.object({}), T12.undefined), T12.never, (args) => {
1066
- const obj = args[0];
1067
- const key = args[1];
1068
- if (obj?.kind !== "object" && obj?.kind !== "instance") return T12.undefined;
1069
- if (!key) return T12.undefined;
1070
- if (key.kind === "literal" && typeof key.value === "string") {
1071
- const prop = hasOwnProp(obj.properties, key.value) ? obj.properties[key.value] : void 0;
1072
- if (!prop) return T12.undefined;
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 T12.undefined;
1078
- return descriptorOf(simplifyUnion4(props.map((k) => obj.properties[k])));
1079
- }
1080
- return T12.undefined;
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
- RegExp: {
1291
- test: T12.fnSig([T12.string], T12.boolean),
1292
- exec: T12.fnSig([T12.string], T12.union(T12.object({}), T12.null)),
1293
- toString: T12.fnSig([], T12.string)
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
- String: {
1296
- charAt: T12.fnSig([T12.number], T12.string),
1297
- charCodeAt: T12.fnSig([T12.number], T12.number),
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
- toFixed: T12.fnSig([T12.number], T12.string),
1315
- toPrecision: T12.fnSig([T12.number], T12.string),
1316
- valueOf: T12.fnSig([], T12.number),
1317
- toString: T12.fnSig([T12.number], T12.string)
1318
- },
1319
- Boolean: {
1320
- valueOf: T12.fnSig([], T12.boolean),
1321
- toString: T12.fnSig([], T12.string)
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
- Symbol: {
1324
- toString: T12.fnSig([], T12.string),
1325
- valueOf: T12.fnSig([], T12.symbol)
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
- Buffer: {
1328
- equals: T12.fnSig([T12.unknown], T12.boolean),
1329
- compare: T12.fnSig([T12.unknown], T12.number),
1330
- toString: T12.fnSig([T12.unknown], T12.string),
1331
- toJSON: T12.fnSig([], T12.unknown)
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
- Error: {
1334
- toString: T12.fnSig([], T12.string)
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
- var _builtinClassValues = /* @__PURE__ */ new Map();
1338
- function builtinClassValue(name) {
1339
- let v = _builtinClassValues.get(name);
1340
- if (v === void 0) {
1341
- v = T12.object({});
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 T12.object({
1770
+ return T14.object({
1449
1771
  value: prop,
1450
- writable: T12.boolean,
1451
- enumerable: T12.boolean,
1452
- configurable: T12.boolean
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 T12.fnSig(sig.paramTypes, sig.returnType, sig.throwsType, (args, thisVal) => sig.impl(args, thisVal ?? receiver));
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 T12.fnSig([], T12.never, T12.instanceOf("TypeError"));
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 = { ...T12.symbol, _symbolName: name };
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 T12.unknown;
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 ? T12.boolean : T12.literal(iter);
2017
+ return iter === void 0 ? T15.boolean : T15.literal(iter);
1640
2018
  }
1641
- if (c.kind === "instance" && !BUILTIN_PROTOTYPE_CLASSES.has(c.className)) return T12.boolean;
1642
- return T12.literal(false);
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 T12.boolean;
2031
+ return T15.boolean;
1654
2032
  case "literal":
1655
2033
  case "primitive":
1656
- return T12.literal(false);
2034
+ return T15.literal(false);
1657
2035
  default:
1658
- return T12.unknown;
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 T12.literal(hasOwnProp(c.properties, strKey) || hasOwnProp(OBJECT_PROTOTYPE_METHODS, strKey));
2042
+ return T15.literal(hasOwnProp3(c.properties, strKey) || hasOwnProp3(OBJECT_PROTOTYPE_METHODS, strKey));
1665
2043
  case "tuple":
1666
- if (strKey === "length") return T12.literal(true);
1667
- if (isArrayIndex(strKey)) return T12.literal(Number(strKey) < c.elements.length);
1668
- return T12.literal(
1669
- hasOwnProp(OBJECT_PROTOTYPE_METHODS, strKey) || hasOwnProp(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Array, strKey)
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 T12.literal(
1673
- strKey === "length" || isArrayIndex(strKey) || hasOwnProp(OBJECT_PROTOTYPE_METHODS, strKey) || hasOwnProp(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS.Array, 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 (hasOwnProp(c.properties, strKey)) return T12.literal(true);
1677
- if (hasOwnProp(OBJECT_PROTOTYPE_METHODS, strKey)) return T12.literal(true);
1678
- const approx = hasOwnProp(BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS, c.className) ? BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS[c.className] : void 0;
1679
- if (approx && hasOwnProp(approx, strKey)) return T12.literal(true);
1680
- if ((c.className === "Set" || c.className === "Map") && strKey === "size") return T12.literal(true);
1681
- return T12.literal(false);
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 T12.literal(
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 T12.literal(
1689
- strKey === "then" || strKey === "catch" || strKey === "finally" || hasOwnProp(OBJECT_PROTOTYPE_METHODS, strKey)
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 T12.literal(strKey === "length" || isArrayIndex(strKey) && Number(strKey) < c.value.length);
2071
+ return T15.literal(strKey === "length" || isArrayIndex(strKey) && Number(strKey) < c.value.length);
1694
2072
  }
1695
- return T12.literal(false);
2073
+ return T15.literal(false);
1696
2074
  case "primitive":
1697
- if (c.type === "string") return T12.literal(strKey === "length" || isArrayIndex(strKey));
1698
- return T12.literal(false);
2075
+ if (c.type === "string") return T15.literal(strKey === "length" || isArrayIndex(strKey));
2076
+ return T15.literal(false);
1699
2077
  default:
1700
- return T12.boolean;
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: T12.never };
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: T12.never };
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 = T12.fn(["specifier"], { type: "BlockStatement", body: [] }, void 0);
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 = T12.object({});
2255
+ const exportsObj = T15.object({});
1878
2256
  exportsObj.__cjsExportsRoot = true;
1879
- const moduleObj = T12.object({ exports: exportsObj });
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", T12.string);
1884
- env.bind("__filename", T12.string);
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 hasOwnProp(props, name) {
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 simplifyUnion4(tv.members.map(fn));
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 T12.undefined;
2024
- if (keys.length > MAX_KEYSET_PROPS) return T12.unknown;
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 T12.unknown;
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 T12.unknown;
2415
+ return T15.unknown;
2033
2416
  }
2034
- const union = simplifyUnion4(values);
2035
- if (union.kind === "union" && union.members.length > MAX_KEYSET_MEMBERS) return T12.unknown;
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 (hasOwnProp(obj.properties, propVal.value) ? obj.properties[propVal.value] : void 0) ?? T12.undefined;
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 simplifyUnion4(
2444
+ return simplifyUnion8(
2062
2445
  propVal.members.map(
2063
2446
  (m) => m.value
2064
- ).map((k) => (hasOwnProp(obj.properties, k) ? obj.properties[k] : void 0) ?? T12.undefined)
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 T12.unknown;
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] ?? T12.undefined;
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 T12.undefined;
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 simplifyUnion4(indices.map((i) => obj.elements[i] ?? T12.undefined));
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 ? simplifyUnion4(obj.elements) : T12.undefined;
2477
+ return obj.elements.length > 0 ? simplifyUnion8(obj.elements) : T15.undefined;
2095
2478
  }
2096
2479
  return obj.element;
2097
2480
  }
2098
- return T12.unknown;
2481
+ return T15.unknown;
2099
2482
  }
2100
2483
  if (obj.kind === "instance" && isDynamicStringKey(propVal)) {
2101
- return T12.undefined;
2484
+ return T15.undefined;
2102
2485
  }
2103
2486
  if (propVal.kind === "literal" && typeof propVal.value === "string") {
2104
2487
  markMiss();
2105
2488
  }
2106
- return T12.unknown;
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 = T12.undefined;
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(simplifyUnion4(returnValues));
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(simplifyUnion4(returnValues), currentEnv);
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 T12.literal(node.value);
2597
+ return T15.literal(node.value);
2233
2598
  case "StringLiteral":
2234
- return T12.literal(node.value);
2599
+ return T15.literal(node.value);
2235
2600
  case "BooleanLiteral":
2236
- return T12.literal(node.value);
2601
+ return T15.literal(node.value);
2237
2602
  case "NullLiteral":
2238
- return T12.null;
2603
+ return T15.null;
2239
2604
  case "RegExpLiteral":
2240
2605
  return createRegExpType();
2241
2606
  case "Identifier": {
2242
- if (node.name === "undefined") return T12.undefined;
2243
- if (hasOwnProp(BUILTIN_STATIC_METHODS, node.name) && !env.has(node.name)) {
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 T12.unknown;
2628
+ return T15.unknown;
2264
2629
  }
2265
- if (!env.has(node.name) && hasOwnProp(OBJECT_PROTOTYPE_METHODS, 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 T12.unknown;
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 T12.literal(node.quasis[0].value.cooked ?? node.quasis[0].value.raw);
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(T12.literal(raw));
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 T12.literal(
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 T12.literal(node.operator === "===" ? identity : !identity);
2681
+ return T15.literal(node.operator === "===" ? identity : !identity);
2317
2682
  }
2318
2683
  const classIdentity = builtinClassIdentityEq(leftVal, rightVal);
2319
2684
  if (classIdentity !== null) {
2320
- return T12.literal(node.operator === "===" ? classIdentity : !classIdentity);
2685
+ return T15.literal(node.operator === "===" ? classIdentity : !classIdentity);
2321
2686
  }
2322
2687
  }
2323
- if (node.operator === "==" || node.operator === "!=") {
2324
- const eq = node.operator === "==";
2325
- return distributeBinaryOverUnion(leftVal, rightVal, (l, r) => {
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
- if (node.operator === "typeof") {
2342
- return distributeOverUnion(argVal, (v) => Ops.typeof_(v));
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 T12.literal(!decided);
2700
+ if (decided !== null) return T15.literal(!decided);
2348
2701
  return Ops.not(v);
2349
2702
  });
2350
2703
  }
2351
- if (node.operator === "-") {
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) ? T12.unknown : rv;
2373
- return simplifyUnion4([leftVal, rightTV]);
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) ? T12.unknown : rv;
2389
- return simplifyUnion4([leftVal, rightTV]);
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) ? T12.unknown : rv;
2757
+ const rightTV = isReturn(rv) || isBranch(rv) || isThrow(rv) ? T15.unknown : rv;
2408
2758
  return rightTV;
2409
2759
  }
2410
- return T12.unknown;
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) ? T12.never : cResult;
2427
- const aVal = isReturn(aResult) ? aResult.value : isBranch(aResult) ? aResult.returnedValue : isThrow(aResult) ? T12.never : aResult;
2428
- return simplifyUnion4([cVal, aVal]);
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
- return evaluate(node.consequent, trueEnv);
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
- return node.alternate ? evaluate(node.alternate, falseEnv) : T12.undefined;
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
- return evaluate(node.consequent, trueEnv);
2818
+ pushPhi(combinePhi(currentPhi(), phis.whenTrue));
2819
+ try {
2820
+ return evaluate(node.consequent, trueEnv);
2821
+ } finally {
2822
+ popPhi();
2823
+ }
2457
2824
  }
2458
- return node.alternate ? evaluate(node.alternate, falseEnv) : T12.undefined;
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(T12.never, falseEnv);
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(simplifyUnion4([cVal, aVal]));
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(simplifyUnion4([cVal, aVal]));
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(T12.undefined);
2502
- return simplifyUnion4(allVals);
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(T12.undefined);
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) : T12.undefined);
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 T12.undefined;
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 = dispatchBinaryOp(binaryOp, leftVal, rightVal);
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 T12.unknown;
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 T12.undefined;
2990
+ if (!node.id) return T15.undefined;
2606
2991
  const paramNames = node.params.map(describeParam);
2607
- const fnType = T12.fn(paramNames, node.body, env);
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 T12.undefined;
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 = T12.fn(paramNames, body, env);
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 T12.undefined;
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 T12.undefined;
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 T12.unknown;
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 T12.undefined;
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 T12.undefined;
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 T12.unknown;
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 && hasOwnProp(BUILTIN_STATIC_METHODS, builtinName)) {
3169
+ if (builtinName && hasOwnProp3(BUILTIN_STATIC_METHODS, builtinName)) {
2785
3170
  const builtin = BUILTIN_STATIC_METHODS[builtinName];
2786
- if (typeof builtin === "object" && hasOwnProp(builtin, propName)) {
2787
- if (builtinName === "Symbol" && hasOwnProp(SYMBOL_STATIC_PROPS, propName)) {
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 T12.number;
3182
+ return T15.number;
2798
3183
  }
2799
3184
  if (obj.kind === "instance" && obj.className === "Set" && propName === "size") {
2800
- return T12.number;
3185
+ return T15.number;
2801
3186
  }
2802
3187
  if (obj.kind === "object") {
2803
- const ownVal = hasOwnProp(obj.properties, propName) ? obj.properties[propName] : void 0;
3188
+ const ownVal = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
2804
3189
  if (ownVal) return ownVal;
2805
- const protoFn = hasOwnProp(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
3190
+ const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
2806
3191
  if (protoFn) return bindObjectProtoMethod(protoFn, obj);
2807
- return T12.undefined;
3192
+ return T15.undefined;
2808
3193
  }
2809
3194
  if (obj.kind === "instance") {
2810
- const own = hasOwnProp(obj.properties, propName) ? obj.properties[propName] : void 0;
3195
+ const own = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
2811
3196
  if (own) return own;
2812
- const protoFn = hasOwnProp(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
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: T12.fnSig([], T12.array(T12.unknown)),
2817
- keys: T12.fnSig([], T12.array(T12.unknown)),
2818
- entries: T12.fnSig([], T12.array(T12.tuple([T12.unknown, T12.unknown]))),
2819
- get: T12.fnSig([T12.unknown], T12.unknown),
2820
- has: T12.fnSig([T12.unknown], T12.boolean),
2821
- add: T12.fnSig([T12.unknown], T12.unknown),
2822
- set: T12.fnSig([T12.unknown, T12.unknown], T12.unknown),
2823
- delete: T12.fnSig([T12.unknown], T12.boolean),
2824
- forEach: T12.fnSig([T12.unknown], T12.undefined),
2825
- call: T12.fnSig([T12.unknown], T12.unknown),
2826
- apply: T12.fnSig([T12.unknown], T12.unknown),
2827
- bind: T12.fnSig([T12.unknown], T12.unknown)
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 = hasOwnProp(knownInstanceMethods, propName) ? knownInstanceMethods[propName] : void 0;
3214
+ const knownFn = hasOwnProp3(knownInstanceMethods, propName) ? knownInstanceMethods[propName] : void 0;
2830
3215
  if (knownFn) return knownFn;
2831
- return T12.fnSig([T12.unknown], T12.unknown);
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" ? T12.literal(obj.elements.length) : T12.number;
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 T12.undefined;
3222
+ return T15.undefined;
2838
3223
  }
2839
3224
  if (propName === "length" && obj.kind === "literal" && typeof obj.value === "string") {
2840
- return T12.literal(obj.value.length);
3225
+ return T15.literal(obj.value.length);
2841
3226
  }
2842
3227
  if (propName === "length" && obj.kind === "primitive" && obj.type === "string") {
2843
- return T12.number;
3228
+ return T15.number;
2844
3229
  }
2845
3230
  if (obj.kind === "promise") {
2846
- const protoFn = hasOwnProp(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
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 && hasOwnProp(promiseMethods, propName)) {
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 : T12.undefined;
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 T12.unknown;
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 T12.unknown;
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 T12.undefined;
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 = hasOwnProp(obj.properties, propName) ? obj.properties[propName] : void 0;
3289
+ const ownVal = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
2905
3290
  if (ownVal) return ownVal;
2906
- const protoFn = hasOwnProp(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
3291
+ const protoFn = hasOwnProp3(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
2907
3292
  if (protoFn) return bindObjectProtoMethod(protoFn, obj);
2908
- return T12.undefined;
3293
+ return T15.undefined;
2909
3294
  }
2910
3295
  if (obj.kind === "instance") {
2911
- const own = hasOwnProp(obj.properties, propName) ? obj.properties[propName] : void 0;
3296
+ const own = hasOwnProp3(obj.properties, propName) ? obj.properties[propName] : void 0;
2912
3297
  if (own) return own;
2913
- const protoFn = hasOwnProp(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
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: T12.fnSig([], T12.array(T12.unknown)),
2918
- keys: T12.fnSig([], T12.array(T12.unknown)),
2919
- entries: T12.fnSig([], T12.array(T12.tuple([T12.unknown, T12.unknown]))),
2920
- get: T12.fnSig([T12.unknown], T12.unknown),
2921
- has: T12.fnSig([T12.unknown], T12.boolean),
2922
- add: T12.fnSig([T12.unknown], T12.unknown),
2923
- set: T12.fnSig([T12.unknown, T12.unknown], T12.unknown),
2924
- delete: T12.fnSig([T12.unknown], T12.boolean),
2925
- forEach: T12.fnSig([T12.unknown], T12.undefined),
2926
- call: T12.fnSig([T12.unknown], T12.unknown),
2927
- apply: T12.fnSig([T12.unknown], T12.unknown),
2928
- bind: T12.fnSig([T12.unknown], T12.unknown)
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 = hasOwnProp(knownInstanceMethods, propName) ? knownInstanceMethods[propName] : void 0;
3315
+ const knownFn = hasOwnProp3(knownInstanceMethods, propName) ? knownInstanceMethods[propName] : void 0;
2931
3316
  if (knownFn) return knownFn;
2932
- return T12.fnSig([T12.unknown], T12.unknown);
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" ? T12.literal(obj.elements.length) : T12.number;
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 T12.undefined;
3323
+ return T15.undefined;
2939
3324
  }
2940
3325
  if (propName === "length" && obj.kind === "literal" && typeof obj.value === "string") {
2941
- return T12.literal(obj.value.length);
3326
+ return T15.literal(obj.value.length);
2942
3327
  }
2943
3328
  if (propName === "length" && obj.kind === "primitive" && obj.type === "string") {
2944
- return T12.number;
3329
+ return T15.number;
2945
3330
  }
2946
3331
  if (obj.kind === "promise") {
2947
- const protoFn = hasOwnProp(OBJECT_PROTOTYPE_METHODS, propName) ? OBJECT_PROTOTYPE_METHODS[propName] : void 0;
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 && hasOwnProp(promiseMethods, propName)) {
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 : T12.undefined;
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 T12.unknown;
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 T12.unknown;
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] = T12.fn(params, prop.body, env);
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] = simplifyUnion4(values);
3412
+ props[key] = simplifyUnion8(values);
3021
3413
  }
3022
3414
  }
3023
3415
  }
3024
3416
  }
3025
3417
  }
3026
3418
  }
3027
- return T12.object(props);
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(T12.undefined);
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 T12.array(simplifyUnion4([...elements, spreadVal.element]));
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 T12.array(simplifyUnion4([...elements, iterable.element]));
3441
+ return T15.array(simplifyUnion8([...elements, iterable.element]));
3050
3442
  } else {
3051
- elements.push(T12.unknown);
3443
+ elements.push(T15.unknown);
3052
3444
  }
3053
3445
  } else {
3054
- elements.push(T12.unknown);
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 T12.tuple(elements);
3455
+ return T15.tuple(elements);
3064
3456
  }
3065
3457
  case "ThrowStatement": {
3066
- const argVal = node.argument ? evaluate(node.argument, env) : T12.undefined;
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 === "++" ? T12.literal(current.value + 1) : T12.literal(current.value - 1);
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, T12.number)) {
3098
- env.bind(node.argument.name, T12.number);
3489
+ if (!env.update(node.argument.name, T15.number)) {
3490
+ env.bind(node.argument.name, T15.number);
3099
3491
  }
3100
- return T12.number;
3492
+ return T15.number;
3101
3493
  }
3102
- return T12.number;
3494
+ return T15.number;
3103
3495
  }
3104
3496
  default:
3105
- return T12.unknown;
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 : T12.unknown : value;
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, T12.object(remaining), env);
3538
+ bindPattern(prop.argument, T15.object(remaining), env);
3147
3539
  } else {
3148
- bindPattern(prop.argument, T12.object({}), env);
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" ? hasOwnProp(value.properties, key) ? value.properties[key] : hasOwnProp(OBJECT_PROTOTYPE_METHODS, key) ? bindObjectProtoMethod(OBJECT_PROTOTYPE_METHODS[key], value) : T12.undefined : T12.unknown;
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, T12.tuple(value.elements.slice(i)), env);
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, T12.tuple([]), env);
3563
+ bindPattern(elem.argument, T15.tuple([]), env);
3172
3564
  }
3173
3565
  continue;
3174
3566
  }
3175
- const elemVal = value.kind === "tuple" ? value.elements[i] ?? T12.undefined : value.kind === "array" ? value.element : T12.unknown;
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(T12.unknown);
3591
+ result.push(T15.unknown);
3200
3592
  }
3201
3593
  } else {
3202
- result.push(T12.unknown);
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 T12.literal("");
3222
- if (name === "Number") return T12.literal(0);
3223
- if (name === "Boolean") return T12.literal(false);
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 T12.literal(String(arg.value));
3229
- return T12.string;
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 T12.literal(0);
3234
- if (arg.value === void 0) return T12.literal(NaN);
3235
- if (typeof arg.value === "boolean") return T12.literal(arg.value ? 1 : 0);
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 T12.literal(num);
3240
- return T12.literal(NaN);
3631
+ if (!isNaN(num)) return T15.literal(num);
3632
+ return T15.literal(NaN);
3241
3633
  }
3242
3634
  }
3243
- return T12.number;
3635
+ return T15.number;
3244
3636
  }
3245
3637
  if (name === "Boolean") {
3246
- if (arg.kind === "literal") return T12.literal(Boolean(arg.value));
3247
- return T12.boolean;
3638
+ if (arg.kind === "literal") return T15.literal(Boolean(arg.value));
3639
+ return T15.boolean;
3248
3640
  }
3249
3641
  }
3250
- if (name === "String") return T12.string;
3251
- if (name === "Number") return T12.number;
3252
- if (name === "Boolean") return T12.boolean;
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 T12.number;
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 T12.boolean;
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 T12.string;
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 T12.promise(createResponseType());
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 : T12.unknown;
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 T12.never;
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 ?? T12.unknown;
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 T12.undefined;
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 T12.number;
3799
+ return T15.number;
3408
3800
  }
3409
3801
  if (["PI", "E", "LN2", "LN10", "LOG2E", "LOG10E", "SQRT1_2", "SQRT2"].includes(methodName)) {
3410
- return T12.number;
3802
+ return T15.number;
3411
3803
  }
3412
- return T12.number;
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 T12.number;
3810
+ return T15.number;
3419
3811
  }
3420
3812
  if (methodName === "constructor") {
3421
- return T12.instanceOf("Date", {
3422
- getTime: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
3423
- getFullYear: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0),
3424
- toISOString: T12.fn(["...args"], { type: "BlockStatement", body: [] }, void 0)
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 T12.unknown;
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 T12.string;
3831
+ return T15.string;
3440
3832
  }
3441
- return T12.unknown;
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 T12.array(typeArgs.T);
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 T12.array(T12.unknown);
3852
+ return T15.array(T15.unknown);
3461
3853
  }
3462
3854
  if (methodName === "isArray") {
3463
- return distributeOverUnion(argVals[0] ?? T12.undefined, (v) => {
3464
- const lit = arrayIsArrayLiteral(v);
3465
- return lit === void 0 ? T12.boolean : T12.literal(lit);
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 T12.unknown;
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 T12.unknown;
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 T12.symbol;
3481
- if (methodName === "keyFor") return T12.union(T12.string, T12.undefined);
3482
- return T12.unknown;
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 T12.unknown;
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" ? T12.literal(String(objVal.value)) : T12.string;
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 : T12.number;
4041
+ return objVal.kind === "literal" && typeof objVal.value === "number" ? objVal : T15.number;
3650
4042
  }
3651
- if (methodName === "toFixed" || methodName === "toPrecision") return T12.string;
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 T12.literal(str);
4090
+ return T15.literal(str);
3699
4091
  case "toUpperCase":
3700
- return T12.literal(str.toUpperCase());
4092
+ return T15.literal(str.toUpperCase());
3701
4093
  case "toLowerCase":
3702
- return T12.literal(str.toLowerCase());
4094
+ return T15.literal(str.toLowerCase());
3703
4095
  case "trim":
3704
- return T12.literal(str.trim());
4096
+ return T15.literal(str.trim());
3705
4097
  case "trimStart":
3706
- return T12.literal(str.trimStart());
4098
+ return T15.literal(str.trimStart());
3707
4099
  case "trimEnd":
3708
- return T12.literal(str.trimEnd());
4100
+ return T15.literal(str.trimEnd());
3709
4101
  case "charAt": {
3710
4102
  const idx = litArg(0);
3711
- return typeof idx === "number" ? T12.literal(str.charAt(idx)) : T12.string;
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" ? T12.literal(str.charCodeAt(idx)) : T12.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 ? T12.literal(ch) : T12.undefined;
4113
+ return ch !== void 0 ? T15.literal(ch) : T15.undefined;
3722
4114
  }
3723
- return T12.union(T12.string, T12.undefined);
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" ? T12.literal(str.startsWith(search)) : T12.boolean;
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" ? T12.literal(str.endsWith(search)) : T12.boolean;
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" ? T12.literal(str.includes(search)) : T12.boolean;
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" ? T12.literal(str.indexOf(search)) : T12.number;
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" ? T12.literal(str.lastIndexOf(search)) : T12.number;
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 T12.literal(str.slice(start, typeof end === "number" ? end : void 0));
4141
+ return T15.literal(str.slice(start, typeof end === "number" ? end : void 0));
3750
4142
  }
3751
- return T12.string;
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 T12.literal(str.substring(start, typeof end === "number" ? end : void 0));
4149
+ return T15.literal(str.substring(start, typeof end === "number" ? end : void 0));
3758
4150
  }
3759
- return T12.string;
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 T12.tuple(parts.map((p) => T12.literal(p)));
4157
+ return T15.tuple(parts.map((p) => T15.literal(p)));
3766
4158
  }
3767
- return T12.array(T12.string);
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 T12.literal(str.replace(search, replacement));
4165
+ return T15.literal(str.replace(search, replacement));
3774
4166
  }
3775
- return T12.string;
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 T12.literal(str.replaceAll(search, replacement));
4173
+ return T15.literal(str.replaceAll(search, replacement));
3782
4174
  }
3783
- return T12.string;
4175
+ return T15.string;
3784
4176
  }
3785
4177
  case "repeat": {
3786
4178
  const count = litArg(0);
3787
- return typeof count === "number" ? T12.literal(str.repeat(count)) : T12.string;
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 T12.literal(str.padStart(len, typeof fill === "string" ? fill : void 0));
4185
+ return T15.literal(str.padStart(len, typeof fill === "string" ? fill : void 0));
3794
4186
  }
3795
- return T12.string;
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 T12.literal(str.padEnd(len, typeof fill === "string" ? fill : void 0));
4193
+ return T15.literal(str.padEnd(len, typeof fill === "string" ? fill : void 0));
3802
4194
  }
3803
- return T12.string;
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 T12.string;
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 T12.string;
4219
+ return T15.string;
3828
4220
  case "charCodeAt":
3829
4221
  case "indexOf":
3830
4222
  case "lastIndexOf":
3831
- return T12.number;
4223
+ return T15.number;
3832
4224
  case "at":
3833
- return T12.union(T12.string, T12.undefined);
4225
+ return T15.union(T15.string, T15.undefined);
3834
4226
  case "startsWith":
3835
4227
  case "endsWith":
3836
4228
  case "includes":
3837
- return T12.boolean;
4229
+ return T15.boolean;
3838
4230
  case "split":
3839
- return T12.array(T12.string);
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 T12.tuple(Object.keys(obj.properties).map((k) => T12.literal(k)));
4239
+ return T15.tuple(Object.keys(obj.properties).map((k) => T15.literal(k)));
3848
4240
  }
3849
- if (method === "values") return T12.tuple(Object.values(obj.properties));
4241
+ if (method === "values") return T15.tuple(Object.values(obj.properties));
3850
4242
  if (method === "entries") {
3851
- return T12.tuple(
3852
- Object.keys(obj.properties).map((k) => T12.tuple([T12.literal(k), obj.properties[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 T12.array(T12.string);
4255
+ else return T15.array(T15.string);
3864
4256
  }
3865
- if (literals.length > 64) return T12.array(T12.string);
3866
- return T12.tuple(literals);
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 T12.array(T12.unknown);
3871
- return T12.tuple(vals);
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 T12.array(T12.tuple([T12.string, T12.unknown]));
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 T12.tuple(obj.elements.map((_, i) => T12.literal(String(i))));
4272
+ return T15.tuple(obj.elements.map((_, i) => T15.literal(String(i))));
3881
4273
  }
3882
- if (method === "values") return T12.tuple([...obj.elements]);
4274
+ if (method === "values") return T15.tuple([...obj.elements]);
3883
4275
  if (method === "entries") {
3884
- return T12.tuple(obj.elements.map((el, i) => T12.tuple([T12.literal(String(i)), el])));
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 T12.array(T12.string);
3890
- if (method === "values") return T12.array(T12.unknown);
3891
- if (method === "entries") return T12.array(T12.tuple([T12.string, T12.unknown]));
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 T12.tuple(keys.map((k) => T12.literal(k)));
4289
+ return T15.tuple(keys.map((k) => T15.literal(k)));
3898
4290
  }
3899
4291
  if (method === "values") {
3900
- return T12.tuple(values);
4292
+ return T15.tuple(values);
3901
4293
  }
3902
4294
  if (method === "entries") {
3903
- return T12.tuple(
3904
- keys.map((k) => T12.tuple([T12.literal(k), obj.properties[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 T12.tuple(keys.map((k) => T12.literal(k)));
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 T12.literal(arr.elements.length);
4314
+ return T15.literal(arr.elements.length);
3923
4315
  }
3924
- return T12.number;
4316
+ return T15.number;
3925
4317
  }
3926
4318
  if (method === "length") {
3927
- return arr.kind === "tuple" ? T12.literal(arr.elements.length) : T12.number;
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 T12.undefined;
3932
- return T12.union(...arr.elements);
4323
+ if (arr.elements.length === 0) return T15.undefined;
4324
+ return T15.union(...arr.elements);
3933
4325
  }
3934
- return T12.unknown;
4326
+ return T15.unknown;
3935
4327
  }
3936
4328
  if (method === "unshift") {
3937
4329
  if (arr.kind === "tuple") {
3938
- return T12.literal(arr.elements.length + argVals.length);
4330
+ return T15.literal(arr.elements.length + argVals.length);
3939
4331
  }
3940
- return T12.number;
4332
+ return T15.number;
3941
4333
  }
3942
4334
  if (method === "indexOf" || method === "lastIndexOf") {
3943
- return T12.number;
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 T12.literal(found);
4341
+ return T15.literal(found);
3950
4342
  }
3951
- return T12.boolean;
4343
+ return T15.boolean;
3952
4344
  }
3953
4345
  if (method === "join") {
3954
- return T12.string;
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 T12.array(simplifyUnion4([...arr.elements, a.element]));
4353
+ else if (a.kind === "array") return T15.array(simplifyUnion8([...arr.elements, a.element]));
3962
4354
  else otherElements.push(a);
3963
4355
  }
3964
- return T12.tuple([...arr.elements, ...otherElements]);
4356
+ return T15.tuple([...arr.elements, ...otherElements]);
3965
4357
  }
3966
- return T12.array(arr.element);
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 T12.tuple(arr.elements.slice(startIdx, endIdx));
4366
+ return T15.tuple(arr.elements.slice(startIdx, endIdx));
3975
4367
  }
3976
- return T12.array(arr.element);
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 ? T12.unknown : r;
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" ? T12.tuple(arr.elements.map(() => T12.unknown)) : T12.array(T12.unknown);
3986
- if (method === "filter") return arr.kind === "tuple" ? T12.array(simplifyUnion4(arr.elements)) : arr;
3987
- if (method === "find") return arr.kind === "tuple" ? simplifyUnion4([...arr.elements, T12.undefined]) : simplifyUnion4([arr.element, T12.undefined]);
3988
- if (method === "some" || method === "every") return T12.boolean;
3989
- if (method === "reduce") return argVals[1] ?? T12.unknown;
3990
- if (method === "forEach") return T12.undefined;
3991
- if (method === "flatMap") return T12.array(T12.unknown);
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, T12.literal(i), arr])
4395
+ (el, i) => callFunction(fn, [tagEl(el, fn.params[0] ?? "item"), T15.literal(i), arr])
3999
4396
  );
4000
- return T12.tuple(mapped);
4397
+ return T15.tuple(mapped);
4001
4398
  }
4002
- return T12.array(callFunction(fn, [arr.element, T12.number, arr]));
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, [arr.elements[i], T12.literal(i), arr]);
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 T12.tuple([]);
4013
- return T12.array(simplifyUnion4(kept));
4415
+ if (kept.length === 0) return T15.tuple([]);
4416
+ return T15.array(simplifyUnion8(kept));
4014
4417
  }
4015
- return T12.array(arr.element);
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] ?? T12.unknown;
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, [acc2, arr.elements[i], T12.literal(i), arr]);
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 acc = init ?? arr.element;
4028
- const result = callFunction(fn, [acc, arr.element, T12.number, arr]);
4029
- return result;
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" ? simplifyUnion4(arr.elements) : arr.element;
4033
- return simplifyUnion4([elementType, T12.undefined]);
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, T12.literal(i), arr])
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 T12.literal(method === "some" ? boolVals.some(Boolean) : boolVals.every(Boolean));
4462
+ return T15.literal(method === "some" ? boolVals.some(Boolean) : boolVals.every(Boolean));
4044
4463
  }
4045
4464
  }
4046
- return T12.boolean;
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, T12.literal(i), arr]));
4469
+ arr.elements.forEach((el, i) => callFunction(fn, [el, T15.literal(i), arr]));
4051
4470
  } else {
4052
- callFunction(fn, [arr.element, T12.number, arr]);
4471
+ callFunction(fn, [arr.element, T15.number, arr]);
4053
4472
  }
4054
- return T12.undefined;
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], T12.literal(i), arr]);
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 T12.array(r2.element);
4481
+ else if (r2.kind === "array") return T15.array(r2.element);
4063
4482
  else results.push(r2);
4064
4483
  }
4065
- return T12.tuple(results);
4484
+ return T15.tuple(results);
4066
4485
  }
4067
- const r = callFunction(fn, [arr.element, T12.number, arr]);
4068
- if (r.kind === "tuple") return T12.array(simplifyUnion4(r.elements));
4069
- if (r.kind === "array") return T12.array(r.element);
4070
- return T12.array(r);
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 ? T12.tuple([...values]) : setValuesIterable(v);
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" ? T12.array(t) : void 0;
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 T12.array(T12.tuple([ta.K ?? T12.unknown, ta.V ?? T12.unknown]));
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(simplifyUnion4(returnValues));
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(simplifyUnion4(returnValues), currentEnv);
4529
+ return makeBranch(simplifyUnion8(returnValues), currentEnv);
4111
4530
  }
4112
- return T12.undefined;
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(simplifyUnion4(returnValues));
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(simplifyUnion4(returnValues), currentEnv);
4551
+ return makeBranch(simplifyUnion8(returnValues), currentEnv);
4133
4552
  }
4134
- return T12.undefined;
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 T12.undefined;
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, T12.tuple([...values]), env);
4565
+ return evaluateForOf(node, T15.tuple([...values]), env);
4147
4566
  }
4148
- return T12.undefined;
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
- T12.tuple(entries.map((e) => T12.tuple([e.key, e.value]))),
4574
+ T15.tuple(entries.map((e) => T15.tuple([e.key, e.value]))),
4156
4575
  env
4157
4576
  );
4158
4577
  }
4159
- return T12.undefined;
4578
+ return T15.undefined;
4160
4579
  }
4161
- return T12.undefined;
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, T12.literal(key), loopEnv2);
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(simplifyUnion4(returnValues));
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(simplifyUnion4(returnValues), currentEnv);
4603
+ return makeBranch(simplifyUnion8(returnValues), currentEnv);
4185
4604
  }
4186
- return T12.undefined;
4605
+ return T15.undefined;
4187
4606
  }
4188
4607
  }
4189
4608
  const loopEnv = env.fork();
4190
- bindForLoopVar(node.left, T12.string, loopEnv);
4609
+ bindForLoopVar(node.left, T15.string, loopEnv);
4191
4610
  evaluate(node.body, loopEnv);
4192
- return T12.undefined;
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(simplifyUnion4(returnValues), env);
4712
+ return makeBranch(simplifyUnion8(returnValues), env);
4294
4713
  }
4295
- return T12.undefined;
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(simplifyUnion4(returnValues), env);
4734
+ return makeBranch(simplifyUnion8(returnValues), env);
4316
4735
  }
4317
- return T12.undefined;
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(simplifyUnion4(returnValues), env);
4756
+ return makeBranch(simplifyUnion8(returnValues), env);
4338
4757
  }
4339
- return T12.undefined;
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 T12.object(exports);
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 T12.unknown;
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 T12.unknown;
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 T12.unknown;
4865
+ return T15.unknown;
4467
4866
  }
4468
- if (!currentModuleResolver) return T12.unknown;
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 T12.unknown;
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}`) : T12.unknown;
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}`) : T12.unknown;
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`) : T12.unknown;
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, T12.object(exports));
4929
+ env.bind(spec.local.name, T15.object(exports));
4531
4930
  }
4532
4931
  }
4533
- return T12.undefined;
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`) : T12.unknown;
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}`) : T12.unknown;
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, T12.object(exports));
4952
+ env.bind(spec.local.name, T15.object(exports));
4554
4953
  }
4555
4954
  }
4556
- return T12.undefined;
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 ?? T12.unknown);
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] ?? T12.unknown);
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, T12.object(rest));
4977
+ env.bind(spec.local.name, T15.object(rest));
4579
4978
  }
4580
4979
  }
4581
- return T12.undefined;
4980
+ return T15.undefined;
4582
4981
  }
4583
- if (!currentModuleResolver) return T12.undefined;
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 T12.undefined;
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`) : T12.unknown;
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}`) : T12.unknown;
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, T12.object(exports));
5014
+ env.bind(spec.local.name, T15.object(exports));
4616
5015
  }
4617
5016
  }
4618
- return T12.undefined;
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 = T12.fn(paramNames, member.body, env);
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 ?? T12.fn([], { type: "BlockStatement", body: [], directives: [] }, env);
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 T12.undefined;
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 T12.boolean;
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, T12.instanceOf(className));
4655
- return T12.literal(matches);
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 T12.literal(structural);
4659
- return T12.boolean;
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 = T12.fnSig([T12.unknown], T12.undefined, T12.never, (args) => {
4667
- sink.push(args[0] ?? T12.undefined);
4668
- return T12.undefined;
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 !== T12.undefined) return 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 T12.promise(T12.union(...resolveCollected));
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 : T12.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 = T12.tuple(args.slice(i));
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
- const argVal = args[i] ?? T12.undefined;
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", T12.tuple(args));
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] ?? T12.undefined;
4783
- return T12.instanceOf(callee.name, { message: msgVal });
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 T12.promise(T12.unknown);
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 T12.array(T12.unknown);
4850
- return T12.instanceOf(protoClassName);
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 T12.array(T12.unknown);
4855
- if (classNamespace === "Object") return T12.object({});
4856
- return T12.instanceOf(classNamespace);
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 = T12.object(instanceProps);
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 T12.instanceOf(classInfo.className, props);
5279
+ return T15.instanceOf(classInfo.className, props);
4876
5280
  }
4877
5281
  return callFunction(calleeVal, argVals);
4878
5282
  }
4879
- return T12.unknown;
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(simplifyUnion4([tryValue.value, catchResult.value]));
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 T12.undefined;
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(simplifyUnion4(returnValues2), env);
5356
+ return makeBranch(simplifyUnion8(returnValues2), env);
4953
5357
  }
4954
- return T12.undefined;
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(simplifyUnion4(returnValues), env);
5391
+ return makeBranch(simplifyUnion8(returnValues), env);
4988
5392
  }
4989
- return T12.undefined;
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(simplifyUnion4(obs), 4);
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: T12.unknown, throws: T12.never };
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: T12.never };
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: T12.unknown, throws: T12.never };
5528
+ return { value: T15.unknown, throws: T15.never };
5125
5529
  }
5126
- return { value: cached, throws: T12.never };
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) ? T12.never : result2;
5132
- const throws = isThrow(result2) ? result2.thrown : T12.never;
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 ? T12.promise(value2) : value2;
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: T12.never, throws: result.thrown, throwLoc: result.loc };
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 ? T12.promise(value) : value;
5145
- return { value: wrapped, throws: T12.never };
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 = T12.fn(paramNames, actualNode.body, callEnv);
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
- bindPattern(actualNode.params[i], args[i] ?? T12.undefined, callEnv);
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: T12.never, throws: result.thrown, throwLoc: result.loc };
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 : T12.promise(value) : value;
5184
- return { value: wrapped, throws: T12.never };
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: T12.unknown, throws: T12.never };
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 T12.never;
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
  };