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
@@ -0,0 +1,19 @@
1
+ # Extension mechanism
2
+
3
+ > Part of [Implemented syntax and features](../implemented.md) · [简体中文](../zh-CN/implemented/extensions.md)
4
+
5
+ Location: `src/extensions/registry.ts`, `src/extensions/node/`
6
+
7
+ - An extension is a plain object: `runtimeSources()` (extra C sources), `linkerFlags()` (extra link flags), `builtins()` (global identifier → runtime symbol, uniform `(argc, argv)` ABI) and `modules()` (import specifier → named exports / namespace).
8
+ - `ExtensionRegistry`: register / unregister / lookup / aggregate builtins, modules, runtime sources and link flags.
9
+ - The built-in core extension `core`: exposes `print` (mapped to `xt_println`), always registered.
10
+ - The Node extension `node`:
11
+ - Modular organisation: `src/extensions/node/fs/` + `runtime/ext_node/fs/read_file.c`
12
+ - Exposes importable modules (`fs`, `fs/promises`, `path`, `os`, `process`, ...) under both bare and `node:`-prefixed specifiers; `import { readFileSync } from "fs"` resolves to `xt_node_read_text_file`, and `path`/`os`/`process` map exports onto the namespace dispatchers.
13
+ - Adding a new module only requires a new directory plus a C implementation; the core compiler never changes.
14
+ - Native C++/Rust extensions (`src/extensions/native.ts`, `--ext-native`):
15
+ - `nativeObjects()` links pre-built objects/static archives that expose `extern "C"` symbols with the `(argc, argv)` ABI; a JSON manifest maps them onto builtins/modules (`linkerFlags` / `linkerFlagsByPlatform` cover C++/Rust runtimes).
16
+ - Authoring helpers live in `runtime/xt_ext.h` (C/C++) and `runtime/xt_ext.rs` (Rust); runnable projects are under `examples/extensions/`.
17
+ - The driver links the artifacts verbatim and the incremental cache fingerprints their contents, so a rebuilt library invalidates the cached binary.
18
+ - CI builds both language examples on Linux, macOS and Windows; on Windows the system clang links with the MSVC ABI (C++ `-lmsvcprt`, Rust `*-pc-windows-msvc` plus the Windows system libraries).
19
+ - Node module coverage is documented in [Node extension](./node.md).
@@ -0,0 +1,44 @@
1
+ # fetch
2
+
3
+ > Part of [Implemented syntax and features](../implemented.md) · [简体中文](../zh-CN/implemented/fetch.md)
4
+
5
+ Location: `runtime/xt_fetch.c`, `runtime/xt_fetch/async.inc`, `runtime/xt_async_io.c`.
6
+
7
+ - Global `fetch(input, init)` is an HTTP/1.1 client. The blocking socket exchange
8
+ (`getaddrinfo`, connect, send, receive) runs on the asynchronous I/O worker
9
+ pool, so a request in flight does **not** stall the event loop: timers, sockets
10
+ and other `await`s keep running and the promise settles when the reactor
11
+ dispatches the completed exchange.
12
+ - Redirects are followed on the main thread: each hop is one offloaded
13
+ exchange, up to 20 redirects, and a 301/302/303 switches POST to GET.
14
+ - It accepts `http://` URLs only — `https://` rejects with a `TypeError` because
15
+ no TLS backend is linked.
16
+ - Options: `method`, `headers` (plain object or `Headers`), `body` and `redirect`
17
+ (`follow` / `manual` / `error`).
18
+ - The resolved `Response`-shaped object exposes `ok` / `status` / `statusText` /
19
+ `url` / `headers` plus `text()` / `json()` / `arrayBuffer()` / `bytes()` /
20
+ `clone()`. The body is buffered before the promise settles; streaming bodies
21
+ are not implemented.
22
+ - `Headers` is case-insensitive with `get` / `has` / `set` / `append` /
23
+ `delete` / `keys` / `values` / `entries` / `forEach` / `getSetCookie`.
24
+ - Invalid URLs and network failures reject with a `TypeError`.
25
+
26
+ ```ts
27
+ async function main(): Promise<void> {
28
+ const response = await fetch("http://127.0.0.1:8080/status");
29
+ console.log(response.status, await response.text());
30
+ }
31
+ main();
32
+ ```
33
+
34
+ A timer scheduled before the request completes fires while the exchange is still
35
+ in flight:
36
+
37
+ ```ts
38
+ const pending = fetch("http://127.0.0.1:8080/slow");
39
+ setTimeout(() => console.log("timer"), 10); // runs before the 150ms response
40
+ await pending;
41
+ ```
42
+
43
+ Known limits (only `http://`, no TLS, buffered body) are listed in
44
+ [Runtime deviations](../unimplemented/deviations.md).
@@ -0,0 +1,23 @@
1
+ # Lexer
2
+
3
+ > Part of [Implemented syntax and features](../implemented.md) · [简体中文](../zh-CN/implemented/lexer.md)
4
+
5
+ Location: `src/lexer/scanner.ts`, `src/lexer/token.ts`
6
+
7
+ - Full token classification: identifiers, keywords, private identifiers, numbers, strings, templates, regex (scanning), all punctuation and operators.
8
+ - Full keyword table: `abstract any as asserts async await bigint boolean break case catch class const constructor continue debugger declare default delete do else enum export extends false finally for from function get if implements import in infer instanceof interface is keyof let module namespace never new null number object package private protected public readonly return satisfies set static string super switch symbol this throw true try type typeof undefined unique unknown var void while with yield`
9
+ - Numeric literals:
10
+ - Decimal, `0x` hex, `0o` octal, `0b` binary
11
+ - Underscore separators `1_000_000`
12
+ - Fractions, exponents `1.5e3`
13
+ - BigInt literals (`10n`, `0xFFn`) evaluate to arbitrary-precision integers (arithmetic, bitwise, shifts, comparisons, `toString(radix)`, `BigInt()` / `BigInt.asIntN` / `BigInt.asUintN`)
14
+ - BigInt literal values are parsed exactly into `bigint` (never routed through `Number`), so the token / AST value of a literal beyond 2^53 keeps full precision
15
+ - String literals:
16
+ - Single / double quotes
17
+ - Escapes: `\n \t \r \b \f \0 \\ \' \"`, `\xHH`, `\uHHHH`, `\u{...}`
18
+ - Template literals (lexer level): no-substitution templates, `TemplateHead`, `TemplateMiddle`, `TemplateTail`, with `${}` and escapes.
19
+ - Regex literal scanning (`/pattern/flags`), distinguishing division `/`.
20
+ - Private identifiers `#name`.
21
+ - Comments: line `//` and block `/* */` (with unterminated diagnostics).
22
+ - Newline and whitespace tracking (for ASI), BOM / CRLF normalization (`SourceFile`).
23
+ - Lexical diagnostics: unterminated string / template / comment, illegal character, illegal number, illegal escape.
@@ -0,0 +1,28 @@
1
+ # Module system
2
+
3
+ > Part of [Implemented syntax and features](../implemented.md) · [简体中文](../zh-CN/implemented/modules.md)
4
+
5
+ Location: `src/parser/parser.ts` (syntax), `src/driver/modules.ts` (bundling),
6
+ `src/driver/frontend.ts` (`parseEntry`).
7
+
8
+ ## Syntax
9
+
10
+ - `import default, { named } from "..."`, `import * as ns from "..."` (namespace imports of relative modules are lowered to a synthetic object literal; extension modules such as `path` are also supported), `import "./side-effect"`, `import type`
11
+ - `export default`, `export { a as b }`, `export *`, `export =`
12
+ - Import attributes (`with` / `assert`)
13
+
14
+ ## Runtime semantics
15
+
16
+ - The **runtime semantics** of `import` / `export` are handled at the driver layer by `src/driver/modules.ts`: it recursively resolves relative dependencies *and* bare `node_modules` packages (following `exports` / `module` / `main` and package subpaths), renames top-level symbols with a per-module prefix, rewrites references, merges into a single file and rebinds.
17
+ - Packages may be ESM or CommonJS: a CommonJS file under `node_modules` gets a synthetic `module`/`exports` pair, its `require` calls are lowered to the bundled dependency's exports, and its statically-detected exports are exposed to ESM importers. `require()` outside `node_modules` is still rejected with a hint to use `import`. Circular dependencies error out.
18
+ - A `.js`-family specifier resolves to its `.ts` source, and TypeScript suffixes are preferred over JavaScript siblings when the specifier omits the extension; plain `.js` / `.jsx` / `.mjs` / `.cjs` sources are bundled directly.
19
+ - Imported bindings and namespace members are snapshots at module-evaluation time (no live bindings) — see [Unimplemented: module system](../unimplemented/modules.md).
20
+ - Type-only imports and re-exports (`import type { T } from "..."`, `import { type T } from "..."`, `export type { T } from "..."`) are erased. They are **not** module edges: the target is not loaded or bundled, and a type-only cycle between modules is not a circular dependency. Use a side-effect import (`import "./mod"`) when a module must be evaluated without binding a name.
21
+
22
+ ## import.meta
23
+
24
+ - `import.meta.url` / `.dirname` / `.filename`, resolved from the running executable's path.
25
+
26
+ ## Extension modules
27
+
28
+ - Extension modules (such as `fs`) are importable by bare or `node:`-prefixed specifier and resolve to their runtime entries; see [Extensions](./extensions.md).
@@ -0,0 +1,17 @@
1
+ # `assert`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/assert.md)
4
+
5
+ Location: `src/extensions/node/assert/index.ts`, `runtime/ext_node/assert/assert.c`
6
+
7
+ `assert.ok` / `fail` / `equal` / `notEqual` / `strictEqual` / `notStrictEqual` /
8
+ `deepEqual` / `notDeepEqual` / `deepStrictEqual` / `notDeepStrictEqual` /
9
+ `throws` / `doesNotThrow` / `rejects` / `doesNotReject` / `match` /
10
+ `doesNotMatch` / `ifError`.
11
+
12
+ Named imports and the namespace form both dispatch through `xt_assert_static`:
13
+
14
+ ```ts
15
+ import assert from "node:assert";
16
+ assert.strictEqual(1 + 1, 2);
17
+ ```
@@ -0,0 +1,29 @@
1
+ # `buffer`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/buffer.md)
4
+
5
+ Location: `src/extensions/node/buffer/index.ts`, `runtime/ext_node/buffer/buffer.c`
6
+
7
+ xbintsc has no native binary value type, so `Buffer` is represented as a
8
+ **plain object**: each byte is a numeric property `"0".."n-1"`, plus a `length`
9
+ property, sharing the `xt_buffer_proto()` prototype that provides instance
10
+ methods. `xt_node_is_buffer` / `xt_node_buffer_bytes` let other modules access
11
+ bytes across modules.
12
+
13
+ | Static method | Notes |
14
+ | --- | --- |
15
+ | `Buffer.from(value[, encoding])` | construct from a string (hex / base64 / utf8), array or Buffer |
16
+ | `Buffer.alloc(size[, fill])` | allocate and fill |
17
+ | `Buffer.allocUnsafe(size)` | allocate |
18
+ | `Buffer.isBuffer(value)` | test |
19
+ | `Buffer.byteLength(value[, encoding])` | byte length |
20
+ | `Buffer.concat(list[, totalLength])` | concatenate |
21
+ | `Buffer.compare(a, b)` | compare |
22
+
23
+ Instance methods: `toString([encoding])`, `toJSON()`, `slice(start, end)`, `subarray(...)`, `equals(other)`, `compare(other)`, `copy(target[, targetStart, sourceStart, sourceEnd])`, `write(string[, offset[, length[, encoding]]])`, `fill(value)`, `reverse()`, `indexOf(value)`, `lastIndexOf(value)`, `includes(value)`, `keys()`, `values()`, plus `readUInt8/UInt16LE/UInt16BE/UInt32LE/UInt32BE`, `writeUInt8/UInt16LE/UInt16BE/UInt32LE/UInt32BE`.
24
+
25
+ ```ts
26
+ const buf = Buffer.from("hello");
27
+ console.log(buf.toString(), buf.length); // hello 5
28
+ console.log(Buffer.alloc(4, 65).toString()); // AAAA
29
+ ```
@@ -0,0 +1,29 @@
1
+ # `child_process`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/child-process.md)
4
+
5
+ Location: `src/extensions/node/child_process/index.ts`, `runtime/ext_node/child_process/child_process.c`
6
+
7
+ `spawnSync(command, args[, options])` runs a program to completion and returns
8
+ `{ status, stdout, stderr }`. `options.cwd` sets the working directory and
9
+ `options.stdio: "inherit"` hands the child the parent's stdout/stderr (used by
10
+ `xbintsc run`, so a compiled program's output streams live); otherwise
11
+ stdout/stderr are captured as UTF-8 strings.
12
+
13
+ | Option | Notes |
14
+ | --- | --- |
15
+ | `cwd` | working directory for the child |
16
+ | `stdio: "inherit"` | share the parent's stdout/stderr instead of capturing |
17
+ | `encoding` | accepted and ignored (output is always decoded as UTF-8) |
18
+
19
+ On Windows the child is launched with `CreateProcess` and its stdout/stderr are
20
+ drained through anonymous pipes by reader threads. No temporary files are used,
21
+ so a locked-down `%TEMP%` cannot break `spawnSync`, and output larger than a pipe
22
+ buffer cannot deadlock.
23
+
24
+ ```ts
25
+ import { spawnSync } from "child_process";
26
+
27
+ const result = spawnSync("clang", ["--version"], { encoding: "utf8" });
28
+ console.log(result.status, result.stdout.split("\n")[0]);
29
+ ```
@@ -0,0 +1,9 @@
1
+ # `crypto`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/crypto.md)
4
+
5
+ Location: `src/extensions/node/crypto/index.ts`, `runtime/ext_node/crypto/crypto.c`
6
+
7
+ - `createHash(algorithm)` returns a hash object with `update(...)` and `digest([encoding])`.
8
+ - The streaming form (`setEncoding` / `write` / `end` / `read`) is supported.
9
+ - SHA-1 and SHA-256 are available.
@@ -0,0 +1,15 @@
1
+ # `dgram`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/dgram.md)
4
+
5
+ Location: `src/extensions/node/dgram/index.ts`, `runtime/ext_node/dgram/dgram.c`
6
+
7
+ UDP sockets. `dgram.createSocket(type | options[, cb])` returns an EventEmitter.
8
+
9
+ | Method | Notes |
10
+ | --- | --- |
11
+ | `bind([port][, address][, cb])` | bind (`send` auto-binds if unbound) |
12
+ | `send(msg[, offset, length,] port[, address][, cb])` | send a datagram |
13
+ | `close([cb])` / `address()` | close / query address |
14
+ | `setBroadcast(b)` / `setTTL(n)` / `setMulticastTTL(n)` | socket options |
15
+ | `on('message', (msg, rinfo) => ...)` | receive a datagram; `rinfo` has `address` / `port` / `family` / `size` |
@@ -0,0 +1,37 @@
1
+ # `events`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/events.md)
4
+
5
+ Location: `src/extensions/node/events/index.ts`, `runtime/ext_node/events/events.c`
6
+
7
+ Provides a standalone `EventEmitter`, available both as a **global constructor**
8
+ (`new EventEmitter()`) and as a named export
9
+ (`import { EventEmitter } from "events"`). Instances share the runtime emitter
10
+ used by `stream` / `net` / `http` (listeners live in an internal `__xt_events`
11
+ property), with the fuller `events` surface layered on top:
12
+
13
+ | Method | Notes |
14
+ | --- | --- |
15
+ | `on(name, fn)` / `addListener(name, fn)` | append a listener |
16
+ | `once(name, fn)` | fire at most once, then remove itself |
17
+ | `prependListener(name, fn)` / `prependOnceListener(name, fn)` | insert at the front |
18
+ | `off(name, fn)` / `removeListener(name, fn)` | remove a listener |
19
+ | `removeAllListeners([name])` | clear one event (or all events) |
20
+ | `emit(name[, ...args])` | invoke listeners |
21
+ | `listeners(name)` / `rawListeners(name)` | listener array |
22
+ | `listenerCount(name)` | number of listeners |
23
+ | `eventNames()` | names that currently have listeners |
24
+ | `setMaxListeners(n)` / `getMaxListeners()` | bookkeeping (default 10) |
25
+
26
+ Statics reachable through the namespace (`import ee from "events"`):
27
+ `listenerCount`, `getEventListeners`, `getMaxListeners`, `setMaxListeners`,
28
+ `once`, `addAbortListener`.
29
+
30
+ ```ts
31
+ import { EventEmitter } from "events";
32
+
33
+ const em = new EventEmitter();
34
+ em.once("ready", () => console.log("ready"));
35
+ em.emit("ready"); // ready
36
+ em.emit("ready"); // nothing: the listener already ran
37
+ ```
@@ -0,0 +1,49 @@
1
+ # `fs/promises`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/fs-promises.md)
4
+
5
+ Location: `src/extensions/node/fs-promises/index.ts`, `runtime/ext_node/fs/async_*.c`,
6
+ `runtime/ext_node/fs/promises.c`.
7
+
8
+ Every function submits a job to the runtime's asynchronous I/O pool
9
+ (`runtime/xt_async_io.c`): the blocking syscall runs on a worker thread and the
10
+ promise settles on the event loop. `await` therefore yields while a large read,
11
+ a slow network filesystem or a descriptor operation is in progress, and `then` /
12
+ `catch` keep the usual Promise semantics. Failures **reject** with the same
13
+ Node-shaped `Error` (with `code` / `errno` / `syscall` / `path`) that the
14
+ synchronous form throws.
15
+
16
+ `fs.promises` is also reachable from the `fs` module
17
+ (`import { promises as fsp } from "fs"`), and both namespaces expose a
18
+ `constants` object.
19
+
20
+ Promise exports: `readFile`, `writeFile`, `appendFile`, `mkdir`, `readdir`,
21
+ `rm`, `unlink`, `rmdir`, `rename`, `copyFile`, `cp`, `realpath`, `stat`,
22
+ `lstat`, `statfs`, `access`, `open`, `chmod`, `lchmod`, `chown`, `lchown`,
23
+ `truncate`, `utimes`, `lutimes`, `link`, `symlink`, `readlink`, `mkdtemp`,
24
+ `opendir`, `glob`, `watch`.
25
+
26
+ `open(...)` resolves to a **`FileHandle`** with:
27
+ `read`, `write`, `readFile`, `writeFile`, `appendFile`, `close`, `stat`,
28
+ `truncate`, `chmod`, `chown`, `utimes`, `sync`, `datasync`. Those methods are
29
+ offloaded too; `read(buffer, …)` fills the caller's `Buffer` when the worker
30
+ completes.
31
+
32
+ ```ts
33
+ import { readFile, writeFile, open } from "fs/promises";
34
+
35
+ async function main(): Promise<void> {
36
+ await writeFile("/tmp/a.txt", "hi");
37
+ console.log(await readFile("/tmp/a.txt"));
38
+ const handle = await open("/tmp/a.txt", "r");
39
+ console.log(await handle.readFile("utf8"));
40
+ await handle.close();
41
+ }
42
+ main();
43
+ ```
44
+
45
+ Work runs on a small fixed pool (four workers) and completions are dispatched in
46
+ submission order per worker; independent operations can overlap. A job never
47
+ blocks another `await`, a timer or a socket callback.
48
+
49
+ Known deviations are listed in [Unimplemented: `fs/promises`](../../unimplemented/node/fs-promises.md).
@@ -0,0 +1,112 @@
1
+ # `fs`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/fs.md)
4
+
5
+ Location: `src/extensions/node/fs/*.ts`, `runtime/ext_node/fs/*.c`
6
+
7
+ ## Available functions (imported from `fs`)
8
+
9
+ | Imported function | Runtime symbol | Notes |
10
+ | --- | --- | --- |
11
+ | `readFileSync(path[, options])` | `xt_node_read_text_file` | synchronously read a file, returns a string; supports encoding options |
12
+ | `readTextFile(path)` | `xt_node_read_text_file` | alias of `readFileSync` (same symbol) |
13
+ | `writeFileSync(path, data[, options])` | `xt_node_write_file` | overwrite write; accepts a string or a `Buffer` |
14
+ | `appendFileSync(path, data[, options])` | `xt_node_append_file` | append write; accepts a string or a `Buffer` |
15
+ | `existsSync(path)` | `xt_node_exists` | whether it exists, returns a boolean |
16
+ | `readdirSync(path[, options])` | `xt_node_read_dir` | directory entry names; `{ withFileTypes: true }` returns `Dirent`s, `{ recursive: true }` recurses |
17
+ | `mkdirSync(path[, options])` | `xt_node_mkdir` | create a directory; `{ recursive: true }` creates recursively, `{ mode }` is honoured |
18
+ | `rmSync(path[, options])` | `xt_node_rm` | delete a file/directory; `{ recursive: true }` deletes recursively |
19
+ | `rmdirSync(path[, options])` | `xt_node_rmdir` | delete an empty directory |
20
+ | `unlinkSync(path)` | `xt_node_unlink` | delete a file |
21
+ | `renameSync(oldPath, newPath)` | `xt_node_rename` | rename / move |
22
+ | `copyFileSync(src, dest[, flags])` | `xt_node_copy_file` | copy a file; honours `COPYFILE_EXCL` |
23
+ | `cpSync(src, dest[, options])` | `xt_node_cp` | recursive copy; `recursive`, `force`, `errorOnExist`, `dereference`, `preserveTimestamps` |
24
+ | `realpathSync(path)` | `xt_node_realpath` | resolve to an absolute path |
25
+ | `statSync(path)` | `xt_node_stat` | file metadata object (follows symlinks) |
26
+ | `lstatSync(path)` | `xt_node_lstat` | file metadata object (does not follow symlinks) |
27
+ | `statfsSync(path)` | `xt_node_statfs` | filesystem statistics (`bsize`, `blocks`, `bfree`, …) |
28
+ | `accessSync(path[, mode])` | `xt_node_access` | check accessibility |
29
+ | `chmodSync(path, mode)` | `xt_node_chmod` | change permissions |
30
+ | `lchmodSync(path, mode)` | `xt_node_lchmod` | change symlink permissions |
31
+ | `chownSync(path, uid, gid)` | `xt_node_chown` | change ownership |
32
+ | `lchownSync(path, uid, gid)` | `xt_node_lchown` | change symlink ownership |
33
+ | `truncateSync(path[, len])` | `xt_node_truncate` | truncate a file |
34
+ | `utimesSync(path, atime, mtime)` | `xt_node_utimes` | set access/modification time (number of seconds or a `Date`) |
35
+ | `lutimesSync(path, atime, mtime)` | `xt_node_lutimes` | set symlink times |
36
+ | `mkdtempSync(prefix)` | `xt_node_mkdtemp` | create a unique temporary directory |
37
+ | `linkSync(existing, newPath)` | `xt_node_link` | hard link |
38
+ | `symlinkSync(target, path[, type])` | `xt_node_symlink` | symbolic link |
39
+ | `readlinkSync(path)` | `xt_node_readlink` | read a symbolic link target |
40
+ | `opendirSync(path[, options])` | `xt_node_opendir` | returns a `Dir` (`readSync` / `closeSync` / `read` / `close`) |
41
+ | `globSync(pattern[, options])` | `xt_node_glob` | glob matching (`*`, `?`, `[...]`, `**`), `{ cwd, withFileTypes }` |
42
+ | `openSync(path[, flags[, mode]])` | `xt_node_open` | open a file descriptor |
43
+ | `closeSync(fd)` | `xt_node_close` | close a descriptor |
44
+ | `readSync(fd, buffer, offset, length, position)` | `xt_node_read` | read into a `Buffer` |
45
+ | `writeSync(fd, data[, offset[, length[, position]]])` | `xt_node_write` | write a string / `Buffer` |
46
+ | `readvSync(fd, buffers[, position])` | `xt_node_readv` | scatter read |
47
+ | `writevSync(fd, buffers[, position])` | `xt_node_writev` | gather write |
48
+ | `fstatSync(fd)` | `xt_node_fstat` | `stat` for a descriptor |
49
+ | `fsyncSync(fd)` / `fdatasyncSync(fd)` | `xt_node_fsync` / `xt_node_fdatasync` | flush a descriptor |
50
+ | `ftruncateSync(fd[, len])` | `xt_node_ftruncate` | truncate a descriptor |
51
+ | `fchmodSync(fd, mode)` | `xt_node_fchmod` | `chmod` for a descriptor |
52
+ | `fchownSync(fd, uid, gid)` | `xt_node_fchown` | `chown` for a descriptor |
53
+ | `futimesSync(fd, atime, mtime)` | `xt_node_futimes` | `utimes` for a descriptor |
54
+ | `watch(filename[, options][, listener])` | `xt_node_watch` | returns an emitter-shaped watcher (never fires; see [Unimplemented: `fs`](../../unimplemented/node/fs.md)) |
55
+ | `watchFile(filename[, options], listener)` | `xt_node_watch_file` | polling-shaped `StatWatcher` (never fires) |
56
+ | `unwatchFile(filename[, listener])` | `xt_node_unwatch_file` | stop watching |
57
+ | `constants` | `xt_fs_constants` | `F_OK` / `R_OK` / `W_OK` / `X_OK`, `COPYFILE_*`, `O_*`, `S_IF*` (host values) |
58
+ | `promises` | `xt_fs_promises` | the `fs/promises` facade (see [`fs/promises`](./fs-promises.md)) |
59
+
60
+ ## Encoding support
61
+
62
+ The `options` of `readFileSync` / `writeFileSync` / `appendFileSync` may be an
63
+ encoding string or `{ encoding: "..." }`:
64
+
65
+ | Encoding | Read | Write |
66
+ | --- | --- | --- |
67
+ | default / `utf8` / `utf-8` / `ascii` / `latin1` / `binary` | raw UTF-8 text | write as text bytes |
68
+ | `hex` | lowercase hex string | parse hex then write |
69
+ | `base64` | Base64 string | parse Base64 then write |
70
+ | `base64url` | Base64url string | parse Base64url then write |
71
+ | `utf16le` / `ucs2` | raw bytes read as text (no UTF-16 decoding) | write as UTF-8 text |
72
+
73
+ > `readFileSync` still returns a **string** by default rather than a `Buffer`,
74
+ > even though the `Buffer` class exists, so that `console.log(readFileSync(p))`
75
+ > keeps printing text.
76
+
77
+ ## `statSync` return structure
78
+
79
+ Returns a plain object with numeric properties: `size`, `mode`, `uid`, `gid`, `dev`, `ino`, `nlink`, `rdev`, `blksize`, `blocks`, `atimeMs`, `mtimeMs`, `ctimeMs`, `birthtimeMs`.
80
+ Methods (native closures, callable): `isFile()`, `isDirectory()`, `isSymbolicLink()`, `isFIFO()`, `isSocket()`, `isBlockDevice()`, `isCharacterDevice()`.
81
+
82
+ ## How to call
83
+
84
+ `fs` exports are reached through an `import` (or the `node:fs` alias), not as bare
85
+ globals:
86
+
87
+ ```ts
88
+ import { readFileSync, writeFileSync, existsSync } from "fs";
89
+
90
+ const text = readFileSync("examples/data.txt");
91
+ writeFileSync("/tmp/out.txt", text);
92
+ console.log(existsSync("/tmp/out.txt"));
93
+ ```
94
+
95
+ ## Error handling
96
+
97
+ On failure the functions **throw** a Node-shaped `Error` object carrying
98
+ `name` (`Error`), `message`, `code` (e.g. `ENOENT`), `errno` (the numeric
99
+ `errno`), `syscall` and `path`. `existsSync` still returns a boolean and never
100
+ throws.
101
+
102
+ ```ts
103
+ import { readFileSync } from "fs";
104
+ try {
105
+ readFileSync("/does/not/exist");
106
+ } catch (error) {
107
+ console.log((error as any).code); // ENOENT
108
+ }
109
+ ```
110
+
111
+
112
+ Known deviations are listed in [Unimplemented: `fs`](../../unimplemented/node/fs.md).
@@ -0,0 +1,21 @@
1
+ # `http`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/http.md)
4
+
5
+ Location: `src/extensions/node/http/index.ts`, `runtime/ext_node/http/http.c`
6
+
7
+ The server wraps a `net` server: each connection accumulates bytes until a
8
+ complete request (request line + headers + `Content-Length` body) is available,
9
+ then invokes the `request` listener with `req`/`res`. The client wraps a `net`
10
+ socket, writes an HTTP/1.1 request and parses the response after the connection
11
+ closes.
12
+
13
+ | API | Notes |
14
+ | --- | --- |
15
+ | `http.createServer([requestListener])` | create an HTTP server |
16
+ | `http.request(options[, cb])` | create a `ClientRequest` (`write` / `end` / `setHeader`) |
17
+ | `http.get(url[, cb])` | issue a GET |
18
+
19
+ `IncomingMessage` (`req` / response): `method`, `url`, `httpVersion`, `headers`, `statusCode`, `data` / `end` events, `setEncoding`.
20
+
21
+ `ServerResponse` (`res`): `writeHead(status[, message][, headers])`, `setHeader` / `getHeader` / `removeHeader` / `getHeaders`, `write(chunk)`, `end([chunk])`, events `finish` / `close`. Responses always carry `Connection: close` (no keep-alive).
@@ -0,0 +1,17 @@
1
+ # `net`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/net.md)
4
+
5
+ Location: `src/extensions/node/net/index.ts`, `runtime/ext_node/net/net.c`
6
+
7
+ TCP server and client, built on the core event loop.
8
+
9
+ | API | Notes |
10
+ | --- | --- |
11
+ | `net.createServer([connectionListener])` | create a TCP server (equivalent to the `Server` constructor) |
12
+ | `net.connect(...)` / `net.createConnection(...)` | connect (blocking connect, then registers with the event loop) |
13
+ | `net.isIP(s)` / `net.isIPv4(s)` / `net.isIPv6(s)` | address test |
14
+
15
+ `Server`: `listen(port[, host][, cb])`, `close([cb])`, `address()`, `getConnections(cb)`, events `listening` / `connection` / `close`.
16
+
17
+ `Socket`: `write(data[, cb])`, `end([data])`, `destroy()`, `address()`, `setEncoding(enc)`, `pause()` / `resume()`, events `data` / `end` / `close` / `connect` / `error`.
@@ -0,0 +1,22 @@
1
+ # `os`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/os.md)
4
+
5
+ Location: `src/extensions/node/os/index.ts`, `runtime/ext_node/os/os.c`
6
+
7
+ Uses `os.<name>(...)` namespace calls, lowered to `xt_os_static(<name>, argc, argv)`.
8
+ Import the module as a namespace (`import os from "os"`) or pull in individual
9
+ functions (`import { platform } from "os"`).
10
+
11
+ | Method | Notes |
12
+ | --- | --- |
13
+ | `os.platform()` | `darwin` / `linux` / `win32` / ... |
14
+ | `os.arch()` | `x64` / `arm64` / `ia32` / `arm` |
15
+ | `os.type()` | `Darwin` / `Linux` / `Windows_NT` / ... |
16
+ | `os.release()` | kernel version |
17
+ | `os.endianness()` | `LE` / `BE` |
18
+ | `os.homedir()` | user home directory |
19
+ | `os.tmpdir()` | temporary directory |
20
+ | `os.hostname()` | hostname |
21
+ | `os.totalmem()` / `os.freemem()` | total / free memory (bytes) |
22
+ | `os.cpus()` | array of CPU entries (`model` / `speed` placeholders) |
@@ -0,0 +1,33 @@
1
+ # `path`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/path.md)
4
+
5
+ Location: `src/extensions/node/path/index.ts`, `runtime/ext_node/path/path.c`
6
+
7
+ Uses `path.<name>(...)` namespace calls, which the compiler lowers to
8
+ `xt_path_static(<name>, argc, argv)`. Results are produced with the POSIX `/`
9
+ separator on every platform (Windows accepts `/`), while inputs may use native
10
+ Windows separators: on Windows both `/` and `\` are recognised and drive
11
+ prefixes (`C:`) are preserved, so the self-hosted compiler resolves
12
+ drive-letter paths correctly.
13
+ Import the module as a namespace (`import path from "path"` / `import * as path
14
+ from "path"`) or pull in individual methods (`import { join } from "path"`).
15
+
16
+ | Method | Notes |
17
+ | --- | --- |
18
+ | `path.join(...parts)` | join and normalize |
19
+ | `path.resolve(...parts)` | resolve to an absolute path |
20
+ | `path.normalize(path)` | normalize |
21
+ | `path.dirname(path)` | directory name |
22
+ | `path.basename(path[, ext])` | file name, optionally without extension |
23
+ | `path.extname(path)` | extension |
24
+ | `path.isAbsolute(path)` | whether it is an absolute path |
25
+ | `path.relative(from, to)` | relative path |
26
+
27
+ ```ts
28
+ import path from "path";
29
+ import { basename } from "path";
30
+
31
+ console.log(path.join("a", "b", "..", "c")); // a/c
32
+ console.log(basename("/x/y/z.txt")); // z.txt
33
+ ```
@@ -0,0 +1,23 @@
1
+ # `process`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/process.md)
4
+
5
+ Location: `src/extensions/node/process/index.ts`, `runtime/ext_node/process/process.c`
6
+
7
+ Method calls lower to `xt_process_call(<name>, argc, argv)`, property access to `xt_process_get(<name>)`.
8
+ Import the object (`import process from "process"`) to reach these.
9
+
10
+ | Method / property | Notes |
11
+ | --- | --- |
12
+ | `process.cwd()` | current working directory |
13
+ | `process.exit([code])` | exit the process |
14
+ | `process.uptime()` | process uptime (seconds) |
15
+ | `process.hrtime()` | `[seconds, nanoseconds]` array |
16
+ | `process.getuid()` | user ID (returns 0 on Windows) |
17
+ | `process.platform` / `process.arch` | platform / architecture |
18
+ | `process.pid` / `process.ppid` | process ID / parent process ID |
19
+ | `process.argv` | argument array (`argv[0]` is the executable) |
20
+ | `process.env` | environment variable object |
21
+ | `process.version` / `process.title` | placeholder strings |
22
+
23
+ > `argv` is captured by the generated `main` via `xt_set_program_args` and provided to the runtime.
@@ -0,0 +1,20 @@
1
+ # `querystring`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/querystring.md)
4
+
5
+ Location: `src/extensions/node/querystring/index.ts`, `runtime/ext_node/querystring/querystring.c`
6
+
7
+ | Function | Notes |
8
+ | --- | --- |
9
+ | `parse(str[, sep[, eq]])` / `decode` | parse into an object; repeated keys become arrays |
10
+ | `stringify(obj[, sep[, eq]])` / `encode` | serialize; spaces become `+`, arrays repeat the key |
11
+ | `escape(str)` / `unescape(str)` | percent-encode / decode (`+` decodes to a space) |
12
+
13
+ Defaults: `sep = "&"`, `eq = "="`.
14
+
15
+ ```ts
16
+ import { parse, stringify } from "querystring";
17
+
18
+ const q = parse("a=1&b=2&b=3"); // { a: "1", b: ["2", "3"] }
19
+ console.log(stringify({ x: "a b" })); // x=a+b
20
+ ```
@@ -0,0 +1,8 @@
1
+ # `stream/promises`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/stream-promises.md)
4
+
5
+ Location: `src/extensions/node/stream-promises/index.ts`, `runtime/ext_node/stream/pipeline.c`
6
+
7
+ - `pipeline(...)` drains the given streams synchronously and returns an already-resolved promise, so `await pipeline(...)` works.
8
+ - `zlib.createGzip()` is the supported transform stage; see [`zlib`](./zlib.md).
@@ -0,0 +1,19 @@
1
+ # `stream`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/stream.md)
4
+
5
+ Location: `src/extensions/node/stream/index.ts`, `runtime/ext_node/stream/stream.c`
6
+
7
+ `Readable` / `Writable` / `Duplex` / `Transform` / `PassThrough` are used as
8
+ **global constructors** (`new Readable()` etc.); statics such as
9
+ `stream.Readable.from(...)` are resolved through the `stream` namespace. Streams
10
+ are EventEmitters with a **synchronous event model**: `on('data')` flushes the
11
+ `push` buffer, and `write` delivers immediately.
12
+
13
+ | Method | Notes |
14
+ | --- | --- |
15
+ | `push(chunk)` / `read([n])` | Readable side |
16
+ | `write(chunk)` / `end([chunk])` | Writable side |
17
+ | `pipe(destination)` | forward data |
18
+ | `on('data' / 'end' / 'finish')` | events |
19
+ | `pause()` / `resume()` / `setEncoding(enc)` / `destroy()` | flow control |
@@ -0,0 +1,10 @@
1
+ # `test`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/test.md)
4
+
5
+ Location: `src/extensions/node/test/index.ts`, `runtime/ext_node/test/test.c`
6
+
7
+ - `test(name, fn)` runs `fn` immediately, catches assertion failures and reports TAP output.
8
+ - `it` / `describe` / `skip` / `todo` / `only` and the `before` / `after` / `beforeEach` / `afterEach` hooks.
9
+ - A failure makes the process exit non-zero.
10
+ - The default export is callable, so `import test from "node:test"` works.
@@ -0,0 +1,8 @@
1
+ # `url`
2
+
3
+ > Part of [Node extension: implemented](../node.md) · [简体中文](../../zh-CN/implemented/node/url.md)
4
+
5
+ Location: `src/extensions/node/url/index.ts`, `runtime/ext_node/url/url.c`
6
+
7
+ - `pathToFileURL(path)` and `fileURLToPath(url)`.
8
+ - These are the helpers used to relate `import.meta.url`, `process.argv[1]` and filesystem paths.