xbintsc 0.5.6 → 0.5.21

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 (490) hide show
  1. package/AGENTS.md +20 -10
  2. package/README.md +8 -7
  3. package/README.zh-CN.md +6 -6
  4. package/dist/src/binder/declarations.js +14 -3
  5. package/dist/src/binder/declarations.js.map +1 -1
  6. package/dist/src/cli/hints.js +7 -1
  7. package/dist/src/cli/hints.js.map +1 -1
  8. package/dist/src/cli/main.js +115 -15
  9. package/dist/src/cli/main.js.map +1 -1
  10. package/dist/src/cli/watch.d.ts +25 -0
  11. package/dist/src/cli/watch.js +93 -0
  12. package/dist/src/cli/watch.js.map +1 -0
  13. package/dist/src/codegen/generator/calls/access.js +11 -2
  14. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  15. package/dist/src/codegen/generator/calls/closures.js +12 -4
  16. package/dist/src/codegen/generator/calls/closures.js.map +1 -1
  17. package/dist/src/codegen/generator/context.d.ts +8 -0
  18. package/dist/src/codegen/generator/context.js +22 -3
  19. package/dist/src/codegen/generator/context.js.map +1 -1
  20. package/dist/src/codegen/generator/expressions/operators.js +17 -15
  21. package/dist/src/codegen/generator/expressions/operators.js.map +1 -1
  22. package/dist/src/codegen/generator/expressions/primary.js +5 -0
  23. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  24. package/dist/src/codegen/generator/module.js +0 -7
  25. package/dist/src/codegen/generator/module.js.map +1 -1
  26. package/dist/src/codegen/generator/numeric.d.ts +6 -3
  27. package/dist/src/codegen/generator/numeric.js +54 -11
  28. package/dist/src/codegen/generator/numeric.js.map +1 -1
  29. package/dist/src/codegen/generator/state.js +23 -0
  30. package/dist/src/codegen/generator/state.js.map +1 -1
  31. package/dist/src/codegen/generator/statements/control-flow.js +1 -4
  32. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
  33. package/dist/src/codegen/generator/statements/loops.js +48 -16
  34. package/dist/src/codegen/generator/statements/loops.js.map +1 -1
  35. package/dist/src/codegen/generator/tables.js +26 -1
  36. package/dist/src/codegen/generator/tables.js.map +1 -1
  37. package/dist/src/diagnostics/diagnostic.d.ts +3 -1
  38. package/dist/src/diagnostics/diagnostic.js +23 -3
  39. package/dist/src/diagnostics/diagnostic.js.map +1 -1
  40. package/dist/src/driver/app-artifacts.d.ts +42 -0
  41. package/dist/src/driver/app-artifacts.js +53 -0
  42. package/dist/src/driver/app-artifacts.js.map +1 -0
  43. package/dist/src/driver/build-key.d.ts +29 -0
  44. package/dist/src/driver/build-key.js +35 -0
  45. package/dist/src/driver/build-key.js.map +1 -0
  46. package/dist/src/driver/bundler/graph.js +61 -12
  47. package/dist/src/driver/bundler/graph.js.map +1 -1
  48. package/dist/src/driver/bundler/merge.js +7 -1
  49. package/dist/src/driver/bundler/merge.js.map +1 -1
  50. package/dist/src/driver/compiler.d.ts +10 -67
  51. package/dist/src/driver/compiler.js +95 -234
  52. package/dist/src/driver/compiler.js.map +1 -1
  53. package/dist/src/driver/config.d.ts +3 -0
  54. package/dist/src/driver/config.js +8 -0
  55. package/dist/src/driver/config.js.map +1 -1
  56. package/dist/src/driver/frontend.d.ts +37 -0
  57. package/dist/src/driver/frontend.js +92 -0
  58. package/dist/src/driver/frontend.js.map +1 -0
  59. package/dist/src/driver/index.d.ts +1 -1
  60. package/dist/src/driver/index.js.map +1 -1
  61. package/dist/src/driver/options.d.ts +64 -0
  62. package/dist/src/driver/options.js +9 -0
  63. package/dist/src/driver/options.js.map +1 -0
  64. package/dist/src/driver/runtime-objects.d.ts +38 -0
  65. package/dist/src/driver/runtime-objects.js +112 -0
  66. package/dist/src/driver/runtime-objects.js.map +1 -0
  67. package/dist/src/driver/toolchain-provider.d.ts +4 -0
  68. package/dist/src/driver/toolchain-provider.js +4 -0
  69. package/dist/src/driver/toolchain-provider.js.map +1 -1
  70. package/dist/src/driver/toolchain.d.ts +32 -1
  71. package/dist/src/driver/toolchain.js +115 -11
  72. package/dist/src/driver/toolchain.js.map +1 -1
  73. package/dist/src/driver/version.d.ts +12 -0
  74. package/dist/src/driver/version.js +13 -0
  75. package/dist/src/driver/version.js.map +1 -0
  76. package/dist/src/driver/win-icon.d.ts +7 -9
  77. package/dist/src/driver/win-icon.js +37 -35
  78. package/dist/src/driver/win-icon.js.map +1 -1
  79. package/dist/src/extensions/node/fs/index.d.ts +4 -3
  80. package/dist/src/extensions/node/fs/index.js +12 -3
  81. package/dist/src/extensions/node/fs/index.js.map +1 -1
  82. package/dist/src/extensions/node/fs-promises/index.d.ts +5 -5
  83. package/dist/src/extensions/node/fs-promises/index.js +15 -6
  84. package/dist/src/extensions/node/fs-promises/index.js.map +1 -1
  85. package/dist/src/parser/declarations/classes.js +5 -0
  86. package/dist/src/parser/declarations/classes.js.map +1 -1
  87. package/dist/src/parser/declarations/functions.js +13 -1
  88. package/dist/src/parser/declarations/functions.js.map +1 -1
  89. package/dist/src/parser/modules.js +8 -3
  90. package/dist/src/parser/modules.js.map +1 -1
  91. package/dist/src/parser/parser.d.ts +1 -0
  92. package/dist/src/parser/parser.js +23 -0
  93. package/dist/src/parser/parser.js.map +1 -1
  94. package/dist/tests/cli/check.test.d.ts +6 -0
  95. package/dist/tests/cli/check.test.js +68 -0
  96. package/dist/tests/cli/check.test.js.map +1 -0
  97. package/dist/tests/cli/main.test.js +19 -0
  98. package/dist/tests/cli/main.test.js.map +1 -1
  99. package/dist/tests/cli/watch.test.d.ts +6 -0
  100. package/dist/tests/cli/watch.test.js +72 -0
  101. package/dist/tests/cli/watch.test.js.map +1 -0
  102. package/dist/tests/codegen/expressions.test.js +15 -3
  103. package/dist/tests/codegen/expressions.test.js.map +1 -1
  104. package/dist/tests/codegen/llvm.test.js +16 -0
  105. package/dist/tests/codegen/llvm.test.js.map +1 -1
  106. package/dist/tests/diagnostics/diagnostic.test.js +8 -0
  107. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -1
  108. package/dist/tests/docs/structure.test.d.ts +1 -0
  109. package/dist/tests/docs/structure.test.js +92 -0
  110. package/dist/tests/docs/structure.test.js.map +1 -0
  111. package/dist/tests/driver/compiler.test.js +6 -0
  112. package/dist/tests/driver/compiler.test.js.map +1 -1
  113. package/dist/tests/driver/config.test.js +9 -0
  114. package/dist/tests/driver/config.test.js.map +1 -1
  115. package/dist/tests/driver/icon.test.js +19 -32
  116. package/dist/tests/driver/icon.test.js.map +1 -1
  117. package/dist/tests/driver/invalid-input.test.d.ts +10 -0
  118. package/dist/tests/driver/invalid-input.test.js +29 -0
  119. package/dist/tests/driver/invalid-input.test.js.map +1 -0
  120. package/dist/tests/driver/modules.test.js +42 -3
  121. package/dist/tests/driver/modules.test.js.map +1 -1
  122. package/dist/tests/driver/toolchain-provider.test.js +27 -1
  123. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  124. package/dist/tests/driver/toolchain.test.js +60 -2
  125. package/dist/tests/driver/toolchain.test.js.map +1 -1
  126. package/dist/tests/e2e/array-buffer.test.d.ts +5 -0
  127. package/dist/tests/e2e/array-buffer.test.js +38 -0
  128. package/dist/tests/e2e/array-buffer.test.js.map +1 -0
  129. package/dist/tests/e2e/array-from-iterables.test.d.ts +7 -0
  130. package/dist/tests/e2e/array-from-iterables.test.js +34 -0
  131. package/dist/tests/e2e/array-from-iterables.test.js.map +1 -0
  132. package/dist/tests/e2e/array-symbol-iterator.test.d.ts +8 -0
  133. package/dist/tests/e2e/array-symbol-iterator.test.js +42 -0
  134. package/dist/tests/e2e/array-symbol-iterator.test.js.map +1 -0
  135. package/dist/tests/e2e/async-await.test.js +1 -1
  136. package/dist/tests/e2e/async-fs.test.d.ts +9 -0
  137. package/dist/tests/e2e/async-fs.test.js +119 -0
  138. package/dist/tests/e2e/async-fs.test.js.map +1 -0
  139. package/dist/tests/e2e/async-generators.test.d.ts +1 -0
  140. package/dist/tests/e2e/async-generators.test.js +154 -0
  141. package/dist/tests/e2e/async-generators.test.js.map +1 -0
  142. package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
  143. package/dist/tests/e2e/await-ordering.test.js +37 -0
  144. package/dist/tests/e2e/await-ordering.test.js.map +1 -0
  145. package/dist/tests/e2e/compile-builtins.test.js +1 -1
  146. package/dist/tests/e2e/compile-modules.test.js +7 -0
  147. package/dist/tests/e2e/compile-modules.test.js.map +1 -1
  148. package/dist/tests/e2e/date-parse.test.d.ts +8 -0
  149. package/dist/tests/e2e/date-parse.test.js +38 -0
  150. package/dist/tests/e2e/date-parse.test.js.map +1 -0
  151. package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
  152. package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
  153. package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
  154. package/dist/tests/e2e/fetch.test.js +24 -0
  155. package/dist/tests/e2e/fetch.test.js.map +1 -1
  156. package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
  157. package/dist/tests/e2e/globals-microtask.test.js +37 -0
  158. package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
  159. package/dist/tests/e2e/gui-inline-svg.test.d.ts +11 -0
  160. package/dist/tests/e2e/gui-inline-svg.test.js +160 -0
  161. package/dist/tests/e2e/gui-inline-svg.test.js.map +1 -0
  162. package/dist/tests/e2e/gui-media.test.js +8 -1
  163. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  164. package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
  165. package/dist/tests/e2e/inspect-builtins.test.js +43 -0
  166. package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
  167. package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
  168. package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
  169. package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
  170. package/dist/tests/e2e/json-circular.test.d.ts +6 -0
  171. package/dist/tests/e2e/json-circular.test.js +43 -0
  172. package/dist/tests/e2e/json-circular.test.js.map +1 -0
  173. package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
  174. package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
  175. package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
  176. package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
  177. package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
  178. package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
  179. package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
  180. package/dist/tests/e2e/json-stringify-space.test.js +23 -0
  181. package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
  182. package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
  183. package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
  184. package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
  185. package/dist/tests/e2e/native-extensions.test.js +1 -1
  186. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  187. package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
  188. package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
  189. package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
  190. package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
  191. package/dist/tests/e2e/property-descriptors.test.js +25 -0
  192. package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
  193. package/dist/tests/e2e/property-ic.test.d.ts +1 -0
  194. package/dist/tests/e2e/property-ic.test.js +55 -0
  195. package/dist/tests/e2e/property-ic.test.js.map +1 -0
  196. package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
  197. package/dist/tests/e2e/runtime-errors.test.js +52 -0
  198. package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
  199. package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
  200. package/dist/tests/e2e/structured-clone.test.js +49 -0
  201. package/dist/tests/e2e/structured-clone.test.js.map +1 -0
  202. package/dist/tests/e2e/text-codec.test.d.ts +6 -0
  203. package/dist/tests/e2e/text-codec.test.js +24 -0
  204. package/dist/tests/e2e/text-codec.test.js.map +1 -0
  205. package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
  206. package/dist/tests/e2e/typed-array-views.test.js +39 -0
  207. package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
  208. package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
  209. package/dist/tests/e2e/url-search-params.test.js +30 -0
  210. package/dist/tests/e2e/url-search-params.test.js.map +1 -0
  211. package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
  212. package/dist/tests/e2e/weak-collections.test.js +88 -0
  213. package/dist/tests/e2e/weak-collections.test.js.map +1 -0
  214. package/dist/tests/parser/declarations.test.js +12 -0
  215. package/dist/tests/parser/declarations.test.js.map +1 -1
  216. package/dist/tests/parser/module-syntax.test.js +9 -0
  217. package/dist/tests/parser/module-syntax.test.js.map +1 -1
  218. package/dist/tests/parser/parser.test.js +7 -0
  219. package/dist/tests/parser/parser.test.js.map +1 -1
  220. package/dist/tests/version.test.js +5 -1
  221. package/dist/tests/version.test.js.map +1 -1
  222. package/doc/ai/README.md +4 -3
  223. package/doc/ai/cli.md +41 -0
  224. package/doc/ai/contributing.md +20 -16
  225. package/doc/ai/extensions.md +13 -10
  226. package/doc/ai/language-support.md +19 -14
  227. package/doc/ai/troubleshooting.md +11 -9
  228. package/doc/ai/zh-CN/README.md +3 -2
  229. package/doc/ai/zh-CN/cli.md +35 -0
  230. package/doc/ai/zh-CN/contributing.md +16 -15
  231. package/doc/ai/zh-CN/extensions.md +12 -9
  232. package/doc/ai/zh-CN/language-support.md +19 -15
  233. package/doc/ai/zh-CN/troubleshooting.md +9 -8
  234. package/doc/gui/api.md +8 -0
  235. package/doc/gui/build.md +13 -4
  236. package/doc/gui/known-issues.md +19 -14
  237. package/doc/gui/media.md +32 -3
  238. package/doc/gui/rendering.md +3 -1
  239. package/doc/gui.md +28 -5
  240. package/doc/icon.md +5 -4
  241. package/doc/implemented/async.md +51 -0
  242. package/doc/implemented/binder.md +13 -0
  243. package/doc/implemented/cli.md +47 -0
  244. package/doc/implemented/codegen.md +33 -0
  245. package/doc/implemented/collections.md +26 -0
  246. package/doc/implemented/driver.md +19 -0
  247. package/doc/implemented/extensions.md +19 -0
  248. package/doc/implemented/fetch.md +44 -0
  249. package/doc/implemented/lexer.md +23 -0
  250. package/doc/implemented/modules.md +28 -0
  251. package/doc/implemented/node/assert.md +17 -0
  252. package/doc/implemented/node/buffer.md +29 -0
  253. package/doc/implemented/node/child-process.md +29 -0
  254. package/doc/implemented/node/crypto.md +9 -0
  255. package/doc/implemented/node/dgram.md +15 -0
  256. package/doc/implemented/node/events.md +37 -0
  257. package/doc/implemented/node/fs-promises.md +49 -0
  258. package/doc/implemented/node/fs.md +112 -0
  259. package/doc/implemented/node/http.md +21 -0
  260. package/doc/implemented/node/net.md +17 -0
  261. package/doc/implemented/node/os.md +22 -0
  262. package/doc/implemented/node/path.md +33 -0
  263. package/doc/implemented/node/process.md +23 -0
  264. package/doc/implemented/node/querystring.md +20 -0
  265. package/doc/implemented/node/stream-promises.md +8 -0
  266. package/doc/implemented/node/stream.md +19 -0
  267. package/doc/implemented/node/test.md +10 -0
  268. package/doc/implemented/node/url.md +8 -0
  269. package/doc/implemented/node/util.md +25 -0
  270. package/doc/implemented/node/worker-threads.md +10 -0
  271. package/doc/implemented/node/zlib.md +8 -0
  272. package/doc/implemented/node.md +48 -0
  273. package/doc/implemented/operators.md +38 -0
  274. package/doc/implemented/parser.md +58 -0
  275. package/doc/implemented/pipeline.md +28 -0
  276. package/doc/implemented/runtime-core.md +32 -0
  277. package/doc/implemented/stdlib.md +78 -0
  278. package/doc/implemented/strings.md +27 -0
  279. package/doc/implemented/tests.md +10 -0
  280. package/doc/implemented/typed-arrays.md +26 -0
  281. package/doc/implemented/value-model.md +18 -0
  282. package/doc/implemented.md +54 -355
  283. package/doc/node-implemented.md +3 -585
  284. package/doc/node-unimplemented.md +3 -164
  285. package/doc/requirements.md +23 -8
  286. package/doc/unimplemented/classes.md +22 -0
  287. package/doc/unimplemented/deviations.md +27 -0
  288. package/doc/unimplemented/expressions.md +26 -0
  289. package/doc/unimplemented/functions.md +21 -0
  290. package/doc/unimplemented/modules.md +22 -0
  291. package/doc/unimplemented/node/async.md +20 -0
  292. package/doc/unimplemented/node/bun.md +9 -0
  293. package/doc/unimplemented/node/fs-promises.md +20 -0
  294. package/doc/unimplemented/node/fs.md +30 -0
  295. package/doc/unimplemented/node/globals.md +23 -0
  296. package/doc/unimplemented/node/modules.md +21 -0
  297. package/doc/unimplemented/node.md +21 -0
  298. package/doc/unimplemented/statements.md +18 -0
  299. package/doc/unimplemented/stdlib.md +54 -0
  300. package/doc/unimplemented/toolchain.md +14 -0
  301. package/doc/unimplemented/types.md +12 -0
  302. package/doc/unimplemented.md +18 -275
  303. package/doc/xbintsc.config.schema.json +12 -0
  304. package/doc/zh-CN/gui/api.md +7 -0
  305. package/doc/zh-CN/gui/build.md +11 -3
  306. package/doc/zh-CN/gui/known-issues.md +17 -11
  307. package/doc/zh-CN/gui/media.md +26 -2
  308. package/doc/zh-CN/gui/rendering.md +2 -1
  309. package/doc/zh-CN/gui.md +21 -3
  310. package/doc/zh-CN/icon.md +5 -4
  311. package/doc/zh-CN/implemented/async.md +49 -0
  312. package/doc/zh-CN/implemented/binder.md +13 -0
  313. package/doc/zh-CN/implemented/cli.md +46 -0
  314. package/doc/zh-CN/implemented/codegen.md +33 -0
  315. package/doc/zh-CN/implemented/collections.md +26 -0
  316. package/doc/zh-CN/implemented/driver.md +19 -0
  317. package/doc/zh-CN/implemented/extensions.md +19 -0
  318. package/doc/zh-CN/implemented/fetch.md +31 -0
  319. package/doc/zh-CN/implemented/lexer.md +23 -0
  320. package/doc/zh-CN/implemented/modules.md +28 -0
  321. package/doc/zh-CN/implemented/node/assert.md +17 -0
  322. package/doc/zh-CN/implemented/node/buffer.md +25 -0
  323. package/doc/zh-CN/implemented/node/child-process.md +27 -0
  324. package/doc/zh-CN/implemented/node/crypto.md +9 -0
  325. package/doc/zh-CN/implemented/node/dgram.md +15 -0
  326. package/doc/zh-CN/implemented/node/events.md +36 -0
  327. package/doc/zh-CN/implemented/node/fs-promises.md +30 -0
  328. package/doc/zh-CN/implemented/node/fs.md +105 -0
  329. package/doc/zh-CN/implemented/node/http.md +17 -0
  330. package/doc/zh-CN/implemented/node/net.md +17 -0
  331. package/doc/zh-CN/implemented/node/os.md +21 -0
  332. package/doc/zh-CN/implemented/node/path.md +26 -0
  333. package/doc/zh-CN/implemented/node/process.md +23 -0
  334. package/doc/zh-CN/implemented/node/querystring.md +20 -0
  335. package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
  336. package/doc/zh-CN/implemented/node/stream.md +15 -0
  337. package/doc/zh-CN/implemented/node/test.md +10 -0
  338. package/doc/zh-CN/implemented/node/url.md +8 -0
  339. package/doc/zh-CN/implemented/node/util.md +25 -0
  340. package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
  341. package/doc/zh-CN/implemented/node/zlib.md +8 -0
  342. package/doc/zh-CN/implemented/node.md +45 -0
  343. package/doc/zh-CN/implemented/operators.md +38 -0
  344. package/doc/zh-CN/implemented/parser.md +58 -0
  345. package/doc/zh-CN/implemented/pipeline.md +25 -0
  346. package/doc/zh-CN/implemented/runtime-core.md +31 -0
  347. package/doc/zh-CN/implemented/stdlib.md +76 -0
  348. package/doc/zh-CN/implemented/strings.md +27 -0
  349. package/doc/zh-CN/implemented/tests.md +10 -0
  350. package/doc/zh-CN/implemented/typed-arrays.md +26 -0
  351. package/doc/zh-CN/implemented/value-model.md +18 -0
  352. package/doc/zh-CN/implemented.md +50 -350
  353. package/doc/zh-CN/node-implemented.md +4 -531
  354. package/doc/zh-CN/node-unimplemented.md +4 -139
  355. package/doc/zh-CN/plan-require-node-modules.md +4 -4
  356. package/doc/zh-CN/requirements.md +20 -6
  357. package/doc/zh-CN/unimplemented/classes.md +22 -0
  358. package/doc/zh-CN/unimplemented/deviations.md +24 -0
  359. package/doc/zh-CN/unimplemented/expressions.md +24 -0
  360. package/doc/zh-CN/unimplemented/functions.md +21 -0
  361. package/doc/zh-CN/unimplemented/modules.md +19 -0
  362. package/doc/zh-CN/unimplemented/node/async.md +20 -0
  363. package/doc/zh-CN/unimplemented/node/bun.md +8 -0
  364. package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
  365. package/doc/zh-CN/unimplemented/node/fs.md +24 -0
  366. package/doc/zh-CN/unimplemented/node/globals.md +14 -0
  367. package/doc/zh-CN/unimplemented/node/modules.md +15 -0
  368. package/doc/zh-CN/unimplemented/node.md +18 -0
  369. package/doc/zh-CN/unimplemented/statements.md +15 -0
  370. package/doc/zh-CN/unimplemented/stdlib.md +54 -0
  371. package/doc/zh-CN/unimplemented/toolchain.md +14 -0
  372. package/doc/zh-CN/unimplemented/types.md +11 -0
  373. package/doc/zh-CN/unimplemented.md +14 -237
  374. package/llms.txt +32 -4
  375. package/package.json +1 -1
  376. package/runtime/ext_gui/inline_svg.cpp +219 -0
  377. package/runtime/ext_gui/inline_svg.h +41 -0
  378. package/runtime/ext_gui/layout.cpp +18 -0
  379. package/runtime/ext_gui/layout.h +7 -0
  380. package/runtime/ext_gui/layout_flow.cpp +4 -3
  381. package/runtime/ext_gui/paint.cpp +14 -0
  382. package/runtime/ext_gui/paint.h +5 -1
  383. package/runtime/ext_gui/renderer_image.cpp +53 -25
  384. package/runtime/ext_gui/renderer_shaders.h +2 -2
  385. package/runtime/ext_gui/stb_image.h +1 -17
  386. package/runtime/ext_gui/style_ua.cpp +3 -0
  387. package/runtime/ext_gui/svg.cpp +122 -39
  388. package/runtime/ext_gui/svg.h +14 -3
  389. package/runtime/ext_gui/window.cpp +28 -0
  390. package/runtime/ext_node/child_process/child_process.c +173 -73
  391. package/runtime/ext_node/fs/async_api.c +314 -0
  392. package/runtime/ext_node/fs/async_complete.c +99 -0
  393. package/runtime/ext_node/fs/async_fh.c +206 -0
  394. package/runtime/ext_node/fs/async_job.c +81 -0
  395. package/runtime/ext_node/fs/async_job.h +132 -0
  396. package/runtime/ext_node/fs/async_worker.c +534 -0
  397. package/runtime/ext_node/fs/async_worker_dir.c +439 -0
  398. package/runtime/ext_node/fs/async_worker_dir.h +33 -0
  399. package/runtime/ext_node/fs/async_worker_fd.c +74 -0
  400. package/runtime/ext_node/fs/dir.c +60 -15
  401. package/runtime/ext_node/fs/fs_common.h +9 -0
  402. package/runtime/ext_node/fs/fs_ops.c +18 -29
  403. package/runtime/ext_node/fs/parts/builtins.inc +34 -0
  404. package/runtime/ext_node/fs/parts/platform.inc +66 -0
  405. package/runtime/ext_node/fs/promises.c +44 -234
  406. package/runtime/rt.h +15 -0
  407. package/runtime/rt_internal.h +108 -0
  408. package/runtime/xt_alloc.c +43 -7
  409. package/runtime/xt_array_buffer.c +284 -0
  410. package/runtime/xt_async.c +46 -21
  411. package/runtime/xt_async_io.c +333 -0
  412. package/runtime/xt_async_io.h +47 -0
  413. package/runtime/xt_bigint/helpers.inc +3 -3
  414. package/runtime/xt_builtins.c +21 -17
  415. package/runtime/xt_constructors.c +12 -2
  416. package/runtime/xt_containers/access.inc +148 -3
  417. package/runtime/xt_containers/objects.inc +26 -2
  418. package/runtime/xt_containers/shapes.inc +71 -0
  419. package/runtime/xt_containers.c +1 -0
  420. package/runtime/xt_coroutine.c +17 -0
  421. package/runtime/xt_fetch/async.inc +295 -0
  422. package/runtime/xt_fetch/request.inc +6 -183
  423. package/runtime/xt_fetch/socket.inc +5 -4
  424. package/runtime/xt_fetch.c +6 -4
  425. package/runtime/xt_generator.c +299 -10
  426. package/runtime/xt_io/inspect.inc +112 -0
  427. package/runtime/xt_loop.c +79 -7
  428. package/runtime/xt_performance.c +37 -0
  429. package/runtime/xt_promise.c +63 -1
  430. package/runtime/xt_stdlib/arrays.inc +1 -1
  431. package/runtime/xt_stdlib/dispatch.inc +46 -11
  432. package/runtime/xt_stdlib/strings.inc +1 -1
  433. package/runtime/xt_stdlib2/array-statics.inc +25 -0
  434. package/runtime/xt_stdlib2/arrays.inc +5 -3
  435. package/runtime/xt_stdlib2/container.inc +5 -0
  436. package/runtime/xt_stdlib2/date.inc +111 -3
  437. package/runtime/xt_stdlib2/error.inc +24 -0
  438. package/runtime/xt_stdlib2/json.inc +310 -19
  439. package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
  440. package/runtime/xt_stdlib2/objects.inc +122 -0
  441. package/runtime/xt_stdlib2/set.inc +1 -1
  442. package/runtime/xt_structured_clone.c +159 -0
  443. package/runtime/xt_symbol.c +2 -2
  444. package/runtime/xt_text_codec.c +69 -0
  445. package/runtime/xt_typed_array/construction.inc +35 -5
  446. package/runtime/xt_typed_array/elements.inc +159 -0
  447. package/runtime/xt_typed_array/methods.inc +21 -5
  448. package/runtime/xt_typed_array.c +7 -10
  449. package/runtime/xt_url.c +375 -0
  450. package/runtime/xt_values/arithmetic.inc +2 -2
  451. package/runtime/xt_values/conversions.inc +1 -1
  452. package/runtime/xt_weak.c +281 -0
  453. package/scripts/build-gui.ts +133 -60
  454. package/scripts/check-version.ts +3 -3
  455. package/src/binder/declarations.ts +14 -3
  456. package/src/cli/hints.ts +8 -1
  457. package/src/cli/main.ts +119 -18
  458. package/src/cli/watch.ts +101 -0
  459. package/src/codegen/generator/calls/access.ts +10 -2
  460. package/src/codegen/generator/calls/closures.ts +12 -4
  461. package/src/codegen/generator/context.ts +23 -3
  462. package/src/codegen/generator/expressions/operators.ts +27 -13
  463. package/src/codegen/generator/expressions/primary.ts +4 -0
  464. package/src/codegen/generator/module.ts +0 -7
  465. package/src/codegen/generator/numeric.ts +85 -11
  466. package/src/codegen/generator/state.ts +23 -0
  467. package/src/codegen/generator/statements/control-flow.ts +1 -4
  468. package/src/codegen/generator/statements/loops.ts +50 -16
  469. package/src/codegen/generator/tables.ts +26 -1
  470. package/src/diagnostics/diagnostic.ts +23 -3
  471. package/src/driver/app-artifacts.ts +77 -0
  472. package/src/driver/build-key.ts +55 -0
  473. package/src/driver/bundler/graph.ts +63 -13
  474. package/src/driver/bundler/merge.ts +4 -1
  475. package/src/driver/compiler.ts +94 -328
  476. package/src/driver/config.ts +11 -0
  477. package/src/driver/frontend.ts +120 -0
  478. package/src/driver/index.ts +0 -1
  479. package/src/driver/options.ts +70 -0
  480. package/src/driver/runtime-objects.ts +134 -0
  481. package/src/driver/toolchain-provider.ts +4 -0
  482. package/src/driver/toolchain.ts +154 -10
  483. package/src/driver/version.ts +12 -0
  484. package/src/driver/win-icon.ts +36 -36
  485. package/src/extensions/node/fs/index.ts +12 -3
  486. package/src/extensions/node/fs-promises/index.ts +15 -6
  487. package/src/parser/declarations/classes.ts +4 -0
  488. package/src/parser/declarations/functions.ts +12 -1
  489. package/src/parser/modules.ts +8 -4
  490. package/src/parser/parser.ts +28 -0
@@ -33,6 +33,22 @@ xt_value xt_node_exists(int32_t argc, xt_value *argv) {
33
33
  `readdirSync(path, { withFileTypes: true })` reuse the same closures. */
34
34
  static void xt_fs_define_stat_method(xt_value object, const char *name, unsigned int mode);
35
35
 
36
+ /* Build the Node `Dirent`-shaped object from an already-known mode. The async
37
+ promise layer collects the mode on its worker so it does not have to `stat`
38
+ the entry again on the main thread. */
39
+ xt_value xt_node_dirent_named(const char *name, unsigned int mode) {
40
+ xt_value object = xt_object_new();
41
+ xt_object_set(object, xt_string_from_cstr("name"), xt_string_from_cstr(name));
42
+ xt_fs_define_stat_method(object, "isFile", mode);
43
+ xt_fs_define_stat_method(object, "isDirectory", mode);
44
+ xt_fs_define_stat_method(object, "isSymbolicLink", mode);
45
+ xt_fs_define_stat_method(object, "isFIFO", mode);
46
+ xt_fs_define_stat_method(object, "isSocket", mode);
47
+ xt_fs_define_stat_method(object, "isBlockDevice", mode);
48
+ xt_fs_define_stat_method(object, "isCharacterDevice", mode);
49
+ return object;
50
+ }
51
+
36
52
  /* Build the Node `Dirent`-shaped object (`name` plus stat predicates) for a
37
53
  single directory entry. Types come from `lstat`, matching Node's `d_type`
38
54
  based `Dirent` (a symlink reports `isSymbolicLink()` true). */
@@ -46,17 +62,7 @@ xt_value xt_node_dirent_result(const char *dir, const char *name) {
46
62
  if (xt_fs_lstat_fn(full, &info) == 0) mode = (unsigned int)info.st_mode;
47
63
  free(full);
48
64
  }
49
-
50
- xt_value object = xt_object_new();
51
- xt_object_set(object, xt_string_from_cstr("name"), xt_string_from_cstr(name));
52
- xt_fs_define_stat_method(object, "isFile", mode);
53
- xt_fs_define_stat_method(object, "isDirectory", mode);
54
- xt_fs_define_stat_method(object, "isSymbolicLink", mode);
55
- xt_fs_define_stat_method(object, "isFIFO", mode);
56
- xt_fs_define_stat_method(object, "isSocket", mode);
57
- xt_fs_define_stat_method(object, "isBlockDevice", mode);
58
- xt_fs_define_stat_method(object, "isCharacterDevice", mode);
59
- return object;
65
+ return xt_node_dirent_named(name, mode);
60
66
  }
61
67
 
62
68
  /* Entries accumulate in an `xt_array`, not a raw `xt_value` buffer: the
@@ -149,24 +155,7 @@ static int xt_fs_recursive(xt_value options) {
149
155
  }
150
156
 
151
157
  static int xt_fs_mkdir_recursive(const char *path, int mode) {
152
- size_t length = strlen(path);
153
- char *copy = (char *)malloc(length + 1);
154
- if (!copy) return -1;
155
- memcpy(copy, path, length + 1);
156
-
157
- while (length > 1 && copy[length - 1] == '/') copy[--length] = '\0';
158
- for (size_t i = 1; i <= length; i++) {
159
- if (copy[i] != '/' && copy[i] != '\0') continue;
160
- char saved = copy[i];
161
- copy[i] = '\0';
162
- if (xt_fs_mkdir_mode(copy, mode) != 0 && errno != EEXIST) {
163
- free(copy);
164
- return -1;
165
- }
166
- copy[i] = saved;
167
- }
168
- free(copy);
169
- return 0;
158
+ return xt_fs_mkdir_parents(path, mode);
170
159
  }
171
160
 
172
161
  xt_value xt_node_mkdir(int32_t argc, xt_value *argv) {
@@ -2,6 +2,7 @@
2
2
 
3
3
  xt_value xt_node_stat_result(const xt_fs_stat_t *info);
4
4
  xt_value xt_node_dirent_result(const char *dir, const char *name);
5
+ xt_value xt_node_dirent_named(const char *name, unsigned int mode);
5
6
 
6
7
  /* -- synchronous fs builtins (one translation unit per group) ------------- */
7
8
 
@@ -64,6 +65,39 @@ xt_value xt_node_watch(int32_t argc, xt_value *argv);
64
65
  xt_value xt_node_watch_file(int32_t argc, xt_value *argv);
65
66
  xt_value xt_node_unwatch_file(int32_t argc, xt_value *argv);
66
67
 
68
+ /* async_api.c — promise-returning counterparts, backed by the async I/O pool */
69
+ xt_value xt_node_p_read_file(int32_t argc, xt_value *argv);
70
+ xt_value xt_node_p_write_file(int32_t argc, xt_value *argv);
71
+ xt_value xt_node_p_append_file(int32_t argc, xt_value *argv);
72
+ xt_value xt_node_p_mkdir(int32_t argc, xt_value *argv);
73
+ xt_value xt_node_p_readdir(int32_t argc, xt_value *argv);
74
+ xt_value xt_node_p_rm(int32_t argc, xt_value *argv);
75
+ xt_value xt_node_p_unlink(int32_t argc, xt_value *argv);
76
+ xt_value xt_node_p_rmdir(int32_t argc, xt_value *argv);
77
+ xt_value xt_node_p_rename(int32_t argc, xt_value *argv);
78
+ xt_value xt_node_p_copy_file(int32_t argc, xt_value *argv);
79
+ xt_value xt_node_p_cp(int32_t argc, xt_value *argv);
80
+ xt_value xt_node_p_realpath(int32_t argc, xt_value *argv);
81
+ xt_value xt_node_p_stat(int32_t argc, xt_value *argv);
82
+ xt_value xt_node_p_lstat(int32_t argc, xt_value *argv);
83
+ xt_value xt_node_p_statfs(int32_t argc, xt_value *argv);
84
+ xt_value xt_node_p_access(int32_t argc, xt_value *argv);
85
+ xt_value xt_node_p_open(int32_t argc, xt_value *argv);
86
+ xt_value xt_node_p_chmod(int32_t argc, xt_value *argv);
87
+ xt_value xt_node_p_lchmod(int32_t argc, xt_value *argv);
88
+ xt_value xt_node_p_chown(int32_t argc, xt_value *argv);
89
+ xt_value xt_node_p_lchown(int32_t argc, xt_value *argv);
90
+ xt_value xt_node_p_truncate(int32_t argc, xt_value *argv);
91
+ xt_value xt_node_p_utimes(int32_t argc, xt_value *argv);
92
+ xt_value xt_node_p_lutimes(int32_t argc, xt_value *argv);
93
+ xt_value xt_node_p_link(int32_t argc, xt_value *argv);
94
+ xt_value xt_node_p_symlink(int32_t argc, xt_value *argv);
95
+ xt_value xt_node_p_readlink(int32_t argc, xt_value *argv);
96
+ xt_value xt_node_p_mkdtemp(int32_t argc, xt_value *argv);
97
+ xt_value xt_node_p_opendir(int32_t argc, xt_value *argv);
98
+ xt_value xt_node_p_glob(int32_t argc, xt_value *argv);
99
+ xt_value xt_node_p_watch(int32_t argc, xt_value *argv);
100
+
67
101
  /* constants.c */
68
102
  xt_value xt_fs_constants(void);
69
103
  xt_value xt_fs_promises(void);
@@ -84,3 +84,69 @@ typedef struct stat xt_fs_stat_t;
84
84
  #define XT_FS_READ read
85
85
  #define XT_FS_WRITE write
86
86
  #endif
87
+
88
+ /* -- recursive directory creation ----------------------------------------- */
89
+ /* `mkdir -p` splits a path at its separators and creates every prefix. A
90
+ * Windows volume prefix must be skipped: `_mkdir("C:")` is not "the C: root" but
91
+ * a drive-relative path that resolves against that drive's current directory,
92
+ * so it fails with EACCES. Creating the prefixes of `C:\...` (e.g. anything
93
+ * under %TEMP%) used to abort on that first component while paths on the
94
+ * process's current drive appeared to work. */
95
+
96
+ static inline int xt_fs_is_sep(char c) {
97
+ #if defined(_WIN32)
98
+ return c == '/' || c == '\\';
99
+ #else
100
+ return c == '/';
101
+ #endif
102
+ }
103
+
104
+ /* Byte index of the first directory component that may be created: 0 for a
105
+ * relative or POSIX path, past `C:` / `\\server\share` on Windows. */
106
+ static inline size_t xt_fs_path_root(const char *path) {
107
+ #if defined(_WIN32)
108
+ if ((path[0] == '\\' || path[0] == '/') && (path[1] == '\\' || path[1] == '/')) {
109
+ size_t i = 2;
110
+ for (int separators = 0; separators < 2 && path[i]; ) {
111
+ if (xt_fs_is_sep(path[i])) separators++;
112
+ i++;
113
+ }
114
+ return i;
115
+ }
116
+ if (path[0] != '\0' && path[1] == ':') {
117
+ size_t i = 2;
118
+ while (xt_fs_is_sep(path[i])) i++;
119
+ return i;
120
+ }
121
+ #endif
122
+ return 0;
123
+ }
124
+
125
+ /* Create `path` and every missing ancestor, tolerating existing directories.
126
+ * Returns 0 or -1 with `errno` set by the failed `mkdir`. */
127
+ static inline int xt_fs_mkdir_parents(const char *path, int mode) {
128
+ size_t length = strlen(path);
129
+ char *copy = (char *)malloc(length + 1);
130
+ if (!copy) return -1;
131
+ memcpy(copy, path, length + 1);
132
+ while (length > 1 && xt_fs_is_sep(copy[length - 1])) copy[--length] = '\0';
133
+
134
+ int status = 0;
135
+ size_t start = xt_fs_path_root(copy);
136
+ if (start < length) {
137
+ /* A driver prefix is already consumed; otherwise index 0 is a separator
138
+ * for absolute paths and the first byte for relative ones. */
139
+ for (size_t i = start > 0 ? start : 1; i <= length; i++) {
140
+ if (!xt_fs_is_sep(copy[i]) && copy[i] != '\0') continue;
141
+ char saved = copy[i];
142
+ copy[i] = '\0';
143
+ if (xt_fs_mkdir_mode(copy, mode) != 0 && errno != EEXIST) {
144
+ status = -1;
145
+ break;
146
+ }
147
+ copy[i] = saved;
148
+ }
149
+ }
150
+ free(copy);
151
+ return status;
152
+ }
@@ -1,244 +1,54 @@
1
1
  /*
2
- * Node.js `fs/promises` for xbintsc.
2
+ * `fs.promises` facade for xbintsc.
3
3
  *
4
- * xbintsc has no asynchronous I/O scheduler, so these builtins reuse the
5
- * synchronous `fs` implementations and wrap the result in a promise that is
6
- * already settled. `await`/`.then` therefore work as expected while the actual
7
- * work happens synchronously. A synchronous failure is turned into a rejected
8
- * promise instead of a thrown exception (matching Node's contract).
9
- *
10
- * `open()` resolves to a `FileHandle`-shaped object (a plain object with an
11
- * `fd` property and the usual methods); there is no shared prototype yet, so
12
- * `handle instanceof FileHandle` is not supported.
4
+ * The individual exports are implemented in async_api.c on top of the async I/O
5
+ * pool: their promises settle when a worker finishes, so awaiting them yields
6
+ * to timers, sockets and other suspending work. This file only builds the
7
+ * `fs.promises` namespace object (reachable as `fs.promises` and as the imported
8
+ * `fs/promises` module).
13
9
  */
14
10
 
15
- #include "../node_common.h"
16
- #include "fs_common.h"
17
-
18
- /* ------------------------------------------------------------------------- */
19
- /* FileHandle */
20
- /* ------------------------------------------------------------------------- */
21
-
22
- static xt_value xt_fh_method(xt_value thisValue, xt_value (*fn)(int32_t, xt_value *), int32_t argc, xt_value *argv,
23
- int prefix) {
24
- xt_value args[10];
25
- int32_t count = 0;
26
- if (prefix >= 1) args[count++] = xt_object_get_cstr(thisValue, "fd");
27
- if (prefix >= 2) args[count++] = xt_object_get_cstr(thisValue, "fd2");
28
- for (int32_t i = 0; i < argc && count < 10; i++) args[count++] = argv[i];
29
- return xt_fs_promisify(fn, count, args);
30
- }
31
-
32
- static xt_value xt_fh_read(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
33
- (void)env;
34
- return xt_fh_method(thisValue, xt_node_read, argc, argv, 1);
35
- }
36
-
37
- static xt_value xt_fh_write(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
38
- (void)env;
39
- return xt_fh_method(thisValue, xt_node_write, argc, argv, 1);
40
- }
41
-
42
- static xt_value xt_fh_close(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
43
- (void)env;
44
- return xt_fh_method(thisValue, xt_node_close, argc, argv, 1);
45
- }
46
-
47
- static xt_value xt_fh_stat(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
48
- (void)env;
49
- return xt_fh_method(thisValue, xt_node_fstat, argc, argv, 1);
50
- }
51
-
52
- static xt_value xt_fh_truncate(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
53
- (void)env;
54
- return xt_fh_method(thisValue, xt_node_ftruncate, argc, argv, 1);
55
- }
56
-
57
- static xt_value xt_fh_chmod(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
58
- (void)env;
59
- return xt_fh_method(thisValue, xt_node_fchmod, argc, argv, 1);
60
- }
61
-
62
- static xt_value xt_fh_chown(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
63
- (void)env;
64
- return xt_fh_method(thisValue, xt_node_fchown, argc, argv, 1);
65
- }
66
-
67
- static xt_value xt_fh_utimes(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
68
- (void)env;
69
- return xt_fh_method(thisValue, xt_node_futimes, argc, argv, 1);
70
- }
71
-
72
- static xt_value xt_fh_sync(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
73
- (void)env;
74
- return xt_fh_method(thisValue, xt_node_fsync, argc, argv, 1);
75
- }
76
-
77
- static xt_value xt_fh_datasync(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
78
- (void)env;
79
- return xt_fh_method(thisValue, xt_node_fdatasync, argc, argv, 1);
80
- }
81
-
82
- /* Read from the handle's current position to EOF; caller frees. */
83
- static unsigned char *xt_fh_slurp(int fd, size_t *outLength) {
84
- size_t capacity = 8192;
85
- size_t length = 0;
86
- unsigned char *bytes = (unsigned char *)malloc(capacity);
87
- if (!bytes) return NULL;
88
- for (;;) {
89
- if (length == capacity) {
90
- capacity *= 2;
91
- unsigned char *grown = (unsigned char *)realloc(bytes, capacity);
92
- if (!grown) {
93
- free(bytes);
94
- return NULL;
95
- }
96
- bytes = grown;
97
- }
98
- ssize_t bytesRead = XT_FS_READ(fd, bytes + length, capacity - length);
99
- if (bytesRead < 0) {
100
- free(bytes);
101
- return NULL;
102
- }
103
- if (bytesRead == 0) break;
104
- length += (size_t)bytesRead;
105
- }
106
- *outLength = length;
107
- return bytes;
108
- }
109
-
110
- static xt_value xt_fh_read_all(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
111
- (void)env;
112
- int fd = (int)xt_to_number(xt_object_get_cstr(thisValue, "fd"));
113
- const char *encoding = argc > 0 ? xt_fs_encoding(argv[0]) : NULL;
114
- size_t length = 0;
115
- unsigned char *bytes = xt_fh_slurp(fd, &length);
116
- if (!bytes) return xt_promise_reject(xt_fs_error_object(errno, "read", NULL));
117
- xt_value result = xt_fs_encode_bytes(bytes, length, encoding);
118
- free(bytes);
119
- return xt_promise_resolve(result);
120
- }
121
-
122
- static xt_value xt_fh_write_all(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
123
- (void)env;
124
- xt_value args[2];
125
- args[0] = xt_object_get_cstr(thisValue, "fd");
126
- args[1] = argc > 0 ? argv[0] : XT_UNDEFINED;
127
- return xt_fs_promisify(xt_node_write, 2, args);
128
- }
129
-
130
- static xt_value xt_fh_new(xt_value fdValue) {
131
- xt_value handle = xt_object_new();
132
- xt_node_set(handle, "fd", fdValue);
133
- xt_node_define_method(handle, "read", (void *)xt_fh_read);
134
- xt_node_define_method(handle, "write", (void *)xt_fh_write);
135
- xt_node_define_method(handle, "readFile", (void *)xt_fh_read_all);
136
- xt_node_define_method(handle, "writeFile", (void *)xt_fh_write_all);
137
- xt_node_define_method(handle, "appendFile", (void *)xt_fh_write_all);
138
- xt_node_define_method(handle, "close", (void *)xt_fh_close);
139
- xt_node_define_method(handle, "stat", (void *)xt_fh_stat);
140
- xt_node_define_method(handle, "truncate", (void *)xt_fh_truncate);
141
- xt_node_define_method(handle, "chmod", (void *)xt_fh_chmod);
142
- xt_node_define_method(handle, "chown", (void *)xt_fh_chown);
143
- xt_node_define_method(handle, "utimes", (void *)xt_fh_utimes);
144
- xt_node_define_method(handle, "sync", (void *)xt_fh_sync);
145
- xt_node_define_method(handle, "datasync", (void *)xt_fh_datasync);
146
- return handle;
147
- }
148
-
149
- /* ------------------------------------------------------------------------- */
150
- /* Promise wrappers */
151
- /* ------------------------------------------------------------------------- */
152
-
153
- #define XT_FS_PROMISE(name, fn) \
154
- xt_value name(int32_t argc, xt_value *argv) { return xt_fs_promisify((fn), argc, argv); }
155
-
156
- XT_FS_PROMISE(xt_node_p_read_file, xt_node_read_text_file)
157
- XT_FS_PROMISE(xt_node_p_write_file, xt_node_write_file)
158
- XT_FS_PROMISE(xt_node_p_append_file, xt_node_append_file)
159
- XT_FS_PROMISE(xt_node_p_mkdir, xt_node_mkdir)
160
- XT_FS_PROMISE(xt_node_p_readdir, xt_node_read_dir)
161
- XT_FS_PROMISE(xt_node_p_rm, xt_node_rm)
162
- XT_FS_PROMISE(xt_node_p_unlink, xt_node_unlink)
163
- XT_FS_PROMISE(xt_node_p_rmdir, xt_node_rmdir)
164
- XT_FS_PROMISE(xt_node_p_rename, xt_node_rename)
165
- XT_FS_PROMISE(xt_node_p_copy_file, xt_node_copy_file)
166
- XT_FS_PROMISE(xt_node_p_realpath, xt_node_realpath)
167
- XT_FS_PROMISE(xt_node_p_stat, xt_node_stat)
168
- XT_FS_PROMISE(xt_node_p_lstat, xt_node_lstat)
169
- XT_FS_PROMISE(xt_node_p_access, xt_node_access)
170
- XT_FS_PROMISE(xt_node_p_cp, xt_node_cp)
171
- XT_FS_PROMISE(xt_node_p_chmod, xt_node_chmod)
172
- XT_FS_PROMISE(xt_node_p_chown, xt_node_chown)
173
- XT_FS_PROMISE(xt_node_p_lchmod, xt_node_lchmod)
174
- XT_FS_PROMISE(xt_node_p_lchown, xt_node_lchown)
175
- XT_FS_PROMISE(xt_node_p_truncate, xt_node_truncate)
176
- XT_FS_PROMISE(xt_node_p_utimes, xt_node_utimes)
177
- XT_FS_PROMISE(xt_node_p_lutimes, xt_node_lutimes)
178
- XT_FS_PROMISE(xt_node_p_link, xt_node_link)
179
- XT_FS_PROMISE(xt_node_p_symlink, xt_node_symlink)
180
- XT_FS_PROMISE(xt_node_p_readlink, xt_node_readlink)
181
- XT_FS_PROMISE(xt_node_p_mkdtemp, xt_node_mkdtemp)
182
- XT_FS_PROMISE(xt_node_p_statfs, xt_node_statfs)
183
- XT_FS_PROMISE(xt_node_p_opendir, xt_node_opendir)
184
- XT_FS_PROMISE(xt_node_p_glob, xt_node_glob)
185
- XT_FS_PROMISE(xt_node_p_watch, xt_node_watch)
186
-
187
- xt_value xt_node_p_open(int32_t argc, xt_value *argv) {
188
- void *frame = xt_try_enter();
189
- if (xt_try_setjmp(frame) == 0) {
190
- xt_value fdValue = xt_node_open(argc, argv);
191
- xt_try_leave(frame);
192
- return xt_promise_resolve(xt_fh_new(fdValue));
193
- }
194
- xt_value exception = xt_try_exception(frame);
195
- xt_try_leave(frame);
196
- return xt_promise_reject(exception);
197
- }
198
-
199
- /* ------------------------------------------------------------------------- */
200
- /* `fs.promises` facade */
201
- /* ------------------------------------------------------------------------- */
11
+ #include "async_job.h"
202
12
 
203
- #define XT_FS_PROMISES_FACADE(name, object) \
204
- static xt_value xt_fs_promises_facade_##name(xt_value thisValue, xt_value env, int32_t argc, \
205
- xt_value *argv) { \
206
- (void)thisValue; \
207
- (void)env; \
208
- return name(argc, argv); \
13
+ #define XT_FS_PROMISES_FACADE(name) \
14
+ static xt_value xt_fs_promises_facade_##name(xt_value thisValue, xt_value env, int32_t argc, \
15
+ xt_value *argv) { \
16
+ (void)thisValue; \
17
+ (void)env; \
18
+ return name(argc, argv); \
209
19
  }
210
20
 
211
- XT_FS_PROMISES_FACADE(xt_node_p_read_file, _)
212
- XT_FS_PROMISES_FACADE(xt_node_p_write_file, _)
213
- XT_FS_PROMISES_FACADE(xt_node_p_append_file, _)
214
- XT_FS_PROMISES_FACADE(xt_node_p_mkdir, _)
215
- XT_FS_PROMISES_FACADE(xt_node_p_readdir, _)
216
- XT_FS_PROMISES_FACADE(xt_node_p_rm, _)
217
- XT_FS_PROMISES_FACADE(xt_node_p_unlink, _)
218
- XT_FS_PROMISES_FACADE(xt_node_p_rmdir, _)
219
- XT_FS_PROMISES_FACADE(xt_node_p_rename, _)
220
- XT_FS_PROMISES_FACADE(xt_node_p_copy_file, _)
221
- XT_FS_PROMISES_FACADE(xt_node_p_realpath, _)
222
- XT_FS_PROMISES_FACADE(xt_node_p_stat, _)
223
- XT_FS_PROMISES_FACADE(xt_node_p_lstat, _)
224
- XT_FS_PROMISES_FACADE(xt_node_p_access, _)
225
- XT_FS_PROMISES_FACADE(xt_node_p_cp, _)
226
- XT_FS_PROMISES_FACADE(xt_node_p_chmod, _)
227
- XT_FS_PROMISES_FACADE(xt_node_p_chown, _)
228
- XT_FS_PROMISES_FACADE(xt_node_p_lchmod, _)
229
- XT_FS_PROMISES_FACADE(xt_node_p_lchown, _)
230
- XT_FS_PROMISES_FACADE(xt_node_p_truncate, _)
231
- XT_FS_PROMISES_FACADE(xt_node_p_utimes, _)
232
- XT_FS_PROMISES_FACADE(xt_node_p_lutimes, _)
233
- XT_FS_PROMISES_FACADE(xt_node_p_link, _)
234
- XT_FS_PROMISES_FACADE(xt_node_p_symlink, _)
235
- XT_FS_PROMISES_FACADE(xt_node_p_readlink, _)
236
- XT_FS_PROMISES_FACADE(xt_node_p_mkdtemp, _)
237
- XT_FS_PROMISES_FACADE(xt_node_p_statfs, _)
238
- XT_FS_PROMISES_FACADE(xt_node_p_opendir, _)
239
- XT_FS_PROMISES_FACADE(xt_node_p_glob, _)
240
- XT_FS_PROMISES_FACADE(xt_node_p_watch, _)
241
- XT_FS_PROMISES_FACADE(xt_node_p_open, _)
21
+ XT_FS_PROMISES_FACADE(xt_node_p_read_file)
22
+ XT_FS_PROMISES_FACADE(xt_node_p_write_file)
23
+ XT_FS_PROMISES_FACADE(xt_node_p_append_file)
24
+ XT_FS_PROMISES_FACADE(xt_node_p_mkdir)
25
+ XT_FS_PROMISES_FACADE(xt_node_p_readdir)
26
+ XT_FS_PROMISES_FACADE(xt_node_p_rm)
27
+ XT_FS_PROMISES_FACADE(xt_node_p_unlink)
28
+ XT_FS_PROMISES_FACADE(xt_node_p_rmdir)
29
+ XT_FS_PROMISES_FACADE(xt_node_p_rename)
30
+ XT_FS_PROMISES_FACADE(xt_node_p_copy_file)
31
+ XT_FS_PROMISES_FACADE(xt_node_p_realpath)
32
+ XT_FS_PROMISES_FACADE(xt_node_p_stat)
33
+ XT_FS_PROMISES_FACADE(xt_node_p_lstat)
34
+ XT_FS_PROMISES_FACADE(xt_node_p_access)
35
+ XT_FS_PROMISES_FACADE(xt_node_p_cp)
36
+ XT_FS_PROMISES_FACADE(xt_node_p_chmod)
37
+ XT_FS_PROMISES_FACADE(xt_node_p_chown)
38
+ XT_FS_PROMISES_FACADE(xt_node_p_lchmod)
39
+ XT_FS_PROMISES_FACADE(xt_node_p_lchown)
40
+ XT_FS_PROMISES_FACADE(xt_node_p_truncate)
41
+ XT_FS_PROMISES_FACADE(xt_node_p_utimes)
42
+ XT_FS_PROMISES_FACADE(xt_node_p_lutimes)
43
+ XT_FS_PROMISES_FACADE(xt_node_p_link)
44
+ XT_FS_PROMISES_FACADE(xt_node_p_symlink)
45
+ XT_FS_PROMISES_FACADE(xt_node_p_readlink)
46
+ XT_FS_PROMISES_FACADE(xt_node_p_mkdtemp)
47
+ XT_FS_PROMISES_FACADE(xt_node_p_statfs)
48
+ XT_FS_PROMISES_FACADE(xt_node_p_opendir)
49
+ XT_FS_PROMISES_FACADE(xt_node_p_glob)
50
+ XT_FS_PROMISES_FACADE(xt_node_p_watch)
51
+ XT_FS_PROMISES_FACADE(xt_node_p_open)
242
52
 
243
53
  xt_value xt_fs_promises(void) {
244
54
  static xt_value cached = 0;
package/runtime/rt.h CHANGED
@@ -132,6 +132,8 @@ xt_value xt_function_get_prototype(xt_value fn);
132
132
  xt_value xt_function_set_generator(xt_value fn);
133
133
  /** Mark a closure as an `async` function so calling it starts a coroutine. */
134
134
  xt_value xt_function_set_async(xt_value fn);
135
+ /** Mark a closure as an `async function*` (generator + async iterator). */
136
+ xt_value xt_function_set_async_generator(xt_value fn);
135
137
 
136
138
  /* -- conversions ---------------------------------------------------------- */
137
139
  int xt_truthy(xt_value v);
@@ -259,6 +261,8 @@ xt_value xt_child_process_spawn_sync(int32_t argc, xt_value *argv);
259
261
  xt_value xt_fetch(int32_t argc, xt_value *argv);
260
262
  /** Construct a `TypeError` with one message argument (used by `fetch`). */
261
263
  xt_value xt_type_error_ctor(int32_t argc, xt_value *argv);
264
+ /** Construct a `RangeError` with one message argument. */
265
+ xt_value xt_range_error_ctor(int32_t argc, xt_value *argv);
262
266
 
263
267
  /* -- promises / async ----------------------------------------------------- */
264
268
  xt_value xt_promise_resolve(xt_value value);
@@ -315,6 +319,12 @@ xt_value xt_set_timeout(int32_t argc, xt_value *argv);
315
319
  xt_value xt_clear_timeout(int32_t argc, xt_value *argv);
316
320
  xt_value xt_set_interval(int32_t argc, xt_value *argv);
317
321
  xt_value xt_clear_interval(int32_t argc, xt_value *argv);
322
+ /* `setImmediate` runs on the timer queue with a zero delay; `clearImmediate`
323
+ * is an alias of `clearTimeout` (ids share one namespace). */
324
+ xt_value xt_set_immediate(int32_t argc, xt_value *argv);
325
+ xt_value xt_clear_immediate(int32_t argc, xt_value *argv);
326
+ /* Schedule `callback` on the promise microtask queue (same FIFO as `.then`). */
327
+ xt_value xt_queue_microtask(int32_t argc, xt_value *argv);
318
328
 
319
329
  /* -- global functions ------------------------------------------------------ */
320
330
  xt_value xt_parse_int(int32_t argc, xt_value *argv);
@@ -328,6 +338,8 @@ xt_value xt_decode_uri(int32_t argc, xt_value *argv);
328
338
  xt_value xt_number_ctor(int32_t argc, xt_value *argv);
329
339
  xt_value xt_string_ctor(int32_t argc, xt_value *argv);
330
340
  xt_value xt_boolean_ctor(int32_t argc, xt_value *argv);
341
+ /* Deep clone arrays/objects/Map/Set/Date/RegExp/typed arrays. */
342
+ xt_value xt_structured_clone(int32_t argc, xt_value *argv);
331
343
  /** `key in obj` (the key is the left operand). */
332
344
  xt_value xt_in(xt_value key, xt_value obj);
333
345
  /** `delete obj[key]`; removes object properties, clears array elements. */
@@ -360,6 +372,9 @@ xt_value xt_iter_value(xt_value value, xt_value index);
360
372
 
361
373
  /* -- generic member access ------------------------------------------------ */
362
374
  xt_value xt_get(xt_value target, xt_value key);
375
+ /** Interned shape/offset inline cache for a property read. `cache` points at
376
+ * two zero-initialised i64 words owned by the generated code. */
377
+ xt_value xt_get_ic(xt_value target, xt_value key, int64_t *cache);
363
378
  xt_value xt_set(xt_value target, xt_value key, xt_value value);
364
379
  /* Materialise a first-class runtime method value (`arr.map`) as an unbound
365
380
  * closure that expects the receiver through `this`. Returns `XT_UNDEFINED` when