@scriptc/compiler 0.0.22 → 0.0.24

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 (93) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +139 -14
  2. package/dist/backend/cc.d.ts +13 -0
  3. package/dist/backend/cc.js +11 -0
  4. package/dist/backend/cc.js.map +1 -1
  5. package/dist/backend/emission/emit-async.d.ts +4 -0
  6. package/dist/backend/emission/emit-async.js +34 -2
  7. package/dist/backend/emission/emit-async.js.map +1 -1
  8. package/dist/backend/emission/emit-exprs.d.ts +10 -0
  9. package/dist/backend/emission/emit-exprs.js +272 -22
  10. package/dist/backend/emission/emit-exprs.js.map +1 -1
  11. package/dist/backend/emission/emit-shapes.js +1 -0
  12. package/dist/backend/emission/emit-shapes.js.map +1 -1
  13. package/dist/backend/emission/emit-stmts.js +36 -9
  14. package/dist/backend/emission/emit-stmts.js.map +1 -1
  15. package/dist/backend/emission/emit-types.js +14 -1
  16. package/dist/backend/emission/emit-types.js.map +1 -1
  17. package/dist/backend/emission/emitter.d.ts +19 -1
  18. package/dist/backend/emission/emitter.js +81 -2
  19. package/dist/backend/emission/emitter.js.map +1 -1
  20. package/dist/backend/llvm/emitter.js +578 -36
  21. package/dist/backend/llvm/emitter.js.map +1 -1
  22. package/dist/backend/llvm/shapes.js +12 -3
  23. package/dist/backend/llvm/shapes.js.map +1 -1
  24. package/dist/backend/mangle.d.ts +3 -0
  25. package/dist/backend/mangle.js +5 -0
  26. package/dist/backend/mangle.js.map +1 -1
  27. package/dist/compat/fetch-profile.d.ts +10 -0
  28. package/dist/compat/fetch-profile.js +55 -6
  29. package/dist/compat/fetch-profile.js.map +1 -1
  30. package/dist/coverage/surface-manifest.js +16 -1
  31. package/dist/coverage/surface-manifest.js.map +1 -1
  32. package/dist/diagnostics/diagnostic.d.ts +10 -0
  33. package/dist/diagnostics/diagnostic.js +27 -1
  34. package/dist/diagnostics/diagnostic.js.map +1 -1
  35. package/dist/frontend/lowering/lower-builtins.d.ts +17 -16
  36. package/dist/frontend/lowering/lower-builtins.js +817 -117
  37. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  38. package/dist/frontend/lowering/lower-calls.js +3 -1
  39. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  40. package/dist/frontend/lowering/lower-classes.js +28 -8
  41. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  42. package/dist/frontend/lowering/lower-containers.d.ts +2 -1
  43. package/dist/frontend/lowering/lower-containers.js +99 -32
  44. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  45. package/dist/frontend/lowering/lower-exprs.d.ts +1 -1
  46. package/dist/frontend/lowering/lower-exprs.js +78 -6
  47. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  48. package/dist/frontend/lowering/lower-generators.js +7 -1
  49. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  50. package/dist/frontend/lowering/lower-inspect.js +59 -1
  51. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  52. package/dist/frontend/lowering/lower-island.d.ts +21 -0
  53. package/dist/frontend/lowering/lower-island.js +284 -10
  54. package/dist/frontend/lowering/lower-island.js.map +1 -1
  55. package/dist/frontend/lowering/lower-server.d.ts +5 -0
  56. package/dist/frontend/lowering/lower-server.js +1 -1
  57. package/dist/frontend/lowering/lower-server.js.map +1 -1
  58. package/dist/frontend/lowering/lower-stmts.d.ts +6 -2
  59. package/dist/frontend/lowering/lower-stmts.js +53 -14
  60. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  61. package/dist/frontend/lowering/lowerer.d.ts +3 -2
  62. package/dist/frontend/lowering/lowerer.js +17 -8
  63. package/dist/frontend/lowering/lowerer.js.map +1 -1
  64. package/dist/frontend/lowering/surfaces.js +108 -25
  65. package/dist/frontend/lowering/surfaces.js.map +1 -1
  66. package/dist/frontend/program.d.ts +4 -4
  67. package/dist/frontend/program.js +264 -46
  68. package/dist/frontend/program.js.map +1 -1
  69. package/dist/frontend/resolve.d.ts +10 -0
  70. package/dist/frontend/resolve.js +37 -0
  71. package/dist/frontend/resolve.js.map +1 -1
  72. package/dist/frontend/ts7/enums.d.ts +9 -0
  73. package/dist/frontend/ts7/enums.js +8 -6
  74. package/dist/frontend/ts7/enums.js.map +1 -1
  75. package/dist/frontend/ts7/program.js +4 -1
  76. package/dist/frontend/ts7/program.js.map +1 -1
  77. package/dist/frontend/types.d.ts +7 -4
  78. package/dist/frontend/types.js +103 -8
  79. package/dist/frontend/types.js.map +1 -1
  80. package/dist/index.js +8 -1
  81. package/dist/index.js.map +1 -1
  82. package/dist/ir/integer-loops.d.ts +23 -0
  83. package/dist/ir/integer-loops.js +82 -0
  84. package/dist/ir/integer-loops.js.map +1 -0
  85. package/dist/ir/nodes.d.ts +104 -28
  86. package/dist/ir/nodes.js +89 -1
  87. package/dist/ir/nodes.js.map +1 -1
  88. package/dist/ir/validate.js +136 -25
  89. package/dist/ir/validate.js.map +1 -1
  90. package/dist/library/fence-eval.js +4 -3
  91. package/dist/library/fence-eval.js.map +1 -1
  92. package/package.json +2 -2
  93. package/surface-manifest.json +186 -29
@@ -234,7 +234,7 @@ export declare function foldedStringKeyOf(L: Lowerer, expr: ts.Expression): stri
234
234
  * (dynFrom's domain, functions box); a value with no dyn representation
235
235
  * fences per property. Spreads copy through dyn.assign in source order;
236
236
  * accessors stay fenced. */
237
- export declare function lowerDynObjectLiteral(L: Lowerer, expr: ts.ObjectLiteralExpression): IrExpr;
237
+ export declare function lowerDynObjectLiteral(L: Lowerer, expr: ts.ObjectLiteralExpression, boxValue?: (node: ts.Expression, value: IrExpr) => IrExpr): IrExpr;
238
238
  export declare function lowerObjectLiteral(L: Lowerer, expr: ts.ObjectLiteralExpression): IrExpr;
239
239
  /** A conditional spread's carrier property: `name: value` or shorthand,
240
240
  * with an identifier/string-literal name. */
@@ -21,7 +21,7 @@ import { lowerSocketInstanceOf, lowerTlsRootCertificates } from "./lower-server.
21
21
  import { findGenericMethodOn, lowerStaticFieldRead } from "./lower-classes.js";
22
22
  import { bindingNeverReassigned, implicitMonoFile, lowerTaggedTemplate, nullishGenericBindingUnitOf, objLitGenericFnInfoOf, objLitGenericFnNodeOf, requireObjLitGenericReceiver } from "./lower-calls.js";
23
23
  import { mixinFnOfCallee } from "./lower-mixins.js";
24
- import { isConstAssertionTypeNode, isGenericCallableMemberType, underConstAssertion, unitOnlyUnion } from "../types.js";
24
+ import { isConstAssertionTypeNode, isGenericCallableMemberType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion } from "../types.js";
25
25
  import { lowerYield } from "./lower-generators.js";
26
26
  import { lowerStreamProperty, lowerStreamStateProperty, streamSidesOf } from "./lower-stream.js";
27
27
  /** A template piece's RAW text (String.raw's contract: escapes stay
@@ -63,6 +63,30 @@ export function abstractPropertyDeclOf(L, expr) {
63
63
  .some((d) => ts.isPropertyDeclaration(d) &&
64
64
  ts.getModifiers(d)?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword) === true);
65
65
  }
66
+ /** A field declared by node:util's parseArgs checked-dynamic type family.
67
+ * Narrowing a ParseArgsToken exposes one anonymous union arm, so its alias
68
+ * identity no longer reaches mapType; declaration ancestry is the stable
69
+ * provenance check. */
70
+ function isParseArgsDynProperty(L, expr) {
71
+ const sym = L.checker.getSymbolAtLocation(expr.name);
72
+ if (!sym)
73
+ return false;
74
+ return L.checker.declarationsOf(sym).some((d) => {
75
+ if (!L.isStdlibFile(d.getSourceFile()))
76
+ return false;
77
+ let inParseArgsType = false;
78
+ for (let node = d.parent; node; node = node.parent) {
79
+ if ((ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) &&
80
+ isParseArgsDynTypeName(node.name.text)) {
81
+ inParseArgsType = true;
82
+ }
83
+ if (ts.isModuleDeclaration(node) && ts.isStringLiteral(node.name)) {
84
+ return inParseArgsType && (node.name.text === "util" || node.name.text === "node:util");
85
+ }
86
+ }
87
+ return false;
88
+ });
89
+ }
66
90
  export function lowerExpr(L, expr) {
67
91
  if (lowerExprDepth >= LOWER_EXPR_MAX_DEPTH) {
68
92
  L.unsupported("SC1090", expr, `expressions nested deeper than ${LOWER_EXPR_MAX_DEPTH} levels`);
@@ -1600,6 +1624,32 @@ function lowerExprInner(L, expr) {
1600
1624
  return nsUndefRead(L, ambientRoot.text, expr, t);
1601
1625
  }
1602
1626
  }
1627
+ // parseArgs results/tokens live in the checked-dynamic tree. A token
1628
+ // discriminant check narrows its checker type to one anonymous arm,
1629
+ // whose ambient property symbols would otherwise hit SC2020 before
1630
+ // the generic dyn receiver path below. Provenance is limited to the
1631
+ // node:util parseArgs family; every other stdlib member keeps its
1632
+ // ordinary surface fence.
1633
+ if (isParseArgsDynProperty(L, expr)) {
1634
+ const recv = L.lowerExpr(expr.expression);
1635
+ if (recv.type.kind === "dyn") {
1636
+ const key = {
1637
+ kind: "strLit",
1638
+ value: expr.name.text,
1639
+ type: STRING,
1640
+ loc: locOf(expr.name),
1641
+ };
1642
+ const opt = chainGuardedByQuestionDot(expr.expression);
1643
+ return L.maybeNarrow({
1644
+ kind: "dynKeyGet",
1645
+ key,
1646
+ ...(opt ? { optional: true } : {}),
1647
+ value: recv,
1648
+ type: DYN,
1649
+ loc,
1650
+ }, expr);
1651
+ }
1652
+ }
1603
1653
  // A member read through a NULLISH generic binding (`const i: I<A &
1604
1654
  // B> = null as any; const _i: I<A> = i.something` — the receiver
1605
1655
  // provably holds null/undefined forever): the read throws Node's
@@ -1614,6 +1664,7 @@ function lowerExprInner(L, expr) {
1614
1664
  // The lib fence's PROPERTY chokepoint: a stdlib-declared member that
1615
1665
  // no lowering above claimed ([1,2].entries, Math.SQRT2, Promise.all,
1616
1666
  // re.exec as a value, ...) reports SC2020 here.
1667
+ L.fenceStaticAbortControllerMemberRead(expr);
1617
1668
  L.fenceStaticResponseMember(expr, "read");
1618
1669
  L.fenceStaticHeadersMember(expr, "read");
1619
1670
  L.fenceStaticReadableStreamMember(expr, "read");
@@ -2911,7 +2962,7 @@ export function lowerIntrinsicProperty(L, expr) {
2911
2962
  if (probe.type.kind === "array")
2912
2963
  kind = "array";
2913
2964
  }
2914
- if (kind !== "string" && kind !== "array" && kind !== "map" && kind !== "set" && kind !== "f64" && kind !== "regex" && kind !== "url" && kind !== "searchParams" && kind !== "stats" && kind !== "spawnRes" && kind !== "child" && kind !== "bytes" && kind !== "symbol") {
2965
+ if (kind !== "string" && kind !== "array" && kind !== "map" && kind !== "set" && kind !== "f64" && kind !== "date" && kind !== "regex" && kind !== "url" && kind !== "searchParams" && kind !== "stats" && kind !== "spawnRes" && kind !== "child" && kind !== "bytes" && kind !== "symbol") {
2915
2966
  return null;
2916
2967
  }
2917
2968
  // child receivers also admit the user's own child-shaped interface
@@ -3004,7 +3055,21 @@ export function lowerIntrinsicProperty(L, expr) {
3004
3055
  if (name === "isFile" || name === "isDirectory") {
3005
3056
  L.unsupported("SC1090", expr, `Stats methods as values (call '${name}' directly)`);
3006
3057
  }
3007
- L.noLowering(`Stats.${name}`, expr, "isFile(), isDirectory(), and size are the supported Stats members", L.checker.getSymbolAtLocation(expr.name));
3058
+ L.noLowering(`Stats.${name}`, expr, "isFile(), isDirectory(), isSymbolicLink(), size, blocks, nlink, atimeMs, and mtimeMs are the supported Stats members", L.checker.getSymbolAtLocation(expr.name));
3059
+ }
3060
+ if (kind === "date") {
3061
+ const methods = new Set([
3062
+ "getTime", "valueOf", "toISOString",
3063
+ "getFullYear", "getUTCFullYear", "getMonth", "getUTCMonth",
3064
+ "getDate", "getUTCDate", "getDay", "getUTCDay", "getHours",
3065
+ "getUTCHours", "getMinutes", "getUTCMinutes", "getSeconds",
3066
+ "getUTCSeconds", "getMilliseconds", "getUTCMilliseconds",
3067
+ "getTimezoneOffset",
3068
+ ]);
3069
+ if (methods.has(name)) {
3070
+ L.unsupported("SC1090", expr, `Date methods as values (call '${name}' directly)`);
3071
+ }
3072
+ L.noLowering(`Date.prototype.${name}`, expr, "getTime(), valueOf(), toISOString(), the local/UTC calendar getters, and getTimezoneOffset() are supported; Date setters and locale/string formatters have no lowering", L.checker.getSymbolAtLocation(expr.name));
3008
3073
  }
3009
3074
  if (kind === "symbol") {
3010
3075
  const loc = locOf(expr);
@@ -3655,7 +3720,7 @@ function propNameText(L, name) {
3655
3720
  * (dynFrom's domain, functions box); a value with no dyn representation
3656
3721
  * fences per property. Spreads copy through dyn.assign in source order;
3657
3722
  * accessors stay fenced. */
3658
- export function lowerDynObjectLiteral(L, expr) {
3723
+ export function lowerDynObjectLiteral(L, expr, boxValue) {
3659
3724
  const loc = locOf(expr);
3660
3725
  let fields = [];
3661
3726
  let acc = null;
@@ -3671,7 +3736,10 @@ export function lowerDynObjectLiteral(L, expr) {
3671
3736
  for (const prop of expr.properties) {
3672
3737
  if (ts.isSpreadAssignment(prop)) {
3673
3738
  flushFields();
3674
- const source = L.coerceToExpected(L.lowerExpr(prop.expression), DYN);
3739
+ const raw = L.lowerExpr(prop.expression);
3740
+ const source = boxValue
3741
+ ? boxValue(prop.expression, raw)
3742
+ : L.coerceToExpected(raw, DYN);
3675
3743
  if (source.type.kind !== "dyn") {
3676
3744
  L.unsupported("SC1101", prop.expression, `spreading '${L.fmt(source.type)}' into a checked-dynamic object literal`);
3677
3745
  }
@@ -3765,7 +3833,9 @@ export function lowerDynObjectLiteral(L, expr) {
3765
3833
  });
3766
3834
  raw = { kind: "closure", fnName, captures: [], type: funcOf([], VOID), loc: locOf(prop) };
3767
3835
  }
3768
- let v = L.coerceToExpected(raw, DYN);
3836
+ let v = boxValue
3837
+ ? boxValue(valueExpr, raw)
3838
+ : L.coerceToExpected(raw, DYN);
3769
3839
  if (v.type.kind !== "dyn") {
3770
3840
  const convDiagsBefore = L.diags.length;
3771
3841
  try {
@@ -5233,6 +5303,7 @@ export function lowerElementAccess(L, expr) {
5233
5303
  // spellings. Fence a statically-known unsupported key before the generic
5234
5304
  // checked-dynamic element-read path can turn it into a runtime missing
5235
5305
  // member.
5306
+ L.fenceStaticAbortControllerMemberRead(expr);
5236
5307
  L.fenceStaticResponseMember(expr, "read");
5237
5308
  L.fenceStaticHeadersMember(expr, "read");
5238
5309
  L.fenceStaticReadableStreamMember(expr, "read");
@@ -7270,6 +7341,7 @@ function typeofAnswer(arm) {
7270
7341
  case "url":
7271
7342
  case "searchParams":
7272
7343
  case "stats":
7344
+ case "fileHandle":
7273
7345
  case "spawnRes":
7274
7346
  case "child":
7275
7347
  case "netServer":