@scriptc/compiler 0.2.2 → 0.2.3

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 (178) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +99 -27
  2. package/dist/backend/cycle-analysis.js +63 -50
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-analysis.test.js +51 -0
  5. package/dist/backend/cycle-analysis.test.js.map +1 -1
  6. package/dist/backend/llvm/borrowed-receivers.d.ts +9 -0
  7. package/dist/backend/llvm/borrowed-receivers.js +58 -0
  8. package/dist/backend/llvm/borrowed-receivers.js.map +1 -0
  9. package/dist/backend/llvm/call-lifetimes.d.ts +20 -0
  10. package/dist/backend/llvm/call-lifetimes.js +179 -0
  11. package/dist/backend/llvm/call-lifetimes.js.map +1 -0
  12. package/dist/backend/llvm/call-lifetimes.test.d.ts +1 -0
  13. package/dist/backend/llvm/call-lifetimes.test.js +205 -0
  14. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -0
  15. package/dist/backend/llvm/dyn.d.ts +2 -2
  16. package/dist/backend/llvm/dyn.js +79 -35
  17. package/dist/backend/llvm/dyn.js.map +1 -1
  18. package/dist/backend/llvm/emitter.d.ts +33 -0
  19. package/dist/backend/llvm/emitter.js +189 -16
  20. package/dist/backend/llvm/emitter.js.map +1 -1
  21. package/dist/backend/llvm/emitter.test.js +20 -1
  22. package/dist/backend/llvm/emitter.test.js.map +1 -1
  23. package/dist/backend/llvm/expr-async.js +1 -1
  24. package/dist/backend/llvm/expr-async.js.map +1 -1
  25. package/dist/backend/llvm/expr-calls.js +42 -5
  26. package/dist/backend/llvm/expr-calls.js.map +1 -1
  27. package/dist/backend/llvm/expr-containers.js +70 -13
  28. package/dist/backend/llvm/expr-containers.js.map +1 -1
  29. package/dist/backend/llvm/expr-dynamic.js +1 -1
  30. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  31. package/dist/backend/llvm/expr-primitives.js +6 -5
  32. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  33. package/dist/backend/llvm/expr-records.js +1 -1
  34. package/dist/backend/llvm/expr-records.js.map +1 -1
  35. package/dist/backend/llvm/expr-stream-bridges.js +5 -10
  36. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  37. package/dist/backend/llvm/lib-shared.js +35 -1
  38. package/dist/backend/llvm/lib-shared.js.map +1 -1
  39. package/dist/backend/llvm/local-array-reads.d.ts +44 -0
  40. package/dist/backend/llvm/local-array-reads.js +313 -0
  41. package/dist/backend/llvm/local-array-reads.js.map +1 -0
  42. package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
  43. package/dist/backend/llvm/local-array-reads.test.js +446 -0
  44. package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
  45. package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
  46. package/dist/backend/llvm/map-read-lifetimes.js +128 -0
  47. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
  48. package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
  49. package/dist/backend/llvm/map-read-lifetimes.test.js +123 -0
  50. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
  51. package/dist/backend/llvm/shapes.js +1 -0
  52. package/dist/backend/llvm/shapes.js.map +1 -1
  53. package/dist/backend/llvm/split.js +15 -5
  54. package/dist/backend/llvm/split.js.map +1 -1
  55. package/dist/backend/llvm/split.test.js +17 -0
  56. package/dist/backend/llvm/split.test.js.map +1 -1
  57. package/dist/backend/llvm/stack-unions.d.ts +20 -0
  58. package/dist/backend/llvm/stack-unions.js +61 -0
  59. package/dist/backend/llvm/stack-unions.js.map +1 -0
  60. package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
  61. package/dist/backend/llvm/stack-unions.test.js +241 -0
  62. package/dist/backend/llvm/stack-unions.test.js.map +1 -0
  63. package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
  64. package/dist/backend/llvm/string-lifetimes.js +70 -0
  65. package/dist/backend/llvm/string-lifetimes.js.map +1 -0
  66. package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
  67. package/dist/backend/llvm/string-lifetimes.test.js +230 -0
  68. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
  69. package/dist/backend/mangle.d.ts +2 -0
  70. package/dist/backend/mangle.js +4 -0
  71. package/dist/backend/mangle.js.map +1 -1
  72. package/dist/backend/may-throw.js +67 -29
  73. package/dist/backend/may-throw.js.map +1 -1
  74. package/dist/backend/may-throw.test.js +104 -1
  75. package/dist/backend/may-throw.test.js.map +1 -1
  76. package/dist/backend/native-toolchain.d.ts +2 -2
  77. package/dist/backend/native-toolchain.js +2 -0
  78. package/dist/backend/native-toolchain.js.map +1 -1
  79. package/dist/frontend/input-tracker.js +3 -3
  80. package/dist/frontend/input-tracker.js.map +1 -1
  81. package/dist/frontend/input-tracker.test.js +38 -2
  82. package/dist/frontend/input-tracker.test.js.map +1 -1
  83. package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
  84. package/dist/frontend/lowering/collection-ingestion.js +215 -0
  85. package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
  86. package/dist/frontend/lowering/containers/bytes.js +2 -0
  87. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  88. package/dist/frontend/lowering/import-meta.d.ts +10 -0
  89. package/dist/frontend/lowering/import-meta.js +52 -0
  90. package/dist/frontend/lowering/import-meta.js.map +1 -0
  91. package/dist/frontend/lowering/lower-assert.js +105 -41
  92. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  93. package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
  94. package/dist/frontend/lowering/lower-builtin-values.js +22 -1
  95. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  96. package/dist/frontend/lowering/lower-builtins.d.ts +3 -13
  97. package/dist/frontend/lowering/lower-builtins.js +150 -46
  98. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  99. package/dist/frontend/lowering/lower-calls.js +6 -3
  100. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  101. package/dist/frontend/lowering/lower-classes.js +4 -4
  102. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  103. package/dist/frontend/lowering/lower-containers.d.ts +5 -1
  104. package/dist/frontend/lowering/lower-containers.js +40 -3
  105. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  106. package/dist/frontend/lowering/lower-exprs.js +35 -41
  107. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  108. package/dist/frontend/lowering/lower-inspect.js +43 -0
  109. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  110. package/dist/frontend/lowering/lower-stmts.js +72 -68
  111. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  112. package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
  113. package/dist/frontend/lowering/lower-system-errors.js +29 -0
  114. package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
  115. package/dist/frontend/lowering/lowerer.d.ts +4 -3
  116. package/dist/frontend/lowering/lowerer.js +50 -22
  117. package/dist/frontend/lowering/lowerer.js.map +1 -1
  118. package/dist/frontend/lowering/surfaces.d.ts +2 -2
  119. package/dist/frontend/lowering/surfaces.js +69 -21
  120. package/dist/frontend/lowering/surfaces.js.map +1 -1
  121. package/dist/frontend/module-syntax.d.ts +1 -1
  122. package/dist/frontend/module-syntax.js +8 -1
  123. package/dist/frontend/module-syntax.js.map +1 -1
  124. package/dist/frontend/module-syntax.test.js +10 -0
  125. package/dist/frontend/module-syntax.test.js.map +1 -1
  126. package/dist/frontend/npm.d.ts +4 -0
  127. package/dist/frontend/npm.js +86 -33
  128. package/dist/frontend/npm.js.map +1 -1
  129. package/dist/frontend/npm.test.js +103 -0
  130. package/dist/frontend/npm.test.js.map +1 -1
  131. package/dist/frontend/pipeline-native.js +2 -1
  132. package/dist/frontend/pipeline-native.js.map +1 -1
  133. package/dist/frontend/services-node.js +3 -2
  134. package/dist/frontend/services-node.js.map +1 -1
  135. package/dist/frontend/services.d.ts +5 -1
  136. package/dist/frontend/services.js +9 -1
  137. package/dist/frontend/services.js.map +1 -1
  138. package/dist/frontend/services.test.js +21 -0
  139. package/dist/frontend/services.test.js.map +1 -1
  140. package/dist/frontend/ts7/ast-node.d.ts +2 -0
  141. package/dist/frontend/ts7/ast-node.js +30 -4
  142. package/dist/frontend/ts7/ast-node.js.map +1 -1
  143. package/dist/frontend/ts7/ast-node.test.js +60 -1
  144. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  145. package/dist/frontend/type-mapper.js +6 -0
  146. package/dist/frontend/type-mapper.js.map +1 -1
  147. package/dist/index.js +3 -2
  148. package/dist/index.js.map +1 -1
  149. package/dist/ir/analysis.js +1 -0
  150. package/dist/ir/analysis.js.map +1 -1
  151. package/dist/ir/integer-loops.d.ts +7 -0
  152. package/dist/ir/integer-loops.js +23 -0
  153. package/dist/ir/integer-loops.js.map +1 -1
  154. package/dist/ir/integer-loops.test.d.ts +1 -0
  155. package/dist/ir/integer-loops.test.js +41 -0
  156. package/dist/ir/integer-loops.test.js.map +1 -0
  157. package/dist/ir/ir.d.ts +21 -17
  158. package/dist/ir/ir.js +43 -9
  159. package/dist/ir/ir.js.map +1 -1
  160. package/dist/ir/ir.test.js +18 -0
  161. package/dist/ir/ir.test.js.map +1 -1
  162. package/dist/ir/validate.js +161 -76
  163. package/dist/ir/validate.js.map +1 -1
  164. package/dist/ir/validate.test.js +227 -0
  165. package/dist/ir/validate.test.js.map +1 -1
  166. package/dist/library/fence-eval.js +9 -2
  167. package/dist/library/fence-eval.js.map +1 -1
  168. package/dist/library/fence-eval.test.d.ts +1 -0
  169. package/dist/library/fence-eval.test.js +21 -0
  170. package/dist/library/fence-eval.test.js.map +1 -0
  171. package/dist/native/runtime-typescript.d.ts +4 -0
  172. package/dist/native/runtime-typescript.js +61 -0
  173. package/dist/native/runtime-typescript.js.map +1 -0
  174. package/dist/native/runtime-typescript.test.d.ts +1 -0
  175. package/dist/native/runtime-typescript.test.js +41 -0
  176. package/dist/native/runtime-typescript.test.js.map +1 -0
  177. package/package.json +20 -20
  178. package/surface-manifest.json +271 -17
@@ -11,7 +11,6 @@ import { literalUnionArm } from "../union-discriminants.js";
11
11
  import * as ts from "../ts7/adapter.js";
12
12
  import { dirname } from "node:path";
13
13
  import * as posix from "node:path/posix";
14
- import { pathToFileURL } from "node:url";
15
14
  import { captureContextArguments } from "./function-context.js";
16
15
  import { OBJECT_CALLABLE_VALUES } from "./surfaces.js";
17
16
  import { wasiGuestPath } from "../../wasi-paths.js";
@@ -54,11 +53,12 @@ import { classSymbolKeyOf } from "./symbol-fields.js";
54
53
  import { lowerClassMethodValue } from "./class-method-values.js";
55
54
  import { classInstanceOf } from "./class-dynamic-dispatch.js";
56
55
  import { lowerGlobalValue } from "./lower-global-value.js";
56
+ import { importMetaField, isImportMeta } from "./import-meta.js";
57
57
  import { lowerClassPrototypeData, lowerClassPrototypeComputedAssignment } from "./class-prototypes.js";
58
58
  import { isClassCallback } from "./class-callbacks.js";
59
59
  import { builtinPrototypeMethod, lowerArrayIsArrayValue, lowerCheckedPredicateValue, lowerNumberParserValue, lowerObjectAssignValue, lowerStringCodesValue } from "./lower-builtin-values.js";
60
60
  import { lowerArrayFromValue } from "./lower-containers.js";
61
- import { lowerPerfHooksTypeof } from "./lower-builtins.js";
61
+ import { lowerPerfHooksTypeof, lowerUrlAssignment } from "./lower-builtins.js";
62
62
  import { jsBindingHasOpenWrites } from "./lower-stmts.js";
63
63
  import { checkedClassInstanceOf } from "./class-construction.js";
64
64
  import { lowerModuleNamespaceElement } from "./module-namespace-elements.js";
@@ -125,6 +125,25 @@ function isParseArgsDynProperty(lowerer, expr) {
125
125
  return false;
126
126
  });
127
127
  }
128
+ function isStatFsDynProperty(lowerer, expr) {
129
+ if (!["type", "bsize", "blocks", "bfree", "bavail", "files", "ffree", "bigint"].includes(expr.name.text))
130
+ return false;
131
+ const symbol = lowerer.checker.getSymbolAtLocation(expr.name);
132
+ return !!symbol && lowerer.checker.declarationsOf(symbol).some((declaration) => {
133
+ if (!lowerer.isStdlibFile(declaration.getSourceFile()))
134
+ return false;
135
+ const parent = declaration.parent;
136
+ if (!ts.isInterfaceDeclaration(parent))
137
+ return false;
138
+ if (expr.name.text === "bigint" ? parent.name.text !== "StatFsOptions" : !["StatsFsBase", "StatsFs", "BigIntStatsFs"].includes(parent.name.text))
139
+ return false;
140
+ for (let node = parent.parent; node; node = node.parent) {
141
+ if (ts.isModuleDeclaration(node) && ts.isStringLiteral(node.name))
142
+ return node.name.text === "fs" || node.name.text === "node:fs";
143
+ }
144
+ return false;
145
+ });
146
+ }
128
147
  export function lowerExpr(lowerer, expr) {
129
148
  if (lowerExprDepth >= LOWER_EXPR_MAX_DEPTH) {
130
149
  lowerer.unsupported("SC1090", expr, `expressions nested deeper than ${LOWER_EXPR_MAX_DEPTH} levels`);
@@ -2031,16 +2050,13 @@ function lowerExprInner(lowerer, expr) {
2031
2050
  return nsUndefRead(lowerer, ambientRoot.text, expr, t);
2032
2051
  }
2033
2052
  }
2034
- // parseArgs results/tokens live in the checked-dynamic tree. A token
2035
- // discriminant check narrows its checker type to one anonymous arm,
2036
- // whose ambient property symbols would otherwise hit SC2020 before
2037
- // the generic dyn receiver path below. Provenance is limited to the
2038
- // node:util parseArgs family; every other stdlib member keeps its
2039
- // ordinary surface fence.
2053
+ // Checked-dynamic stdlib results retain ambient property symbols,
2054
+ // including parseArgs tokens narrowed to anonymous union arms. Only
2055
+ // members owned by these implemented families bypass the stdlib fence.
2040
2056
  const segmentDataSymbol = lowerer.typeOf(expr.expression).getSymbol();
2041
2057
  const segmentDataProperty = segmentDataSymbol?.name === "SegmentData" && lowerer.isStdlibSymbol(segmentDataSymbol) &&
2042
2058
  ["segment", "index", "input", "isWordLike"].includes(expr.name.text);
2043
- if (isParseArgsDynProperty(lowerer, expr) || segmentDataProperty) {
2059
+ if (isParseArgsDynProperty(lowerer, expr) || isStatFsDynProperty(lowerer, expr) || segmentDataProperty) {
2044
2060
  const recv = lowerer.lowerExpr(expr.expression);
2045
2061
  if (recv.type.kind === "dyn") {
2046
2062
  const key = {
@@ -2201,38 +2217,7 @@ function moduleFileName(lowerer, sf) {
2201
2217
  : sf.fileName;
2202
2218
  }
2203
2219
  function importMetaProperty(lowerer, expr) {
2204
- if (!ts.isMetaProperty(expr.expression))
2205
- return null;
2206
- const meta = expr.expression;
2207
- if (meta.keywordToken !== ts.SyntaxKind.ImportKeyword || meta.name.text !== "meta")
2208
- return null;
2209
- const sf = expr.getSourceFile();
2210
- const fileName = moduleFileName(lowerer, sf);
2211
- switch (expr.name.text) {
2212
- case "env":
2213
- return dynUndefinedExpr(locOf(expr));
2214
- case "url":
2215
- return {
2216
- kind: "strLit",
2217
- value: pathToFileURL(fileName, { windows: lowerer.targetPlatform === "win32" }).href,
2218
- type: STRING,
2219
- loc: locOf(expr),
2220
- };
2221
- case "filename":
2222
- return { kind: "strLit", value: fileName, type: STRING, loc: locOf(expr) };
2223
- case "dirname":
2224
- return {
2225
- kind: "strLit",
2226
- value: lowerer.targetPlatform === "wasi" ? posix.dirname(fileName) : dirname(fileName),
2227
- type: STRING,
2228
- loc: locOf(expr),
2229
- };
2230
- case "main":
2231
- return { kind: "boolLit", value: sf === lowerer.entry, type: BOOL, loc: locOf(expr) };
2232
- default:
2233
- lowerer.unsupported("SC1090", expr, `'import.meta.${expr.name.text}' (only url, filename, dirname, and main are supported in static ESM)`);
2234
- return null;
2235
- }
2220
+ return isImportMeta(expr.expression) ? importMetaField(lowerer, expr, expr.name.text) : null;
2236
2221
  }
2237
2222
  /** `c ? a : b`. An explicit destination constructs each branch at that
2238
2223
  * layout before joining it. Without one, retain the expression's inferred
@@ -4495,6 +4480,12 @@ export function lowerOptionalNumber(lowerer, operand, loc, narrowedNode) {
4495
4480
  * string-key element access (`a["length"]`) and string indexing (`s[0]`
4496
4481
  * typechecks against the lib's index signature; use .charAt) stay out. */
4497
4482
  export function lowerElementAccess(lowerer, expr) {
4483
+ if (isImportMeta(expr.expression)) {
4484
+ const name = lowerer.foldedStringKeyOf(expr.argumentExpression);
4485
+ if (name === null)
4486
+ lowerer.unsupported("SC1090", expr, "import.meta with a runtime-computed key (use a statically-known metadata field)");
4487
+ return importMetaField(lowerer, expr, name);
4488
+ }
4498
4489
  // `a?.[i]`: the guard lowers as an optional-chain step around the
4499
4490
  // plain element read below.
4500
4491
  if (expr.questionDotToken && !lowerer.chainHandled.has(expr)) {
@@ -6591,6 +6582,9 @@ export function lowerBinary(lowerer, expr) {
6591
6582
  if (cacheHas)
6592
6583
  return cacheHas;
6593
6584
  if (op === ts.SyntaxKind.EqualsToken || (op >= ts.SyntaxKind.FirstCompoundAssignment && op <= ts.SyntaxKind.LastCompoundAssignment)) {
6585
+ const urlWrite = lowerUrlAssignment(lowerer, expr);
6586
+ if (urlWrite)
6587
+ return urlWrite;
6594
6588
  if (op === ts.SyntaxKind.EqualsToken) {
6595
6589
  const prototypeWrite = lowerClassPrototypeComputedAssignment(lowerer, expr);
6596
6590
  if (prototypeWrite)