@scriptc/compiler 0.2.0 → 0.2.2

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 (284) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +84 -19
  2. package/dist/backend/cycle-analysis.js +1 -0
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/llvm/classes.js +21 -5
  5. package/dist/backend/llvm/classes.js.map +1 -1
  6. package/dist/backend/llvm/dyn.d.ts +8 -0
  7. package/dist/backend/llvm/dyn.js +247 -108
  8. package/dist/backend/llvm/dyn.js.map +1 -1
  9. package/dist/backend/llvm/emitter.d.ts +6 -3
  10. package/dist/backend/llvm/emitter.js +99 -25
  11. package/dist/backend/llvm/emitter.js.map +1 -1
  12. package/dist/backend/llvm/emitter.test.js +9 -1
  13. package/dist/backend/llvm/emitter.test.js.map +1 -1
  14. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  15. package/dist/backend/llvm/expr-bytes.js +28 -17
  16. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  17. package/dist/backend/llvm/expr-containers.js +5 -0
  18. package/dist/backend/llvm/expr-containers.js.map +1 -1
  19. package/dist/backend/llvm/expr-control.js +1 -1
  20. package/dist/backend/llvm/expr-control.js.map +1 -1
  21. package/dist/backend/llvm/expr-dynamic.js +47 -13
  22. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  23. package/dist/backend/llvm/expr-primitives.js +11 -1
  24. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  25. package/dist/backend/llvm/expr-records.js +11 -3
  26. package/dist/backend/llvm/expr-records.js.map +1 -1
  27. package/dist/backend/llvm/expr-stream-bridges.js +187 -18
  28. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  29. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  30. package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
  31. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  32. package/dist/backend/llvm/lib-dispatch.js +41 -3
  33. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  34. package/dist/backend/llvm/lib-filesystem.js +12 -9
  35. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  36. package/dist/backend/llvm/lib-process.js +23 -3
  37. package/dist/backend/llvm/lib-process.js.map +1 -1
  38. package/dist/backend/llvm/lib-shared.js +80 -3
  39. package/dist/backend/llvm/lib-shared.js.map +1 -1
  40. package/dist/backend/llvm/shapes.js +8 -2
  41. package/dist/backend/llvm/shapes.js.map +1 -1
  42. package/dist/backend/may-throw.js +4 -0
  43. package/dist/backend/may-throw.js.map +1 -1
  44. package/dist/backend/native-codegen.d.ts +1 -1
  45. package/dist/backend/native-codegen.js +4 -3
  46. package/dist/backend/native-codegen.js.map +1 -1
  47. package/dist/backend/native-codegen.test.js +11 -0
  48. package/dist/backend/native-codegen.test.js.map +1 -1
  49. package/dist/backend/native-toolchain.d.ts +3 -6
  50. package/dist/backend/native-toolchain.js +53 -23
  51. package/dist/backend/native-toolchain.js.map +1 -1
  52. package/dist/backend/native-toolchain.test.js +72 -0
  53. package/dist/backend/native-toolchain.test.js.map +1 -1
  54. package/dist/backend/runtime-abi.d.ts +2 -2
  55. package/dist/backend/runtime-abi.js +2 -2
  56. package/dist/backend/runtime-pack-native.js +4 -1
  57. package/dist/backend/runtime-pack-native.js.map +1 -1
  58. package/dist/backend/runtime-pack-targets.test.js +1 -1
  59. package/dist/backend/runtime-pack.test.js +1 -1
  60. package/dist/backend/target-diagnostics.d.ts +5 -0
  61. package/dist/backend/target-diagnostics.js +72 -1
  62. package/dist/backend/target-diagnostics.js.map +1 -1
  63. package/dist/backend/target-diagnostics.test.d.ts +1 -0
  64. package/dist/backend/target-diagnostics.test.js +68 -0
  65. package/dist/backend/target-diagnostics.test.js.map +1 -0
  66. package/dist/backend/targets.js +10 -6
  67. package/dist/backend/targets.js.map +1 -1
  68. package/dist/backend/targets.test.js +7 -0
  69. package/dist/backend/targets.test.js.map +1 -1
  70. package/dist/compat/fetch-profile.js +34 -4
  71. package/dist/compat/fetch-profile.js.map +1 -1
  72. package/dist/coverage/surface-manifest.js +5 -3
  73. package/dist/coverage/surface-manifest.js.map +1 -1
  74. package/dist/diagnostics/diagnostic.js +2 -7
  75. package/dist/diagnostics/diagnostic.js.map +1 -1
  76. package/dist/executable/executable-cache.d.ts +7 -3
  77. package/dist/executable/executable-cache.js +47 -11
  78. package/dist/executable/executable-cache.js.map +1 -1
  79. package/dist/executable/executable-cache.test.js +109 -2
  80. package/dist/executable/executable-cache.test.js.map +1 -1
  81. package/dist/executable/prepare.js +2 -1
  82. package/dist/executable/prepare.js.map +1 -1
  83. package/dist/frontend/builtin-modules.d.ts +1 -1
  84. package/dist/frontend/builtin-modules.js +1 -1
  85. package/dist/frontend/builtin-modules.js.map +1 -1
  86. package/dist/frontend/function-completion.d.ts +6 -0
  87. package/dist/frontend/function-completion.js +50 -0
  88. package/dist/frontend/function-completion.js.map +1 -0
  89. package/dist/frontend/lowering/abstract-equality.js +5 -1
  90. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  91. package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
  92. package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
  93. package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
  94. package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
  95. package/dist/frontend/lowering/checked-promise-all.js +31 -0
  96. package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
  97. package/dist/frontend/lowering/class-callbacks.d.ts +4 -4
  98. package/dist/frontend/lowering/class-callbacks.js +29 -17
  99. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  100. package/dist/frontend/lowering/class-construction.d.ts +14 -0
  101. package/dist/frontend/lowering/class-construction.js +185 -0
  102. package/dist/frontend/lowering/class-construction.js.map +1 -0
  103. package/dist/frontend/lowering/class-descriptors.d.ts +2 -1
  104. package/dist/frontend/lowering/class-descriptors.js +58 -10
  105. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  106. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +36 -1
  107. package/dist/frontend/lowering/class-dynamic-dispatch.js +965 -91
  108. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  109. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +66 -3
  110. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  111. package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
  112. package/dist/frontend/lowering/class-instance-constructor.js +15 -42
  113. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  114. package/dist/frontend/lowering/class-method-values.d.ts +20 -1
  115. package/dist/frontend/lowering/class-method-values.js +120 -24
  116. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  117. package/dist/frontend/lowering/class-prototypes.d.ts +10 -3
  118. package/dist/frontend/lowering/class-prototypes.js +188 -21
  119. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  120. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  121. package/dist/frontend/lowering/class-runtime-statics.js +84 -0
  122. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
  123. package/dist/frontend/lowering/class-static-data.d.ts +1 -0
  124. package/dist/frontend/lowering/class-static-data.js +6 -4
  125. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  126. package/dist/frontend/lowering/containers/bytes.js +66 -17
  127. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  128. package/dist/frontend/lowering/containers/string-and-regexp.js +24 -47
  129. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  130. package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
  131. package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
  132. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
  133. package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
  134. package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
  135. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
  136. package/dist/frontend/lowering/error-methods.d.ts +4 -1
  137. package/dist/frontend/lowering/error-methods.js +100 -1
  138. package/dist/frontend/lowering/error-methods.js.map +1 -1
  139. package/dist/frontend/lowering/expressions/native-proxy.js +3 -1
  140. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  141. package/dist/frontend/lowering/expressions/nullish-assignment.js +19 -11
  142. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  143. package/dist/frontend/lowering/expressions/object-literals.js +68 -7
  144. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  145. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
  146. package/dist/frontend/lowering/expressions/optional-chains.js +72 -20
  147. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  148. package/dist/frontend/lowering/function-context.d.ts +11 -3
  149. package/dist/frontend/lowering/function-context.js +11 -5
  150. package/dist/frontend/lowering/function-context.js.map +1 -1
  151. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -0
  152. package/dist/frontend/lowering/generator-dynamic-dispatch.js +39 -1
  153. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  154. package/dist/frontend/lowering/lib-boundary.d.ts +2 -0
  155. package/dist/frontend/lowering/lib-boundary.js +54 -1
  156. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  157. package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -1
  158. package/dist/frontend/lowering/lower-builtin-values.js +113 -3
  159. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  160. package/dist/frontend/lowering/lower-builtins.d.ts +10 -14
  161. package/dist/frontend/lowering/lower-builtins.js +443 -88
  162. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  163. package/dist/frontend/lowering/lower-calls.d.ts +8 -5
  164. package/dist/frontend/lowering/lower-calls.js +717 -142
  165. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  166. package/dist/frontend/lowering/lower-classes.d.ts +18 -13
  167. package/dist/frontend/lowering/lower-classes.js +1076 -188
  168. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  169. package/dist/frontend/lowering/lower-containers.d.ts +9 -0
  170. package/dist/frontend/lowering/lower-containers.js +172 -51
  171. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  172. package/dist/frontend/lowering/lower-dgram.js +3 -2
  173. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  174. package/dist/frontend/lowering/lower-exprs.d.ts +12 -8
  175. package/dist/frontend/lowering/lower-exprs.js +802 -232
  176. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  177. package/dist/frontend/lowering/lower-generators.js +17 -2
  178. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  179. package/dist/frontend/lowering/lower-inspect.js +15 -1
  180. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  181. package/dist/frontend/lowering/lower-island.d.ts +2 -0
  182. package/dist/frontend/lowering/lower-island.js +36 -10
  183. package/dist/frontend/lowering/lower-island.js.map +1 -1
  184. package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
  185. package/dist/frontend/lowering/lower-island.test.js +51 -0
  186. package/dist/frontend/lowering/lower-island.test.js.map +1 -0
  187. package/dist/frontend/lowering/lower-modules.d.ts +1 -3
  188. package/dist/frontend/lowering/lower-modules.js +380 -73
  189. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  190. package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
  191. package/dist/frontend/lowering/lower-modules.test.js +107 -0
  192. package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
  193. package/dist/frontend/lowering/lower-stmts.d.ts +7 -3
  194. package/dist/frontend/lowering/lower-stmts.js +221 -47
  195. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  196. package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
  197. package/dist/frontend/lowering/lower-stmts.test.js +77 -0
  198. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
  199. package/dist/frontend/lowering/lower-stream.js +3 -1
  200. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  201. package/dist/frontend/lowering/lower-url.d.ts +2 -1
  202. package/dist/frontend/lowering/lower-url.js +32 -9
  203. package/dist/frontend/lowering/lower-url.js.map +1 -1
  204. package/dist/frontend/lowering/lowerer.d.ts +53 -10
  205. package/dist/frontend/lowering/lowerer.js +390 -77
  206. package/dist/frontend/lowering/lowerer.js.map +1 -1
  207. package/dist/frontend/lowering/lowerer.test.js +187 -3
  208. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  209. package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
  210. package/dist/frontend/lowering/module-namespace-elements.js +54 -0
  211. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
  212. package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
  213. package/dist/frontend/lowering/object-factory-new.js +27 -14
  214. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  215. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  216. package/dist/frontend/lowering/surfaces.js +48 -19
  217. package/dist/frontend/lowering/surfaces.js.map +1 -1
  218. package/dist/frontend/lowering/text-decoder-encoding.d.ts +2 -0
  219. package/dist/frontend/lowering/text-decoder-encoding.js +8 -0
  220. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
  221. package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
  222. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
  223. package/dist/frontend/lowering/unregistered-class-types.test.js +3 -3
  224. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
  225. package/dist/frontend/npm-static-prune.js +116 -34
  226. package/dist/frontend/npm-static-prune.js.map +1 -1
  227. package/dist/frontend/npm-static-prune.test.js +8 -0
  228. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  229. package/dist/frontend/program.d.ts +1 -1
  230. package/dist/frontend/program.js +57 -26
  231. package/dist/frontend/program.js.map +1 -1
  232. package/dist/frontend/program.test.js +18 -0
  233. package/dist/frontend/program.test.js.map +1 -1
  234. package/dist/frontend/ts7/ast.js +4 -3
  235. package/dist/frontend/ts7/ast.js.map +1 -1
  236. package/dist/frontend/ts7/semantic-json.js +5 -10
  237. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  238. package/dist/frontend/type-mapper.d.ts +9 -1
  239. package/dist/frontend/type-mapper.js +169 -23
  240. package/dist/frontend/type-mapper.js.map +1 -1
  241. package/dist/frontend/type-mapper.test.js +23 -0
  242. package/dist/frontend/type-mapper.test.js.map +1 -1
  243. package/dist/frontend/union-discriminants.d.ts +1 -1
  244. package/dist/frontend/union-discriminants.js +24 -9
  245. package/dist/frontend/union-discriminants.js.map +1 -1
  246. package/dist/index.js +16 -10
  247. package/dist/index.js.map +1 -1
  248. package/dist/ir/analysis.js +2 -0
  249. package/dist/ir/analysis.js.map +1 -1
  250. package/dist/ir/ir.d.ts +74 -41
  251. package/dist/ir/ir.js +167 -43
  252. package/dist/ir/ir.js.map +1 -1
  253. package/dist/ir/ir.test.js +35 -0
  254. package/dist/ir/ir.test.js.map +1 -1
  255. package/dist/ir/serialize.js +35 -3
  256. package/dist/ir/serialize.js.map +1 -1
  257. package/dist/ir/serialize.test.js +26 -1
  258. package/dist/ir/serialize.test.js.map +1 -1
  259. package/dist/ir/traverse.d.ts +0 -3
  260. package/dist/ir/traverse.js +33 -20
  261. package/dist/ir/traverse.js.map +1 -1
  262. package/dist/ir/validate.js +136 -16
  263. package/dist/ir/validate.js.map +1 -1
  264. package/dist/ir/validate.test.js +77 -1
  265. package/dist/ir/validate.test.js.map +1 -1
  266. package/dist/library/compiler-self-identity.js +1 -1
  267. package/dist/library/compiler-self-identity.test.js +2 -2
  268. package/dist/library/compiler-self-identity.test.js.map +1 -1
  269. package/dist/library/int-infer.d.ts +2 -2
  270. package/dist/library/int-infer.js +10 -7
  271. package/dist/library/int-infer.js.map +1 -1
  272. package/dist/library/int-infer.test.js +44 -0
  273. package/dist/library/int-infer.test.js.map +1 -1
  274. package/dist/library/prepare.js +2 -1
  275. package/dist/library/prepare.js.map +1 -1
  276. package/dist/native/sanitizer.js +3 -1
  277. package/dist/native/sanitizer.js.map +1 -1
  278. package/dist/native/toolchain.d.ts +1 -1
  279. package/dist/native/toolchain.js +26 -6
  280. package/dist/native/toolchain.js.map +1 -1
  281. package/dist/native/toolchain.test.js +53 -1
  282. package/dist/native/toolchain.test.js.map +1 -1
  283. package/package.json +20 -20
  284. package/surface-manifest.json +170 -93
@@ -1,5 +1,5 @@
1
1
  import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, CHILD_T, CHILDSTREAM_T, CHILDWRITER_T, CRYPTOHASH_T, CRYPTOHMAC_T, DATE_T, DGRAMSOCK_T, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, FILEHANDLE_T, FSWATCHER_T, HTTP2SESSION_T, HTTP2STREAM_T, HTTPCLIENTREQ_T, HTTPREQ_T, HTTPRES_T, islandPromisePayloadTag, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, NETSERVER_T, NETSOCKET_T, PROCSTREAM_T, REF_TRUTHY_KINDS, REGEX, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, SEARCH_PARAMS_T, SECURECTX_T, shapeHasAccessorSlots, SPAWNRES_T, STATS_T, STRING, SYMBOL_T, TESTCTX_T, typeEquals, typeKey, unionContainerArmsOk, URL_T, VOID } from "./ir.js";
2
- import { BIGINT_T } from "./ir.js";
2
+ import { BIGINT_T, DYN_CLASS_PROPERTIES } from "./ir.js";
3
3
  import { unionWideningTags } from "./analysis.js";
4
4
  import { alwaysReturns } from "./control-flow.js";
5
5
  /** Per-method signature for strIntrinsic: `argTypes` lists every argument
@@ -26,6 +26,7 @@ export const STR_INTRINSIC_SIGS = {
26
26
  padEnd: { argTypes: [F64, STRING], minArgs: 2, result: STRING },
27
27
  toLowerCase: { argTypes: [], minArgs: 0, result: STRING },
28
28
  toUpperCase: { argTypes: [], minArgs: 0, result: STRING },
29
+ normalize: { argTypes: [STRING], minArgs: 1, result: STRING },
29
30
  isWellFormed: { argTypes: [], minArgs: 0, result: BOOL },
30
31
  toWellFormed: { argTypes: [], minArgs: 0, result: STRING },
31
32
  cpAt: { argTypes: [F64], minArgs: 1, result: STRING },
@@ -40,6 +41,8 @@ export const REGEX_INTRINSIC_SIGS = {
40
41
  // VOID here is the process.envGet sentinel; the regexIntrinsic case
41
42
  // checks the union's arms.
42
43
  match: { receiver: STRING, argTypes: [REGEX], result: VOID },
44
+ exec: { receiver: STRING, argTypes: [REGEX], result: VOID },
45
+ lastIndex: { receiver: REGEX, argTypes: [], result: F64 },
43
46
  matchAll: { receiver: STRING, argTypes: [REGEX], result: arrayOf(arrayOf(STRING)) },
44
47
  matchAllInto: { receiver: STRING, argTypes: [REGEX, arrayOf(F64)], result: arrayOf(arrayOf(STRING)) },
45
48
  search: { receiver: STRING, argTypes: [REGEX], result: F64 },
@@ -60,6 +63,14 @@ export const REGEX_INTRINSIC_SIGS = {
60
63
  export const LIB_FN_SIGS = {
61
64
  "fetch.start": { argTypes: [STRING, DYN], result: { kind: "promise", inner: DYN } },
62
65
  "fetch.responseNew": { argTypes: [DYN, DYN], result: DYN },
66
+ "fetch.input": { argTypes: [DYN, DYN], result: { kind: "promise", inner: DYN } },
67
+ "abort.controllerNew": { argTypes: [], result: DYN },
68
+ "abort.timeout": { argTypes: [DYN], result: DYN },
69
+ "abort.now": { argTypes: [DYN], result: DYN },
70
+ "abort.any": { argTypes: [DYN], result: DYN },
71
+ "fetch.function": { argTypes: [], result: DYN },
72
+ "fetch.requestNew": { argTypes: [DYN, DYN], result: DYN },
73
+ "fetch.headersNew": { argTypes: [DYN], result: DYN },
63
74
  "fetch.responseArrayBuffer": { argTypes: [DYN], result: { kind: "promise", inner: DYN } },
64
75
  "fetch.responseJson": { argTypes: [DYN], result: { kind: "promise", inner: DYN } },
65
76
  "fetch.responseText": { argTypes: [DYN], result: { kind: "promise", inner: STRING } },
@@ -72,6 +83,8 @@ export const LIB_FN_SIGS = {
72
83
  // Program-dependent iterable: typed arrays/bytes/string stay intact so
73
84
  // the native stream can pull lazily; checked-dynamic values are the
74
85
  // fallback. The libCall validator below checks the closed set.
86
+ "fetch.webIs": { argTypes: [DYN, STRING], result: BOOL },
87
+ "fetch.streamIs": { argTypes: [DYN], result: BOOL },
75
88
  "fetch.streamFrom": { argTypes: [null], result: DYN },
76
89
  // The chunk/result record depends on ReadableStream<T>; validated below.
77
90
  "fetch.readerRead": { argTypes: [DYN], result: VOID },
@@ -97,6 +110,7 @@ export const LIB_FN_SIGS = {
97
110
  "dyn.globalSymbolHas": { argTypes: [SYMBOL_T], result: BOOL },
98
111
  "dyn.globalSymbolDelete": { argTypes: [SYMBOL_T], result: VOID },
99
112
  "dyn.typedRefIs": { argTypes: [DYN, STRING], result: BOOL },
113
+ "dyn.classIs": { argTypes: [DYN, STRING], result: BOOL },
100
114
  "dyn.iterPack": { argTypes: [DYN, STRING], result: DYN },
101
115
  "dyn.arrayFromIterator": { argTypes: [DYN], result: DYN },
102
116
  "dyn.iterator": { argTypes: [DYN, STRING], result: DYN },
@@ -121,6 +135,7 @@ export const LIB_FN_SIGS = {
121
135
  "dyn.defineProperty": { argTypes: [DYN, DYN, DYN], result: DYN },
122
136
  "dyn.getOwnPropertyDescriptor": { argTypes: [DYN, DYN], result: DYN },
123
137
  "dyn.arrayProtoCall": { argTypes: [DYN, STRING, DYN], result: DYN },
138
+ "dyn.promiseAll": { argTypes: [DYN], result: { kind: "promise", inner: DYN } },
124
139
  "dyn.typeof": { argTypes: [DYN], result: STRING },
125
140
  "dyn.objectTag": { argTypes: [DYN], result: STRING },
126
141
  "module.registryInit": { argTypes: [F64], result: VOID },
@@ -220,6 +235,7 @@ export const LIB_FN_SIGS = {
220
235
  "os.totalmem": { argTypes: [], result: F64 },
221
236
  "process.umask": { argTypes: [F64], result: F64 },
222
237
  "process.chdir": { argTypes: [STRING], result: VOID },
238
+ "process.loadEnvFile": { argTypes: [DYN], result: VOID },
223
239
  "process.exiting": { argTypes: [], result: BOOL },
224
240
  "net.getAutoSelTimeout": { argTypes: [], result: F64 },
225
241
  "net.setAutoSelTimeout": { argTypes: [F64], result: VOID },
@@ -280,11 +296,13 @@ export const LIB_FN_SIGS = {
280
296
  "str.btoa": { argTypes: [DYN], result: STRING },
281
297
  "str.b64Missing": { argTypes: [], result: STRING },
282
298
  "str.decodeUriComponent": { argTypes: [STRING], result: STRING },
299
+ "str.decodeUri": { argTypes: [STRING], result: STRING },
283
300
  "str.encodeUri": { argTypes: [STRING], result: STRING },
284
301
  "regexp.escape": { argTypes: [STRING], result: STRING },
285
302
  "num.toExponential": { argTypes: [F64], result: STRING },
286
303
  "num.toFixed0": { argTypes: [F64], result: STRING },
287
304
  "num.toFixed": { argTypes: [F64, F64], result: STRING },
305
+ "num.toStringRadix": { argTypes: [F64, DYN], result: STRING },
288
306
  "num.sameValue": { argTypes: [F64, F64], result: BOOL },
289
307
  "intl.numFormatEnUs": { argTypes: [F64], result: STRING },
290
308
  "sym.new": { argTypes: [STRING], result: SYMBOL_T },
@@ -327,6 +345,10 @@ export const LIB_FN_SIGS = {
327
345
  "bigint.dataViewSet": { argTypes: [BYTES_U8, F64, BIGINT_T, BOOL], result: VOID },
328
346
  "url.new": { argTypes: [STRING], result: URL_T },
329
347
  "url.newBase": { argTypes: [STRING, STRING], result: URL_T },
348
+ "url.canParse": { argTypes: [STRING], result: BOOL },
349
+ "url.canParseBase": { argTypes: [STRING, STRING], result: BOOL },
350
+ "url.parse": { argTypes: [STRING], result: DYN },
351
+ "url.parseBase": { argTypes: [STRING, STRING], result: DYN },
330
352
  "url.protocol": { argTypes: [URL_T], result: STRING },
331
353
  "url.origin": { argTypes: [URL_T], result: STRING },
332
354
  "url.username": { argTypes: [URL_T], result: STRING },
@@ -343,6 +365,7 @@ export const LIB_FN_SIGS = {
343
365
  "url.pathToFileURLPlatform": { argTypes: [STRING, BOOL], result: URL_T },
344
366
  "url.pathToFileURLWin32": { argTypes: [STRING], result: URL_T },
345
367
  "sp.new": { argTypes: [], result: SEARCH_PARAMS_T },
368
+ "sp.newChecked": { argTypes: [DYN], result: SEARCH_PARAMS_T },
346
369
  "sp.parse": { argTypes: [STRING], result: SEARCH_PARAMS_T },
347
370
  "sp.copy": { argTypes: [SEARCH_PARAMS_T], result: SEARCH_PARAMS_T },
348
371
  // The pairs argument is string[][] — checked structurally below (the
@@ -376,11 +399,16 @@ export const LIB_FN_SIGS = {
376
399
  "qs.escape": { argTypes: [STRING], result: STRING },
377
400
  "qs.unescape": { argTypes: [STRING], result: STRING },
378
401
  "util.parseArgs": { argTypes: [DYN], result: DYN },
402
+ "util.parseEnv": { argTypes: [DYN], result: DYN },
379
403
  "fs.statSync": { argTypes: [STRING], result: STATS_T },
380
404
  "fs.lstatSync": { argTypes: [STRING], result: STATS_T },
381
405
  "fs.fstatSync": { argTypes: [F64], result: STATS_T },
382
406
  "fs.fchmodSync": { argTypes: [F64, F64], result: VOID },
383
407
  "fs.fsyncSync": { argTypes: [F64], result: VOID },
408
+ "fs.fdatasyncSync": { argTypes: [F64], result: VOID },
409
+ "fs.ftruncateSync": { argTypes: [F64, F64], result: VOID },
410
+ "fs.readvSync": { argTypes: [F64, arrayOf(BYTES_U8), F64], result: F64 },
411
+ "fs.writevSync": { argTypes: [F64, arrayOf(BYTES_U8), F64], result: F64 },
384
412
  "fs.linkSync": { argTypes: [STRING, STRING], result: VOID },
385
413
  "fs.openSync": { argTypes: [STRING, STRING], result: F64 },
386
414
  "fs.openNumericSync": { argTypes: [STRING, F64, F64], result: F64 },
@@ -856,6 +884,8 @@ export const LIB_FN_SIGS = {
856
884
  "child.disconnect": { argTypes: [CHILD_T], result: VOID },
857
885
  "child.onMessage": { argTypes: [CHILD_T, null, BOOL], result: VOID },
858
886
  "child.onDisconnect": { argTypes: [CHILD_T, null, BOOL], result: VOID },
887
+ "child.onSpawn": { argTypes: [CHILD_T, null], result: VOID },
888
+ "child.onDyn": { argTypes: [CHILD_T, STRING, DYN], result: VOID },
859
889
  "process.connected": { argTypes: [], result: BOOL },
860
890
  "process.send": { argTypes: [STRING], result: BOOL },
861
891
  "process.sendCb": { argTypes: [STRING, null], result: BOOL },
@@ -870,6 +900,7 @@ export const LIB_FN_SIGS = {
870
900
  argTypes: [STRING, arrayOf(STRING), F64, F64, F64, F64, F64, BOOL, BOOL, BOOL, arrayOf(STRING), STRING],
871
901
  result: CHILD_T,
872
902
  },
903
+ "cp.spawnDynamic": { argTypes: [STRING, arrayOf(STRING), DYN], result: CHILD_T },
873
904
  // The callback's func type is program-dependent (zero params, or the
874
905
  // `number | null` union / the %Error class) — the libCall case checks
875
906
  // the shape; the slot here only pins arity and the child receiver.
@@ -921,6 +952,7 @@ export const LIB_FN_SIGS = {
921
952
  "child.kill": { argTypes: [CHILD_T, STRING], result: BOOL },
922
953
  "child.killNum": { argTypes: [CHILD_T, F64], result: BOOL },
923
954
  "child.unref": { argTypes: [CHILD_T], result: VOID },
955
+ "child.ref": { argTypes: [CHILD_T], result: VOID },
924
956
  "spawnRes.stdout": { argTypes: [SPAWNRES_T], result: STRING },
925
957
  "spawnRes.stderr": { argTypes: [SPAWNRES_T], result: STRING },
926
958
  "crypto.randomUUID": { argTypes: [], result: STRING },
@@ -928,6 +960,7 @@ export const LIB_FN_SIGS = {
928
960
  "crypto.randomBytes": { argTypes: [F64], result: BYTES_U8 },
929
961
  "crypto.hashDigestStr": { argTypes: [STRING, STRING, STRING], result: STRING },
930
962
  "crypto.hashDigestBytes": { argTypes: [STRING, BYTES_U8, STRING], result: STRING },
963
+ "crypto.native": { argTypes: [], result: DYN },
931
964
  "crypto.hashNew": { argTypes: [STRING], result: CRYPTOHASH_T },
932
965
  "crypto.hmacNewStr": { argTypes: [STRING, STRING], result: CRYPTOHMAC_T },
933
966
  "crypto.hmacNewBytes": { argTypes: [STRING, BYTES_U8], result: CRYPTOHMAC_T },
@@ -947,12 +980,17 @@ export const LIB_FN_SIGS = {
947
980
  "crypto.pbkdf2": { argTypes: [BYTES_U8, BYTES_U8, F64, F64, STRING], result: BYTES_U8 },
948
981
  "crypto.randomBytesCb": { argTypes: [F64, null], result: VOID },
949
982
  "crypto.pbkdf2Cb": { argTypes: [BYTES_U8, BYTES_U8, F64, F64, STRING, null], result: VOID },
983
+ "crypto.hkdf": { argTypes: [STRING, BYTES_U8, BYTES_U8, BYTES_U8, F64], result: DYN },
984
+ "crypto.hkdfCb": { argTypes: [STRING, BYTES_U8, BYTES_U8, BYTES_U8, F64, null], result: VOID },
985
+ "crypto.scrypt": { argTypes: [BYTES_U8, BYTES_U8, F64, DYN], result: BYTES_U8 },
986
+ "crypto.scryptCb": { argTypes: [BYTES_U8, BYTES_U8, F64, DYN, null], result: VOID },
950
987
  // The Buffer statics and the fs/zlib Buffer forms: fixed always-u8
951
988
  // signatures (Buffer IS a Uint8Array — one bytes kind).
952
989
  "buffer.fromStr": { argTypes: [STRING, STRING], result: BYTES_U8 },
953
990
  "buffer.brand": { argTypes: [BYTES_U8], result: BYTES_U8 },
954
991
  "buffer.fromDyn": { argTypes: [DYN, STRING], result: BYTES_U8 },
955
992
  "buffer.concat": { argTypes: [arrayOf(BYTES_U8)], result: BYTES_U8 },
993
+ "buffer.byteLenDyn": { argTypes: [DYN, STRING], result: F64 },
956
994
  "buffer.byteLenStr": { argTypes: [STRING, STRING], result: F64 },
957
995
  "buffer.isEncoding": { argTypes: [STRING], result: BOOL },
958
996
  "buffer.concatLen": { argTypes: [arrayOf(BYTES_U8), F64], result: BYTES_U8 },
@@ -1025,6 +1063,12 @@ export const LIB_FN_SIGS = {
1025
1063
  "fsp.open": { argTypes: [STRING, STRING, F64], result: { kind: "promise", inner: FILEHANDLE_T } },
1026
1064
  "fileHandle.fd": { argTypes: [FILEHANDLE_T], result: F64 },
1027
1065
  "fileHandle.close": { argTypes: [FILEHANDLE_T], result: { kind: "promise", inner: VOID } },
1066
+ "fileHandle.sync": { argTypes: [FILEHANDLE_T], result: { kind: "promise", inner: VOID } },
1067
+ "fileHandle.datasync": { argTypes: [FILEHANDLE_T], result: { kind: "promise", inner: VOID } },
1068
+ "fileHandle.truncate": { argTypes: [FILEHANDLE_T, F64], result: { kind: "promise", inner: VOID } },
1069
+ "fileHandle.chmod": { argTypes: [FILEHANDLE_T, F64], result: { kind: "promise", inner: VOID } },
1070
+ "fileHandle.readv": { argTypes: [FILEHANDLE_T, arrayOf(BYTES_U8), F64], result: { kind: "promise", inner: VOID } },
1071
+ "fileHandle.writev": { argTypes: [FILEHANDLE_T, arrayOf(BYTES_U8), F64], result: { kind: "promise", inner: VOID } },
1028
1072
  // read/write carry call-site result record shapes; the validator checks
1029
1073
  // those below, so promise<void> is only a table sentinel.
1030
1074
  "fileHandle.read": { argTypes: [FILEHANDLE_T, BYTES_U8, F64, F64, F64, BOOL], result: { kind: "promise", inner: VOID } },
@@ -1051,6 +1095,7 @@ export const LIB_FN_SIGS = {
1051
1095
  "process.cwd": { argTypes: [], result: STRING },
1052
1096
  "process.pid": { argTypes: [], result: F64 },
1053
1097
  "dyn.this": { argTypes: [], result: DYN },
1098
+ "dyn.generatorThis": { argTypes: [], result: DYN },
1054
1099
  "process.getuid": { argTypes: [], result: F64 },
1055
1100
  "process.getgid": { argTypes: [], result: F64 },
1056
1101
  "process.execPath": { argTypes: [], result: STRING },
@@ -1059,6 +1104,8 @@ export const LIB_FN_SIGS = {
1059
1104
  "process.builtinId": { argTypes: [DYN, arrayOf(STRING)], result: STRING },
1060
1105
  "process.builtinModule": { argTypes: [STRING, DYN], result: DYN },
1061
1106
  "process.builtinUnsupported": { argTypes: [STRING, STRING], result: DYN },
1107
+ "fs.callbackValue": { argTypes: [STRING], result: DYN },
1108
+ "fs.callbackCall": { argTypes: [STRING, DYN], result: DYN },
1062
1109
  "process.hrtimeValue": { argTypes: [], result: DYN },
1063
1110
  "process.versionsNode": { argTypes: [], result: STRING },
1064
1111
  "process.versionsOpenssl": { argTypes: [], result: STRING },
@@ -1075,6 +1122,7 @@ export const LIB_FN_SIGS = {
1075
1122
  "error.cause": { argTypes: [null], result: DYN },
1076
1123
  "error.hasCause": { argTypes: [null], result: BOOL },
1077
1124
  "error.setCause": { argTypes: [null, DYN], result: VOID },
1125
+ "error.defineCause": { argTypes: [null, DYN], result: VOID },
1078
1126
  "error.deleteCause": { argTypes: [null], result: VOID },
1079
1127
  "error.nodeThrow": { argTypes: [F64, STRING, STRING], result: VOID },
1080
1128
  "dyn.toStringCoerce": { argTypes: [DYN], result: STRING },
@@ -1083,9 +1131,11 @@ export const LIB_FN_SIGS = {
1083
1131
  "dyn.toNumeric": { argTypes: [DYN], result: DYN },
1084
1132
  "dyn.increment": { argTypes: [DYN, BOOL], result: DYN },
1085
1133
  "dyn.numberConstructor": { argTypes: [DYN], result: F64 },
1134
+ "dyn.bigintConstructor": { argTypes: [DYN], result: BIGINT_T },
1086
1135
  "dyn.toNumberCoerce": { argTypes: [DYN], result: F64 },
1087
1136
  "dyn.add": { argTypes: [DYN, DYN], result: DYN },
1088
1137
  "dyn.arithmetic": { argTypes: [DYN, DYN, STRING], result: DYN },
1138
+ "dyn.compare": { argTypes: [DYN, DYN, STRING], result: BOOL },
1089
1139
  "dyn.bitwise": { argTypes: [DYN, DYN, STRING], result: DYN },
1090
1140
  "dyn.proxyNew": { argTypes: [DYN, DYN], result: DYN },
1091
1141
  // Always throws; the result is the READ's declared type (a typed dummy
@@ -1098,6 +1148,7 @@ export const LIB_FN_SIGS = {
1098
1148
  "class.name": { argTypes: [null], result: STRING },
1099
1149
  "error.ctor": { argTypes: [null, STRING], result: VOID },
1100
1150
  "error.toString": { argTypes: [null], result: STRING },
1151
+ "dyn.sameValue": { argTypes: [DYN, DYN], result: BOOL },
1101
1152
  "error.stack": { argTypes: [null], result: STRING },
1102
1153
  "error.stackLimitGet": { argTypes: [], result: F64 },
1103
1154
  "error.stackLimitSet": { argTypes: [F64], result: VOID },
@@ -1120,6 +1171,12 @@ export const LIB_FN_SIGS = {
1120
1171
  "weakMap.new": { argTypes: [DYN], result: DYN },
1121
1172
  "weakSet.new": { argTypes: [DYN], result: DYN },
1122
1173
  "dyn.fromEntries": { argTypes: [DYN], result: DYN },
1174
+ "bytes.constructor": { argTypes: [STRING], result: DYN },
1175
+ "bytes.instanceOf": { argTypes: [DYN, DYN], result: BOOL },
1176
+ "bytes.construct": { argTypes: [DYN, DYN, STRING], result: DYN },
1177
+ "dyn.dataViewIs": { argTypes: [DYN], result: BOOL },
1178
+ "dyn.construct": { argTypes: [DYN, DYN, STRING], result: DYN },
1179
+ "arrayBuffer.constructor": { argTypes: [], result: DYN },
1123
1180
  "arrayBuffer.new": { argTypes: [DYN], result: DYN },
1124
1181
  "ffi.argument": { argTypes: [DYN, STRING], result: DYN },
1125
1182
  "ffi.memoryModule": { argTypes: [DYN], result: DYN },
@@ -1144,21 +1201,36 @@ export const LIB_FN_SIGS = {
1144
1201
  "dyn.propertyIsEnumerable": { argTypes: [DYN, STRING], result: BOOL },
1145
1202
  "dyn.assign": { argTypes: [DYN, DYN], result: DYN },
1146
1203
  "dyn.copyDataProperties": { argTypes: [DYN, DYN], result: DYN },
1204
+ "dyn.objectRest": { argTypes: [DYN, DYN], result: DYN },
1147
1205
  "dyn.packPush": { argTypes: [DYN, DYN], result: VOID },
1148
1206
  "dyn.packPushSpread": { argTypes: [DYN, DYN, STRING], result: VOID },
1149
1207
  "dyn.packPushSpreadIter": { argTypes: [DYN, DYN], result: VOID },
1208
+ "dyn.reflectApply": { argTypes: [DYN, DYN, DYN], result: DYN },
1209
+ "dyn.reflectGet": { argTypes: [DYN, DYN, DYN], result: DYN },
1210
+ "dyn.reflectSet": { argTypes: [DYN, DYN, DYN, DYN], result: BOOL },
1211
+ "dyn.reflectDefine": { argTypes: [DYN, DYN, DYN], result: BOOL },
1212
+ "dyn.abstractEq": { argTypes: [DYN, DYN], result: BOOL },
1150
1213
  "dyn.assignAll": { argTypes: [DYN, DYN], result: DYN },
1151
1214
  "dyn.objCreateNullProto": { argTypes: [], result: DYN },
1152
1215
  "dyn.arrayPrototype": { argTypes: [], result: DYN },
1216
+ "dyn.arrayConstructor": { argTypes: [], result: DYN },
1217
+ "dyn.objectPrototype": { argTypes: [], result: DYN },
1218
+ "dyn.functionApply": { argTypes: [], result: DYN },
1219
+ "dyn.builtinMethod": { argTypes: [STRING, STRING], result: DYN },
1153
1220
  "dyn.classPrototype": { argTypes: [DYN, DYN], result: DYN },
1154
1221
  "dyn.classBasePrototype": { argTypes: [DYN], result: DYN },
1222
+ "dyn.classInherit": { argTypes: [DYN, DYN], result: DYN },
1155
1223
  "dyn.classSuper": { argTypes: [DYN, DYN, DYN], result: VOID },
1156
1224
  "dyn.assignPrototype": { argTypes: [DYN, DYN, DYN], result: DYN },
1225
+ "dyn.definePrototypeProps": { argTypes: [DYN, DYN, DYN], result: DYN },
1226
+ "dyn.bagGet": { argTypes: [DYN, STRING, DYN], result: DYN },
1227
+ "dyn.bagSet": { argTypes: [DYN, STRING, DYN, DYN], result: VOID },
1157
1228
  "dyn.objCreate": { argTypes: [DYN], result: DYN },
1158
1229
  "dyn.objCreateWithProperties": { argTypes: [DYN, DYN], result: DYN },
1159
1230
  "dyn.getPrototype": { argTypes: [DYN], result: DYN },
1160
1231
  "dyn.setPrototype": { argTypes: [DYN, DYN], result: DYN },
1161
1232
  "dyn.getOwnPropertyNames": { argTypes: [DYN], result: DYN },
1233
+ "dyn.ownKeys": { argTypes: [DYN], result: DYN },
1162
1234
  "dyn.getOwnPropertySymbols": { argTypes: [DYN], result: DYN },
1163
1235
  "dyn.getOwnPropertyDescriptors": { argTypes: [DYN], result: DYN },
1164
1236
  "dyn.preventExtensions": { argTypes: [DYN], result: DYN },
@@ -1171,6 +1243,7 @@ export const LIB_FN_SIGS = {
1171
1243
  "dyn.cloneMissing": { argTypes: [], result: DYN },
1172
1244
  "dyn.cloneTransferFail": { argTypes: [], result: DYN },
1173
1245
  "regex.new": { argTypes: [STRING, STRING], result: REGEX },
1246
+ "regex.resetLastIndex": { argTypes: [REGEX, F64], result: VOID },
1174
1247
  "regex.newChecked": { argTypes: [DYN, DYN], result: REGEX },
1175
1248
  // node:events EventEmitter: receivers are emitter-hierarchy objects and
1176
1249
  // the chaining forms (on/off/removeAll/setMax) return the receiver's
@@ -1258,6 +1331,8 @@ export const LIB_FN_SIGS = {
1258
1331
  "readable.pushDyn": { argTypes: [null, DYN], result: BOOL },
1259
1332
  "readable.unshift": { argTypes: [null, BYTES_U8], result: VOID },
1260
1333
  "readable.unshiftStr": { argTypes: [null, STRING], result: VOID },
1334
+ "stream.onDyn": { argTypes: [null, STRING, DYN, BOOL, BOOL], result: VOID },
1335
+ "readable.readDyn": { argTypes: [null, DYN], result: DYN },
1261
1336
  "readable.read": { argTypes: [null, F64], result: VOID },
1262
1337
  "readable.pause": { argTypes: [null], result: VOID },
1263
1338
  "readable.setEncoding": { argTypes: [null, STRING], result: VOID },
@@ -1437,7 +1512,18 @@ export const LIB_FN_SIGS = {
1437
1512
  "date.parseGetTime": { argTypes: [STRING], result: F64 },
1438
1513
  "date.utc": { argTypes: [F64, F64, F64, F64, F64, F64, F64], result: F64 },
1439
1514
  "text.decode": { argTypes: [BYTES_U8], result: STRING },
1515
+ "bytes.bufferSource": { argTypes: [DYN], result: BYTES_U8 },
1516
+ "text.decodeBufferSource": { argTypes: [DYN], result: STRING },
1517
+ "text.decodeOptions": { argTypes: [BYTES_U8, BOOL, BOOL], result: STRING },
1518
+ "text.decodeStream": { argTypes: [DYN, BYTES_U8, F64, BOOL, BOOL, BOOL], result: STRING },
1519
+ "text.decodeLegacyOptions": { argTypes: [BYTES_U8, F64, BOOL, BOOL], result: STRING },
1440
1520
  "text.decodeLegacy": { argTypes: [BYTES_U8, F64], result: STRING },
1521
+ "text.decoderEncoding": { argTypes: [DYN], result: F64 },
1522
+ "text.decoderName": { argTypes: [F64], result: STRING },
1523
+ "text.encodeInto": { argTypes: [DYN, DYN], result: DYN },
1524
+ "buffer.isAscii": { argTypes: [DYN], result: BOOL },
1525
+ "buffer.isUtf8": { argTypes: [DYN], result: BOOL },
1526
+ "buffer.transcode": { argTypes: [DYN, DYN, DYN], result: BYTES_U8 },
1441
1527
  "fs.mkdirRecursiveSync": { argTypes: [STRING], result: VOID },
1442
1528
  "fs.rmOptsSync": { argTypes: [STRING, BOOL, BOOL], result: VOID },
1443
1529
  "fs.rmRetrySync": { argTypes: [STRING, BOOL, BOOL, F64, F64], result: VOID },
@@ -1695,15 +1781,38 @@ export function validateModule(mod) {
1695
1781
  errors.push({ message: `class ${cls.name}: invalid local base capture`, loc: cls.loc });
1696
1782
  }
1697
1783
  }
1784
+ if (cls.baseValueGlobal !== undefined) {
1785
+ const global = mod.globals?.find((global) => global.id === cls.baseValueGlobal);
1786
+ if (cls.localBaseCapture !== undefined || !cls.base || global?.type.kind !== "classval" || global.type.className !== cls.base) {
1787
+ errors.push({ message: `class ${cls.name}: invalid computed base global`, loc: cls.loc });
1788
+ }
1789
+ }
1698
1790
  if (cls.jsLength !== undefined && (!Number.isSafeInteger(cls.jsLength) || cls.jsLength < 0)) {
1699
1791
  errors.push({ message: `class ${cls.name}: invalid constructor length`, loc: cls.loc });
1700
1792
  }
1793
+ if (cls.tracksOwnFields && (cls.runtime || cls.fields.find((field) => field.name === DYN_CLASS_PROPERTIES)?.type.kind !== "dyn")) {
1794
+ errors.push({ message: `class ${cls.name}: field presence tracking requires a native dyn property bag`, loc: cls.loc });
1795
+ }
1701
1796
  if (cls.prototypeDataHelper !== undefined) {
1702
1797
  const helper = functionsByName.get(cls.prototypeDataHelper);
1703
1798
  if (!helper || helper.params.length !== 0 || helper.returnType.kind !== "dyn" || helper.captures !== undefined || helper.classCaptures !== undefined) {
1704
1799
  errors.push({ message: `class ${cls.name}: prototype data helper must be a noncapturing () => dyn function`, loc: cls.loc });
1705
1800
  }
1706
1801
  }
1802
+ if (cls.instancePrototypeHelper !== undefined) {
1803
+ const helper = functionsByName.get(cls.instancePrototypeHelper);
1804
+ const receiver = helper?.params[0]?.type;
1805
+ if (!helper || helper.params.length !== 1 || receiver?.kind !== "object" || receiver.className !== cls.name ||
1806
+ helper.returnType.kind !== "dyn" || helper.captures !== undefined || helper.classCaptures !== undefined) {
1807
+ errors.push({ message: `class ${cls.name}: instance prototype helper must be a noncapturing (instance) => dyn function`, loc: cls.loc });
1808
+ }
1809
+ }
1810
+ for (const symbol of cls.symbolFields ?? []) {
1811
+ const global = mod.globals?.find((global) => global.id === symbol.globalId);
1812
+ if (global?.type.kind !== "symbol" || !cls.fields.some((field) => field.name === symbol.field)) {
1813
+ errors.push({ message: `class ${cls.name}: invalid symbol field metadata`, loc: cls.loc });
1814
+ }
1815
+ }
1707
1816
  const seen = new Set();
1708
1817
  for (const f of cls.fields) {
1709
1818
  if (seen.has(f.name)) {
@@ -1746,7 +1855,7 @@ export function validateModule(mod) {
1746
1855
  errors.push({ message: `class ${cls.name}: undeclared base "${cls.base}"`, loc: cls.loc });
1747
1856
  continue;
1748
1857
  }
1749
- if (base.localCaptures !== undefined && cls.localBaseCapture === undefined) {
1858
+ if (base.localCaptures !== undefined && cls.localBaseCapture === undefined && cls.baseValueGlobal === undefined) {
1750
1859
  errors.push({ message: `class ${cls.name}: local base requires a captured constructor`, loc: cls.loc });
1751
1860
  }
1752
1861
  const seen = new Set([cls.name]);
@@ -2113,9 +2222,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2113
2222
  if (isUnitType(fn.returnType)) {
2114
2223
  err(`return type is bare unit type ${fn.returnType.kind}`, fn.loc);
2115
2224
  }
2116
- // Caught (catch-binding) values are local-only by construction: they can
2117
- // never be parameters, returns, or captures (the frontend fences every
2118
- // escape; a caught anywhere else is frontend breakage).
2225
+ // Exception snapshots may be captured, but are never public parameters
2226
+ // or return values. Their payload crosses those boundaries explicitly.
2119
2227
  if (fn.returnType.kind === "caught")
2120
2228
  err("return type is caught", fn.loc);
2121
2229
  for (const p of fn.params) {
@@ -2133,8 +2241,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2133
2241
  err(`capture local "${c.localId}" is not boxed`, fn.loc);
2134
2242
  else if (!typeEquals(local.type, c.type))
2135
2243
  err(`capture local "${c.localId}" has the wrong type`, fn.loc);
2136
- if (c.type.kind === "caught")
2137
- err(`capture "${c.name}" is caught-typed`, fn.loc);
2138
2244
  }
2139
2245
  if (fn.classCaptures !== undefined) {
2140
2246
  const self = fn.params[0];
@@ -2838,7 +2944,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2838
2944
  err(`toString of unknown union ${e.operand.type.unionId}`, e.loc);
2839
2945
  }
2840
2946
  else if (!def.arms.every((a) => a.kind === "undefinedT" || a.kind === "nullT" ||
2841
- a.kind === "string" || a.kind === "f64" || a.kind === "bool" ||
2947
+ a.kind === "string" || a.kind === "f64" || a.kind === "bigint" || a.kind === "bool" ||
2842
2948
  (a.kind === "bytes" && a.elem === "u8"))) {
2843
2949
  err("toString union operand has a non-stringable arm (frontend must fence)", e.loc);
2844
2950
  }
@@ -2908,7 +3014,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2908
3014
  if (want)
2909
3015
  expectType(a, want, `regexIntrinsic ${e.method} arg ${i}`);
2910
3016
  });
2911
- if (e.method === "match") {
3017
+ if (e.method === "match" || e.method === "exec") {
2912
3018
  // The `string[] | null` union (program-dependent id) — checked
2913
3019
  // by arms, like the libCall case checks process.envGet.
2914
3020
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
@@ -4010,6 +4116,10 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4010
4116
  }
4011
4117
  case "dynCall": {
4012
4118
  checkExpr(e.callee);
4119
+ if (e.calleeNameValue !== undefined) {
4120
+ checkExpr(e.calleeNameValue);
4121
+ expectType(e.calleeNameValue, STRING, "dynCall callee name");
4122
+ }
4013
4123
  if (e.receiver !== undefined) {
4014
4124
  checkExpr(e.receiver);
4015
4125
  expectType(e.receiver, DYN, "dynCall receiver");
@@ -4041,6 +4151,10 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4041
4151
  }
4042
4152
  case "dynInvoke": {
4043
4153
  checkExpr(e.recv);
4154
+ if (e.calleeNameValue !== undefined) {
4155
+ checkExpr(e.calleeNameValue);
4156
+ expectType(e.calleeNameValue, STRING, "dynInvoke callee name");
4157
+ }
4044
4158
  expectType(e.recv, DYN, "dynInvoke receiver");
4045
4159
  if (e.type.kind !== "dyn")
4046
4160
  err(`dynInvoke must be dyn-typed, got ${e.type.kind}`, e.loc);
@@ -4508,7 +4622,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4508
4622
  return;
4509
4623
  if (checkLibEmitterCall(e, sig.result))
4510
4624
  return;
4511
- if (e.fn === "error.stack" || e.fn === "error.cause" || e.fn === "error.hasCause" || e.fn === "error.setCause" || e.fn === "error.deleteCause") {
4625
+ if (e.fn === "error.stack" || e.fn === "error.cause" || e.fn === "error.hasCause" || e.fn === "error.setCause" || e.fn === "error.defineCause" || e.fn === "error.deleteCause") {
4512
4626
  const recv = e.args[0];
4513
4627
  let cls = recv?.type.kind === "object" ? classes.get(recv.type.className) : undefined;
4514
4628
  while (cls?.base)
@@ -4531,18 +4645,19 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4531
4645
  }
4532
4646
  }
4533
4647
  function checkLibValueCall(e) {
4534
- if (e.fn === "fileHandle.read" || e.fn === "fileHandle.writeBytes" || e.fn === "fileHandle.writeStr") {
4648
+ if (e.fn === "fileHandle.read" || e.fn === "fileHandle.writeBytes" || e.fn === "fileHandle.writeStr" || e.fn === "fileHandle.readv" || e.fn === "fileHandle.writev") {
4535
4649
  const inner = e.type.kind === "promise" ? e.type.inner : undefined;
4536
4650
  const shape = inner?.kind === "record" ? records.get(inner.shapeId) : undefined;
4537
- const countName = e.fn === "fileHandle.read" ? "bytesRead" : "bytesWritten";
4651
+ const countName = e.fn === "fileHandle.read" || e.fn === "fileHandle.readv" ? "bytesRead" : "bytesWritten";
4652
+ const payloadName = e.fn === "fileHandle.readv" || e.fn === "fileHandle.writev" ? "buffers" : "buffer";
4538
4653
  const payload = e.args[1]?.type;
4539
4654
  const count = shape?.fields.find((f) => f.name === countName);
4540
- const buffer = shape?.fields.find((f) => f.name === "buffer");
4655
+ const buffer = shape?.fields.find((f) => f.name === payloadName);
4541
4656
  const ok = shape !== undefined && !shape.tuple && shape.indexValue === undefined && shape.fields.length === 2 &&
4542
4657
  count?.type.kind === "f64" && payload !== undefined && buffer !== undefined &&
4543
4658
  typeEquals(buffer.type, payload);
4544
4659
  if (!ok) {
4545
- err(`libCall ${e.fn} must return a promise of { ${countName}: number, buffer }`, e.loc);
4660
+ err(`libCall ${e.fn} must return a promise of { ${countName}: number, ${payloadName} }`, e.loc);
4546
4661
  }
4547
4662
  return true;
4548
4663
  }
@@ -5162,6 +5277,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
5162
5277
  }
5163
5278
  }
5164
5279
  }
5280
+ if (e.fn === "child.onSpawn") {
5281
+ const cb = e.args[1];
5282
+ if (!cb || cb.type.kind !== "func" || cb.type.params.length !== 0 || cb.type.ret.kind !== "void")
5283
+ err("child.onSpawn callback must be () => void", e.loc);
5284
+ }
5165
5285
  if (e.fn === "child.onExit" || e.fn === "child.onClose" || e.fn === "child.onError") {
5166
5286
  // The listener: a closure with no params, or exactly the
5167
5287
  // supported parameter shapes per event — exit takes (code:
@@ -5590,7 +5710,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
5590
5710
  return false;
5591
5711
  }
5592
5712
  function checkLibEmitterCall(e, result) {
5593
- if (e.fn.startsWith("emitter.") && e.fn !== "emitter.setDefaultMax" &&
5713
+ if ((e.fn.startsWith("emitter.") || e.fn === "stream.onDyn") && e.fn !== "emitter.setDefaultMax" &&
5594
5714
  e.fn !== "emitter.setDefaultMaxChk" &&
5595
5715
  e.fn !== "emitter.getDefaultMax" && e.fn !== "emitter.checkListener") {
5596
5716
  // Receiver: an emitter-hierarchy object (the %EventEmitter class
@@ -5619,7 +5739,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
5619
5739
  }
5620
5740
  // The chaining forms return the receiver's own static class.
5621
5741
  if (e.fn === "emitter.on" || e.fn === "emitter.off" ||
5622
- e.fn === "emitter.onDyn" || e.fn === "emitter.onFlex" || e.fn === "emitter.offDyn" ||
5742
+ e.fn === "emitter.onDyn" || (e.fn === "emitter.onFlex" || e.fn === "stream.onDyn") || e.fn === "emitter.offDyn" ||
5623
5743
  e.fn === "emitter.onData" || e.fn === "emitter.onDataDyn" ||
5624
5744
  e.fn === "emitter.removeAll" || e.fn === "emitter.setMax" ||
5625
5745
  e.fn === "emitter.setMaxChk") {