@scriptc/compiler 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +832 -55
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/executable-features.js +1 -0
  5. package/dist/backend/executable-features.js.map +1 -1
  6. package/dist/backend/literals.d.ts +7 -0
  7. package/dist/backend/literals.js +32 -0
  8. package/dist/backend/literals.js.map +1 -1
  9. package/dist/backend/literals.test.js +17 -1
  10. package/dist/backend/literals.test.js.map +1 -1
  11. package/dist/backend/llvm/alloc.d.ts +15 -4
  12. package/dist/backend/llvm/alloc.js +63 -25
  13. package/dist/backend/llvm/alloc.js.map +1 -1
  14. package/dist/backend/llvm/alloc.test.js +62 -2
  15. package/dist/backend/llvm/alloc.test.js.map +1 -1
  16. package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
  17. package/dist/backend/llvm/appended-array-literals.js +109 -0
  18. package/dist/backend/llvm/appended-array-literals.js.map +1 -0
  19. package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
  20. package/dist/backend/llvm/appended-array-literals.test.js +90 -0
  21. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
  22. package/dist/backend/llvm/array-search.d.ts +8 -0
  23. package/dist/backend/llvm/array-search.js +52 -0
  24. package/dist/backend/llvm/array-search.js.map +1 -0
  25. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  26. package/dist/backend/llvm/array-search.test.js +72 -0
  27. package/dist/backend/llvm/array-search.test.js.map +1 -0
  28. package/dist/backend/llvm/call-lifetimes.d.ts +11 -1
  29. package/dist/backend/llvm/call-lifetimes.js +74 -4
  30. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.test.js +54 -0
  32. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  33. package/dist/backend/llvm/classes.js +97 -38
  34. package/dist/backend/llvm/classes.js.map +1 -1
  35. package/dist/backend/llvm/classes.test.js +2 -2
  36. package/dist/backend/llvm/common.d.ts +1 -1
  37. package/dist/backend/llvm/common.js +1 -1
  38. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  39. package/dist/backend/llvm/dense-array-access.js +18 -13
  40. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  41. package/dist/backend/llvm/dense-array-access.test.js +15 -2
  42. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  43. package/dist/backend/llvm/dyn.d.ts +6 -0
  44. package/dist/backend/llvm/dyn.js +84 -11
  45. package/dist/backend/llvm/dyn.js.map +1 -1
  46. package/dist/backend/llvm/emitter.d.ts +108 -16
  47. package/dist/backend/llvm/emitter.js +598 -108
  48. package/dist/backend/llvm/emitter.js.map +1 -1
  49. package/dist/backend/llvm/emitter.test.js +26 -3
  50. package/dist/backend/llvm/emitter.test.js.map +1 -1
  51. package/dist/backend/llvm/expr-async.js +174 -7
  52. package/dist/backend/llvm/expr-async.js.map +1 -1
  53. package/dist/backend/llvm/expr-bytes.js +11 -0
  54. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  55. package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
  56. package/dist/backend/llvm/expr-callbacks.js +96 -2
  57. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  58. package/dist/backend/llvm/expr-calls.d.ts +12 -1
  59. package/dist/backend/llvm/expr-calls.js +133 -54
  60. package/dist/backend/llvm/expr-calls.js.map +1 -1
  61. package/dist/backend/llvm/expr-containers.d.ts +7 -0
  62. package/dist/backend/llvm/expr-containers.js +80 -22
  63. package/dist/backend/llvm/expr-containers.js.map +1 -1
  64. package/dist/backend/llvm/expr-context.d.ts +2 -0
  65. package/dist/backend/llvm/expr-control.d.ts +8 -0
  66. package/dist/backend/llvm/expr-control.js +103 -69
  67. package/dist/backend/llvm/expr-control.js.map +1 -1
  68. package/dist/backend/llvm/expr-dynamic.js +21 -10
  69. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  70. package/dist/backend/llvm/expr-primitives.d.ts +7 -0
  71. package/dist/backend/llvm/expr-primitives.js +53 -51
  72. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  73. package/dist/backend/llvm/expr-records.js +19 -5
  74. package/dist/backend/llvm/expr-records.js.map +1 -1
  75. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  76. package/dist/backend/llvm/expr-stream-bridges.js +111 -39
  77. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  78. package/dist/backend/llvm/expr-stream-bridges.test.js +49 -1
  79. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  80. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  81. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  82. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  83. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  84. package/dist/backend/llvm/inline-unions.js +134 -0
  85. package/dist/backend/llvm/inline-unions.js.map +1 -0
  86. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  87. package/dist/backend/llvm/inline-unions.test.js +124 -0
  88. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  89. package/dist/backend/llvm/int32-abi.d.ts +18 -2
  90. package/dist/backend/llvm/int32-abi.js +23 -2
  91. package/dist/backend/llvm/int32-abi.js.map +1 -1
  92. package/dist/backend/llvm/int32-abi.test.js +75 -1
  93. package/dist/backend/llvm/int32-abi.test.js.map +1 -1
  94. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  95. package/dist/backend/llvm/integer-remainder.js +80 -9
  96. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  97. package/dist/backend/llvm/lib-dispatch.js +170 -28
  98. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  99. package/dist/backend/llvm/lib-filesystem.js +181 -5
  100. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  101. package/dist/backend/llvm/lib-network.js +9 -6
  102. package/dist/backend/llvm/lib-network.js.map +1 -1
  103. package/dist/backend/llvm/lib-process.js +2 -2
  104. package/dist/backend/llvm/lib-process.js.map +1 -1
  105. package/dist/backend/llvm/lib-shared.js +208 -9
  106. package/dist/backend/llvm/lib-shared.js.map +1 -1
  107. package/dist/backend/llvm/lib-stream.js +97 -0
  108. package/dist/backend/llvm/lib-stream.js.map +1 -1
  109. package/dist/backend/llvm/local-array-reads.js +12 -6
  110. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  111. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  112. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  113. package/dist/backend/llvm/local-union-storage.d.ts +26 -2
  114. package/dist/backend/llvm/local-union-storage.js +132 -12
  115. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  116. package/dist/backend/llvm/local-union-storage.test.js +107 -1
  117. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  118. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  119. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  120. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  121. package/dist/backend/llvm/map-number-lookup.d.ts +20 -0
  122. package/dist/backend/llvm/map-number-lookup.js +66 -0
  123. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  124. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  125. package/dist/backend/llvm/map-number-lookup.test.js +102 -0
  126. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  127. package/dist/backend/llvm/map-read-lifetimes.js +1 -0
  128. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  129. package/dist/backend/llvm/publish.d.ts +4 -0
  130. package/dist/backend/llvm/publish.js +3 -1
  131. package/dist/backend/llvm/publish.js.map +1 -1
  132. package/dist/backend/llvm/record-results.d.ts +29 -0
  133. package/dist/backend/llvm/record-results.js +260 -0
  134. package/dist/backend/llvm/record-results.js.map +1 -0
  135. package/dist/backend/llvm/reference-effects.js +15 -0
  136. package/dist/backend/llvm/reference-effects.js.map +1 -1
  137. package/dist/backend/llvm/reference-writes.js +29 -9
  138. package/dist/backend/llvm/reference-writes.js.map +1 -1
  139. package/dist/backend/llvm/regions.d.ts +68 -0
  140. package/dist/backend/llvm/regions.js +314 -0
  141. package/dist/backend/llvm/regions.js.map +1 -0
  142. package/dist/backend/llvm/regions.test.d.ts +1 -0
  143. package/dist/backend/llvm/regions.test.js +173 -0
  144. package/dist/backend/llvm/regions.test.js.map +1 -0
  145. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  146. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  147. package/dist/backend/llvm/shapes.d.ts +86 -13
  148. package/dist/backend/llvm/shapes.js +208 -54
  149. package/dist/backend/llvm/shapes.js.map +1 -1
  150. package/dist/backend/llvm/shapes.test.js +68 -9
  151. package/dist/backend/llvm/shapes.test.js.map +1 -1
  152. package/dist/backend/llvm/split-loops.js +1 -1
  153. package/dist/backend/llvm/split-loops.js.map +1 -1
  154. package/dist/backend/llvm/stack-objects.d.ts +29 -0
  155. package/dist/backend/llvm/stack-objects.js +142 -0
  156. package/dist/backend/llvm/stack-objects.js.map +1 -0
  157. package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
  158. package/dist/backend/llvm/stack-objects.test.js +255 -0
  159. package/dist/backend/llvm/stack-objects.test.js.map +1 -0
  160. package/dist/backend/llvm/string-reads.d.ts +4 -1
  161. package/dist/backend/llvm/string-reads.js +89 -9
  162. package/dist/backend/llvm/string-reads.js.map +1 -1
  163. package/dist/backend/llvm/switch-dispatch.js +5 -4
  164. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  165. package/dist/backend/llvm/walkers.d.ts +13 -0
  166. package/dist/backend/llvm/walkers.js +108 -10
  167. package/dist/backend/llvm/walkers.js.map +1 -1
  168. package/dist/backend/may-throw.js +10 -4
  169. package/dist/backend/may-throw.js.map +1 -1
  170. package/dist/backend/native/contracts.d.ts +7 -2
  171. package/dist/backend/native/executable.js +28 -2
  172. package/dist/backend/native/executable.js.map +1 -1
  173. package/dist/backend/native/library.js +1 -1
  174. package/dist/backend/native/library.js.map +1 -1
  175. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  176. package/dist/backend/native/runtime-inputs.js +3 -0
  177. package/dist/backend/native/runtime-inputs.js.map +1 -1
  178. package/dist/backend/native-link-info-core.d.ts +1 -0
  179. package/dist/backend/native-link-info-core.js.map +1 -1
  180. package/dist/backend/native-toolchain.test.js +1 -1
  181. package/dist/backend/native-toolchain.test.js.map +1 -1
  182. package/dist/backend/runtime-abi.d.ts +2 -2
  183. package/dist/backend/runtime-abi.js +2 -2
  184. package/dist/backend/runtime-pack-core.d.ts +1 -0
  185. package/dist/backend/runtime-pack-core.js +1 -0
  186. package/dist/backend/runtime-pack-core.js.map +1 -1
  187. package/dist/backend/runtime-pack-targets.test.js +1 -1
  188. package/dist/backend/runtime-pack.test.js +1 -1
  189. package/dist/backend/target-diagnostics.js +17 -0
  190. package/dist/backend/target-diagnostics.js.map +1 -1
  191. package/dist/backend/target-diagnostics.test.js +16 -0
  192. package/dist/backend/target-diagnostics.test.js.map +1 -1
  193. package/dist/compat/fetch-profile.js +4 -4
  194. package/dist/compat/fetch-profile.js.map +1 -1
  195. package/dist/contracts/check.js +2 -0
  196. package/dist/contracts/check.js.map +1 -1
  197. package/dist/coverage/report.js +1 -1
  198. package/dist/coverage/report.js.map +1 -1
  199. package/dist/diagnostics/diagnostic.d.ts +6 -5
  200. package/dist/diagnostics/diagnostic.js +7 -6
  201. package/dist/diagnostics/diagnostic.js.map +1 -1
  202. package/dist/executable/executable-cache.d.ts +1 -0
  203. package/dist/executable/executable-cache.js.map +1 -1
  204. package/dist/frontend/builtin-modules.d.ts +1 -1
  205. package/dist/frontend/builtin-modules.js +1 -0
  206. package/dist/frontend/builtin-modules.js.map +1 -1
  207. package/dist/frontend/comptime-node.js +2 -2
  208. package/dist/frontend/comptime-node.js.map +1 -1
  209. package/dist/frontend/experimental-import.d.ts +12 -0
  210. package/dist/frontend/experimental-import.js +63 -0
  211. package/dist/frontend/experimental-import.js.map +1 -0
  212. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  213. package/dist/frontend/lowering/binding-analysis.js +1 -1
  214. package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
  215. package/dist/frontend/lowering/builtin-calls.js +36 -0
  216. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  218. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  219. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  221. package/dist/frontend/lowering/builtins/blob.js +167 -0
  222. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  223. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  224. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  225. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  226. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  227. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  228. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/compression.js +3 -2
  230. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/console.d.ts +16 -6
  232. package/dist/frontend/lowering/builtins/console.js +33 -9
  233. package/dist/frontend/lowering/builtins/console.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/crypto.js +415 -120
  235. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  236. package/dist/frontend/lowering/builtins/errors.js +20 -0
  237. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  238. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  239. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  240. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  241. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  242. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  243. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  244. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  245. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  246. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  247. package/dist/frontend/lowering/builtins/json.d.ts +2 -2
  248. package/dist/frontend/lowering/builtins/json.js +13 -4
  249. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  250. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  251. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  252. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  253. package/dist/frontend/lowering/builtins/module-calls.js +60 -12
  254. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  255. package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
  256. package/dist/frontend/lowering/builtins/numbers.js +17 -0
  257. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
  259. package/dist/frontend/lowering/builtins/operating-system.js +361 -1
  260. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  261. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  262. package/dist/frontend/lowering/builtins/performance.js +340 -5
  263. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  265. package/dist/frontend/lowering/builtins/process.js +122 -17
  266. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/promises.js +109 -2
  268. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  270. package/dist/frontend/lowering/builtins/properties.js +39 -11
  271. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  273. package/dist/frontend/lowering/builtins/readline.js +266 -90
  274. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
  276. package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
  277. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  279. package/dist/frontend/lowering/builtins/url.js +36 -0
  280. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  281. package/dist/frontend/lowering/call-arguments.js +1 -1
  282. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  283. package/dist/frontend/lowering/call-signatures.js +20 -2
  284. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  285. package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
  286. package/dist/frontend/lowering/checked-promise-all.js +52 -6
  287. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  288. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +8 -3
  289. package/dist/frontend/lowering/class-dynamic-dispatch.js +159 -32
  290. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  291. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  292. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  293. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  294. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  295. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  296. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  297. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  298. package/dist/frontend/lowering/coercions/structural.js +3 -3
  299. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  300. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  301. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  302. package/dist/frontend/lowering/containers/array-callbacks.js +33 -6
  303. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  304. package/dist/frontend/lowering/containers/array-construction.js +8 -4
  305. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  306. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  307. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  308. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  309. package/dist/frontend/lowering/containers/array-pipelines.js +1 -1
  310. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  311. package/dist/frontend/lowering/containers/bytes.js +38 -26
  312. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  313. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  314. package/dist/frontend/lowering/containers/for-of.js +5 -1
  315. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  316. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  317. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  318. package/dist/frontend/lowering/containers/string-and-regexp.js +91 -0
  319. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  320. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  321. package/dist/frontend/lowering/crypto-tables.js +77 -12
  322. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  323. package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
  324. package/dist/frontend/lowering/cycle-initialization.js +166 -12
  325. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  326. package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
  327. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  328. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  329. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  330. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  331. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  332. package/dist/frontend/lowering/expressions/object-literals.js +21 -68
  333. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  334. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  335. package/dist/frontend/lowering/generator-delegation.js +231 -10
  336. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  337. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  338. package/dist/frontend/lowering/generic-functions.js +2 -2
  339. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  340. package/dist/frontend/lowering/http2-constants.js +1 -1
  341. package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
  342. package/dist/frontend/lowering/lifetime-regions.js +216 -0
  343. package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
  344. package/dist/frontend/lowering/lower-array-sort.d.ts +40 -3
  345. package/dist/frontend/lowering/lower-array-sort.js +661 -194
  346. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  347. package/dist/frontend/lowering/lower-array-sort.test.js +103 -4
  348. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  349. package/dist/frontend/lowering/lower-assert.js +2 -2
  350. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  351. package/dist/frontend/lowering/lower-async-iteration.js +248 -2
  352. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  353. package/dist/frontend/lowering/lower-calls.js +173 -111
  354. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  355. package/dist/frontend/lowering/lower-classes.d.ts +12 -5
  356. package/dist/frontend/lowering/lower-classes.js +156 -11
  357. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  358. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  359. package/dist/frontend/lowering/lower-comptime.js +4 -4
  360. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  361. package/dist/frontend/lowering/lower-console.d.ts +13 -0
  362. package/dist/frontend/lowering/lower-console.js +460 -4
  363. package/dist/frontend/lowering/lower-console.js.map +1 -1
  364. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
  365. package/dist/frontend/lowering/lower-event-emitter.js +124 -38
  366. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  367. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  368. package/dist/frontend/lowering/lower-event-target.js +362 -0
  369. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  370. package/dist/frontend/lowering/lower-expando.js +2 -2
  371. package/dist/frontend/lowering/lower-exprs.js +247 -42
  372. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  373. package/dist/frontend/lowering/lower-generators.d.ts +15 -7
  374. package/dist/frontend/lowering/lower-generators.js +183 -99
  375. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  376. package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
  377. package/dist/frontend/lowering/lower-inspect.js +247 -28
  378. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  379. package/dist/frontend/lowering/lower-mixins.js +1 -1
  380. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  381. package/dist/frontend/lowering/lower-modules.js +27 -17
  382. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  383. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  384. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  385. package/dist/frontend/lowering/lower-server.js +39 -14
  386. package/dist/frontend/lowering/lower-server.js.map +1 -1
  387. package/dist/frontend/lowering/lower-stdlib.d.ts +11 -1
  388. package/dist/frontend/lowering/lower-stdlib.js +45 -4
  389. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  390. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  391. package/dist/frontend/lowering/lower-stmts.js +112 -23
  392. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  393. package/dist/frontend/lowering/lower-stream.js +234 -22
  394. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  395. package/dist/frontend/lowering/lower-timers.js +1 -1
  396. package/dist/frontend/lowering/lowerer.d.ts +45 -6
  397. package/dist/frontend/lowering/lowerer.js +360 -48
  398. package/dist/frontend/lowering/lowerer.js.map +1 -1
  399. package/dist/frontend/lowering/native-ffi.js +2 -2
  400. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  401. package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
  402. package/dist/frontend/lowering/regex-span-reads.js +164 -0
  403. package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
  404. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  405. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  406. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  407. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  408. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  409. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  410. package/dist/frontend/lowering/surfaces.d.ts +7 -3
  411. package/dist/frontend/lowering/surfaces.js +385 -32
  412. package/dist/frontend/lowering/surfaces.js.map +1 -1
  413. package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
  414. package/dist/frontend/lowering/var-hoisting.js +261 -0
  415. package/dist/frontend/lowering/var-hoisting.js.map +1 -0
  416. package/dist/frontend/module-syntax.d.ts +1 -1
  417. package/dist/frontend/module-syntax.js +1 -1
  418. package/dist/frontend/npm-static-prune.js +1 -1
  419. package/dist/frontend/npm-static-prune.js.map +1 -1
  420. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  421. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  422. package/dist/frontend/pipeline.js +6 -4
  423. package/dist/frontend/pipeline.js.map +1 -1
  424. package/dist/frontend/program.d.ts +6 -5
  425. package/dist/frontend/program.js +42 -22
  426. package/dist/frontend/program.js.map +1 -1
  427. package/dist/frontend/program.test.js +13 -0
  428. package/dist/frontend/program.test.js.map +1 -1
  429. package/dist/frontend/resolve.js +1 -1
  430. package/dist/frontend/ts7/adapter.js +1 -1
  431. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  432. package/dist/frontend/ts7/ast-bytes.js +1 -1
  433. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  434. package/dist/frontend/ts7/semantic-json.js +1 -1
  435. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  436. package/dist/frontend/ts7/world-check.js +1 -1
  437. package/dist/frontend/tsc-codes.js +2 -2
  438. package/dist/frontend/tsc-codes.js.map +1 -1
  439. package/dist/frontend/type-mapper.d.ts +28 -1
  440. package/dist/frontend/type-mapper.js +288 -30
  441. package/dist/frontend/type-mapper.js.map +1 -1
  442. package/dist/index.js +6 -4
  443. package/dist/index.js.map +1 -1
  444. package/dist/ir/analysis.d.ts +12 -6
  445. package/dist/ir/analysis.js +26 -10
  446. package/dist/ir/analysis.js.map +1 -1
  447. package/dist/ir/analysis.test.js +15 -3
  448. package/dist/ir/analysis.test.js.map +1 -1
  449. package/dist/ir/builtin-effects.js +108 -2
  450. package/dist/ir/builtin-effects.js.map +1 -1
  451. package/dist/ir/builtin-signatures.d.ts +1 -1
  452. package/dist/ir/builtin-signatures.js +436 -53
  453. package/dist/ir/builtin-signatures.js.map +1 -1
  454. package/dist/ir/function-references.test.js +1 -0
  455. package/dist/ir/function-references.test.js.map +1 -1
  456. package/dist/ir/int32-slots.js +2 -0
  457. package/dist/ir/int32-slots.js.map +1 -1
  458. package/dist/ir/intrinsic-signatures.js +2 -0
  459. package/dist/ir/intrinsic-signatures.js.map +1 -1
  460. package/dist/ir/ir.d.ts +129 -36
  461. package/dist/ir/ir.js +42 -1
  462. package/dist/ir/ir.js.map +1 -1
  463. package/dist/ir/runtime-features.d.ts +1 -0
  464. package/dist/ir/runtime-features.js +116 -5
  465. package/dist/ir/runtime-features.js.map +1 -1
  466. package/dist/ir/scalar-records.js +1 -2
  467. package/dist/ir/scalar-records.js.map +1 -1
  468. package/dist/ir/serialize.js +1 -1
  469. package/dist/ir/serialize.js.map +1 -1
  470. package/dist/ir/traverse.js +1 -0
  471. package/dist/ir/traverse.js.map +1 -1
  472. package/dist/ir/validate.js +250 -34
  473. package/dist/ir/validate.js.map +1 -1
  474. package/dist/ir/validate.test.js +125 -0
  475. package/dist/ir/validate.test.js.map +1 -1
  476. package/dist/library/fence-eval.d.ts +1 -1
  477. package/dist/library/fence-eval.js +5 -4
  478. package/dist/library/fence-eval.js.map +1 -1
  479. package/dist/library/ir-policy.js +11 -4
  480. package/dist/library/ir-policy.js.map +1 -1
  481. package/dist/library/library-profile.js +13 -13
  482. package/dist/library/library-profile.js.map +1 -1
  483. package/dist/library/prepare.js +1 -1
  484. package/dist/library/prepare.js.map +1 -1
  485. package/dist/library/sidecar.js +3 -3
  486. package/dist/library/sidecar.js.map +1 -1
  487. package/dist/native/prepare.js +3 -2
  488. package/dist/native/prepare.js.map +1 -1
  489. package/dist/native/sanitizer.test.js +1 -0
  490. package/dist/native/sanitizer.test.js.map +1 -1
  491. package/package.json +20 -20
  492. package/surface-manifest.json +537 -142
@@ -3,10 +3,12 @@ import { InternalCompilerError } from "../../errors.js";
3
3
  import * as ts from "../ts7/adapter.js";
4
4
  import { unsignedHex } from "../../format-integer.js";
5
5
  import { isJsSourceFile } from "../program.js";
6
- import { BOOL, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, UNDEFINED_T, canConvertToDyn, canDynCheckTo, recordTextCodecClass, shapeHasAccessorSlots, typeKey, } from "../../ir/ir.js";
6
+ import { BOOL, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, isDirentShape, isDynTypedRefType, recordTextCodecClass, shapeHasAccessorSlots, typeKey, } from "../../ir/ir.js";
7
7
  import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
8
8
  import { symbolFieldDisplayName } from "./symbol-fields.js";
9
+ import { eventTargetRootOf } from "./lower-event-target.js";
9
10
  import { lowerSystemErrorMap } from "./lower-system-errors.js";
11
+ import { isPerfEntryType, perfEntryJson } from "./builtins/performance.js";
10
12
  /* ── IR construction shorthand ───────────────────────────────────────── */
11
13
  function concatAll(parts, loc) {
12
14
  if (parts.length === 0)
@@ -20,7 +22,7 @@ function concatAll(parts, loc) {
20
22
  /* ── property-name rendering (compile-time keys) ─────────────────────── */
21
23
  /** strEscape's quote ladder over a COMPILE-TIME string (record field
22
24
  * names, format-string chunks never pass through here — only keys).
23
- * Mirrors scr_inspect.c's insp_quote_into byte-for-byte. */
25
+ * Mirrors scr_inspect.c's insp_quote_into exactly. */
24
26
  function inspectQuote(s) {
25
27
  const hasSingle = s.includes("'");
26
28
  const quote = !hasSingle
@@ -185,13 +187,35 @@ function inspectSupport(lowerer, t, visiting, out) {
185
187
  const info = lowerer.classes.get(t.className);
186
188
  if (!info)
187
189
  return `class '${t.className}' has no inspect lowering`;
190
+ // EventTarget and Event subclasses render through Node's inspectors
191
+ // for those classes (the runtime's capsule view).
192
+ if (eventTargetRootOf(info) !== null)
193
+ return null;
188
194
  if (isErrorClass(lowerer, t.className)) {
189
195
  return errorRenderable(info)
190
196
  ? null
191
197
  : "error subclasses with declared fields have no inspect lowering yet (the extra own properties are runtime-dynamic)";
192
198
  }
199
+ // A class with subclasses renders through its checked-dynamic view,
200
+ // which names the instance's own class and holds its own fields.
193
201
  if (info.subclasses.length > 0) {
194
- return `inspect of '${t.className}' values is not lowered (the class has subclasses — the runtime value's constructor name and fields are dynamic)`;
202
+ if (!isDynTypedRefType(t) || visiting.has(t.className))
203
+ return null;
204
+ visiting.add(t.className);
205
+ const hierarchy = (current) => [
206
+ current,
207
+ ...current.subclasses.flatMap(hierarchy),
208
+ ];
209
+ for (const member of hierarchy(info))
210
+ for (const f of member.def.fields) {
211
+ if (f.name.startsWith("#") || f.name.startsWith("%"))
212
+ continue;
213
+ const why = inspectSupport(lowerer, f.type, visiting, out);
214
+ if (why !== null)
215
+ return why;
216
+ }
217
+ visiting.delete(t.className);
218
+ return null;
195
219
  }
196
220
  if (visiting.has(t.className)) {
197
221
  out.recursive = true;
@@ -241,6 +265,20 @@ function isNumberFlag(lowerer, t, v, loc) {
241
265
  * with the depth budget `depth` — a direct scalar libCall or a call of
242
266
  * the interned per-type helper. */
243
267
  export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
268
+ // A Dirent row renders through its dyn view: Node's `Dirent { ... }`
269
+ // with the Symbol(type) key.
270
+ if (t.kind === "record") {
271
+ const shape = lowerer.shapes.get(t.shapeId);
272
+ if (shape && isDirentShape(shape)) {
273
+ return {
274
+ kind: "libCall",
275
+ fn: "insp.dyn",
276
+ args: [lowerer.coerceToExpected(value, DYN), recurse, depth],
277
+ type: STRING,
278
+ loc,
279
+ };
280
+ }
281
+ }
244
282
  switch (t.kind) {
245
283
  case "f64":
246
284
  return { kind: "libCall", fn: "insp.f64", args: [value], type: STRING, loc };
@@ -265,6 +303,15 @@ export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
265
303
  case "dyn":
266
304
  return { kind: "libCall", fn: "insp.dyn", args: [value, recurse, depth], type: STRING, loc };
267
305
  case "object":
306
+ if (eventTargetRootOf(lowerer.classes.get(t.className)) !== null) {
307
+ return {
308
+ kind: "libCall",
309
+ fn: "insp.dyn",
310
+ args: [lowerer.coerceToExpected(value, DYN), recurse, depth],
311
+ type: STRING,
312
+ loc,
313
+ };
314
+ }
268
315
  if (isErrorClass(lowerer, t.className)) {
269
316
  return {
270
317
  kind: "libCall",
@@ -274,6 +321,15 @@ export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
274
321
  loc,
275
322
  };
276
323
  }
324
+ if (lowerer.classes.get(t.className)?.subclasses.length) {
325
+ return {
326
+ kind: "libCall",
327
+ fn: "insp.dyn",
328
+ args: [lowerer.coerceToExpected(value, DYN), recurse, depth],
329
+ type: STRING,
330
+ loc,
331
+ };
332
+ }
277
333
  return {
278
334
  kind: "call",
279
335
  callee: inspectHelper(lowerer, t, loc),
@@ -599,6 +655,66 @@ function inspectHelper(lowerer, t, loc) {
599
655
  type,
600
656
  loc,
601
657
  });
658
+ if (isPerfEntryType(lowerer, t)) {
659
+ // PerformanceEntry's custom inspect: `[PerformanceMark]` past the
660
+ // depth budget, otherwise the class name and a nested inspect of
661
+ // toJSON() one level shallower, in its own context.
662
+ const className = {
663
+ kind: "ternary",
664
+ cond: {
665
+ kind: "strEq",
666
+ negated: false,
667
+ left: get("entryType", STRING),
668
+ right: strLit("mark", loc),
669
+ type: BOOL,
670
+ loc,
671
+ },
672
+ then: strLit("PerformanceMark", loc),
673
+ else_: strLit("PerformanceMeasure", loc),
674
+ type: STRING,
675
+ loc,
676
+ };
677
+ const json = perfEntryJson(lowerer, v(), t, loc);
678
+ const dLess1 = {
679
+ kind: "bin",
680
+ op: "-",
681
+ left: d(),
682
+ right: numLit(1, loc),
683
+ type: F64,
684
+ loc,
685
+ };
686
+ locals.push({ id: "in.0", name: "inner", type: STRING, mutable: false });
687
+ body = [
688
+ {
689
+ kind: "if",
690
+ cond: { kind: "bin", op: ">", left: r(), right: d(), type: BOOL, loc },
691
+ then: [ret(concatAll([strLit("[", loc), className, strLit("]", loc)], loc))],
692
+ else_: null,
693
+ loc,
694
+ },
695
+ exprStmt({
696
+ kind: "libCall",
697
+ fn: "insp.nestedBegin",
698
+ args: [],
699
+ type: { kind: "void" },
700
+ loc,
701
+ }),
702
+ {
703
+ kind: "varDecl",
704
+ localId: "in.0",
705
+ init: inspectExpr(lowerer, json.type, json, numLit(0, loc), dLess1, loc),
706
+ loc,
707
+ },
708
+ ret({
709
+ kind: "libCall",
710
+ fn: "insp.nestedEnd",
711
+ args: [className, varRef("in.0", STRING, loc)],
712
+ type: STRING,
713
+ loc,
714
+ }),
715
+ ];
716
+ break;
717
+ }
602
718
  if (shape.tuple) {
603
719
  // Tuples ARE arrays to Node: bracket form, array-extras grouping.
604
720
  if (shape.fields.length === 0) {
@@ -910,13 +1026,13 @@ function inspectHelper(lowerer, t, loc) {
910
1026
  // Node prints the class's OWN name — the declaration's, never the
911
1027
  // IR name's module qualifier (`m0.Timer` is the frontend's spelling
912
1028
  // for a class declared in a non-entry module).
913
- const display = info.decl?.name?.text ?? info.def.name.replace(/^%/, "");
1029
+ const display = info.def.jsName ?? info.decl?.name?.text ?? info.def.name.replace(/^%/, "");
914
1030
  // #private fields never render: they are not properties in any
915
1031
  // observable way — Node's inspect omits them entirely (verified),
916
1032
  // so a class whose only fields are private prints as `C {}`.
917
1033
  const visible = info.def.fields.filter((f) => !f.name.startsWith("#"));
918
1034
  if (visible.length === 0) {
919
- body = [ret(strLit(`${display} {}`, loc))];
1035
+ body = [ret(strLit(display === "" ? "{}" : `${display} {}`, loc))];
920
1036
  break;
921
1037
  }
922
1038
  const get = (field, type) => ({
@@ -927,7 +1043,7 @@ function inspectHelper(lowerer, t, loc) {
927
1043
  type,
928
1044
  loc,
929
1045
  });
930
- body = [depthGate(`[${display}]`), ...begin()];
1046
+ body = [depthGate(display === "" ? "[Object]" : `[${display}]`), ...begin()];
931
1047
  // def.fields carries layout order: the base chain first, then own —
932
1048
  // exactly the own-property insertion order of a constructor that
933
1049
  // assigns in declaration order (SEMANTICS.md 36's stance). SYMBOL-
@@ -948,7 +1064,7 @@ function inspectHelper(lowerer, t, loc) {
948
1064
  const key = symNames.has(f.name) ? symbolFieldDisplayName(f.name) : inspectKey(f.name);
949
1065
  body.push(entry(concatAll([strLit(`${key}: `, loc), child(f.type, get(f.name, f.type))], loc), boolLit(false, loc)));
950
1066
  }
951
- body.push(ret(end(strLit("", loc), strLit(`${display} {`, loc), strLit("}", loc), false, boolLit(false, loc))));
1067
+ body.push(ret(end(strLit("", loc), strLit(display === "" ? "{" : `${display} {`, loc), strLit("}", loc), false, boolLit(false, loc))));
952
1068
  break;
953
1069
  }
954
1070
  default:
@@ -1108,7 +1224,7 @@ export function lowerConsoleInspectArg(lowerer, node, value, surface, loc) {
1108
1224
  if (t.kind === "undefinedT" || t.kind === "nullT") {
1109
1225
  // The baked text ("undefined"/"null"): the operand is a literal or a
1110
1226
  // pure read, so dropping its evaluation loses nothing. Effectful
1111
- // unit-typed operands keep a fence — a silent skip is banned.
1227
+ // unit-typed operands report SC1090 instead of being skipped.
1112
1228
  if (value.kind !== "unitLit" && !isSafeToRepeat(value)) {
1113
1229
  lowerer.unsupported("SC1090", node, `${surface} of an effectful '${lowerer.fmt(t)}'-typed expression (evaluate it first: const v = ...; ${surface}(v))`);
1114
1230
  }
@@ -1143,16 +1259,17 @@ export function lowerConsoleInspectArg(lowerer, node, value, surface, loc) {
1143
1259
  /* ── the callsite: options, direct function/class names ──────────────── */
1144
1260
  /** The parsed options literal: the resolved depth (numeric; Infinity for
1145
1261
  * `null`), with every non-default knob fenced by name. */
1146
- function parseInspectOptions(lowerer, node, recursive) {
1262
+ function parseInspectOptions(lowerer, node, recursive, dir = false) {
1263
+ const surface = dir ? "console.dir" : "util.inspect";
1147
1264
  if (!node || (ts.isIdentifier(node) && node.text === "undefined"))
1148
1265
  return 2;
1149
1266
  if (!ts.isObjectLiteralExpression(node)) {
1150
- lowerer.noLowering("util.inspect with a non-literal options argument", node, "the options must be an object literal ({ depth, colors: false, ... }) so the knobs resolve at compile time");
1267
+ lowerer.noLowering(`${surface} with a non-literal options argument`, node, "the options must be an object literal ({ depth, colors: false, ... }) so the knobs resolve at compile time");
1151
1268
  }
1152
1269
  let depth = 2;
1153
1270
  for (const prop of node.properties) {
1154
1271
  if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) {
1155
- lowerer.noLowering("util.inspect options in this form", prop, "plain `key: literal` entries are the lowered options");
1272
+ lowerer.noLowering(`${surface} options in this form`, prop, "plain `key: literal` entries are the lowered options");
1156
1273
  }
1157
1274
  const key = prop.name.text;
1158
1275
  const value = prop.initializer;
@@ -1178,28 +1295,34 @@ function parseInspectOptions(lowerer, node, recursive) {
1178
1295
  else if (!(ts.isIdentifier(value) && value.text === "undefined")) {
1179
1296
  const n = numeric();
1180
1297
  if (n === null) {
1181
- lowerer.noLowering("util.inspect with a non-literal depth option", value, "depth must be a numeric literal (or null)");
1298
+ lowerer.noLowering(`${surface} with a non-literal depth option`, value, "depth must be a numeric literal (or null)");
1182
1299
  }
1183
1300
  depth = n;
1184
1301
  }
1185
1302
  }
1186
1303
  else if (key === "colors") {
1187
1304
  if (value.kind !== ts.SyntaxKind.FalseKeyword) {
1188
- lowerer.noLowering("util.inspect with colors: true", value, "ANSI styling has no lowering — only colors: false");
1305
+ lowerer.noLowering(`${surface} with colors: true`, value, "ANSI styling has no lowering — only colors: false");
1189
1306
  }
1190
1307
  }
1191
1308
  else if (key === "compact") {
1192
1309
  if (numeric() !== 3) {
1193
- lowerer.noLowering("util.inspect with a non-default compact option", value, "only the default compact: 3 is lowered");
1310
+ lowerer.noLowering(`${surface} with a non-default compact option`, value, "only the default compact: 3 is lowered");
1194
1311
  }
1195
1312
  }
1196
1313
  else if (key === "breakLength") {
1197
1314
  if (numeric() !== 80) {
1198
- lowerer.noLowering("util.inspect with a non-default breakLength option", value, "only the default breakLength: 80 is lowered");
1315
+ lowerer.noLowering(`${surface} with a non-default breakLength option`, value, "only the default breakLength: 80 is lowered");
1316
+ }
1317
+ }
1318
+ else if (dir && key === "customInspect") {
1319
+ // console.dir's own default; only that value is lowered.
1320
+ if (value.kind !== ts.SyntaxKind.FalseKeyword) {
1321
+ lowerer.noLowering("console.dir with customInspect: true", value, "only customInspect: false (console.dir's default) is lowered");
1199
1322
  }
1200
1323
  }
1201
1324
  else {
1202
- lowerer.noLowering(`util.inspect with the '${key}' option`, prop, "the lowered options are depth (numeric literal or null), colors: false, compact: 3, and breakLength: 80");
1325
+ lowerer.noLowering(`${surface} with the '${key}' option`, prop, `the lowered options are depth (numeric literal or null), colors: false, compact: 3, ${dir ? "breakLength: 80, and customInspect: false" : "and breakLength: 80"}`);
1203
1326
  }
1204
1327
  }
1205
1328
  return depth;
@@ -1249,16 +1372,25 @@ function lowerInspectCall(lowerer, expr, loc) {
1249
1372
  if (expr.arguments.length < 1 || expr.arguments.length > 2) {
1250
1373
  lowerer.noLowering(`util.inspect with ${expr.arguments.length} arguments`, expr, "the supported forms are inspect(value) and inspect(value, options)");
1251
1374
  }
1252
- const valueNode = expr.arguments[0];
1375
+ return lowerInspectValue(lowerer, expr.arguments[0], expr.arguments[1], loc, false);
1376
+ }
1377
+ /** `inspect(value, options)` over one value node: the shared body of
1378
+ * util.inspect and console.dir. console.dir is Node's `inspect(object,
1379
+ * { customInspect: false, ...options })`; the only lowered value with a
1380
+ * custom inspect hook is Buffer (its <Buffer ..> form), so that call
1381
+ * fences Buffers and routes checked-dynamic values through the runtime
1382
+ * walk that refuses a Buffer anywhere inside. */
1383
+ export function lowerInspectValue(lowerer, valueNode, optionsNode, loc, dir) {
1384
+ const surface = dir ? "console.dir" : "util.inspect";
1253
1385
  // Inline function/class literals and direct declared names render as
1254
1386
  // their baked forms; other function-typed values fence below.
1255
1387
  const direct = directCallableInspect(lowerer, valueNode, loc);
1256
1388
  if (direct) {
1257
- parseInspectOptions(lowerer, expr.arguments[1], false);
1389
+ parseInspectOptions(lowerer, optionsNode, false, dir);
1258
1390
  return direct;
1259
1391
  }
1260
1392
  if (ts.isArrowFunction(valueNode) || ts.isFunctionExpression(valueNode)) {
1261
- parseInspectOptions(lowerer, expr.arguments[1], false);
1393
+ parseInspectOptions(lowerer, optionsNode, false, dir);
1262
1394
  return strLit(valueNode.kind === ts.SyntaxKind.FunctionExpression &&
1263
1395
  valueNode.name
1264
1396
  ? `[Function: ${valueNode.name.text}]`
@@ -1276,19 +1408,31 @@ function lowerInspectCall(lowerer, expr, loc) {
1276
1408
  tname === "NonSharedBuffer" ||
1277
1409
  tname.startsWith("Buffer<") ||
1278
1410
  tname.startsWith("NonSharedBuffer<");
1411
+ if (dir) {
1412
+ lowerer.noLowering(`console.dir of '${tname}' values`, valueNode, "console.dir disables custom inspection, and the typed-array rendering it falls back to has no lowering yet — use console.log");
1413
+ }
1279
1414
  if (value.type.elem !== "u8" || !isBuffer) {
1280
1415
  lowerer.noLowering(`util.inspect of '${tname}' values`, valueNode, "Buffer's <Buffer ..> form is the lowered typed-array rendering; other typed arrays fence");
1281
1416
  }
1282
- const bufDepth = parseInspectOptions(lowerer, expr.arguments[1], false);
1417
+ const bufDepth = parseInspectOptions(lowerer, optionsNode, false, dir);
1283
1418
  void bufDepth; // Buffers render fully at any depth (custom inspect)
1284
1419
  return inspectExpr(lowerer, value.type, value, numLit(0, loc), numLit(2, loc), loc);
1285
1420
  }
1286
1421
  const walk = { recursive: false };
1287
1422
  const reason = inspectSupport(lowerer, value.type, new Set(), walk);
1288
1423
  if (reason !== null) {
1289
- lowerer.noLowering(`util.inspect of '${lowerer.fmt(value.type)}' values`, valueNode, reason);
1424
+ lowerer.noLowering(`${surface} of '${lowerer.fmt(value.type)}' values`, valueNode, reason);
1425
+ }
1426
+ const depth = parseInspectOptions(lowerer, optionsNode, walk.recursive, dir);
1427
+ if (dir && value.type.kind === "dyn") {
1428
+ return {
1429
+ kind: "libCall",
1430
+ fn: "console.dirDyn",
1431
+ args: [value, numLit(depth, loc)],
1432
+ type: STRING,
1433
+ loc,
1434
+ };
1290
1435
  }
1291
- const depth = parseInspectOptions(lowerer, expr.arguments[1], walk.recursive);
1292
1436
  return inspectExpr(lowerer, value.type, value, numLit(0, loc), numLit(depth, loc), loc);
1293
1437
  }
1294
1438
  /* ── util.format / util.formatWithOptions ────────────────────────────── */
@@ -1373,8 +1517,8 @@ function formatOArg(lowerer, node, depth, loc) {
1373
1517
  * ported exactly — the arg cursor, the args-exhausted guard, %c's
1374
1518
  * consume-and-drop), with per-static-type conversions. Non-literal
1375
1519
  * format strings lower only in the substitution-free shapes. */
1376
- export function lowerFormatCall(lowerer, expr, loc, withOptions) {
1377
- const argNodes = [...expr.arguments];
1520
+ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverride, literalPrefix = "") {
1521
+ const argNodes = [...(argNodesOverride ?? expr.arguments)];
1378
1522
  if (withOptions) {
1379
1523
  const opts = argNodes.shift();
1380
1524
  if (!opts || !ts.isObjectLiteralExpression(opts) || opts.properties.length > 0) {
@@ -1402,7 +1546,9 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions) {
1402
1546
  }
1403
1547
  return concatAll(parts, loc);
1404
1548
  }
1405
- const fmt = first.text;
1549
+ // A literal prefix joins the format text (console.assert's "Assertion
1550
+ // failed: " — Node formats the joined string).
1551
+ const fmt = literalPrefix + first.text;
1406
1552
  // Node's early return: a lone string first argument passes VERBATIM —
1407
1553
  // no substitution runs, "%%" stays "%%".
1408
1554
  if (argNodes.length === 1)
@@ -1454,7 +1600,8 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions) {
1454
1600
  // context.actual)` — test/common's exit report): VALIDATE it as a
1455
1601
  // number (dynCheck) and format. A non-number dyn value throws the
1456
1602
  // catchable TypeError where Node would print its ToNumber (NaN
1457
- // for objects) — loud, never a silent wrong answer (SEMANTICS.md).
1603
+ // for objects) — it throws instead of returning a wrong result
1604
+ // (SEMANTICS.md).
1458
1605
  if (value.type.kind === "dyn") {
1459
1606
  return {
1460
1607
  kind: "libCall",
@@ -1506,7 +1653,8 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions) {
1506
1653
  // A checked-dynamic argument (`console.error('headers: %j',
1507
1654
  // headers)` — the suite's http logging idiom): the runtime dyn
1508
1655
  // walk stringifies JS-exactly (root undefined/function prints
1509
- // "undefined"; a handle in the tree throws the loud fence).
1656
+ // "undefined"; a handle in the tree throws the "not supported yet"
1657
+ // Error).
1510
1658
  if (value.type.kind === "dyn") {
1511
1659
  return { kind: "libCall", fn: "insp.jsonDyn", args: [value], type: STRING, loc };
1512
1660
  }
@@ -1652,6 +1800,12 @@ export function lowerUtilModuleCall(lowerer, expr, bi, loc) {
1652
1800
  loc,
1653
1801
  };
1654
1802
  }
1803
+ case "inherits":
1804
+ case "deprecate":
1805
+ case "callbackify":
1806
+ case "debuglog":
1807
+ case "debug":
1808
+ return lowerUtilCallableCall(lowerer, expr, bi.member, loc);
1655
1809
  case "getSystemErrorMap": {
1656
1810
  if (expr.arguments.some(ts.isSpreadElement))
1657
1811
  lowerer.noLowering("util.getSystemErrorMap with spread arguments", expr);
@@ -1735,6 +1889,71 @@ export function lowerUtilModuleCall(lowerer, expr, bi, loc) {
1735
1889
  return null;
1736
1890
  }
1737
1891
  }
1892
+ /** util.inherits/deprecate/callbackify/debuglog: every argument crosses as
1893
+ * a checked-dynamic value, evaluated left to right before the runtime call
1894
+ * (surplus arguments are evaluated and dropped). The function helpers
1895
+ * answer native dyn wrappers; a static function slot checks the wrapper
1896
+ * when it receives it, and dyn slots keep calling it with JS arity. */
1897
+ function lowerUtilCallableCall(lowerer, expr, member, loc) {
1898
+ if (expr.arguments.some(ts.isSpreadElement))
1899
+ lowerer.noLowering(`util.${member} with spread arguments`, expr);
1900
+ const fn = member === "inherits"
1901
+ ? "util.inherits"
1902
+ : member === "deprecate"
1903
+ ? "util.deprecate"
1904
+ : member === "callbackify"
1905
+ ? "util.callbackify"
1906
+ : "util.debuglog";
1907
+ const arity = member === "deprecate" ? 4 : member === "callbackify" ? 1 : 2;
1908
+ // Program classes keep static prototypes: there is no function object
1909
+ // whose prototype chain the runtime could relink or wrap.
1910
+ const classArgs = member === "inherits" ? 2 : member === "deprecate" ? 1 : 0;
1911
+ for (const arg of expr.arguments.slice(0, classArgs)) {
1912
+ if (lowerer.mapTypeOf(lowerer.typeOf(arg))?.kind === "classval")
1913
+ lowerer.noLowering(`util.${member} over a class constructor`, arg, member === "inherits"
1914
+ ? "declare the subclass with extends"
1915
+ : "deprecate a factory function or the class's call sites instead");
1916
+ }
1917
+ if (member === "callbackify" && callbackifyErrorExcludesNull(lowerer, expr))
1918
+ lowerer.noLowering("util.callbackify into a callback whose error parameter excludes null", expr, "Node calls back with a null error on success; type the binding's callback as (err: NodeJS.ErrnoException | null, ...) => void");
1919
+ const stmts = [];
1920
+ const args = [];
1921
+ for (let i = 0; i < arity; i++) {
1922
+ const input = expr.arguments[i]
1923
+ ? lowerer.lowerExprExpecting(expr.arguments[i], DYN)
1924
+ : dynUndefinedExpr(loc);
1925
+ const saved = lowerer.declareHiddenLocal("%utilInput", DYN);
1926
+ stmts.push({ kind: "varDecl", localId: saved.id, init: input, loc });
1927
+ args.push(varRef(saved.id, DYN, loc));
1928
+ }
1929
+ for (const arg of expr.arguments.slice(arity))
1930
+ stmts.push({ kind: "exprStmt", expr: lowerer.lowerExpr(arg), loc });
1931
+ const type = fn === "util.inherits" ? VOID : DYN;
1932
+ const result = { kind: "libCall", fn, args, type, loc };
1933
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
1934
+ }
1935
+ /** Whether the slot receiving a callbackify wrapper declares a callback
1936
+ * whose first parameter cannot hold null. Some @types/node overloads type
1937
+ * that error as NodeJS.ErrnoException, but Node passes null on success, and
1938
+ * a statically typed callback parameter cannot receive a value its type
1939
+ * excludes. Untyped (JavaScript or unknown) slots keep the wrapper dyn. */
1940
+ function callbackifyErrorExcludesNull(lowerer, expr) {
1941
+ if (isJsSourceFile(expr.getSourceFile()))
1942
+ return false;
1943
+ const checker = lowerer.checker;
1944
+ const slot = checker.getContextualType(expr) ?? lowerer.typeOf(expr);
1945
+ const wrapper = checker.getCallSignatures(slot)[0];
1946
+ const callbackSymbol = wrapper?.getParameters().at(-1);
1947
+ if (!callbackSymbol)
1948
+ return false;
1949
+ const callback = checker.getCallSignatures(checker.getTypeOfSymbol(callbackSymbol))[0];
1950
+ const errorSymbol = callback?.getParameters()[0];
1951
+ if (!errorSymbol)
1952
+ return false;
1953
+ const error = checker.getTypeOfSymbol(errorSymbol);
1954
+ const arms = error.isUnionType() ? ts.constituentTypes(error) : [error];
1955
+ return !arms.some((arm) => (arm.flags & (ts.TypeFlags.Null | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0);
1956
+ }
1738
1957
  /** util.parseArgs(config?): the configuration is ordinary JSON-safe data,
1739
1958
  * so it crosses into the runtime as a checked-dynamic tree. The native
1740
1959
  * parser returns the same tree-shaped result Node does (including token
@@ -1797,7 +2016,7 @@ function lowerParseArgsCall(lowerer, expr, loc) {
1797
2016
  * mustNotCall — `callSite.scriptName`:`callSite.lineNumber` in the
1798
2017
  * failure text — read a printable value instead of throwing). Argument
1799
2018
  * forms and TypeScript keep the SC2020 fence: a typed consumer asserting
1800
- * real frames must fail loudly at compile time, not read placeholders. */
2019
+ * real frames must fail at compile time instead of reading placeholders. */
1801
2020
  function lowerGetCallSitesCall(lowerer, expr, loc) {
1802
2021
  if (expr.arguments.length !== 0)
1803
2022
  return null;