@scriptc/compiler 0.1.3 → 0.1.5

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 (217) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +275 -62
  2. package/dist/backend/c/async.d.ts +25 -0
  3. package/dist/backend/c/async.js +167 -0
  4. package/dist/backend/c/async.js.map +1 -1
  5. package/dist/backend/c/c-emitter.d.ts +15 -1
  6. package/dist/backend/c/c-emitter.js +36 -11
  7. package/dist/backend/c/c-emitter.js.map +1 -1
  8. package/dist/backend/c/exprs.d.ts +2 -2
  9. package/dist/backend/c/exprs.js +556 -71
  10. package/dist/backend/c/exprs.js.map +1 -1
  11. package/dist/backend/c/stmts.js +5 -3
  12. package/dist/backend/c/stmts.js.map +1 -1
  13. package/dist/backend/c/types.d.ts +2 -3
  14. package/dist/backend/c/types.js +10 -1
  15. package/dist/backend/c/types.js.map +1 -1
  16. package/dist/backend/c/walkers.js +1 -1
  17. package/dist/backend/c/walkers.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +3 -1
  19. package/dist/backend/link-plan.js +3 -1
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/dyn.js +1 -1
  22. package/dist/backend/llvm/dyn.js.map +1 -1
  23. package/dist/backend/llvm/emitter.js +42 -12
  24. package/dist/backend/llvm/emitter.js.map +1 -1
  25. package/dist/backend/llvm/expr-bytes.d.ts +1 -2
  26. package/dist/backend/llvm/expr-bytes.js +28 -23
  27. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  28. package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
  29. package/dist/backend/llvm/expr-callbacks.js +125 -0
  30. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  31. package/dist/backend/llvm/expr-containers.d.ts +1 -0
  32. package/dist/backend/llvm/expr-containers.js +32 -4
  33. package/dist/backend/llvm/expr-containers.js.map +1 -1
  34. package/dist/backend/llvm/expr-context.d.ts +19 -3
  35. package/dist/backend/llvm/expr-dispatch.js +1 -0
  36. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  37. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  38. package/dist/backend/llvm/expr-primitives.js +49 -13
  39. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  40. package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
  41. package/dist/backend/llvm/expr-primitives.test.js +38 -0
  42. package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
  43. package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
  44. package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
  45. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  46. package/dist/backend/llvm/lib-filesystem.js +80 -10
  47. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  48. package/dist/backend/llvm/lib-network.js +69 -10
  49. package/dist/backend/llvm/lib-network.js.map +1 -1
  50. package/dist/backend/llvm/lib-process.js +156 -6
  51. package/dist/backend/llvm/lib-process.js.map +1 -1
  52. package/dist/backend/llvm/lib-shared.js +100 -0
  53. package/dist/backend/llvm/lib-shared.js.map +1 -1
  54. package/dist/backend/llvm/lib-stream.js +23 -0
  55. package/dist/backend/llvm/lib-stream.js.map +1 -1
  56. package/dist/backend/native-toolchain.d.ts +5 -0
  57. package/dist/backend/native-toolchain.js +4 -1
  58. package/dist/backend/native-toolchain.js.map +1 -1
  59. package/dist/backend/runtime-pack.test.js +28 -10
  60. package/dist/backend/runtime-pack.test.js.map +1 -1
  61. package/dist/backend/targets.d.ts +7 -0
  62. package/dist/backend/targets.js +26 -0
  63. package/dist/backend/targets.js.map +1 -1
  64. package/dist/backend/targets.test.js +8 -1
  65. package/dist/backend/targets.test.js.map +1 -1
  66. package/dist/coverage/surface-manifest.js +14 -4
  67. package/dist/coverage/surface-manifest.js.map +1 -1
  68. package/dist/diagnostics/diagnostic.js +1 -1
  69. package/dist/diagnostics/diagnostic.js.map +1 -1
  70. package/dist/executable/executable-cache.d.ts +4 -0
  71. package/dist/executable/executable-cache.js +6 -1
  72. package/dist/executable/executable-cache.js.map +1 -1
  73. package/dist/executable/executable-cache.test.js +3 -3
  74. package/dist/executable/executable-cache.test.js.map +1 -1
  75. package/dist/frontend/fork-target.d.ts +17 -0
  76. package/dist/frontend/fork-target.js +256 -0
  77. package/dist/frontend/fork-target.js.map +1 -0
  78. package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
  79. package/dist/frontend/lowering/abstract-equality.js +250 -0
  80. package/dist/frontend/lowering/abstract-equality.js.map +1 -0
  81. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  82. package/dist/frontend/lowering/containers/bytes.js +6 -5
  83. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  84. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +7 -6
  85. package/dist/frontend/lowering/containers/string-and-regexp.js +237 -28
  86. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  87. package/dist/frontend/lowering/expressions/object-literals.js +8 -0
  88. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  89. package/dist/frontend/lowering/lower-assert.js +71 -2
  90. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  91. package/dist/frontend/lowering/lower-builtins.d.ts +54 -28
  92. package/dist/frontend/lowering/lower-builtins.js +957 -116
  93. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  94. package/dist/frontend/lowering/lower-calls.d.ts +32 -23
  95. package/dist/frontend/lowering/lower-calls.js +835 -206
  96. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  97. package/dist/frontend/lowering/lower-classes.js +41 -10
  98. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  99. package/dist/frontend/lowering/lower-containers.d.ts +7 -9
  100. package/dist/frontend/lowering/lower-containers.js +293 -51
  101. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  102. package/dist/frontend/lowering/lower-event-emitter.js +212 -21
  103. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  104. package/dist/frontend/lowering/lower-exprs.d.ts +12 -0
  105. package/dist/frontend/lowering/lower-exprs.js +263 -93
  106. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  107. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  108. package/dist/frontend/lowering/lower-inspect.js +1 -1
  109. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  110. package/dist/frontend/lowering/lower-island.d.ts +6 -3
  111. package/dist/frontend/lowering/lower-island.js +182 -12
  112. package/dist/frontend/lowering/lower-island.js.map +1 -1
  113. package/dist/frontend/lowering/lower-modules.d.ts +6 -0
  114. package/dist/frontend/lowering/lower-modules.js +184 -38
  115. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  116. package/dist/frontend/lowering/lower-namespaces.js +7 -0
  117. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  118. package/dist/frontend/lowering/lower-server.d.ts +3 -5
  119. package/dist/frontend/lowering/lower-server.js +413 -54
  120. package/dist/frontend/lowering/lower-server.js.map +1 -1
  121. package/dist/frontend/lowering/lower-stmts.js +122 -19
  122. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  123. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  124. package/dist/frontend/lowering/lower-stream.js +7 -0
  125. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  126. package/dist/frontend/lowering/lowerer.d.ts +86 -9
  127. package/dist/frontend/lowering/lowerer.js +449 -74
  128. package/dist/frontend/lowering/lowerer.js.map +1 -1
  129. package/dist/frontend/lowering/optional-arguments.d.ts +9 -1
  130. package/dist/frontend/lowering/optional-arguments.js +67 -1
  131. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  132. package/dist/frontend/lowering/pairs-snapshot.d.ts +3 -1
  133. package/dist/frontend/lowering/pairs-snapshot.js +12 -4
  134. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  135. package/dist/frontend/lowering/surfaces.d.ts +34 -14
  136. package/dist/frontend/lowering/surfaces.js +177 -104
  137. package/dist/frontend/lowering/surfaces.js.map +1 -1
  138. package/dist/frontend/npm-static-declarations.d.ts +4 -0
  139. package/dist/frontend/npm-static-declarations.js +56 -0
  140. package/dist/frontend/npm-static-declarations.js.map +1 -1
  141. package/dist/frontend/npm-static-declarations.test.js +23 -2
  142. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  143. package/dist/frontend/npm-static-prune.d.ts +6 -0
  144. package/dist/frontend/npm-static-prune.js +203 -0
  145. package/dist/frontend/npm-static-prune.js.map +1 -0
  146. package/dist/frontend/npm-static-prune.test.d.ts +1 -0
  147. package/dist/frontend/npm-static-prune.test.js +48 -0
  148. package/dist/frontend/npm-static-prune.test.js.map +1 -0
  149. package/dist/frontend/npm-static.js +6 -5
  150. package/dist/frontend/npm-static.js.map +1 -1
  151. package/dist/frontend/npm.d.ts +15 -3
  152. package/dist/frontend/npm.js +87 -14
  153. package/dist/frontend/npm.js.map +1 -1
  154. package/dist/frontend/npm.test.js +76 -9
  155. package/dist/frontend/npm.test.js.map +1 -1
  156. package/dist/frontend/program.js +107 -14
  157. package/dist/frontend/program.js.map +1 -1
  158. package/dist/frontend/provenance.js +8 -3
  159. package/dist/frontend/provenance.js.map +1 -1
  160. package/dist/frontend/resolve.d.ts +6 -0
  161. package/dist/frontend/resolve.js +7 -4
  162. package/dist/frontend/resolve.js.map +1 -1
  163. package/dist/frontend/type-mapper.d.ts +5 -0
  164. package/dist/frontend/type-mapper.js +80 -29
  165. package/dist/frontend/type-mapper.js.map +1 -1
  166. package/dist/index.d.ts +8 -3
  167. package/dist/index.js +34 -41
  168. package/dist/index.js.map +1 -1
  169. package/dist/ir/analysis.d.ts +5 -3
  170. package/dist/ir/analysis.js +25 -11
  171. package/dist/ir/analysis.js.map +1 -1
  172. package/dist/ir/analysis.test.js +50 -2
  173. package/dist/ir/analysis.test.js.map +1 -1
  174. package/dist/ir/constant-tables.d.ts +17 -0
  175. package/dist/ir/constant-tables.js +99 -0
  176. package/dist/ir/constant-tables.js.map +1 -0
  177. package/dist/ir/constant-tables.test.d.ts +1 -0
  178. package/dist/ir/constant-tables.test.js +78 -0
  179. package/dist/ir/constant-tables.test.js.map +1 -0
  180. package/dist/ir/integer-ranges.d.ts +13 -0
  181. package/dist/ir/integer-ranges.js +122 -0
  182. package/dist/ir/integer-ranges.js.map +1 -0
  183. package/dist/ir/integer-ranges.test.d.ts +1 -0
  184. package/dist/ir/integer-ranges.test.js +63 -0
  185. package/dist/ir/integer-ranges.test.js.map +1 -0
  186. package/dist/ir/ir.d.ts +130 -76
  187. package/dist/ir/ir.js +69 -4
  188. package/dist/ir/ir.js.map +1 -1
  189. package/dist/ir/ir.test.js +20 -1
  190. package/dist/ir/ir.test.js.map +1 -1
  191. package/dist/ir/scalar-records.d.ts +8 -0
  192. package/dist/ir/scalar-records.js +216 -0
  193. package/dist/ir/scalar-records.js.map +1 -0
  194. package/dist/ir/scalar-records.test.d.ts +1 -0
  195. package/dist/ir/scalar-records.test.js +142 -0
  196. package/dist/ir/scalar-records.test.js.map +1 -0
  197. package/dist/ir/serialize.d.ts +1 -1
  198. package/dist/ir/serialize.js +1 -1
  199. package/dist/ir/serialize.js.map +1 -1
  200. package/dist/ir/validate.js +256 -20
  201. package/dist/ir/validate.js.map +1 -1
  202. package/dist/ir/validate.test.d.ts +1 -0
  203. package/dist/ir/validate.test.js +31 -0
  204. package/dist/ir/validate.test.js.map +1 -0
  205. package/dist/library/cache-primitives.d.ts +1 -1
  206. package/dist/library/cache-primitives.js +3 -3
  207. package/dist/library/cache-primitives.js.map +1 -1
  208. package/dist/library/fence-eval.js +11 -4
  209. package/dist/library/fence-eval.js.map +1 -1
  210. package/dist/library/int-infer.test.js +4 -4
  211. package/dist/library/int-infer.test.js.map +1 -1
  212. package/dist/library/library-cache.js +0 -1
  213. package/dist/library/library-cache.js.map +1 -1
  214. package/dist/library/library-cache.test.js +8 -8
  215. package/dist/library/library-cache.test.js.map +1 -1
  216. package/package.json +17 -17
  217. package/surface-manifest.json +186 -79
@@ -11,8 +11,8 @@ export const STR_INTRINSIC_SIGS = {
11
11
  charAt: { argTypes: [F64], minArgs: 1, result: STRING },
12
12
  indexOf: { argTypes: [STRING, F64], minArgs: 1, result: F64 },
13
13
  includes: { argTypes: [STRING, F64], minArgs: 1, result: BOOL },
14
- startsWith: { argTypes: [STRING], minArgs: 1, result: BOOL },
15
- endsWith: { argTypes: [STRING], minArgs: 1, result: BOOL },
14
+ startsWith: { argTypes: [STRING, F64], minArgs: 1, result: BOOL },
15
+ endsWith: { argTypes: [STRING, F64], minArgs: 1, result: BOOL },
16
16
  slice: { argTypes: [F64, F64], minArgs: 0, result: STRING },
17
17
  substring: { argTypes: [F64, F64], minArgs: 1, result: STRING },
18
18
  repeat: { argTypes: [F64], minArgs: 1, result: STRING },
@@ -196,11 +196,27 @@ export const LIB_FN_SIGS = {
196
196
  "os.networkInterfaces": { argTypes: [], result: VOID },
197
197
  "math.maxArr": { argTypes: [arrayOf(F64)], result: F64 },
198
198
  "math.minArr": { argTypes: [arrayOf(F64)], result: F64 },
199
+ "math.hypotArr": { argTypes: [arrayOf(F64)], result: F64 },
199
200
  "math.floor": { argTypes: [F64], result: F64 },
200
201
  "math.abs": { argTypes: [F64], result: F64 },
201
202
  "math.round": { argTypes: [F64], result: F64 },
202
203
  "math.trunc": { argTypes: [F64], result: F64 },
203
204
  "math.ceil": { argTypes: [F64], result: F64 },
205
+ "math.sin": { argTypes: [F64], result: F64 },
206
+ "math.cos": { argTypes: [F64], result: F64 },
207
+ "math.tan": { argTypes: [F64], result: F64 },
208
+ "math.asin": { argTypes: [F64], result: F64 },
209
+ "math.acos": { argTypes: [F64], result: F64 },
210
+ "math.atan": { argTypes: [F64], result: F64 },
211
+ "math.cbrt": { argTypes: [F64], result: F64 },
212
+ "math.sign": { argTypes: [F64], result: F64 },
213
+ "math.exp": { argTypes: [F64], result: F64 },
214
+ "math.sqrt": { argTypes: [F64], result: F64 },
215
+ "math.log": { argTypes: [F64], result: F64 },
216
+ "math.log2": { argTypes: [F64], result: F64 },
217
+ "math.log10": { argTypes: [F64], result: F64 },
218
+ "math.atan2": { argTypes: [F64, F64], result: F64 },
219
+ "math.pow": { argTypes: [F64, F64], result: F64 },
204
220
  "math.min": { argTypes: [F64, F64], result: F64 },
205
221
  "math.max": { argTypes: [F64, F64], result: F64 },
206
222
  "math.random": { argTypes: [], result: F64 },
@@ -246,6 +262,7 @@ export const LIB_FN_SIGS = {
246
262
  "bigint.shl": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
247
263
  "bigint.shr": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
248
264
  "bigint.eq": { argTypes: [BIGINT_T, BIGINT_T], result: BOOL },
265
+ "bigint.eqString": { argTypes: [BIGINT_T, STRING], result: BOOL },
249
266
  "bigint.cmp": { argTypes: [BIGINT_T, BIGINT_T], result: F64 },
250
267
  "bigint.cmpNumber": { argTypes: [BIGINT_T, F64], result: F64 },
251
268
  "bigint.truthy": { argTypes: [BIGINT_T], result: BOOL },
@@ -260,8 +277,12 @@ export const LIB_FN_SIGS = {
260
277
  "bigint.dataViewSet": { argTypes: [BYTES_U8, F64, BIGINT_T, BOOL], result: VOID },
261
278
  "url.new": { argTypes: [STRING], result: URL_T },
262
279
  "url.protocol": { argTypes: [URL_T], result: STRING },
280
+ "url.origin": { argTypes: [URL_T], result: STRING },
281
+ "url.username": { argTypes: [URL_T], result: STRING },
282
+ "url.password": { argTypes: [URL_T], result: STRING },
263
283
  "url.host": { argTypes: [URL_T], result: STRING },
264
284
  "url.hostname": { argTypes: [URL_T], result: STRING },
285
+ "url.port": { argTypes: [URL_T], result: STRING },
265
286
  "url.pathname": { argTypes: [URL_T], result: STRING },
266
287
  "url.href": { argTypes: [URL_T], result: STRING },
267
288
  "url.fileURLToPathUrl": { argTypes: [URL_T], result: STRING },
@@ -277,6 +298,7 @@ export const LIB_FN_SIGS = {
277
298
  "sp.with": { argTypes: [SEARCH_PARAMS_T, STRING, STRING], result: SEARCH_PARAMS_T },
278
299
  "url.searchParams": { argTypes: [URL_T], result: SEARCH_PARAMS_T },
279
300
  "url.search": { argTypes: [URL_T], result: STRING },
301
+ "url.hash": { argTypes: [URL_T], result: STRING },
280
302
  // Result is the interned `string | null` union — the libCall case
281
303
  // checks the arms (the spawnRes.signal pattern).
282
304
  "sp.get": { argTypes: [SEARCH_PARAMS_T, STRING], result: VOID },
@@ -303,7 +325,12 @@ export const LIB_FN_SIGS = {
303
325
  "util.parseArgs": { argTypes: [DYN], result: DYN },
304
326
  "fs.statSync": { argTypes: [STRING], result: STATS_T },
305
327
  "fs.lstatSync": { argTypes: [STRING], result: STATS_T },
328
+ "fs.fstatSync": { argTypes: [F64], result: STATS_T },
329
+ "fs.fchmodSync": { argTypes: [F64, F64], result: VOID },
330
+ "fs.fsyncSync": { argTypes: [F64], result: VOID },
331
+ "fs.linkSync": { argTypes: [STRING, STRING], result: VOID },
306
332
  "fs.openSync": { argTypes: [STRING, STRING], result: F64 },
333
+ "fs.openNumericSync": { argTypes: [STRING, F64, F64], result: F64 },
307
334
  "fs.readSync": { argTypes: [F64, BYTES_U8, F64, F64, F64], result: F64 },
308
335
  "fs.writeSync": { argTypes: [F64, BYTES_U8, F64, F64, F64], result: F64 },
309
336
  "fs.writeStrSync": { argTypes: [F64, STRING, F64, STRING], result: F64 },
@@ -323,10 +350,13 @@ export const LIB_FN_SIGS = {
323
350
  "stats.isDirectory": { argTypes: [STATS_T], result: BOOL },
324
351
  "stats.isSymbolicLink": { argTypes: [STATS_T], result: BOOL },
325
352
  "stats.size": { argTypes: [STATS_T], result: F64 },
353
+ "stats.dev": { argTypes: [STATS_T], result: F64 },
354
+ "stats.ino": { argTypes: [STATS_T], result: F64 },
326
355
  "stats.blocks": { argTypes: [STATS_T], result: F64 },
327
356
  "stats.nlink": { argTypes: [STATS_T], result: F64 },
328
357
  "stats.atimeMs": { argTypes: [STATS_T], result: F64 },
329
358
  "stats.mtimeMs": { argTypes: [STATS_T], result: F64 },
359
+ "stats.ctimeMs": { argTypes: [STATS_T], result: F64 },
330
360
  // The wider sync fs slice (unlink/chmod/chown/copyfile and the
331
361
  // mode-carrying write/mkdir forms).
332
362
  "fs.unlinkSync": { argTypes: [STRING], result: VOID },
@@ -369,6 +399,7 @@ export const LIB_FN_SIGS = {
369
399
  // the callback follows the reusePort BOOL in this additive ABI.
370
400
  "net.listenOptsReusePortCb": { argTypes: [NETSERVER_T, F64, STRING, BOOL, BOOL, null], result: VOID },
371
401
  "net.serverPort": { argTypes: [NETSERVER_T], result: F64 },
402
+ "net.serverListening": { argTypes: [NETSERVER_T], result: BOOL },
372
403
  // net.serverAddress's record result is shape-checked in the libCall case
373
404
  // (the dgram.address sentinel pattern).
374
405
  "net.serverAddress": { argTypes: [NETSERVER_T], result: VOID },
@@ -444,29 +475,55 @@ export const LIB_FN_SIGS = {
444
475
  // union, checked like process.envGet.
445
476
  "http.createServer": { argTypes: [null], result: NETSERVER_T },
446
477
  "http.createServerEmpty": { argTypes: [], result: NETSERVER_T },
478
+ "http.validateHeaderName": { argTypes: [STRING, STRING], result: VOID },
479
+ "http.validateHeaderValue": { argTypes: [STRING, DYN], result: VOID },
447
480
  "http.serverJoinDupHeaders": { argTypes: [NETSERVER_T], result: VOID },
481
+ "http.serverAllowMissingHostHeader": { argTypes: [NETSERVER_T], result: VOID },
448
482
  "http.serverTimeoutGet": { argTypes: [NETSERVER_T, F64], result: F64 },
483
+ "http.serverSetTimeout": { argTypes: [NETSERVER_T, F64], result: VOID },
484
+ "http.serverSetTimeoutCb": { argTypes: [NETSERVER_T, F64, null], result: VOID },
485
+ "http.serverOnTimeout": { argTypes: [NETSERVER_T, null, BOOL], result: VOID },
486
+ "http.serverCloseAllConnections": { argTypes: [NETSERVER_T], result: VOID },
487
+ "http.serverCloseIdleConnections": { argTypes: [NETSERVER_T], result: VOID },
449
488
  "http.serverTimeoutSet": { argTypes: [NETSERVER_T, F64, F64], result: VOID },
450
489
  "http.serverTimeoutOptionSet": { argTypes: [NETSERVER_T, F64, DYN], result: VOID },
451
490
  "net.serverOnListening": { argTypes: [NETSERVER_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
452
491
  "http.resStatusGet": { argTypes: [HTTPRES_T], result: F64 },
453
492
  "http.resStatusSet": { argTypes: [HTTPRES_T, F64], result: VOID },
454
- "http.resStatusMsgGet": { argTypes: [HTTPRES_T], result: STRING },
493
+ "http.resStatusMsgGet": { argTypes: [HTTPRES_T], result: VOID },
455
494
  "http.resStatusMsgSet": { argTypes: [HTTPRES_T, STRING], result: VOID },
495
+ "http.resRequest": { argTypes: [HTTPRES_T], result: HTTPREQ_T },
496
+ "http.resSocket": { argTypes: [HTTPRES_T], result: VOID },
497
+ "http.resWritableFinished": { argTypes: [HTTPRES_T], result: BOOL },
498
+ "http.resSendDateGet": { argTypes: [HTTPRES_T], result: BOOL },
499
+ "http.resSendDateSet": { argTypes: [HTTPRES_T, BOOL], result: VOID },
500
+ "http.resStrictContentLengthGet": { argTypes: [HTTPRES_T], result: BOOL },
501
+ "http.resStrictContentLengthSet": { argTypes: [HTTPRES_T, BOOL], result: VOID },
502
+ "http.resSetTimeout": { argTypes: [HTTPRES_T, F64], result: VOID },
503
+ "http.resSetTimeoutCb": { argTypes: [HTTPRES_T, F64, { kind: "func", params: [], ret: VOID }], result: VOID },
456
504
  // resGetHeader answers the interned `string | undefined` union — the
457
505
  // reqHeader/envGet sentinel pattern (VOID here, checked specially).
458
506
  "http.resGetHeader": { argTypes: [HTTPRES_T, STRING], result: VOID },
507
+ "http.resGetHeaderNames": { argTypes: [HTTPRES_T], result: arrayOf(STRING) },
508
+ "http.resGetRawHeaderNames": { argTypes: [HTTPRES_T], result: arrayOf(STRING) },
509
+ "http.resGetHeaders": { argTypes: [HTTPRES_T], result: DYN },
459
510
  "http.resHasHeader": { argTypes: [HTTPRES_T, STRING], result: BOOL },
460
511
  "http.resRemoveHeader": { argTypes: [HTTPRES_T, STRING], result: VOID },
461
512
  "http.resOnFinish": { argTypes: [HTTPRES_T, { kind: "func", params: [], ret: VOID }], result: VOID },
462
513
  "http.reqUrl": { argTypes: [HTTPREQ_T], result: STRING },
463
514
  "http.reqMethod": { argTypes: [HTTPREQ_T], result: STRING },
464
515
  "http.reqHeader": { argTypes: [HTTPREQ_T, STRING], result: VOID },
516
+ "http.reqTrailer": { argTypes: [HTTPREQ_T, STRING], result: VOID },
517
+ "http.reqHeaderValues": { argTypes: [HTTPREQ_T, STRING], result: VOID },
518
+ "http.reqTrailerValues": { argTypes: [HTTPREQ_T, STRING], result: VOID },
465
519
  "http.reqOnData": { argTypes: [HTTPREQ_T, null, BOOL], result: VOID },
466
520
  "http.reqOnEnd": { argTypes: [HTTPREQ_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
467
521
  "http.resSetHeader": { argTypes: [HTTPRES_T, STRING, STRING], result: VOID },
468
522
  "http.resWriteHead": { argTypes: [HTTPRES_T, F64], result: VOID },
469
523
  "http.resWriteHeadN": { argTypes: [HTTPRES_T, F64, arrayOf(STRING), arrayOf(STRING)], result: VOID },
524
+ "http.resWriteContinue": { argTypes: [HTTPRES_T], result: VOID },
525
+ "http.resWriteProcessing": { argTypes: [HTTPRES_T], result: VOID },
526
+ "http.resWriteEarlyHints": { argTypes: [HTTPRES_T, arrayOf(STRING)], result: VOID },
470
527
  "http.resWrite": { argTypes: [HTTPRES_T, STRING], result: VOID },
471
528
  "http.resWriteBytes": { argTypes: [HTTPRES_T, BYTES_U8], result: VOID },
472
529
  "http.resEnd": { argTypes: [HTTPRES_T], result: VOID },
@@ -475,6 +532,12 @@ export const LIB_FN_SIGS = {
475
532
  "http.resWriteDyn": { argTypes: [HTTPRES_T, DYN], result: VOID },
476
533
  "http.resEndDyn": { argTypes: [HTTPRES_T, DYN], result: VOID },
477
534
  "http.resHeadersSent": { argTypes: [HTTPRES_T], result: BOOL },
535
+ "http.resWritableEnded": { argTypes: [HTTPRES_T], result: BOOL },
536
+ "http.resFlushHeaders": { argTypes: [HTTPRES_T], result: VOID },
537
+ "http.resAddTrailers": { argTypes: [HTTPRES_T, arrayOf(STRING)], result: VOID },
538
+ "http.resCork": { argTypes: [HTTPRES_T], result: VOID },
539
+ "http.resUncork": { argTypes: [HTTPRES_T], result: VOID },
540
+ "http.resWritableCorked": { argTypes: [HTTPRES_T], result: F64 },
478
541
  // The member follow-ups: reqStatusCode's `number | undefined` and
479
542
  // sockRemoteAddress's `string | undefined` results are shape-checked in
480
543
  // the special cases below (like reqHeader/columns).
@@ -484,6 +547,8 @@ export const LIB_FN_SIGS = {
484
547
  "http.reqStatusMessage": { argTypes: [HTTPREQ_T], result: VOID },
485
548
  "http.reqRawHeaders": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
486
549
  "http.reqHeaderPairs": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
550
+ "http.reqRawTrailers": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
551
+ "http.reqTrailerPairs": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
487
552
  "net.sockDestroyed": { argTypes: [NETSOCKET_T], result: BOOL },
488
553
  "net.sockWritable": { argTypes: [NETSOCKET_T], result: BOOL },
489
554
  // The 'upgrade' registrations: the callback shapes are program-typed
@@ -672,18 +737,52 @@ export const LIB_FN_SIGS = {
672
737
  "https.requestFn": { argTypes: [BOOL, STRING, F64, STRING, STRING, F64, arrayOf(STRING), BOOL, BOOL, null], result: HTTPCLIENTREQ_T },
673
738
  "https.requestFnCb": { argTypes: [BOOL, STRING, F64, STRING, STRING, F64, arrayOf(STRING), BOOL, BOOL, null, null], result: HTTPCLIENTREQ_T },
674
739
  "http.clientWrite": { argTypes: [HTTPCLIENTREQ_T, STRING], result: VOID },
740
+ "http.clientSetHeader": { argTypes: [HTTPCLIENTREQ_T, STRING, STRING], result: VOID },
741
+ "http.clientGetHeader": { argTypes: [HTTPCLIENTREQ_T, STRING], result: VOID },
742
+ "http.clientHasHeader": { argTypes: [HTTPCLIENTREQ_T, STRING], result: BOOL },
743
+ "http.clientRemoveHeader": { argTypes: [HTTPCLIENTREQ_T, STRING], result: VOID },
744
+ "http.clientGetHeaderNames": { argTypes: [HTTPCLIENTREQ_T], result: arrayOf(STRING) },
745
+ "http.clientGetRawHeaderNames": { argTypes: [HTTPCLIENTREQ_T], result: arrayOf(STRING) },
746
+ "http.clientGetHeaders": { argTypes: [HTTPCLIENTREQ_T], result: DYN },
675
747
  "http.clientWriteBytes": { argTypes: [HTTPCLIENTREQ_T, BYTES_U8], result: VOID },
676
748
  "http.clientEnd": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
677
749
  "http.clientEndStr": { argTypes: [HTTPCLIENTREQ_T, STRING], result: VOID },
678
750
  "http.clientEndBytes": { argTypes: [HTTPCLIENTREQ_T, BYTES_U8], result: VOID },
679
751
  "http.clientWriteDyn": { argTypes: [HTTPCLIENTREQ_T, DYN], result: VOID },
680
752
  "http.clientEndDyn": { argTypes: [HTTPCLIENTREQ_T, DYN], result: VOID },
753
+ "http.clientFlushHeaders": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
754
+ "http.clientAddTrailers": { argTypes: [HTTPCLIENTREQ_T, arrayOf(STRING)], result: VOID },
755
+ "http.clientCork": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
756
+ "http.clientUncork": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
757
+ "http.clientWritableCorked": { argTypes: [HTTPCLIENTREQ_T], result: F64 },
758
+ "http.clientMethod": { argTypes: [HTTPCLIENTREQ_T], result: STRING },
759
+ "http.clientPath": { argTypes: [HTTPCLIENTREQ_T], result: STRING },
760
+ "http.clientHost": { argTypes: [HTTPCLIENTREQ_T], result: STRING },
761
+ "http.clientProtocol": { argTypes: [HTTPCLIENTREQ_T], result: STRING },
762
+ "http.clientHeadersSent": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
763
+ "http.clientWritableEnded": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
764
+ "http.clientWritableFinished": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
765
+ "http.clientSocket": { argTypes: [HTTPCLIENTREQ_T], result: NETSOCKET_T },
766
+ "http.clientReusedSocket": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
767
+ "http.clientSetNoDelay": { argTypes: [HTTPCLIENTREQ_T, BOOL], result: VOID },
768
+ "http.clientSetSocketKeepAlive": { argTypes: [HTTPCLIENTREQ_T, BOOL, F64], result: VOID },
769
+ "http.clientSetTimeout": { argTypes: [HTTPCLIENTREQ_T, F64], result: VOID },
770
+ "http.clientSetTimeoutCb": { argTypes: [HTTPCLIENTREQ_T, F64, { kind: "func", params: [], ret: VOID }], result: VOID },
771
+ "http.statusCodes": { argTypes: [], result: DYN },
772
+ "http.methods": { argTypes: [], result: arrayOf(STRING) },
773
+ "http.reqSetTimeout": { argTypes: [HTTPREQ_T, F64], result: VOID },
774
+ "http.reqSetTimeoutCb": { argTypes: [HTTPREQ_T, F64, { kind: "func", params: [], ret: VOID }], result: VOID },
681
775
  "http.clientDestroy": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
776
+ "http.clientAbort": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
777
+ "http.clientAborted": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
682
778
  "http.clientDestroyed": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
683
779
  "http.clientOnResponse": { argTypes: [HTTPCLIENTREQ_T, null, BOOL], result: VOID },
780
+ "http.clientOnSocket": { argTypes: [HTTPCLIENTREQ_T, null, BOOL], result: VOID },
781
+ "http.clientOnFinish": { argTypes: [HTTPCLIENTREQ_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
684
782
  "http.clientOnError": { argTypes: [HTTPCLIENTREQ_T, null, BOOL], result: VOID },
685
783
  "http.clientOnTimeout": { argTypes: [HTTPCLIENTREQ_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
686
784
  "http.clientOnClose": { argTypes: [HTTPCLIENTREQ_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
785
+ "http.clientOnAbort": { argTypes: [HTTPCLIENTREQ_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
687
786
  "cp.execSync": {
688
787
  argTypes: [STRING, arrayOf(STRING), BOOL, STRING, BOOL, STRING, BOOL, arrayOf(STRING), F64, F64, F64],
689
788
  result: STRING,
@@ -693,17 +792,36 @@ export const LIB_FN_SIGS = {
693
792
  result: SPAWNRES_T,
694
793
  },
695
794
  "cp.spawn": { argTypes: [STRING, arrayOf(STRING)], result: CHILD_T },
795
+ "process.forkTarget": { argTypes: [F64], result: F64 },
796
+ "cp.fork": {
797
+ argTypes: [F64, arrayOf(STRING), F64, F64, F64, BOOL, arrayOf(STRING), STRING],
798
+ result: CHILD_T,
799
+ },
800
+ "child.connected": { argTypes: [CHILD_T], result: BOOL },
801
+ "child.send": { argTypes: [CHILD_T, STRING], result: BOOL },
802
+ "child.sendCb": { argTypes: [CHILD_T, STRING, null], result: BOOL },
803
+ "child.disconnect": { argTypes: [CHILD_T], result: VOID },
804
+ "child.onMessage": { argTypes: [CHILD_T, null, BOOL], result: VOID },
805
+ "child.onDisconnect": { argTypes: [CHILD_T, null, BOOL], result: VOID },
806
+ "process.connected": { argTypes: [], result: BOOL },
807
+ "process.send": { argTypes: [STRING], result: BOOL },
808
+ "process.sendCb": { argTypes: [STRING, null], result: BOOL },
809
+ "process.disconnect": { argTypes: [], result: VOID },
810
+ "process.onMessage": { argTypes: [null, BOOL], result: VOID },
811
+ "process.onDisconnect": { argTypes: [null, BOOL], result: VOID },
812
+ "cp.execFile": { argTypes: [STRING, arrayOf(STRING), null], result: CHILD_T },
696
813
  // spawn's options form: per-slot stdio modes (0 ignore / 1 inherit /
697
814
  // 2 fd) with the out/err fds for mode 2, detached, env replacement
698
815
  // pairs, cwd ("" = inherit).
699
816
  "cp.spawnOpts": {
700
- argTypes: [STRING, arrayOf(STRING), F64, F64, F64, F64, F64, BOOL, BOOL, arrayOf(STRING), STRING],
817
+ argTypes: [STRING, arrayOf(STRING), F64, F64, F64, F64, F64, BOOL, BOOL, BOOL, arrayOf(STRING), STRING],
701
818
  result: CHILD_T,
702
819
  },
703
820
  // The callback's func type is program-dependent (zero params, or the
704
821
  // `number | null` union / the %Error class) — the libCall case checks
705
822
  // the shape; the slot here only pins arity and the child receiver.
706
823
  "child.onExit": { argTypes: [CHILD_T, null], result: VOID },
824
+ "child.onClose": { argTypes: [CHILD_T, null], result: VOID },
707
825
  "child.onError": { argTypes: [CHILD_T, null], result: VOID },
708
826
  // Like process.envGet, spawnRes.status's result type is program-dependent
709
827
  // (the interned `number | null` union) — the libCall case checks the arms.
@@ -734,7 +852,9 @@ export const LIB_FN_SIGS = {
734
852
  // (zero-param / Buffer / Buffer-armed union) — the slots pin arity,
735
853
  // the stream receiver, and the once-flag.
736
854
  "stream.onData": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
855
+ "stream.onDataStr": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
737
856
  "stream.onEnd": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
857
+ "stream.childSetEncoding": { argTypes: [CHILDSTREAM_T, STRING], result: CHILDSTREAM_T },
738
858
  "writer.writeString": { argTypes: [CHILDWRITER_T, STRING], result: BOOL },
739
859
  "writer.writeBytes": { argTypes: [CHILDWRITER_T, BYTES_U8], result: BOOL },
740
860
  "writer.end": { argTypes: [CHILDWRITER_T], result: VOID },
@@ -808,6 +928,19 @@ export const LIB_FN_SIGS = {
808
928
  "fsp.readFileBytes": { argTypes: [STRING], result: { kind: "promise", inner: BYTES_U8 } },
809
929
  "zlib.deflateSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
810
930
  "zlib.inflateSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
931
+ "zlib.deflateRawSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
932
+ "zlib.inflateRawSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
933
+ "zlib.gzipSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
934
+ "zlib.gunzipSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
935
+ "zlib.unzipSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
936
+ "zlib.deflateCb": { argTypes: [BYTES_U8, null], result: VOID },
937
+ "zlib.inflateCb": { argTypes: [BYTES_U8, null], result: VOID },
938
+ "zlib.deflateRawCb": { argTypes: [BYTES_U8, null], result: VOID },
939
+ "zlib.inflateRawCb": { argTypes: [BYTES_U8, null], result: VOID },
940
+ "zlib.gzipCb": { argTypes: [BYTES_U8, null], result: VOID },
941
+ "zlib.gunzipCb": { argTypes: [BYTES_U8, null], result: VOID },
942
+ "zlib.unzipCb": { argTypes: [BYTES_U8, null], result: VOID },
943
+ "zlib.crc32": { argTypes: [BYTES_U8, F64], result: F64 },
811
944
  "process.stdoutWriteBytes": { argTypes: [BYTES_U8, STRING], result: BOOL },
812
945
  "process.stderrWriteBytes": { argTypes: [BYTES_U8, STRING], result: BOOL },
813
946
  // Completion callback is program-dependent: zero params, checked-dynamic,
@@ -825,8 +958,13 @@ export const LIB_FN_SIGS = {
825
958
  "fsp.chmod": { argTypes: [STRING, F64], result: { kind: "promise", inner: VOID } },
826
959
  "fsp.rename": { argTypes: [STRING, STRING], result: { kind: "promise", inner: VOID } },
827
960
  "fsp.readdir": { argTypes: [STRING], result: { kind: "promise", inner: arrayOf(STRING) } },
961
+ // Result is promise<call-site Dirent record array>; the libCall case
962
+ // validates the program-dependent record shape below.
963
+ "fsp.readdirTypes": { argTypes: [STRING], result: { kind: "promise", inner: VOID } },
828
964
  "fsp.rm": { argTypes: [STRING], result: { kind: "promise", inner: VOID } },
829
965
  "fsp.stat": { argTypes: [STRING], result: { kind: "promise", inner: STATS_T } },
966
+ "fsp.realpath": { argTypes: [STRING], result: { kind: "promise", inner: STRING } },
967
+ "fsp.lstat": { argTypes: [STRING], result: { kind: "promise", inner: STATS_T } },
830
968
  "fsp.open": { argTypes: [STRING, STRING, F64], result: { kind: "promise", inner: FILEHANDLE_T } },
831
969
  "fileHandle.fd": { argTypes: [FILEHANDLE_T], result: F64 },
832
970
  "fileHandle.close": { argTypes: [FILEHANDLE_T], result: { kind: "promise", inner: VOID } },
@@ -851,6 +989,8 @@ export const LIB_FN_SIGS = {
851
989
  "process.envUnset": { argTypes: [STRING], result: VOID },
852
990
  "process.envPairs": { argTypes: [], result: arrayOf(STRING) },
853
991
  "process.exit": { argTypes: [F64], result: VOID },
992
+ "process.setExitCode": { argTypes: [F64], result: VOID },
993
+ "process.currentExitCode": { argTypes: [], result: F64 },
854
994
  "process.cwd": { argTypes: [], result: STRING },
855
995
  "process.pid": { argTypes: [], result: F64 },
856
996
  "dyn.this": { argTypes: [], result: DYN },
@@ -869,6 +1009,7 @@ export const LIB_FN_SIGS = {
869
1009
  "error.new": { argTypes: [STRING], result: VOID },
870
1010
  "error.nodeThrow": { argTypes: [F64, STRING, STRING], result: VOID },
871
1011
  "dyn.toStringCoerce": { argTypes: [DYN], result: STRING },
1012
+ "dyn.toNumberCoerce": { argTypes: [DYN], result: F64 },
872
1013
  // Always throws; the result is the READ's declared type (a typed dummy
873
1014
  // the unwind abandons) — the libCall case skips the result check.
874
1015
  "global.undefRead": { argTypes: [STRING], result: VOID },
@@ -921,9 +1062,11 @@ export const LIB_FN_SIGS = {
921
1062
  // once, prepend), offDyn (recv, name, cb dyn).
922
1063
  "emitter.checkListener": { argTypes: [DYN], result: VOID },
923
1064
  "emitter.onDyn": { argTypes: [null, STRING, DYN, null, BOOL, BOOL], result: VOID },
1065
+ "emitter.onFlex": { argTypes: [null, STRING, DYN, BOOL, BOOL], result: VOID },
924
1066
  "emitter.offDyn": { argTypes: [null, STRING, DYN], result: VOID },
925
1067
  "emitter.removeAll": { argTypes: [null, STRING, BOOL], result: VOID },
926
1068
  "emitter.emit": { argTypes: [null, STRING], result: BOOL },
1069
+ "emitter.emitFlex": { argTypes: [null, STRING], result: BOOL },
927
1070
  "emitter.emitError": { argTypes: [null, STRING, null], result: BOOL },
928
1071
  "emitter.count": { argTypes: [null, STRING], result: F64 },
929
1072
  "emitter.countFn": { argTypes: [null, STRING, null], result: F64 },
@@ -1035,6 +1178,7 @@ export const LIB_FN_SIGS = {
1035
1178
  // The equality quartet over checked-dynamic operands (the frontend
1036
1179
  // boxes a static side into the checked-dynamic tree first).
1037
1180
  "assert.eqDyn": { argTypes: [DYN, DYN, BOOL, BOOL, STRING, BOOL], result: VOID },
1181
+ "assert.looseResult": { argTypes: [BOOL, BOOL, STRING, STRING, STRING, BOOL], result: VOID },
1038
1182
  // The throws(fn, {shape}) accumulator: begin/slot calls never throw;
1039
1183
  // shapeEnd throws the Comparison diff. The error slot is the
1040
1184
  // %Error-narrowed caught value.
@@ -1139,6 +1283,7 @@ export const LIB_FN_SIGS = {
1139
1283
  "date.newNow": { argTypes: [], result: DATE_T },
1140
1284
  "date.newMs": { argTypes: [F64], result: DATE_T },
1141
1285
  "date.newString": { argTypes: [STRING], result: DATE_T },
1286
+ "date.parse": { argTypes: [STRING], result: F64 },
1142
1287
  "date.getTime": { argTypes: [DATE_T], result: F64 },
1143
1288
  "date.valueOf": { argTypes: [DATE_T], result: F64 },
1144
1289
  "date.toISOString": { argTypes: [F64], result: STRING },
@@ -1181,6 +1326,7 @@ export const LIB_FN_SIGS = {
1181
1326
  // form) — checked in the libCall case.
1182
1327
  "string.fromCharCode": { argTypes: [null], result: STRING },
1183
1328
  "string.lastIndexOf": { argTypes: [STRING, STRING], result: F64 },
1329
+ "string.lastIndexOfFrom": { argTypes: [STRING, STRING, F64], result: F64 },
1184
1330
  "string.raw": { argTypes: [arrayOf(STRING), arrayOf(STRING)], result: STRING },
1185
1331
  };
1186
1332
  /** True for an object type naming a runtime-provided error class. */
@@ -1817,6 +1963,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1817
1963
  if (e.type.kind !== "string")
1818
1964
  err("strLit must be string", e.loc);
1819
1965
  break;
1966
+ case "moduleNsRef":
1967
+ if (e.type.kind !== "moduleNs" || e.type.moduleId !== e.moduleId) {
1968
+ err("moduleNsRef must match its moduleNs type", e.loc);
1969
+ }
1970
+ break;
1820
1971
  case "boolLit":
1821
1972
  if (e.type.kind !== "bool")
1822
1973
  err("boolLit must be bool", e.loc);
@@ -1855,6 +2006,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1855
2006
  err(`bin ${e.op} on class values: right operand is ${e.right.type.kind}`, e.loc);
1856
2007
  }
1857
2008
  }
2009
+ else if (isEq && e.left.type.kind === "moduleNs") {
2010
+ if (e.right.type.kind !== "moduleNs") {
2011
+ err(`bin ${e.op} on module namespaces: right operand is ${e.right.type.kind}`, e.loc);
2012
+ }
2013
+ }
1858
2014
  else if (isEq &&
1859
2015
  (e.left.type.kind === "array" ||
1860
2016
  e.left.type.kind === "map" ||
@@ -2577,7 +2733,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2577
2733
  ? { argTypes: e.args.map(() => elem), result: F64 }
2578
2734
  : e.method === "pushSpread" || e.method === "concatSpread" || e.method === "unshiftSpread"
2579
2735
  ? { argTypes: [e.receiver.type], result: F64 }
2580
- : e.method === "nextPresent"
2736
+ : e.method === "nextPresent" || e.method === "getNumber"
2581
2737
  ? { argTypes: [F64], result: F64 }
2582
2738
  : e.method === "pop"
2583
2739
  ? { argTypes: [], result: e.type } // union-checked below
@@ -2604,6 +2760,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2604
2760
  : e.method === "shift"
2605
2761
  ? { argTypes: [], result: e.type } // union-checked below
2606
2762
  : { argTypes: [], result: F64 }; // length
2763
+ if (e.method === "getNumber" && elem.kind !== "f64") {
2764
+ err(`arrIntrinsic getNumber requires f64 elements, got ${elem.kind}`, e.loc);
2765
+ }
2607
2766
  if (e.method === "join" &&
2608
2767
  elem.kind !== "f64" && elem.kind !== "string" && elem.kind !== "bool" &&
2609
2768
  !(elem.kind === "union" &&
@@ -2859,7 +3018,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2859
3018
  // ISLAND-REST types (restAbi jsval) SPELL their trailing engine
2860
3019
  // array param — the lifted signature matches directly, no
2861
3020
  // hidden slot.
2862
- const hiddenRest = e.type.rest === true && e.type.restAbi !== "jsval";
3021
+ const hiddenRest = e.type.rest === true && e.type.restAbi === undefined;
2863
3022
  const declared = hiddenRest ? target.params.slice(0, -1) : target.params;
2864
3023
  const restOk = !hiddenRest ||
2865
3024
  (target.params.length === e.type.params.length + 1 &&
@@ -3764,7 +3923,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
3764
3923
  // The stream constructors (trailing option callbacks), write/end
3765
3924
  // (the optional chunk/cb tail), and unpipe (the optional
3766
3925
  // destination) admit a longer list the same way.
3767
- const variadic = e.fn === "emitter.emit" ||
3926
+ const variadic = e.fn === "emitter.emit" || e.fn === "emitter.emitFlex" ||
3768
3927
  e.fn === "readable.new" || e.fn === "writable.new" ||
3769
3928
  e.fn === "duplex.new" || e.fn === "transform.new" ||
3770
3929
  e.fn === "passthrough.new" ||
@@ -4100,7 +4259,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4100
4259
  }
4101
4260
  break;
4102
4261
  }
4103
- if (e.fn === "http.reqStatusMessage") {
4262
+ if (e.fn === "http.reqStatusMessage" || e.fn === "http.resStatusMsgGet") {
4104
4263
  // Result is the interned `string | undefined` union (reqHeader's).
4105
4264
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4106
4265
  const ok = def &&
@@ -4108,10 +4267,19 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4108
4267
  def.arms.some((a) => a.kind === "string") &&
4109
4268
  def.arms.some((a) => a.kind === "undefinedT");
4110
4269
  if (!ok) {
4111
- err(`libCall http.reqStatusMessage must return the 'string | undefined' union`, e.loc);
4270
+ err(`libCall ${e.fn} must return the 'string | undefined' union`, e.loc);
4112
4271
  }
4113
4272
  break;
4114
4273
  }
4274
+ if (e.fn === "http.resSocket") {
4275
+ const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4276
+ const ok = def && def.arms.length === 2 &&
4277
+ def.arms.some((a) => a.kind === "netSocket") &&
4278
+ def.arms.some((a) => a.kind === "nullT");
4279
+ if (!ok)
4280
+ err(`libCall http.resSocket must return the 'Socket | null' union`, e.loc);
4281
+ break;
4282
+ }
4115
4283
  if (e.fn === "http.reqH2Stream") {
4116
4284
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4117
4285
  const ok = def && def.arms.length === 2 &&
@@ -4121,7 +4289,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4121
4289
  err(`libCall http.reqH2Stream must return the 'Http2Stream | undefined' union`, e.loc);
4122
4290
  break;
4123
4291
  }
4124
- if (e.fn === "http.reqHeader" || e.fn === "http.resGetHeader") {
4292
+ if (e.fn === "http.reqHeader" || e.fn === "http.reqTrailer" || e.fn === "http.resGetHeader" || e.fn === "http.clientGetHeader") {
4125
4293
  // Result is the interned `string | undefined` union (envGet's).
4126
4294
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4127
4295
  const ok = def &&
@@ -4133,15 +4301,26 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4133
4301
  }
4134
4302
  break;
4135
4303
  }
4304
+ if (e.fn === "http.reqHeaderValues" || e.fn === "http.reqTrailerValues") {
4305
+ const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4306
+ const ok = def && def.arms.length === 2 &&
4307
+ def.arms[0].kind === "array" && def.arms[0].elem.kind === "string" &&
4308
+ def.arms[1].kind === "undefinedT";
4309
+ if (!ok)
4310
+ err(`libCall ${e.fn} must return the 'string[] | undefined' union`, e.loc);
4311
+ break;
4312
+ }
4136
4313
  if (e.fn === "net.createServerCb" || e.fn === "net.serverOnConnection" ||
4137
4314
  e.fn === "net.serverOnSecureConnection" ||
4315
+ e.fn === "http.serverSetTimeoutCb" || e.fn === "http.serverOnTimeout" ||
4316
+ e.fn === "http.clientOnSocket" ||
4138
4317
  e.fn === "net.sockOnData" || e.fn === "net.serverOnError" ||
4139
4318
  e.fn === "net.sockOnError") {
4140
4319
  // The program-dependent listener shapes: a void closure with no
4141
4320
  // params, or exactly the one supported parameter per event
4142
4321
  // (socket handle / data chunk bytes / error %Error). The
4143
4322
  // callback slot is arg 0 for createServerCb, arg 1 otherwise.
4144
- const cbT = e.args[e.fn === "net.createServerCb" ? 0 : 1]?.type;
4323
+ const cbT = e.args[e.fn === "net.createServerCb" ? 0 : e.fn === "http.serverSetTimeoutCb" ? 2 : 1]?.type;
4145
4324
  let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= 1;
4146
4325
  if (ok && cbT?.kind === "func" && cbT.params.length === 1) {
4147
4326
  const p = cbT.params[0];
@@ -4231,6 +4410,30 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4231
4410
  }
4232
4411
  break;
4233
4412
  }
4413
+ if (e.fn === "zlib.deflateCb" || e.fn === "zlib.inflateCb" ||
4414
+ e.fn === "zlib.deflateRawCb" || e.fn === "zlib.inflateRawCb" ||
4415
+ e.fn === "zlib.gzipCb" || e.fn === "zlib.gunzipCb" || e.fn === "zlib.unzipCb") {
4416
+ const cbT = e.args[1]?.type;
4417
+ let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= 2;
4418
+ if (ok && cbT?.kind === "func" && cbT.params.length >= 1) {
4419
+ const error = cbT.params[0];
4420
+ if (error.kind !== "dyn") {
4421
+ const def = error.kind === "union" ? unions.get(error.unionId) : undefined;
4422
+ ok = def !== undefined &&
4423
+ def.arms.some((arm) => arm.kind === "nullT") &&
4424
+ def.arms.some((arm) => arm.kind === "object" && arm.className === "%Error") &&
4425
+ def.arms.every((arm) => arm.kind === "nullT" || arm.kind === "undefinedT" ||
4426
+ (arm.kind === "object" && arm.className === "%Error"));
4427
+ }
4428
+ }
4429
+ if (ok && cbT?.kind === "func" && cbT.params.length === 2) {
4430
+ const value = cbT.params[1];
4431
+ ok = value.kind === "dyn" || (value.kind === "bytes" && value.elem === "u8");
4432
+ }
4433
+ if (!ok)
4434
+ err(`libCall ${e.fn} callback shape (frontend must fence)`, e.loc);
4435
+ break;
4436
+ }
4234
4437
  if (e.fn === "fs.renameCb" ||
4235
4438
  e.fn === "process.stdoutWriteBytesCb" ||
4236
4439
  e.fn === "process.stderrWriteBytesCb") {
@@ -4286,12 +4489,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4286
4489
  }
4287
4490
  break;
4288
4491
  }
4289
- if (e.fn === "fs.readdirTypesSync") {
4492
+ if (e.fn === "fs.readdirTypesSync" || e.fn === "fsp.readdirTypes") {
4290
4493
  // Result: the interned Dirent record array — {%dtype: f64,
4291
4494
  // name: string, parentPath: string} rows (canonical field
4292
4495
  // order; the structure lowerFsReaddirTypesCall pinned).
4293
- const shape = e.type.kind === "array" && e.type.elem.kind === "record"
4294
- ? records.get(e.type.elem.shapeId)
4496
+ const result = e.fn === "fsp.readdirTypes"
4497
+ ? e.type.kind === "promise" ? e.type.inner : undefined
4498
+ : e.type;
4499
+ const shape = result?.kind === "array" && result.elem.kind === "record"
4500
+ ? records.get(result.elem.shapeId)
4295
4501
  : undefined;
4296
4502
  const ok = shape !== undefined &&
4297
4503
  !shape.tuple &&
@@ -4301,7 +4507,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4301
4507
  shape.fields[1].name === "name" && shape.fields[1].type.kind === "string" &&
4302
4508
  shape.fields[2].name === "parentPath" && shape.fields[2].type.kind === "string";
4303
4509
  if (!ok) {
4304
- err(`libCall fs.readdirTypesSync must return the Dirent record array`, e.loc);
4510
+ err(`libCall ${e.fn} must return ${e.fn === "fsp.readdirTypes" ? "a promise of " : ""}the Dirent record array`, e.loc);
4305
4511
  }
4306
4512
  break;
4307
4513
  }
@@ -4341,18 +4547,43 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4341
4547
  }
4342
4548
  break;
4343
4549
  }
4344
- if (e.fn === "child.onExit" || e.fn === "child.onError") {
4550
+ if (e.fn === "cp.execFile") {
4551
+ const cb = e.args[2]?.type;
4552
+ if (cb?.kind !== "func" || cb.rest === true || cb.params.length > 3 || cb.ret.kind !== "void") {
4553
+ err(`libCall cp.execFile callback must be a non-rest void function with at most three parameters`, e.loc);
4554
+ }
4555
+ else {
4556
+ const error = cb.params[0];
4557
+ if (error !== undefined) {
4558
+ const def = error.kind === "union" ? unions.get(error.unionId) : undefined;
4559
+ if (!def || def.arms.length !== 2 ||
4560
+ !def.arms.some((arm) => arm.kind === "nullT") ||
4561
+ !def.arms.some((arm) => arm.kind === "object" && arm.className === "%Error")) {
4562
+ err(`libCall cp.execFile callback error parameter must be Error | null`, e.loc);
4563
+ }
4564
+ }
4565
+ const stdout = cb.params[1];
4566
+ if (stdout !== undefined && stdout.kind !== "string") {
4567
+ err(`libCall cp.execFile callback stdout parameter must be string`, e.loc);
4568
+ }
4569
+ const stderr = cb.params[2];
4570
+ if (stderr !== undefined && stderr.kind !== "string") {
4571
+ err(`libCall cp.execFile callback stderr parameter must be string`, e.loc);
4572
+ }
4573
+ }
4574
+ }
4575
+ if (e.fn === "child.onExit" || e.fn === "child.onClose" || e.fn === "child.onError") {
4345
4576
  // The listener: a closure with no params, or exactly the
4346
4577
  // supported parameter shapes per event — exit takes (code:
4347
4578
  // number | null) with an optional (signal: string | null)
4348
4579
  // second parameter, error exactly (err: %Error).
4349
4580
  const cb = e.args[1];
4350
4581
  const cbT = cb?.type;
4351
- const maxParams = e.fn === "child.onExit" ? 2 : 1;
4582
+ const maxParams = e.fn === "child.onError" ? 1 : 2;
4352
4583
  let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= maxParams;
4353
4584
  if (ok && cbT?.kind === "func" && cbT.params.length >= 1) {
4354
4585
  const p = cbT.params[0];
4355
- if (e.fn === "child.onExit") {
4586
+ if (e.fn === "child.onExit" || e.fn === "child.onClose") {
4356
4587
  const def = p.kind === "union" ? unions.get(p.unionId) : undefined;
4357
4588
  ok =
4358
4589
  def !== undefined &&
@@ -4789,7 +5020,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4789
5020
  }
4790
5021
  // The chaining forms return the receiver's own static class.
4791
5022
  if (e.fn === "emitter.on" || e.fn === "emitter.off" ||
4792
- e.fn === "emitter.onDyn" || e.fn === "emitter.offDyn" ||
5023
+ e.fn === "emitter.onDyn" || e.fn === "emitter.onFlex" || e.fn === "emitter.offDyn" ||
4793
5024
  e.fn === "emitter.onData" || e.fn === "emitter.onDataDyn" ||
4794
5025
  e.fn === "emitter.removeAll" || e.fn === "emitter.setMax" ||
4795
5026
  e.fn === "emitter.setMaxChk") {
@@ -4836,7 +5067,12 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4836
5067
  err(`libCall emitter.listeners must return a func array`, e.loc);
4837
5068
  break;
4838
5069
  }
4839
- if (e.fn === "emitter.emit" || e.fn === "emitter.count" ||
5070
+ if (e.fn === "emitter.emitFlex") {
5071
+ if (e.args.slice(2).some((arg) => arg.type.kind !== "dyn")) {
5072
+ err("libCall emitter.emitFlex payloads must be checked-dynamic", e.loc);
5073
+ }
5074
+ }
5075
+ if (e.fn === "emitter.emit" || e.fn === "emitter.emitFlex" || e.fn === "emitter.count" ||
4840
5076
  e.fn === "emitter.getMax" || e.fn === "emitter.ctor" ||
4841
5077
  e.fn === "emitter.countFn" || e.fn === "emitter.emitError") {
4842
5078
  if (!typeEquals(e.type, sig.result)) {