@scriptc/compiler 0.1.2 → 0.1.4

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 (206) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +258 -64
  2. package/dist/backend/c/async.d.ts +30 -0
  3. package/dist/backend/c/async.js +224 -0
  4. package/dist/backend/c/async.js.map +1 -1
  5. package/dist/backend/c/c-emitter.d.ts +13 -0
  6. package/dist/backend/c/c-emitter.js +28 -9
  7. package/dist/backend/c/c-emitter.js.map +1 -1
  8. package/dist/backend/c/exprs.d.ts +8 -1
  9. package/dist/backend/c/exprs.js +445 -60
  10. package/dist/backend/c/exprs.js.map +1 -1
  11. package/dist/backend/c/shapes.js +15 -13
  12. package/dist/backend/c/shapes.js.map +1 -1
  13. package/dist/backend/c/types.d.ts +4 -0
  14. package/dist/backend/c/types.js +20 -1
  15. package/dist/backend/c/types.js.map +1 -1
  16. package/dist/backend/c/types.test.js +8 -1
  17. package/dist/backend/c/types.test.js.map +1 -1
  18. package/dist/backend/c/walkers.js +32 -11
  19. package/dist/backend/c/walkers.js.map +1 -1
  20. package/dist/backend/json-literal.d.ts +7 -0
  21. package/dist/backend/json-literal.js +17 -0
  22. package/dist/backend/json-literal.js.map +1 -0
  23. package/dist/backend/json-literal.test.d.ts +1 -0
  24. package/dist/backend/json-literal.test.js +17 -0
  25. package/dist/backend/json-literal.test.js.map +1 -0
  26. package/dist/backend/link-plan.d.ts +2 -1
  27. package/dist/backend/link-plan.js +6 -1
  28. package/dist/backend/link-plan.js.map +1 -1
  29. package/dist/backend/llvm/classes.js +8 -7
  30. package/dist/backend/llvm/classes.js.map +1 -1
  31. package/dist/backend/llvm/common.d.ts +4 -0
  32. package/dist/backend/llvm/common.js +6 -0
  33. package/dist/backend/llvm/common.js.map +1 -1
  34. package/dist/backend/llvm/common.test.d.ts +1 -0
  35. package/dist/backend/llvm/common.test.js +9 -0
  36. package/dist/backend/llvm/common.test.js.map +1 -0
  37. package/dist/backend/llvm/dyn.d.ts +4 -0
  38. package/dist/backend/llvm/dyn.js +24 -13
  39. package/dist/backend/llvm/dyn.js.map +1 -1
  40. package/dist/backend/llvm/emitter.js +54 -12
  41. package/dist/backend/llvm/emitter.js.map +1 -1
  42. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  43. package/dist/backend/llvm/expr-bytes.js +8 -8
  44. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  45. package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
  46. package/dist/backend/llvm/expr-callbacks.js +125 -0
  47. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  48. package/dist/backend/llvm/expr-context.d.ts +18 -2
  49. package/dist/backend/llvm/expr-dispatch.js +1 -0
  50. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  51. package/dist/backend/llvm/expr-dynamic.js +9 -0
  52. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  53. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  54. package/dist/backend/llvm/expr-primitives.js +38 -9
  55. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  56. package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
  57. package/dist/backend/llvm/expr-primitives.test.js +38 -0
  58. package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
  59. package/dist/backend/llvm/expr-records.js +3 -3
  60. package/dist/backend/llvm/expr-records.js.map +1 -1
  61. package/dist/backend/llvm/expr-stream-bridges.js +2 -1
  62. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  63. package/dist/backend/llvm/expr-stream-callbacks.d.ts +6 -0
  64. package/dist/backend/llvm/expr-stream-callbacks.js +122 -0
  65. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  66. package/dist/backend/llvm/lib-dispatch.js +22 -0
  67. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  68. package/dist/backend/llvm/lib-filesystem.js +68 -10
  69. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  70. package/dist/backend/llvm/lib-network.js +18 -2
  71. package/dist/backend/llvm/lib-network.js.map +1 -1
  72. package/dist/backend/llvm/lib-process.js +206 -11
  73. package/dist/backend/llvm/lib-process.js.map +1 -1
  74. package/dist/backend/llvm/lib-shared.js +82 -0
  75. package/dist/backend/llvm/lib-shared.js.map +1 -1
  76. package/dist/backend/llvm/lib-stream.js +23 -0
  77. package/dist/backend/llvm/lib-stream.js.map +1 -1
  78. package/dist/backend/llvm/shapes.js +10 -8
  79. package/dist/backend/llvm/shapes.js.map +1 -1
  80. package/dist/backend/llvm/walkers.js +7 -5
  81. package/dist/backend/llvm/walkers.js.map +1 -1
  82. package/dist/backend/native-link-info.d.ts +2 -1
  83. package/dist/backend/native-link-info.js +4 -0
  84. package/dist/backend/native-link-info.js.map +1 -1
  85. package/dist/backend/native-link-info.test.js +24 -1
  86. package/dist/backend/native-link-info.test.js.map +1 -1
  87. package/dist/backend/native-toolchain.d.ts +11 -6
  88. package/dist/backend/native-toolchain.js +30 -13
  89. package/dist/backend/native-toolchain.js.map +1 -1
  90. package/dist/backend/native-toolchain.test.js +36 -1
  91. package/dist/backend/native-toolchain.test.js.map +1 -1
  92. package/dist/backend/runtime-pack-targets.test.js +1 -1
  93. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  94. package/dist/backend/runtime-pack.test.js +29 -10
  95. package/dist/backend/runtime-pack.test.js.map +1 -1
  96. package/dist/backend/targets.d.ts +9 -0
  97. package/dist/backend/targets.js +22 -0
  98. package/dist/backend/targets.js.map +1 -1
  99. package/dist/backend/targets.test.js +13 -1
  100. package/dist/backend/targets.test.js.map +1 -1
  101. package/dist/coverage/surface-manifest.js +9 -0
  102. package/dist/coverage/surface-manifest.js.map +1 -1
  103. package/dist/diagnostics/diagnostic.js +4 -4
  104. package/dist/diagnostics/diagnostic.js.map +1 -1
  105. package/dist/executable/executable-cache.d.ts +3 -0
  106. package/dist/executable/executable-cache.js +4 -0
  107. package/dist/executable/executable-cache.js.map +1 -1
  108. package/dist/executable/executable-cache.test.js +1 -0
  109. package/dist/executable/executable-cache.test.js.map +1 -1
  110. package/dist/frontend/fork-target.d.ts +17 -0
  111. package/dist/frontend/fork-target.js +256 -0
  112. package/dist/frontend/fork-target.js.map +1 -0
  113. package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
  114. package/dist/frontend/lowering/abstract-equality.js +250 -0
  115. package/dist/frontend/lowering/abstract-equality.js.map +1 -0
  116. package/dist/frontend/lowering/containers/bytes.d.ts +0 -4
  117. package/dist/frontend/lowering/containers/bytes.js +112 -28
  118. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  119. package/dist/frontend/lowering/lower-assert.js +87 -12
  120. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  121. package/dist/frontend/lowering/lower-builtins.d.ts +72 -44
  122. package/dist/frontend/lowering/lower-builtins.js +1323 -165
  123. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  124. package/dist/frontend/lowering/lower-calls.d.ts +37 -27
  125. package/dist/frontend/lowering/lower-calls.js +682 -132
  126. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  127. package/dist/frontend/lowering/lower-classes.js +39 -8
  128. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  129. package/dist/frontend/lowering/lower-containers.js +162 -8
  130. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  131. package/dist/frontend/lowering/lower-event-emitter.js +212 -21
  132. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  133. package/dist/frontend/lowering/lower-exprs.js +238 -87
  134. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  135. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  136. package/dist/frontend/lowering/lower-inspect.js +8 -1
  137. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  138. package/dist/frontend/lowering/lower-island.d.ts +6 -3
  139. package/dist/frontend/lowering/lower-island.js +165 -6
  140. package/dist/frontend/lowering/lower-island.js.map +1 -1
  141. package/dist/frontend/lowering/lower-modules.d.ts +6 -0
  142. package/dist/frontend/lowering/lower-modules.js +192 -38
  143. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  144. package/dist/frontend/lowering/lower-namespaces.js +7 -0
  145. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  146. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  147. package/dist/frontend/lowering/lower-server.js +130 -27
  148. package/dist/frontend/lowering/lower-server.js.map +1 -1
  149. package/dist/frontend/lowering/lower-stmts.d.ts +5 -4
  150. package/dist/frontend/lowering/lower-stmts.js +141 -21
  151. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  152. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  153. package/dist/frontend/lowering/lower-stream.js +7 -0
  154. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  155. package/dist/frontend/lowering/lowerer.d.ts +90 -13
  156. package/dist/frontend/lowering/lowerer.js +416 -76
  157. package/dist/frontend/lowering/lowerer.js.map +1 -1
  158. package/dist/frontend/lowering/surfaces.d.ts +31 -3
  159. package/dist/frontend/lowering/surfaces.js +173 -90
  160. package/dist/frontend/lowering/surfaces.js.map +1 -1
  161. package/dist/frontend/npm-static-declarations.d.ts +4 -0
  162. package/dist/frontend/npm-static-declarations.js +83 -14
  163. package/dist/frontend/npm-static-declarations.js.map +1 -1
  164. package/dist/frontend/npm-static-declarations.test.js +33 -2
  165. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  166. package/dist/frontend/npm-static.js +6 -5
  167. package/dist/frontend/npm-static.js.map +1 -1
  168. package/dist/frontend/npm.d.ts +15 -3
  169. package/dist/frontend/npm.js +80 -8
  170. package/dist/frontend/npm.js.map +1 -1
  171. package/dist/frontend/npm.test.js +76 -9
  172. package/dist/frontend/npm.test.js.map +1 -1
  173. package/dist/frontend/program.js +110 -12
  174. package/dist/frontend/program.js.map +1 -1
  175. package/dist/frontend/resolve.d.ts +28 -7
  176. package/dist/frontend/resolve.js +90 -26
  177. package/dist/frontend/resolve.js.map +1 -1
  178. package/dist/frontend/resolve.test.js +21 -1
  179. package/dist/frontend/resolve.test.js.map +1 -1
  180. package/dist/frontend/type-mapper.d.ts +5 -0
  181. package/dist/frontend/type-mapper.js +115 -33
  182. package/dist/frontend/type-mapper.js.map +1 -1
  183. package/dist/index.d.ts +5 -0
  184. package/dist/index.js +30 -3
  185. package/dist/index.js.map +1 -1
  186. package/dist/ir/analysis.js +1 -0
  187. package/dist/ir/analysis.js.map +1 -1
  188. package/dist/ir/ir.d.ts +155 -66
  189. package/dist/ir/ir.js +143 -6
  190. package/dist/ir/ir.js.map +1 -1
  191. package/dist/ir/ir.test.js +14 -1
  192. package/dist/ir/ir.test.js.map +1 -1
  193. package/dist/ir/serialize.d.ts +1 -1
  194. package/dist/ir/serialize.js +1 -1
  195. package/dist/ir/serialize.js.map +1 -1
  196. package/dist/ir/validate.js +242 -18
  197. package/dist/ir/validate.js.map +1 -1
  198. package/dist/library/int-infer.test.js +4 -4
  199. package/dist/library/int-infer.test.js.map +1 -1
  200. package/dist/library/library-cache.d.ts +1 -0
  201. package/dist/library/library-cache.js +1 -0
  202. package/dist/library/library-cache.js.map +1 -1
  203. package/dist/library/library-cache.test.js +18 -5
  204. package/dist/library/library-cache.test.js.map +1 -1
  205. package/package.json +17 -17
  206. package/surface-manifest.json +163 -54
@@ -1,4 +1,5 @@
1
- import { arrayOf, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, CHILD_T, CHILDSTREAM_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, unionFuncSetArmsOk, URL_T, VOID } from "./ir.js";
1
+ import { arrayOf, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, 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, unionFuncSetArmsOk, URL_T, VOID } from "./ir.js";
2
+ import { BIGINT_T } from "./ir.js";
2
3
  /** Per-method signature for strIntrinsic: `argTypes` lists every argument
3
4
  * position (optional ones included); `minArgs` is how many may be omitted
4
5
  * from the end (backends fill the documented defaults). Exported for the
@@ -229,10 +230,43 @@ export const LIB_FN_SIGS = {
229
230
  "sym.keyFor": { argTypes: [SYMBOL_T], result: VOID },
230
231
  "sym.desc": { argTypes: [SYMBOL_T], result: VOID },
231
232
  "sym.toString": { argTypes: [SYMBOL_T], result: STRING },
233
+ "bigint.parse": { argTypes: [STRING], result: BIGINT_T },
234
+ "bigint.fromF64": { argTypes: [F64], result: BIGINT_T },
235
+ "bigint.neg": { argTypes: [BIGINT_T], result: BIGINT_T },
236
+ "bigint.not": { argTypes: [BIGINT_T], result: BIGINT_T },
237
+ "bigint.add": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
238
+ "bigint.sub": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
239
+ "bigint.mul": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
240
+ "bigint.div": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
241
+ "bigint.mod": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
242
+ "bigint.pow": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
243
+ "bigint.and": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
244
+ "bigint.or": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
245
+ "bigint.xor": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
246
+ "bigint.shl": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
247
+ "bigint.shr": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
248
+ "bigint.eq": { argTypes: [BIGINT_T, BIGINT_T], result: BOOL },
249
+ "bigint.eqString": { argTypes: [BIGINT_T, STRING], result: BOOL },
250
+ "bigint.cmp": { argTypes: [BIGINT_T, BIGINT_T], result: F64 },
251
+ "bigint.cmpNumber": { argTypes: [BIGINT_T, F64], result: F64 },
252
+ "bigint.truthy": { argTypes: [BIGINT_T], result: BOOL },
253
+ "bigint.toString": { argTypes: [BIGINT_T, F64], result: STRING },
254
+ "bigint.inspect": { argTypes: [BIGINT_T], result: STRING },
255
+ "bigint.toF64": { argTypes: [BIGINT_T], result: F64 },
256
+ "bigint.asUintN": { argTypes: [F64, BIGINT_T], result: BIGINT_T },
257
+ "bigint.asIntN": { argTypes: [F64, BIGINT_T], result: BIGINT_T },
258
+ "bigint.bufferRead": { argTypes: [BYTES_U8, F64, BOOL, BOOL], result: BIGINT_T },
259
+ "bigint.bufferWrite": { argTypes: [BYTES_U8, BIGINT_T, F64, BOOL, BOOL], result: F64 },
260
+ "bigint.dataViewGet": { argTypes: [BYTES_U8, F64, BOOL, BOOL], result: BIGINT_T },
261
+ "bigint.dataViewSet": { argTypes: [BYTES_U8, F64, BIGINT_T, BOOL], result: VOID },
232
262
  "url.new": { argTypes: [STRING], result: URL_T },
233
263
  "url.protocol": { argTypes: [URL_T], result: STRING },
264
+ "url.origin": { argTypes: [URL_T], result: STRING },
265
+ "url.username": { argTypes: [URL_T], result: STRING },
266
+ "url.password": { argTypes: [URL_T], result: STRING },
234
267
  "url.host": { argTypes: [URL_T], result: STRING },
235
268
  "url.hostname": { argTypes: [URL_T], result: STRING },
269
+ "url.port": { argTypes: [URL_T], result: STRING },
236
270
  "url.pathname": { argTypes: [URL_T], result: STRING },
237
271
  "url.href": { argTypes: [URL_T], result: STRING },
238
272
  "url.fileURLToPathUrl": { argTypes: [URL_T], result: STRING },
@@ -248,6 +282,7 @@ export const LIB_FN_SIGS = {
248
282
  "sp.with": { argTypes: [SEARCH_PARAMS_T, STRING, STRING], result: SEARCH_PARAMS_T },
249
283
  "url.searchParams": { argTypes: [URL_T], result: SEARCH_PARAMS_T },
250
284
  "url.search": { argTypes: [URL_T], result: STRING },
285
+ "url.hash": { argTypes: [URL_T], result: STRING },
251
286
  // Result is the interned `string | null` union — the libCall case
252
287
  // checks the arms (the spawnRes.signal pattern).
253
288
  "sp.get": { argTypes: [SEARCH_PARAMS_T, STRING], result: VOID },
@@ -274,7 +309,12 @@ export const LIB_FN_SIGS = {
274
309
  "util.parseArgs": { argTypes: [DYN], result: DYN },
275
310
  "fs.statSync": { argTypes: [STRING], result: STATS_T },
276
311
  "fs.lstatSync": { argTypes: [STRING], result: STATS_T },
312
+ "fs.fstatSync": { argTypes: [F64], result: STATS_T },
313
+ "fs.fchmodSync": { argTypes: [F64, F64], result: VOID },
314
+ "fs.fsyncSync": { argTypes: [F64], result: VOID },
315
+ "fs.linkSync": { argTypes: [STRING, STRING], result: VOID },
277
316
  "fs.openSync": { argTypes: [STRING, STRING], result: F64 },
317
+ "fs.openNumericSync": { argTypes: [STRING, F64, F64], result: F64 },
278
318
  "fs.readSync": { argTypes: [F64, BYTES_U8, F64, F64, F64], result: F64 },
279
319
  "fs.writeSync": { argTypes: [F64, BYTES_U8, F64, F64, F64], result: F64 },
280
320
  "fs.writeStrSync": { argTypes: [F64, STRING, F64, STRING], result: F64 },
@@ -294,10 +334,13 @@ export const LIB_FN_SIGS = {
294
334
  "stats.isDirectory": { argTypes: [STATS_T], result: BOOL },
295
335
  "stats.isSymbolicLink": { argTypes: [STATS_T], result: BOOL },
296
336
  "stats.size": { argTypes: [STATS_T], result: F64 },
337
+ "stats.dev": { argTypes: [STATS_T], result: F64 },
338
+ "stats.ino": { argTypes: [STATS_T], result: F64 },
297
339
  "stats.blocks": { argTypes: [STATS_T], result: F64 },
298
340
  "stats.nlink": { argTypes: [STATS_T], result: F64 },
299
341
  "stats.atimeMs": { argTypes: [STATS_T], result: F64 },
300
342
  "stats.mtimeMs": { argTypes: [STATS_T], result: F64 },
343
+ "stats.ctimeMs": { argTypes: [STATS_T], result: F64 },
301
344
  // The wider sync fs slice (unlink/chmod/chown/copyfile and the
302
345
  // mode-carrying write/mkdir forms).
303
346
  "fs.unlinkSync": { argTypes: [STRING], result: VOID },
@@ -416,6 +459,7 @@ export const LIB_FN_SIGS = {
416
459
  "http.createServer": { argTypes: [null], result: NETSERVER_T },
417
460
  "http.createServerEmpty": { argTypes: [], result: NETSERVER_T },
418
461
  "http.serverJoinDupHeaders": { argTypes: [NETSERVER_T], result: VOID },
462
+ "http.serverAllowMissingHostHeader": { argTypes: [NETSERVER_T], result: VOID },
419
463
  "http.serverTimeoutGet": { argTypes: [NETSERVER_T, F64], result: F64 },
420
464
  "http.serverTimeoutSet": { argTypes: [NETSERVER_T, F64, F64], result: VOID },
421
465
  "http.serverTimeoutOptionSet": { argTypes: [NETSERVER_T, F64, DYN], result: VOID },
@@ -433,6 +477,9 @@ export const LIB_FN_SIGS = {
433
477
  "http.reqUrl": { argTypes: [HTTPREQ_T], result: STRING },
434
478
  "http.reqMethod": { argTypes: [HTTPREQ_T], result: STRING },
435
479
  "http.reqHeader": { argTypes: [HTTPREQ_T, STRING], result: VOID },
480
+ "http.reqTrailer": { argTypes: [HTTPREQ_T, STRING], result: VOID },
481
+ "http.reqHeaderValues": { argTypes: [HTTPREQ_T, STRING], result: VOID },
482
+ "http.reqTrailerValues": { argTypes: [HTTPREQ_T, STRING], result: VOID },
436
483
  "http.reqOnData": { argTypes: [HTTPREQ_T, null, BOOL], result: VOID },
437
484
  "http.reqOnEnd": { argTypes: [HTTPREQ_T, { kind: "func", params: [], ret: VOID }, BOOL], result: VOID },
438
485
  "http.resSetHeader": { argTypes: [HTTPRES_T, STRING, STRING], result: VOID },
@@ -446,6 +493,11 @@ export const LIB_FN_SIGS = {
446
493
  "http.resWriteDyn": { argTypes: [HTTPRES_T, DYN], result: VOID },
447
494
  "http.resEndDyn": { argTypes: [HTTPRES_T, DYN], result: VOID },
448
495
  "http.resHeadersSent": { argTypes: [HTTPRES_T], result: BOOL },
496
+ "http.resFlushHeaders": { argTypes: [HTTPRES_T], result: VOID },
497
+ "http.resAddTrailers": { argTypes: [HTTPRES_T, arrayOf(STRING)], result: VOID },
498
+ "http.resCork": { argTypes: [HTTPRES_T], result: VOID },
499
+ "http.resUncork": { argTypes: [HTTPRES_T], result: VOID },
500
+ "http.resWritableCorked": { argTypes: [HTTPRES_T], result: F64 },
449
501
  // The member follow-ups: reqStatusCode's `number | undefined` and
450
502
  // sockRemoteAddress's `string | undefined` results are shape-checked in
451
503
  // the special cases below (like reqHeader/columns).
@@ -455,6 +507,8 @@ export const LIB_FN_SIGS = {
455
507
  "http.reqStatusMessage": { argTypes: [HTTPREQ_T], result: VOID },
456
508
  "http.reqRawHeaders": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
457
509
  "http.reqHeaderPairs": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
510
+ "http.reqRawTrailers": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
511
+ "http.reqTrailerPairs": { argTypes: [HTTPREQ_T], result: arrayOf(STRING) },
458
512
  "net.sockDestroyed": { argTypes: [NETSOCKET_T], result: BOOL },
459
513
  "net.sockWritable": { argTypes: [NETSOCKET_T], result: BOOL },
460
514
  // The 'upgrade' registrations: the callback shapes are program-typed
@@ -649,6 +703,11 @@ export const LIB_FN_SIGS = {
649
703
  "http.clientEndBytes": { argTypes: [HTTPCLIENTREQ_T, BYTES_U8], result: VOID },
650
704
  "http.clientWriteDyn": { argTypes: [HTTPCLIENTREQ_T, DYN], result: VOID },
651
705
  "http.clientEndDyn": { argTypes: [HTTPCLIENTREQ_T, DYN], result: VOID },
706
+ "http.clientFlushHeaders": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
707
+ "http.clientAddTrailers": { argTypes: [HTTPCLIENTREQ_T, arrayOf(STRING)], result: VOID },
708
+ "http.clientCork": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
709
+ "http.clientUncork": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
710
+ "http.clientWritableCorked": { argTypes: [HTTPCLIENTREQ_T], result: F64 },
652
711
  "http.clientDestroy": { argTypes: [HTTPCLIENTREQ_T], result: VOID },
653
712
  "http.clientDestroyed": { argTypes: [HTTPCLIENTREQ_T], result: BOOL },
654
713
  "http.clientOnResponse": { argTypes: [HTTPCLIENTREQ_T, null, BOOL], result: VOID },
@@ -664,17 +723,36 @@ export const LIB_FN_SIGS = {
664
723
  result: SPAWNRES_T,
665
724
  },
666
725
  "cp.spawn": { argTypes: [STRING, arrayOf(STRING)], result: CHILD_T },
726
+ "process.forkTarget": { argTypes: [F64], result: F64 },
727
+ "cp.fork": {
728
+ argTypes: [F64, arrayOf(STRING), F64, F64, F64, BOOL, arrayOf(STRING), STRING],
729
+ result: CHILD_T,
730
+ },
731
+ "child.connected": { argTypes: [CHILD_T], result: BOOL },
732
+ "child.send": { argTypes: [CHILD_T, STRING], result: BOOL },
733
+ "child.sendCb": { argTypes: [CHILD_T, STRING, null], result: BOOL },
734
+ "child.disconnect": { argTypes: [CHILD_T], result: VOID },
735
+ "child.onMessage": { argTypes: [CHILD_T, null, BOOL], result: VOID },
736
+ "child.onDisconnect": { argTypes: [CHILD_T, null, BOOL], result: VOID },
737
+ "process.connected": { argTypes: [], result: BOOL },
738
+ "process.send": { argTypes: [STRING], result: BOOL },
739
+ "process.sendCb": { argTypes: [STRING, null], result: BOOL },
740
+ "process.disconnect": { argTypes: [], result: VOID },
741
+ "process.onMessage": { argTypes: [null, BOOL], result: VOID },
742
+ "process.onDisconnect": { argTypes: [null, BOOL], result: VOID },
743
+ "cp.execFile": { argTypes: [STRING, arrayOf(STRING), null], result: CHILD_T },
667
744
  // spawn's options form: per-slot stdio modes (0 ignore / 1 inherit /
668
745
  // 2 fd) with the out/err fds for mode 2, detached, env replacement
669
746
  // pairs, cwd ("" = inherit).
670
747
  "cp.spawnOpts": {
671
- argTypes: [STRING, arrayOf(STRING), F64, F64, F64, F64, F64, BOOL, BOOL, arrayOf(STRING), STRING],
748
+ argTypes: [STRING, arrayOf(STRING), F64, F64, F64, F64, F64, BOOL, BOOL, BOOL, arrayOf(STRING), STRING],
672
749
  result: CHILD_T,
673
750
  },
674
751
  // The callback's func type is program-dependent (zero params, or the
675
752
  // `number | null` union / the %Error class) — the libCall case checks
676
753
  // the shape; the slot here only pins arity and the child receiver.
677
754
  "child.onExit": { argTypes: [CHILD_T, null], result: VOID },
755
+ "child.onClose": { argTypes: [CHILD_T, null], result: VOID },
678
756
  "child.onError": { argTypes: [CHILD_T, null], result: VOID },
679
757
  // Like process.envGet, spawnRes.status's result type is program-dependent
680
758
  // (the interned `number | null` union) — the libCall case checks the arms.
@@ -700,11 +778,22 @@ export const LIB_FN_SIGS = {
700
778
  // case checks the arms — the child.pid pattern with a ref arm).
701
779
  "child.stdout": { argTypes: [CHILD_T], result: VOID },
702
780
  "child.stderr": { argTypes: [CHILD_T], result: VOID },
781
+ "child.stdin": { argTypes: [CHILD_T], result: VOID },
703
782
  // Listener registrations: callback func shapes are program-dependent
704
783
  // (zero-param / Buffer / Buffer-armed union) — the slots pin arity,
705
784
  // the stream receiver, and the once-flag.
706
785
  "stream.onData": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
786
+ "stream.onDataStr": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
707
787
  "stream.onEnd": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
788
+ "stream.childSetEncoding": { argTypes: [CHILDSTREAM_T, STRING], result: CHILDSTREAM_T },
789
+ "writer.writeString": { argTypes: [CHILDWRITER_T, STRING], result: BOOL },
790
+ "writer.writeBytes": { argTypes: [CHILDWRITER_T, BYTES_U8], result: BOOL },
791
+ "writer.end": { argTypes: [CHILDWRITER_T], result: VOID },
792
+ "writer.destroy": { argTypes: [CHILDWRITER_T], result: VOID },
793
+ "writer.writable": { argTypes: [CHILDWRITER_T], result: BOOL },
794
+ "writer.onDrain": { argTypes: [CHILDWRITER_T, null, BOOL], result: VOID },
795
+ "writer.onFinish": { argTypes: [CHILDWRITER_T, null, BOOL], result: VOID },
796
+ "writer.onError": { argTypes: [CHILDWRITER_T, null, BOOL], result: VOID },
708
797
  "procStream.write": { argTypes: [PROCSTREAM_T, STRING], result: BOOL },
709
798
  "child.killed": { argTypes: [CHILD_T], result: BOOL },
710
799
  "child.kill": { argTypes: [CHILD_T, STRING], result: BOOL },
@@ -717,6 +806,25 @@ export const LIB_FN_SIGS = {
717
806
  "crypto.randomBytes": { argTypes: [F64], result: BYTES_U8 },
718
807
  "crypto.hashDigestStr": { argTypes: [STRING, STRING, STRING], result: STRING },
719
808
  "crypto.hashDigestBytes": { argTypes: [STRING, BYTES_U8, STRING], result: STRING },
809
+ "crypto.hashNew": { argTypes: [STRING], result: CRYPTOHASH_T },
810
+ "crypto.hmacNewStr": { argTypes: [STRING, STRING], result: CRYPTOHMAC_T },
811
+ "crypto.hmacNewBytes": { argTypes: [STRING, BYTES_U8], result: CRYPTOHMAC_T },
812
+ "crypto.hashUpdateStr": { argTypes: [CRYPTOHASH_T, STRING], result: CRYPTOHASH_T },
813
+ "crypto.hashUpdateBytes": { argTypes: [CRYPTOHASH_T, BYTES_U8], result: CRYPTOHASH_T },
814
+ "crypto.hmacUpdateStr": { argTypes: [CRYPTOHMAC_T, STRING], result: CRYPTOHMAC_T },
815
+ "crypto.hmacUpdateBytes": { argTypes: [CRYPTOHMAC_T, BYTES_U8], result: CRYPTOHMAC_T },
816
+ "crypto.hashCopy": { argTypes: [CRYPTOHASH_T], result: CRYPTOHASH_T },
817
+ "crypto.hashDigestString": { argTypes: [CRYPTOHASH_T, STRING], result: STRING },
818
+ "crypto.hashDigestBuffer": { argTypes: [CRYPTOHASH_T], result: BYTES_U8 },
819
+ "crypto.hmacDigestString": { argTypes: [CRYPTOHMAC_T, STRING], result: STRING },
820
+ "crypto.hmacDigestBuffer": { argTypes: [CRYPTOHMAC_T], result: BYTES_U8 },
821
+ "crypto.timingSafeEqual": { argTypes: [BYTES_U8, BYTES_U8], result: BOOL },
822
+ "crypto.randomFill": { argTypes: [BYTES_U8, F64, F64], result: BYTES_U8 },
823
+ "crypto.randomFillRest": { argTypes: [BYTES_U8, F64], result: BYTES_U8 },
824
+ "crypto.randomInt": { argTypes: [F64, F64], result: F64 },
825
+ "crypto.pbkdf2": { argTypes: [BYTES_U8, BYTES_U8, F64, F64, STRING], result: BYTES_U8 },
826
+ "crypto.randomBytesCb": { argTypes: [F64, null], result: VOID },
827
+ "crypto.pbkdf2Cb": { argTypes: [BYTES_U8, BYTES_U8, F64, F64, STRING, null], result: VOID },
720
828
  // The Buffer statics and the fs/zlib Buffer forms: fixed always-u8
721
829
  // signatures (Buffer IS a Uint8Array — one bytes kind).
722
830
  "buffer.fromStr": { argTypes: [STRING, STRING], result: BYTES_U8 },
@@ -751,6 +859,19 @@ export const LIB_FN_SIGS = {
751
859
  "fsp.readFileBytes": { argTypes: [STRING], result: { kind: "promise", inner: BYTES_U8 } },
752
860
  "zlib.deflateSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
753
861
  "zlib.inflateSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
862
+ "zlib.deflateRawSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
863
+ "zlib.inflateRawSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
864
+ "zlib.gzipSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
865
+ "zlib.gunzipSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
866
+ "zlib.unzipSync": { argTypes: [BYTES_U8], result: BYTES_U8 },
867
+ "zlib.deflateCb": { argTypes: [BYTES_U8, null], result: VOID },
868
+ "zlib.inflateCb": { argTypes: [BYTES_U8, null], result: VOID },
869
+ "zlib.deflateRawCb": { argTypes: [BYTES_U8, null], result: VOID },
870
+ "zlib.inflateRawCb": { argTypes: [BYTES_U8, null], result: VOID },
871
+ "zlib.gzipCb": { argTypes: [BYTES_U8, null], result: VOID },
872
+ "zlib.gunzipCb": { argTypes: [BYTES_U8, null], result: VOID },
873
+ "zlib.unzipCb": { argTypes: [BYTES_U8, null], result: VOID },
874
+ "zlib.crc32": { argTypes: [BYTES_U8, F64], result: F64 },
754
875
  "process.stdoutWriteBytes": { argTypes: [BYTES_U8, STRING], result: BOOL },
755
876
  "process.stderrWriteBytes": { argTypes: [BYTES_U8, STRING], result: BOOL },
756
877
  // Completion callback is program-dependent: zero params, checked-dynamic,
@@ -768,8 +889,13 @@ export const LIB_FN_SIGS = {
768
889
  "fsp.chmod": { argTypes: [STRING, F64], result: { kind: "promise", inner: VOID } },
769
890
  "fsp.rename": { argTypes: [STRING, STRING], result: { kind: "promise", inner: VOID } },
770
891
  "fsp.readdir": { argTypes: [STRING], result: { kind: "promise", inner: arrayOf(STRING) } },
892
+ // Result is promise<call-site Dirent record array>; the libCall case
893
+ // validates the program-dependent record shape below.
894
+ "fsp.readdirTypes": { argTypes: [STRING], result: { kind: "promise", inner: VOID } },
771
895
  "fsp.rm": { argTypes: [STRING], result: { kind: "promise", inner: VOID } },
772
896
  "fsp.stat": { argTypes: [STRING], result: { kind: "promise", inner: STATS_T } },
897
+ "fsp.realpath": { argTypes: [STRING], result: { kind: "promise", inner: STRING } },
898
+ "fsp.lstat": { argTypes: [STRING], result: { kind: "promise", inner: STATS_T } },
773
899
  "fsp.open": { argTypes: [STRING, STRING, F64], result: { kind: "promise", inner: FILEHANDLE_T } },
774
900
  "fileHandle.fd": { argTypes: [FILEHANDLE_T], result: F64 },
775
901
  "fileHandle.close": { argTypes: [FILEHANDLE_T], result: { kind: "promise", inner: VOID } },
@@ -794,6 +920,8 @@ export const LIB_FN_SIGS = {
794
920
  "process.envUnset": { argTypes: [STRING], result: VOID },
795
921
  "process.envPairs": { argTypes: [], result: arrayOf(STRING) },
796
922
  "process.exit": { argTypes: [F64], result: VOID },
923
+ "process.setExitCode": { argTypes: [F64], result: VOID },
924
+ "process.currentExitCode": { argTypes: [], result: F64 },
797
925
  "process.cwd": { argTypes: [], result: STRING },
798
926
  "process.pid": { argTypes: [], result: F64 },
799
927
  "dyn.this": { argTypes: [], result: DYN },
@@ -812,6 +940,7 @@ export const LIB_FN_SIGS = {
812
940
  "error.new": { argTypes: [STRING], result: VOID },
813
941
  "error.nodeThrow": { argTypes: [F64, STRING, STRING], result: VOID },
814
942
  "dyn.toStringCoerce": { argTypes: [DYN], result: STRING },
943
+ "dyn.toNumberCoerce": { argTypes: [DYN], result: F64 },
815
944
  // Always throws; the result is the READ's declared type (a typed dummy
816
945
  // the unwind abandons) — the libCall case skips the result check.
817
946
  "global.undefRead": { argTypes: [STRING], result: VOID },
@@ -864,9 +993,11 @@ export const LIB_FN_SIGS = {
864
993
  // once, prepend), offDyn (recv, name, cb dyn).
865
994
  "emitter.checkListener": { argTypes: [DYN], result: VOID },
866
995
  "emitter.onDyn": { argTypes: [null, STRING, DYN, null, BOOL, BOOL], result: VOID },
996
+ "emitter.onFlex": { argTypes: [null, STRING, DYN, BOOL, BOOL], result: VOID },
867
997
  "emitter.offDyn": { argTypes: [null, STRING, DYN], result: VOID },
868
998
  "emitter.removeAll": { argTypes: [null, STRING, BOOL], result: VOID },
869
999
  "emitter.emit": { argTypes: [null, STRING], result: BOOL },
1000
+ "emitter.emitFlex": { argTypes: [null, STRING], result: BOOL },
870
1001
  "emitter.emitError": { argTypes: [null, STRING, null], result: BOOL },
871
1002
  "emitter.count": { argTypes: [null, STRING], result: F64 },
872
1003
  "emitter.countFn": { argTypes: [null, STRING, null], result: F64 },
@@ -960,6 +1091,7 @@ export const LIB_FN_SIGS = {
960
1091
  // message slot always carries a string ("" when hasMsg is false).
961
1092
  "assert.ok": { argTypes: [BOOL, STRING], result: VOID },
962
1093
  "assert.eqF64": { argTypes: [F64, F64, BOOL, BOOL, STRING, BOOL], result: VOID },
1094
+ "assert.eqBigInt": { argTypes: [BIGINT_T, BIGINT_T, BOOL, BOOL, STRING, BOOL], result: VOID },
963
1095
  "assert.eqStr": { argTypes: [STRING, STRING, BOOL, BOOL, STRING, BOOL], result: VOID },
964
1096
  "assert.eqBool": { argTypes: [BOOL, BOOL, BOOL, BOOL, STRING, BOOL], result: VOID },
965
1097
  "assert.deepResult": { argTypes: [BOOL, BOOL, STRING, BOOL], result: VOID },
@@ -977,6 +1109,7 @@ export const LIB_FN_SIGS = {
977
1109
  // The equality quartet over checked-dynamic operands (the frontend
978
1110
  // boxes a static side into the checked-dynamic tree first).
979
1111
  "assert.eqDyn": { argTypes: [DYN, DYN, BOOL, BOOL, STRING, BOOL], result: VOID },
1112
+ "assert.looseResult": { argTypes: [BOOL, BOOL, STRING, STRING, STRING, BOOL], result: VOID },
980
1113
  // The throws(fn, {shape}) accumulator: begin/slot calls never throw;
981
1114
  // shapeEnd throws the Comparison diff. The error slot is the
982
1115
  // %Error-narrowed caught value.
@@ -1081,6 +1214,7 @@ export const LIB_FN_SIGS = {
1081
1214
  "date.newNow": { argTypes: [], result: DATE_T },
1082
1215
  "date.newMs": { argTypes: [F64], result: DATE_T },
1083
1216
  "date.newString": { argTypes: [STRING], result: DATE_T },
1217
+ "date.parse": { argTypes: [STRING], result: F64 },
1084
1218
  "date.getTime": { argTypes: [DATE_T], result: F64 },
1085
1219
  "date.valueOf": { argTypes: [DATE_T], result: F64 },
1086
1220
  "date.toISOString": { argTypes: [F64], result: STRING },
@@ -1759,6 +1893,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1759
1893
  if (e.type.kind !== "string")
1760
1894
  err("strLit must be string", e.loc);
1761
1895
  break;
1896
+ case "moduleNsRef":
1897
+ if (e.type.kind !== "moduleNs" || e.type.moduleId !== e.moduleId) {
1898
+ err("moduleNsRef must match its moduleNs type", e.loc);
1899
+ }
1900
+ break;
1762
1901
  case "boolLit":
1763
1902
  if (e.type.kind !== "bool")
1764
1903
  err("boolLit must be bool", e.loc);
@@ -1797,6 +1936,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1797
1936
  err(`bin ${e.op} on class values: right operand is ${e.right.type.kind}`, e.loc);
1798
1937
  }
1799
1938
  }
1939
+ else if (isEq && e.left.type.kind === "moduleNs") {
1940
+ if (e.right.type.kind !== "moduleNs") {
1941
+ err(`bin ${e.op} on module namespaces: right operand is ${e.right.type.kind}`, e.loc);
1942
+ }
1943
+ }
1800
1944
  else if (isEq &&
1801
1945
  (e.left.type.kind === "array" ||
1802
1946
  e.left.type.kind === "map" ||
@@ -1954,9 +2098,10 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1954
2098
  checkExpr(e.operand);
1955
2099
  if (e.operand.type.kind !== "f64" &&
1956
2100
  e.operand.type.kind !== "string" &&
2101
+ e.operand.type.kind !== "dyn" &&
1957
2102
  e.operand.type.kind !== "union" &&
1958
2103
  !REF_TRUTHY_KINDS.has(e.operand.type.kind)) {
1959
- err(`toBool operand must be f64|string|union|ref, got ${e.operand.type.kind}`, e.loc);
2104
+ err(`toBool operand must be f64|string|dyn|union|ref, got ${e.operand.type.kind}`, e.loc);
1960
2105
  }
1961
2106
  if (e.operand.type.kind === "union")
1962
2107
  checkTruthyUnion(e.operand.type.unionId, e.loc);
@@ -2800,7 +2945,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
2800
2945
  // ISLAND-REST types (restAbi jsval) SPELL their trailing engine
2801
2946
  // array param — the lifted signature matches directly, no
2802
2947
  // hidden slot.
2803
- const hiddenRest = e.type.rest === true && e.type.restAbi !== "jsval";
2948
+ const hiddenRest = e.type.rest === true && e.type.restAbi === undefined;
2804
2949
  const declared = hiddenRest ? target.params.slice(0, -1) : target.params;
2805
2950
  const restOk = !hiddenRest ||
2806
2951
  (target.params.length === e.type.params.length + 1 &&
@@ -3705,7 +3850,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
3705
3850
  // The stream constructors (trailing option callbacks), write/end
3706
3851
  // (the optional chunk/cb tail), and unpipe (the optional
3707
3852
  // destination) admit a longer list the same way.
3708
- const variadic = e.fn === "emitter.emit" ||
3853
+ const variadic = e.fn === "emitter.emit" || e.fn === "emitter.emitFlex" ||
3709
3854
  e.fn === "readable.new" || e.fn === "writable.new" ||
3710
3855
  e.fn === "duplex.new" || e.fn === "transform.new" ||
3711
3856
  e.fn === "passthrough.new" ||
@@ -4062,7 +4207,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4062
4207
  err(`libCall http.reqH2Stream must return the 'Http2Stream | undefined' union`, e.loc);
4063
4208
  break;
4064
4209
  }
4065
- if (e.fn === "http.reqHeader" || e.fn === "http.resGetHeader") {
4210
+ if (e.fn === "http.reqHeader" || e.fn === "http.reqTrailer" || e.fn === "http.resGetHeader") {
4066
4211
  // Result is the interned `string | undefined` union (envGet's).
4067
4212
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4068
4213
  const ok = def &&
@@ -4074,6 +4219,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4074
4219
  }
4075
4220
  break;
4076
4221
  }
4222
+ if (e.fn === "http.reqHeaderValues" || e.fn === "http.reqTrailerValues") {
4223
+ const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4224
+ const ok = def && def.arms.length === 2 &&
4225
+ def.arms[0].kind === "array" && def.arms[0].elem.kind === "string" &&
4226
+ def.arms[1].kind === "undefinedT";
4227
+ if (!ok)
4228
+ err(`libCall ${e.fn} must return the 'string[] | undefined' union`, e.loc);
4229
+ break;
4230
+ }
4077
4231
  if (e.fn === "net.createServerCb" || e.fn === "net.serverOnConnection" ||
4078
4232
  e.fn === "net.serverOnSecureConnection" ||
4079
4233
  e.fn === "net.sockOnData" || e.fn === "net.serverOnError" ||
@@ -4172,6 +4326,30 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4172
4326
  }
4173
4327
  break;
4174
4328
  }
4329
+ if (e.fn === "zlib.deflateCb" || e.fn === "zlib.inflateCb" ||
4330
+ e.fn === "zlib.deflateRawCb" || e.fn === "zlib.inflateRawCb" ||
4331
+ e.fn === "zlib.gzipCb" || e.fn === "zlib.gunzipCb" || e.fn === "zlib.unzipCb") {
4332
+ const cbT = e.args[1]?.type;
4333
+ let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= 2;
4334
+ if (ok && cbT?.kind === "func" && cbT.params.length >= 1) {
4335
+ const error = cbT.params[0];
4336
+ if (error.kind !== "dyn") {
4337
+ const def = error.kind === "union" ? unions.get(error.unionId) : undefined;
4338
+ ok = def !== undefined &&
4339
+ def.arms.some((arm) => arm.kind === "nullT") &&
4340
+ def.arms.some((arm) => arm.kind === "object" && arm.className === "%Error") &&
4341
+ def.arms.every((arm) => arm.kind === "nullT" || arm.kind === "undefinedT" ||
4342
+ (arm.kind === "object" && arm.className === "%Error"));
4343
+ }
4344
+ }
4345
+ if (ok && cbT?.kind === "func" && cbT.params.length === 2) {
4346
+ const value = cbT.params[1];
4347
+ ok = value.kind === "dyn" || (value.kind === "bytes" && value.elem === "u8");
4348
+ }
4349
+ if (!ok)
4350
+ err(`libCall ${e.fn} callback shape (frontend must fence)`, e.loc);
4351
+ break;
4352
+ }
4175
4353
  if (e.fn === "fs.renameCb" ||
4176
4354
  e.fn === "process.stdoutWriteBytesCb" ||
4177
4355
  e.fn === "process.stderrWriteBytesCb") {
@@ -4227,12 +4405,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4227
4405
  }
4228
4406
  break;
4229
4407
  }
4230
- if (e.fn === "fs.readdirTypesSync") {
4408
+ if (e.fn === "fs.readdirTypesSync" || e.fn === "fsp.readdirTypes") {
4231
4409
  // Result: the interned Dirent record array — {%dtype: f64,
4232
4410
  // name: string, parentPath: string} rows (canonical field
4233
4411
  // order; the structure lowerFsReaddirTypesCall pinned).
4234
- const shape = e.type.kind === "array" && e.type.elem.kind === "record"
4235
- ? records.get(e.type.elem.shapeId)
4412
+ const result = e.fn === "fsp.readdirTypes"
4413
+ ? e.type.kind === "promise" ? e.type.inner : undefined
4414
+ : e.type;
4415
+ const shape = result?.kind === "array" && result.elem.kind === "record"
4416
+ ? records.get(result.elem.shapeId)
4236
4417
  : undefined;
4237
4418
  const ok = shape !== undefined &&
4238
4419
  !shape.tuple &&
@@ -4242,7 +4423,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4242
4423
  shape.fields[1].name === "name" && shape.fields[1].type.kind === "string" &&
4243
4424
  shape.fields[2].name === "parentPath" && shape.fields[2].type.kind === "string";
4244
4425
  if (!ok) {
4245
- err(`libCall fs.readdirTypesSync must return the Dirent record array`, e.loc);
4426
+ err(`libCall ${e.fn} must return ${e.fn === "fsp.readdirTypes" ? "a promise of " : ""}the Dirent record array`, e.loc);
4246
4427
  }
4247
4428
  break;
4248
4429
  }
@@ -4282,18 +4463,43 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4282
4463
  }
4283
4464
  break;
4284
4465
  }
4285
- if (e.fn === "child.onExit" || e.fn === "child.onError") {
4466
+ if (e.fn === "cp.execFile") {
4467
+ const cb = e.args[2]?.type;
4468
+ if (cb?.kind !== "func" || cb.rest === true || cb.params.length > 3 || cb.ret.kind !== "void") {
4469
+ err(`libCall cp.execFile callback must be a non-rest void function with at most three parameters`, e.loc);
4470
+ }
4471
+ else {
4472
+ const error = cb.params[0];
4473
+ if (error !== undefined) {
4474
+ const def = error.kind === "union" ? unions.get(error.unionId) : undefined;
4475
+ if (!def || def.arms.length !== 2 ||
4476
+ !def.arms.some((arm) => arm.kind === "nullT") ||
4477
+ !def.arms.some((arm) => arm.kind === "object" && arm.className === "%Error")) {
4478
+ err(`libCall cp.execFile callback error parameter must be Error | null`, e.loc);
4479
+ }
4480
+ }
4481
+ const stdout = cb.params[1];
4482
+ if (stdout !== undefined && stdout.kind !== "string") {
4483
+ err(`libCall cp.execFile callback stdout parameter must be string`, e.loc);
4484
+ }
4485
+ const stderr = cb.params[2];
4486
+ if (stderr !== undefined && stderr.kind !== "string") {
4487
+ err(`libCall cp.execFile callback stderr parameter must be string`, e.loc);
4488
+ }
4489
+ }
4490
+ }
4491
+ if (e.fn === "child.onExit" || e.fn === "child.onClose" || e.fn === "child.onError") {
4286
4492
  // The listener: a closure with no params, or exactly the
4287
4493
  // supported parameter shapes per event — exit takes (code:
4288
4494
  // number | null) with an optional (signal: string | null)
4289
4495
  // second parameter, error exactly (err: %Error).
4290
4496
  const cb = e.args[1];
4291
4497
  const cbT = cb?.type;
4292
- const maxParams = e.fn === "child.onExit" ? 2 : 1;
4498
+ const maxParams = e.fn === "child.onError" ? 1 : 2;
4293
4499
  let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= maxParams;
4294
4500
  if (ok && cbT?.kind === "func" && cbT.params.length >= 1) {
4295
4501
  const p = cbT.params[0];
4296
- if (e.fn === "child.onExit") {
4502
+ if (e.fn === "child.onExit" || e.fn === "child.onClose") {
4297
4503
  const def = p.kind === "union" ? unions.get(p.unionId) : undefined;
4298
4504
  ok =
4299
4505
  def !== undefined &&
@@ -4319,6 +4525,18 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4319
4525
  }
4320
4526
  break;
4321
4527
  }
4528
+ if (e.fn === "writer.onDrain" || e.fn === "writer.onFinish" || e.fn === "writer.onError") {
4529
+ const cbT = e.args[1]?.type;
4530
+ const maxParams = e.fn === "writer.onError" ? 1 : 0;
4531
+ let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= maxParams;
4532
+ if (ok && cbT?.kind === "func" && cbT.params.length === 1) {
4533
+ const p = cbT.params[0];
4534
+ ok = p.kind === "object" && p.className === "%Error";
4535
+ }
4536
+ if (!ok)
4537
+ err(`libCall ${e.fn} callback shape (frontend must fence)`, e.loc);
4538
+ break;
4539
+ }
4322
4540
  if (e.fn === "process.onExit" || e.fn === "process.offExit" ||
4323
4541
  e.fn === "stdin.onData" || e.fn === "stdin.onError") {
4324
4542
  // The listener: a void closure with no params, or exactly the
@@ -4438,14 +4656,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4438
4656
  }
4439
4657
  break;
4440
4658
  }
4441
- if (e.fn === "child.stdout" || e.fn === "child.stderr") {
4659
+ if (e.fn === "child.stdin" || e.fn === "child.stdout" || e.fn === "child.stderr") {
4442
4660
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4661
+ const handleKind = e.fn === "child.stdin" ? "childWriter" : "childStream";
4443
4662
  const ok = def &&
4444
4663
  def.arms.length === 2 &&
4445
- def.arms.some((a) => a.kind === "childStream") &&
4664
+ def.arms.some((a) => a.kind === handleKind) &&
4446
4665
  def.arms.some((a) => a.kind === "nullT");
4447
4666
  if (!ok) {
4448
- err(`libCall ${e.fn} must return the 'Readable | null' union`, e.loc);
4667
+ err(`libCall ${e.fn} must return the '${e.fn === "child.stdin" ? "Writable" : "Readable"} | null' union`, e.loc);
4449
4668
  }
4450
4669
  break;
4451
4670
  }
@@ -4717,7 +4936,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4717
4936
  }
4718
4937
  // The chaining forms return the receiver's own static class.
4719
4938
  if (e.fn === "emitter.on" || e.fn === "emitter.off" ||
4720
- e.fn === "emitter.onDyn" || e.fn === "emitter.offDyn" ||
4939
+ e.fn === "emitter.onDyn" || e.fn === "emitter.onFlex" || e.fn === "emitter.offDyn" ||
4721
4940
  e.fn === "emitter.onData" || e.fn === "emitter.onDataDyn" ||
4722
4941
  e.fn === "emitter.removeAll" || e.fn === "emitter.setMax" ||
4723
4942
  e.fn === "emitter.setMaxChk") {
@@ -4764,7 +4983,12 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4764
4983
  err(`libCall emitter.listeners must return a func array`, e.loc);
4765
4984
  break;
4766
4985
  }
4767
- if (e.fn === "emitter.emit" || e.fn === "emitter.count" ||
4986
+ if (e.fn === "emitter.emitFlex") {
4987
+ if (e.args.slice(2).some((arg) => arg.type.kind !== "dyn")) {
4988
+ err("libCall emitter.emitFlex payloads must be checked-dynamic", e.loc);
4989
+ }
4990
+ }
4991
+ if (e.fn === "emitter.emit" || e.fn === "emitter.emitFlex" || e.fn === "emitter.count" ||
4768
4992
  e.fn === "emitter.getMax" || e.fn === "emitter.ctor" ||
4769
4993
  e.fn === "emitter.countFn" || e.fn === "emitter.emitError") {
4770
4994
  if (!typeEquals(e.type, sig.result)) {