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
@@ -1,533 +1,6 @@
1
- # xbintsc Node 扩展已实现功能
1
+ # Node 扩展:已实现(已迁移)
2
2
 
3
- > 语言 / Language:[English](../node-implemented.md) | **简体中文**
4
-
5
- 本文档基于对 Node 扩展源码(`src/extensions/node/`)与 C 运行时(`runtime/ext_node/`)的逐文件核对整理,列出当前 **Node 扩展真正可用** 的功能与接口。
6
-
7
- > 相关文档:
8
- > - 核心语言能力见 [implemented.md](implemented.md) / [unimplemented.md](unimplemented.md)
9
- > - Node 扩展未实现部分见 [node-unimplemented.md](node-unimplemented.md)
10
-
11
- ---
12
-
13
- ## 1. 扩展机制(已实现)
14
-
15
- 实现位置:`src/extensions/node/index.ts`、`src/extensions/node/module.ts`、`src/extensions/registry.ts`
16
-
17
- - Node 扩展通过统一的 `Extension` 对象接入,仅在注册时编译并链接其 C 源。
18
- - 通过 CLI 开启:
19
-
20
- ```bash
21
- xbintsc run examples/node/read.ts --ext node
22
- ```
23
-
24
- - 模块化组织:每个 Node 模块一个子目录,与 C 实现一一对应:
25
-
26
- ```
27
- src/extensions/node/ runtime/ext_node/
28
- index.ts # nodeExtension fs/read_file.c
29
- module.ts # NodeModule 接口 fs/write_file.c
30
- fs/index.ts fs/fs_ops.c
31
- fs/read-file.ts fs/fs_common.h
32
- fs/write-file.ts fs/promises.c
33
- fs/fs-ops.ts fs/streams.c
34
- fs/streams.ts fs/fd_ops.c
35
- path/index.ts fs/meta_ops.c
36
- os/index.ts fs/link_ops.c
37
- process/index.ts fs/copy_ops.c
38
- buffer/index.ts fs/dir.c
39
- stream/index.ts fs/glob.c
40
- net/index.ts fs/watch.c
41
- dgram/index.ts fs/constants.c
42
- http/index.ts path/path.c
43
- fs-promises/index.ts os/os.c
44
- crypto/index.ts process/process.c
45
- url/index.ts buffer/buffer.c
46
- child_process/index.ts stream/stream.c
47
- events/index.ts net/net.c
48
- util/index.ts dgram/dgram.c
49
- querystring/index.ts http/http.c
50
- assert/index.ts node_common.h(事件发射器 / 编码助手)
51
- test/index.ts crypto/crypto.c
52
- zlib/index.ts url/url.c
53
- stream-promises/index.ts child_process/child_process.c
54
- worker_threads/index.ts events/events.c
55
- util/util.c
56
- querystring/querystring.c
57
- assert/assert.c
58
- test/test.c
59
- zlib/zlib.c
60
- stream/pipeline.c
61
- worker_threads/worker_threads.c
62
- ```
63
-
64
- - 核心事件循环:`runtime/xt_loop.c`(`select(2)` 反应堆),生成模块的 `main` 在微任务清空后调用 `xt_run_event_loop()`;无可注册 fd 或定时器时立即返回,因此纯计算程序不受影响。
65
-
66
- - `NodeModule` 接口:
67
- - `name`:模块名(如 `fs`)
68
- - `runtimeSources()`:该模块的 C 源
69
- - `builtins()`:全局标识符 → 运行时符号的映射(`path` / `os` / `process` 通过命名空间分发,故返回空表)
70
- - `namespace` / `exports()`:该模块的可导入命名空间与命名导出(`import { join } from "path"`、`import path from "path"`)
71
- - `resolveFrom(importMetaUrl, relative)`:把相对于当前模块目录的路径解析为绝对路径,用于定位 C 源。
72
-
73
- ---
74
-
75
- ## 2. `fs` 模块(已实现,仅同步 API)
76
-
77
- 实现位置:`src/extensions/node/fs/*.ts`、`runtime/ext_node/fs/*.c`
78
-
79
- ### 2.1 可用函数(从 `fs` 导入)
80
-
81
- | 导入函数 | 运行时符号 | 说明 |
82
- | --- | --- | --- |
83
- | `readFileSync(path[, options])` | `xt_node_read_text_file` | 同步读取文件,返回字符串;支持编码选项 |
84
- | `readTextFile(path)` | `xt_node_read_text_file` | `readFileSync` 的别名(同一符号) |
85
- | `writeFileSync(path, data[, options])` | `xt_node_write_file` | 覆盖写入;接受字符串或 `Buffer` |
86
- | `appendFileSync(path, data[, options])` | `xt_node_append_file` | 追加写入;接受字符串或 `Buffer` |
87
- | `existsSync(path)` | `xt_node_exists` | 是否存在,返回布尔值 |
88
- | `readdirSync(path[, options])` | `xt_node_read_dir` | 目录项名称;`{ withFileTypes: true }` 返回 `Dirent`,`{ recursive: true }` 递归 |
89
- | `mkdirSync(path[, options])` | `xt_node_mkdir` | 创建目录,`{ recursive: true }` 递归创建,`{ mode }` 生效 |
90
- | `rmSync(path[, options])` | `xt_node_rm` | 删除文件/目录,`{ recursive: true }` 递归删除 |
91
- | `unlinkSync(path)` | `xt_node_unlink` | 删除文件 |
92
- | `rmdirSync(path)` | `xt_node_rmdir` | 删除空目录 |
93
- | `renameSync(oldPath, newPath)` | `xt_node_rename` | 重命名 / 移动 |
94
- | `copyFileSync(src, dest[, flags])` | `xt_node_copy_file` | 复制文件;支持 `COPYFILE_EXCL` |
95
- | `cpSync(src, dest[, options])` | `xt_node_cp` | 递归复制;`recursive` / `force` / `errorOnExist` / `dereference` / `preserveTimestamps` |
96
- | `realpathSync(path)` | `xt_node_realpath` | 解析为绝对路径 |
97
- | `statSync(path)` | `xt_node_stat` | 文件元信息对象(跟随符号链接) |
98
- | `lstatSync(path)` | `xt_node_lstat` | 文件元信息对象(不跟随符号链接) |
99
- | `statfsSync(path)` | `xt_node_statfs` | 文件系统统计(`bsize` / `blocks` / `bfree` …) |
100
- | `accessSync(path[, mode])` | `xt_node_access` | 检查可访问性 |
101
- | `chmodSync(path, mode)` | `xt_node_chmod` | 修改权限 |
102
- | `lchmodSync(path, mode)` | `xt_node_lchmod` | 修改符号链接权限 |
103
- | `chownSync(path, uid, gid)` | `xt_node_chown` | 修改属主 |
104
- | `lchownSync(path, uid, gid)` | `xt_node_lchown` | 修改符号链接属主 |
105
- | `truncateSync(path[, len])` | `xt_node_truncate` | 截断文件 |
106
- | `utimesSync(path, atime, mtime)` | `xt_node_utimes` | 设置访问/修改时间(秒数或 `Date`) |
107
- | `lutimesSync(path, atime, mtime)` | `xt_node_lutimes` | 设置符号链接时间 |
108
- | `mkdtempSync(prefix)` | `xt_node_mkdtemp` | 创建唯一临时目录 |
109
- | `linkSync(existing, newPath)` | `xt_node_link` | 硬链接 |
110
- | `symlinkSync(target, path[, type])` | `xt_node_symlink` | 符号链接 |
111
- | `readlinkSync(path)` | `xt_node_readlink` | 读取符号链接目标 |
112
- | `opendirSync(path[, options])` | `xt_node_opendir` | 返回 `Dir`(`readSync` / `closeSync` / `read` / `close`) |
113
- | `globSync(pattern[, options])` | `xt_node_glob` | glob 匹配(`*` / `?` / `[...]` / `**`),`{ cwd, withFileTypes }` |
114
- | `openSync(path[, flags[, mode]])` | `xt_node_open` | 打开文件描述符 |
115
- | `closeSync(fd)` | `xt_node_close` | 关闭描述符 |
116
- | `readSync(fd, buffer, offset, length, position)` | `xt_node_read` | 读入 `Buffer` |
117
- | `writeSync(fd, data[, offset[, length[, position]]])` | `xt_node_write` | 写入字符串 / `Buffer` |
118
- | `readvSync(fd, buffers[, position])` | `xt_node_readv` | 分散读 |
119
- | `writevSync(fd, buffers[, position])` | `xt_node_writev` | 聚集写 |
120
- | `fstatSync(fd)` | `xt_node_fstat` | 描述符的 `stat` |
121
- | `fsyncSync(fd)` / `fdatasyncSync(fd)` | `xt_node_fsync` / `xt_node_fdatasync` | 刷新描述符 |
122
- | `ftruncateSync(fd[, len])` | `xt_node_ftruncate` | 截断描述符 |
123
- | `fchmodSync(fd, mode)` | `xt_node_fchmod` | 描述符的 `chmod` |
124
- | `fchownSync(fd, uid, gid)` | `xt_node_fchown` | 描述符的 `chown` |
125
- | `futimesSync(fd, atime, mtime)` | `xt_node_futimes` | 描述符的 `utimes` |
126
- | `watch(filename[, options][, listener])` | `xt_node_watch` | 返回发射器形态的 watcher(不会触发,见 §2.6) |
127
- | `watchFile(filename[, options], listener)` | `xt_node_watch_file` | 轮询形态的 `StatWatcher`(不会触发) |
128
- | `unwatchFile(filename[, listener])` | `xt_node_unwatch_file` | 停止监听 |
129
- | `constants` | `xt_fs_constants` | `F_OK` / `R_OK` / `W_OK` / `X_OK`、`COPYFILE_*`、`O_*`、`S_IF*`(宿主值) |
130
- | `promises` | `xt_fs_promises` | `fs/promises` 门面(见 §11) |
131
-
132
- ### 2.2 编码支持
133
-
134
- `readFileSync` / `writeFileSync` / `appendFileSync` 的 `options` 可以是编码字符串,也可以是 `{ encoding: "..." }`:
135
-
136
- | 编码 | 读取 | 写入 |
137
- | --- | --- | --- |
138
- | 默认 / `utf8` / `utf-8` / `ascii` / `latin1` / `binary` | 原始 UTF-8 文本 | 按文本字节写入 |
139
- | `hex` | 小写十六进制字符串 | 解析十六进制后写入 |
140
- | `base64` | Base64 字符串 | 解析 Base64 后写入 |
141
- | `base64url` | Base64url 字符串 | 解析 Base64url 后写入 |
142
- | `utf16le` / `ucs2` | 按文本直接读取原始字节(不做 UTF-16 解码) | 按 UTF-8 文本写入 |
143
-
144
- > `readFileSync` 默认仍返回**字符串**而不是 `Buffer`(即使 `Buffer` 类已存在),这样 `console.log(readFileSync(p))` 仍打印文本。
145
-
146
- ### 2.3 `statSync` 返回结构
147
-
148
- 返回普通对象,数值属性:`size`、`mode`、`uid`、`gid`、`dev`、`ino`、`nlink`、`rdev`、`blksize`、`blocks`、`atimeMs`、`mtimeMs`、`ctimeMs`、`birthtimeMs`。
149
- 方法(原生闭包,可调用):`isFile()`、`isDirectory()`、`isSymbolicLink()`、`isFIFO()`、`isSocket()`、`isBlockDevice()`、`isCharacterDevice()`。
150
-
151
- ### 2.4 调用方式
152
-
153
- `fs` 的导出通过 `import` 引入(也可用 `node:fs` 别名),不再以裸全局标识符暴露:
154
-
155
- ```ts
156
- import { readFileSync, writeFileSync, existsSync } from "fs";
157
-
158
- const text = readFileSync("examples/data.txt");
159
- writeFileSync("/tmp/out.txt", text);
160
- console.log(existsSync("/tmp/out.txt"));
161
- ```
162
-
163
- ### 2.5 错误处理
164
-
165
- 失败时函数会**抛出** Node 形态的 `Error` 对象,带有 `name`(`Error`)、`message`、`code`(如 `ENOENT`)、`errno`(数值 `errno`)、`syscall` 与 `path`。`existsSync` 仍返回布尔值,不会抛出。
166
-
167
- ```ts
168
- import { readFileSync } from "fs";
169
- try {
170
- readFileSync("/does/not/exist");
171
- } catch (error) {
172
- console.log((error as any).code); // ENOENT
173
- }
174
- ```
175
-
176
- ### 2.6 与 Node 的差异
177
-
178
- - **没有异步 I/O 调度器**(事件循环是配有定时器与套接字、但无回调式 `fs` 后端的 `select(2)` 反应堆),因此不提供回调式 `fs` 函数(`readFile`、`writeFile`、`open` 等);请使用 `fs/promises` 或 `*Sync` 形式。
179
- - `watch` / `watchFile` / `unwatchFile` 返回 API 形态的发射器对象,`.close()` / `.on()` 方法存在,但**不会触发**事件。
180
- - `Dir.read(cb)` / `Dir.close(cb)` 会**同步**调用回调。
181
- - `readFileSync` 默认返回字符串而不是 `Buffer`。
182
- - `utf16le` / `ucs2` 读取时按原始字节处理(不做 UTF-16 解码)。
183
- - `mkdtempSync` 无论前缀是否以 `XXXXXX` 结尾,都会追加 6 个随机字符。
184
- - `globSync` 支持 `*`、`?`、`[...]`、`**`,但不支持 `exclude` 回调与 `follow`;`**` 不跟随符号链接(与 Node 默认一致)。
185
- - `cpSync` 基于同步助手实现;除非 `dereference: true`,否则符号链接按符号链接复制。
186
- - **Windows**:`readlinkSync` 抛 `ENOSYS`;`chmodSync` / `lchmodSync` / `chownSync` / `lchownSync` / `fchmodSync` / `fchownSync` 为空操作;`statfsSync` 返回全零字段。
187
- - **macOS / Windows**:`lutimesSync` 退化为 `utimesSync`。
188
-
189
- ---
190
-
191
- ## 3. `path` 模块(已实现)
192
-
193
- 实现位置:`src/extensions/node/path/index.ts`、`runtime/ext_node/path/path.c`
194
-
195
- 采用 `path.<name>(...)` 命名空间调用,编译器将其降为 `xt_path_static(<name>, argc, argv)`。结果在所有平台上都以 POSIX `/` 分隔符输出(Windows 也接受 `/`),但输入可以使用 Windows 原生分隔符:在 Windows 上 `/` 与 `\` 都被识别,并保留盘符前缀(`C:`),因此自举后的编译器能正确解析带盘符的路径。以命名空间方式导入(`import path from "path"` / `import * as path from "path"`),或单独导入方法(`import { join } from "path"`)。
196
-
197
- | 方法 | 说明 |
198
- | --- | --- |
199
- | `path.join(...parts)` | 拼接并规范化 |
200
- | `path.resolve(...parts)` | 解析为绝对路径 |
201
- | `path.normalize(path)` | 规范化 |
202
- | `path.dirname(path)` | 目录名 |
203
- | `path.basename(path[, ext])` | 文件名,可去掉扩展名 |
204
- | `path.extname(path)` | 扩展名 |
205
- | `path.isAbsolute(path)` | 是否绝对路径 |
206
- | `path.relative(from, to)` | 相对路径 |
207
-
208
- ```ts
209
- import path from "path";
210
- import { basename } from "path";
211
-
212
- console.log(path.join("a", "b", "..", "c")); // a/c
213
- console.log(basename("/x/y/z.txt")); // z.txt
214
- ```
215
-
216
- ---
217
-
218
- ## 4. `os` 模块(已实现)
219
-
220
- 实现位置:`src/extensions/node/os/index.ts`、`runtime/ext_node/os/os.c`
221
-
222
- 采用 `os.<name>(...)` 命名空间调用,降为 `xt_os_static(<name>, argc, argv)`。
223
- 以命名空间方式导入(`import os from "os"`),或单独导入函数(`import { platform } from "os"`)。
224
-
225
- | 方法 | 说明 |
226
- | --- | --- |
227
- | `os.platform()` | `darwin` / `linux` / `win32` / ... |
228
- | `os.arch()` | `x64` / `arm64` / `ia32` / `arm` |
229
- | `os.type()` | `Darwin` / `Linux` / `Windows_NT` / ... |
230
- | `os.release()` | 内核版本 |
231
- | `os.endianness()` | `LE` / `BE` |
232
- | `os.homedir()` | 用户主目录 |
233
- | `os.tmpdir()` | 临时目录 |
234
- | `os.hostname()` | 主机名 |
235
- | `os.totalmem()` / `os.freemem()` | 总内存 / 可用内存(字节) |
236
- | `os.cpus()` | CPU 条目数组(`model` / `speed` 占位) |
237
-
238
- ---
239
-
240
- ## 5. `process` 对象(已实现)
241
-
242
- 实现位置:`src/extensions/node/process/index.ts`、`runtime/ext_node/process/process.c`
243
-
244
- 方法调用降为 `xt_process_call(<name>, argc, argv)`,属性访问降为 `xt_process_get(<name>)`。
245
- 通过 `import process from "process"` 导入后使用。
246
-
247
- | 方法 / 属性 | 说明 |
248
- | --- | --- |
249
- | `process.cwd()` | 当前工作目录 |
250
- | `process.exit([code])` | 退出进程 |
251
- | `process.uptime()` | 进程运行时间(秒) |
252
- | `process.hrtime()` | `[秒, 纳秒]` 数组 |
253
- | `process.getuid()` | 用户 ID(Windows 返回 0) |
254
- | `process.platform` / `process.arch` | 平台 / 架构 |
255
- | `process.pid` / `process.ppid` | 进程 ID / 父进程 ID |
256
- | `process.argv` | 参数数组(`argv[0]` 为可执行文件) |
257
- | `process.env` | 环境变量对象 |
258
- | `process.version` / `process.title` | 占位字符串 |
259
-
260
- > `argv` 由生成的 `main` 通过 `xt_set_program_args` 捕获后提供给运行时。
261
-
262
- ---
263
-
264
- ## 6. `buffer` 模块(已实现)
265
-
266
- 实现位置:`src/extensions/node/buffer/index.ts`、`runtime/ext_node/buffer/buffer.c`
267
-
268
- xbintsc 没有原生的二进制值类型,`Buffer` 以**普通对象**表示:每个字节是数字属性 `"0".."n-1"`,再加一个 `length` 属性,并共享 `xt_buffer_proto()` 原型提供实例方法。`xt_node_is_buffer` / `xt_node_buffer_bytes` 供其它模块跨模块访问字节。
269
-
270
- | 静态方法 | 说明 |
271
- | --- | --- |
272
- | `Buffer.from(value[, encoding])` | 从字符串(hex / base64 / utf8)、数组或 Buffer 构造 |
273
- | `Buffer.alloc(size[, fill])` | 分配并填充 |
274
- | `Buffer.allocUnsafe(size)` | 分配 |
275
- | `Buffer.isBuffer(value)` | 判定 |
276
- | `Buffer.byteLength(value[, encoding])` | 字节长度 |
277
- | `Buffer.concat(list[, totalLength])` | 拼接 |
278
- | `Buffer.compare(a, b)` | 比较 |
279
-
280
- 实例方法:`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()`,以及 `readUInt8/UInt16LE/UInt16BE/UInt32LE/UInt32BE`、`writeUInt8/UInt16LE/UInt16BE/UInt32LE/UInt32BE`。
281
-
282
- ```ts
283
- const buf = Buffer.from("hello");
284
- console.log(buf.toString(), buf.length); // hello 5
285
- console.log(Buffer.alloc(4, 65).toString()); // AAAA
286
- ```
287
-
288
- ---
289
-
290
- ## 7. `stream` 模块(已实现)
291
-
292
- 实现位置:`src/extensions/node/stream/index.ts`、`runtime/ext_node/stream/stream.c`
293
-
294
- `Readable` / `Writable` / `Duplex` / `Transform` / `PassThrough` 作为**全局构造函数**使用(`new Readable()` 等);`stream.Readable.from(...)` 等静态方法通过 `stream` 命名空间解析。流是 EventEmitter,采用**同步事件模型**:`on('data')` 时冲刷 `push` 缓冲,`write` 即时投递。
295
-
296
- | 方法 | 说明 |
297
- | --- | --- |
298
- | `push(chunk)` / `read([n])` | Readable 端 |
299
- | `write(chunk)` / `end([chunk])` | Writable 端 |
300
- | `pipe(destination)` | 数据转发 |
301
- | `on('data' / 'end' / 'finish')` | 事件 |
302
- | `pause()` / `resume()` / `setEncoding(enc)` / `destroy()` | 流控制 |
3
+ 本页已迁移到 [Node 扩展:已实现](./implemented/node.md)。Node 文档现在按模块拆分在
4
+ `doc/zh-CN/implemented/node/` 下。
303
5
 
304
- ---
305
-
306
- ## 8. `net` 模块(已实现)
307
-
308
- 实现位置:`src/extensions/node/net/index.ts`、`runtime/ext_node/net/net.c`
309
-
310
- TCP 服务端与客户端,基于核心事件循环。
311
-
312
- | API | 说明 |
313
- | --- | --- |
314
- | `net.createServer([connectionListener])` | 创建 TCP 服务端(`Server` 构造函数等价) |
315
- | `net.connect(...)` / `net.createConnection(...)` | 连接(阻塞式 connect,之后注册事件循环) |
316
- | `net.isIP(s)` / `net.isIPv4(s)` / `net.isIPv6(s)` | 地址判定 |
317
-
318
- `Server`:`listen(port[, host][, cb])`、`close([cb])`、`address()`、`getConnections(cb)`,事件 `listening` / `connection` / `close`。
319
-
320
- `Socket`:`write(data[, cb])`、`end([data])`、`destroy()`、`address()`、`setEncoding(enc)`、`pause()` / `resume()`,事件 `data` / `end` / `close` / `connect` / `error`。
321
-
322
- ---
323
-
324
- ## 9. `dgram` 模块(已实现)
325
-
326
- 实现位置:`src/extensions/node/dgram/index.ts`、`runtime/ext_node/dgram/dgram.c`
327
-
328
- UDP 套接字。`dgram.createSocket(type | options[, cb])` 返回 EventEmitter。
329
-
330
- | 方法 | 说明 |
331
- | --- | --- |
332
- | `bind([port][, address][, cb])` | 绑定(未绑定时 `send` 会自动绑定) |
333
- | `send(msg[, offset, length,] port[, address][, cb])` | 发送数据报 |
334
- | `close([cb])` / `address()` | 关闭 / 查询地址 |
335
- | `setBroadcast(b)` / `setTTL(n)` / `setMulticastTTL(n)` | 套接字选项 |
336
- | `on('message', (msg, rinfo) => ...)` | 收到数据报,`rinfo` 含 `address` / `port` / `family` / `size` |
337
-
338
- ---
339
-
340
- ## 10. `http` 模块(已实现)
341
-
342
- 实现位置:`src/extensions/node/http/index.ts`、`runtime/ext_node/http/http.c`
343
-
344
- 服务端包裹一个 `net` 服务端:每个连接累积字节直到完整请求(请求行 + 头 + `Content-Length` body)可用,再以 `req`/`res` 调用 `request` 监听器。客户端包裹一个 `net` 套接字,写出 HTTP/1.1 请求并在连接关闭后解析响应。
345
-
346
- | API | 说明 |
347
- | --- | --- |
348
- | `http.createServer([requestListener])` | 创建 HTTP 服务端 |
349
- | `http.request(options[, cb])` | 创建 `ClientRequest`(`write` / `end` / `setHeader`) |
350
- | `http.get(url[, cb])` | 发起 GET |
351
-
352
- `IncomingMessage`(`req` / 响应):`method`、`url`、`httpVersion`、`headers`、`statusCode`、`data` / `end` 事件、`setEncoding`。
353
-
354
- `ServerResponse`(`res`):`writeHead(status[, message][, headers])`、`setHeader` / `getHeader` / `removeHeader` / `getHeaders`、`write(chunk)`、`end([chunk])`,事件 `finish` / `close`。响应固定带 `Connection: close`(不做 keep-alive)。
355
-
356
- ---
357
-
358
- ## 11. `fs/promises` 模块(已实现)
359
-
360
- 实现位置:`src/extensions/node/fs-promises/index.ts`、`runtime/ext_node/fs/promises.c`
361
-
362
- 无异步 I/O 调度器,故每个函数把对应的同步 `fs` 实现包进**已 settle 的 Promise**。失败时会以同步形式抛出的同构 Node `Error`(含 `code` / `errno` / `syscall` / `path`)**reject**。`fs.promises` 也可从 `fs` 模块访问(`import { promises as fsp } from "fs"`),两个命名空间都暴露 `constants` 对象。
363
-
364
- Promise 导出:`readFile`、`writeFile`、`appendFile`、`mkdir`、`readdir`、`rm`、`unlink`、`rmdir`、`rename`、`copyFile`、`cp`、`realpath`、`stat`、`lstat`、`statfs`、`access`、`open`、`chmod`、`lchmod`、`chown`、`lchown`、`truncate`、`utimes`、`lutimes`、`link`、`symlink`、`readlink`、`mkdtemp`、`opendir`、`glob`、`watch`。
365
-
366
- `open(...)` 解析为 **`FileHandle`**,带有:`read`、`write`、`readFile`、`writeFile`、`appendFile`、`close`、`stat`、`truncate`、`chmod`、`chown`、`utimes`、`sync`、`datasync`。
367
-
368
- ```ts
369
- import { readFile, writeFile, open } from "fs/promises";
370
-
371
- async function main(): Promise<void> {
372
- await writeFile("/tmp/a.txt", "hi");
373
- console.log(await readFile("/tmp/a.txt"));
374
- const handle = await open("/tmp/a.txt", "r");
375
- console.log(await handle.readFile("utf8"));
376
- await handle.close();
377
- }
378
- main();
379
- ```
380
-
381
- ### 11.1 与 Node 的差异
382
-
383
- - 由于 I/O 是同步的,Promise 在返回值被 `await` 之前就已 settle(事件循环不会让出)。
384
- - `FileHandle.appendFile` 行为同 `writeFile`(在当前位置写入而非追加)。
385
- - `FileHandle.readFile()` 从当前文件描述符偏移处读取。
386
- - `Dir.read` / `Dir.close`(同步与 Promise/回调两种形式)都会立即完成。
387
- - `watch` 解析为与 `fs.watch` 相同的不会触发的 watcher 对象。
388
-
389
- ---
390
-
391
- ## 12. `child_process` 模块(已实现)
392
-
393
- 位置:`src/extensions/node/child_process/index.ts`、`runtime/ext_node/child_process/child_process.c`
394
-
395
- `spawnSync(command, args[, options])` 运行一个程序直到结束,返回
396
- `{ status, stdout, stderr }`。`options.cwd` 设置子进程工作目录;
397
- `options.stdio: "inherit"` 让子进程共用父进程的 stdout/stderr(`xbintsc run`
398
- 用它把被编译程序的输出实时透传),否则 stdout/stderr 会作为 UTF-8 字符串捕获。
399
-
400
- | 选项 | 说明 |
401
- | --- | --- |
402
- | `cwd` | 子进程的工作目录 |
403
- | `stdio: "inherit"` | 共用父进程的 stdout/stderr,而不是捕获 |
404
- | `encoding` | 接受但忽略(输出始终按 UTF-8 解码) |
405
-
406
- ```ts
407
- import { spawnSync } from "child_process";
408
-
409
- const result = spawnSync("clang", ["--version"], { encoding: "utf8" });
410
- console.log(result.status, result.stdout.split("\n")[0]);
411
- ```
412
-
413
- ---
414
-
415
- ## 13. `events` 模块(已实现)
416
-
417
- 位置:`src/extensions/node/events/index.ts`、`runtime/ext_node/events/events.c`
418
-
419
- 提供独立的 `EventEmitter`,既可以作为**全局构造函数**使用
420
- (`new EventEmitter()`),也可以作为命名导出(`import { EventEmitter } from
421
- "events"`)。实例与 `stream` / `net` / `http` 共用运行时事件发射器(监听器存放
422
- 在内部的 `__xt_events` 属性上),并在此基础上提供更完整的 `events` 接口:
423
-
424
- | 方法 | 说明 |
425
- | --- | --- |
426
- | `on(name, fn)` / `addListener(name, fn)` | 追加监听器 |
427
- | `once(name, fn)` | 最多触发一次,然后自行移除 |
428
- | `prependListener(name, fn)` / `prependOnceListener(name, fn)` | 插入到最前 |
429
- | `off(name, fn)` / `removeListener(name, fn)` | 移除监听器 |
430
- | `removeAllListeners([name])` | 清空某个(或全部)事件 |
431
- | `emit(name[, ...args])` | 触发监听器 |
432
- | `listeners(name)` / `rawListeners(name)` | 监听器数组 |
433
- | `listenerCount(name)` | 监听器数量 |
434
- | `eventNames()` | 当前有监听器的事件名 |
435
- | `setMaxListeners(n)` / `getMaxListeners()` | 记录(默认 10) |
436
-
437
- 通过命名空间(`import ee from "events"`)可访问的静态方法:`listenerCount`、
438
- `getEventListeners`、`getMaxListeners`、`setMaxListeners`、`once`、
439
- `addAbortListener`。
440
-
441
- ```ts
442
- import { EventEmitter } from "events";
443
-
444
- const em = new EventEmitter();
445
- em.once("ready", () => console.log("ready"));
446
- em.emit("ready"); // ready
447
- em.emit("ready"); // 无输出:监听器已执行过
448
- ```
449
-
450
- ---
451
-
452
- ## 14. `util` 模块(已实现)
453
-
454
- 位置:`src/extensions/node/util/index.ts`、`runtime/ext_node/util/util.c`
455
-
456
- 同时支持命名导入(`import { format } from "util"`)与命名空间调用
457
- (`import util from "util"` / `import * as util from "util"`)。
458
-
459
- | 函数 | 说明 |
460
- | --- | --- |
461
- | `format(fmt, ...args)` | 支持 `%s` `%d` `%i` `%f` `%j` `%o` `%O` `%c` `%%` 占位符 |
462
- | `formatWithOptions(opts, fmt, ...args)` | 接受选项但忽略 |
463
- | `inspect(value)` | 递归打印(限制深度,字符串带引号) |
464
- | `isDeepStrictEqual(a, b)` | 结构比较(`NaN` 等于 `NaN`) |
465
- | `inherits(ctor, superCtor)` | 连接原型链 |
466
- | `deprecate(fn, msg)` | 原样返回 `fn`(没有告警通道) |
467
- | `promisify(fn)` | 把「回调在末尾」的函数包装为 `Promise` |
468
- | `isString` `isNumber` `isBoolean` `isUndefined` `isNull` `isFunction` `isArray` `isObject` `isBuffer` `isDate` `isRegExp` `isPromise` `isError` | 类型判断 |
469
-
470
- ```ts
471
- import { format, promisify } from "util";
472
-
473
- console.log(format("%s=%d", "n", 3)); // n=3
474
- ```
475
-
476
- ---
477
-
478
- ## 15. `querystring` 模块(已实现)
479
-
480
- 位置:`src/extensions/node/querystring/index.ts`、`runtime/ext_node/querystring/querystring.c`
481
-
482
- | 函数 | 说明 |
483
- | --- | --- |
484
- | `parse(str[, sep[, eq]])` / `decode` | 解析为对象;重复的键会变成数组 |
485
- | `stringify(obj[, sep[, eq]])` / `encode` | 序列化;空格变成 `+`,数组会重复键 |
486
- | `escape(str)` / `unescape(str)` | 百分号编码 / 解码(`+` 解码为空格) |
487
-
488
- 默认值:`sep = "&"`,`eq = "="`。
489
-
490
- ```ts
491
- import { parse, stringify } from "querystring";
492
-
493
- const q = parse("a=1&b=2&b=3"); // { a: "1", b: ["2", "3"] }
494
- console.log(stringify({ x: "a b" })); // x=a+b
495
- ```
496
-
497
- ---
498
-
499
- ## 16. 已实现 Node 能力速查
500
-
501
- | 类别 | 内容 |
502
- | --- | --- |
503
- | 扩展注册 | `nodeExtension`(`--ext node`)、`NodeModule` 接口、`resolveFrom` 工具 |
504
- | fs 读取 | `readFileSync`、`readTextFile`(`xt_node_read_text_file`),支持 hex / base64 / base64url |
505
- | fs 写入 | `writeFileSync`、`appendFileSync`,支持 hex / base64 / base64url;字符串或 `Buffer` |
506
- | fs 目录 | `readdirSync`(`withFileTypes` / `recursive`)、`mkdirSync`、`rmSync`、`unlinkSync`、`rmdirSync`、`opendirSync`(`Dir`)、`globSync`、`mkdtempSync` |
507
- | fs 其它 | `existsSync`、`renameSync`、`copyFileSync`、`cpSync`、`realpathSync`、`statSync`、`lstatSync`、`statfsSync`、`accessSync`、`chmodSync`、`chownSync`、`lchmodSync`、`lchownSync`、`truncateSync`、`utimesSync`、`lutimesSync`、`linkSync`、`symlinkSync`、`readlinkSync`、`watch`、`watchFile`、`unwatchFile` |
508
- | fs 描述符 | `openSync`、`closeSync`、`readSync`、`writeSync`、`readvSync`、`writevSync`、`fstatSync`、`fsyncSync`、`fdatasyncSync`、`ftruncateSync`、`fchmodSync`、`fchownSync`、`futimesSync` |
509
- | fs 常量 | `constants`(`F_OK`、`R_OK`、`W_OK`、`X_OK`、`COPYFILE_*`、`O_*`、`S_IF*`) |
510
- | path | `join` `resolve` `normalize` `dirname` `basename` `extname` `isAbsolute` `relative` |
511
- | os | `platform` `arch` `type` `release` `endianness` `homedir` `tmpdir` `hostname` `totalmem` `freemem` `cpus` |
512
- | process | `cwd` `exit` `uptime` `hrtime` `getuid`;`platform` `arch` `pid` `ppid` `argv` `env` `version` `title` |
513
- | buffer | `Buffer.from/alloc/allocUnsafe/isBuffer/byteLength/concat/compare`;实例 `toString/toJSON/slice/.../readUInt32BE/writeUInt32BE` |
514
- | stream | `Readable` `Writable` `Duplex` `Transform` `PassThrough`;`push/read/write/end/pipe/on` |
515
- | net | `createServer` `connect` `createConnection` `isIP/isIPv4/isIPv6`;`Server` `Socket` |
516
- | dgram | `createSocket`;`bind/send/close/address/setBroadcast/setTTL` |
517
- | http | `createServer` `request` `get`;`ClientRequest`、`IncomingMessage`、`ServerResponse` |
518
- | child_process | `spawnSync(command, args[, {cwd, stdio}])`,返回 `status` / `stdout` / `stderr` |
519
- | assert | `ok/equal/notEqual/strictEqual/notStrictEqual/deepStrictEqual/notDeepStrictEqual/throws/doesNotThrow/ifError/match/doesNotMatch/fail`(`import assert from "node:assert"`) |
520
- | test | `test(name, fn)` / `it` / `describe` / `skip` / `todo`(`import test from "node:test"`),输出 TAP,失败时以非零码退出 |
521
- | zlib | `createGzip()`(由 `stream/promises` 的 pipeline 消费) |
522
- | stream/promises | `pipeline(...)`(同步执行,返回已决议的 Promise) |
523
- | worker_threads | `Worker`、`isMainThread`、`workerData`、`parentPort`(把当前可执行文件作为子进程重跑) |
524
- | events | `EventEmitter`(全局 + 命名);`on/once/off/emit/listeners/listenerCount/eventNames`;静态 `listenerCount/getEventListeners/getMaxListeners/setMaxListeners/once/addAbortListener` |
525
- | util | `format` `formatWithOptions` `inspect` `isDeepStrictEqual` `inherits` `deprecate` `promisify`;`isString/isNumber/isBoolean/isUndefined/isNull/isFunction/isArray/isObject/isBuffer/isDate/isRegExp/isPromise/isError` |
526
- | querystring | `parse`/`decode` `stringify`/`encode` `escape` `unescape` |
527
- | crypto | `createHash(algorithm)`,含 `update`/`digest` 与流式 API(`setEncoding`/`write`/`end`/`read`);支持 SHA-1 与 SHA-256 |
528
- | 全局函数 | `btoa` / `atob` base64 辅助函数;定时器 `setTimeout` / `clearTimeout` / `setInterval` / `clearInterval`(返回数字 id,无 `Timeout` 对象) |
529
- | url | `pathToFileURL` `fileURLToPath` |
530
- | fs/promises | `readFile` `writeFile` `appendFile` `mkdir` `readdir` `rm` `unlink` `rmdir` `rename` `copyFile` `cp` `realpath` `stat` `lstat` `statfs` `access` `open` `chmod` `lchmod` `chown` `lchown` `truncate` `utimes` `lutimes` `link` `symlink` `readlink` `mkdtemp` `opendir` `glob` `watch` `constants`;`FileHandle` |
531
- | 事件循环 | `xt_loop`(`select` 反应堆)、`xt_run_event_loop()`、`xt_loop_add/update/remove`、定时器队列(`xt_set_timeout` / `xt_set_interval` / `xt_clear_*`) |
532
- | 调用约定 | 统一 `(argc, argv)` ABI,返回 `xt_value` |
533
- | 链接方式 | 注册后编译 `runtime/ext_node/**` 并随运行时一起链接 |
6
+ > 语言 / Language:[English](../node-implemented.md) | **简体中文**