xbintsc 0.5.6 → 0.5.20

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 (436) hide show
  1. package/AGENTS.md +16 -8
  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 +94 -233
  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 +111 -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/parser/declarations/classes.js +5 -0
  80. package/dist/src/parser/declarations/classes.js.map +1 -1
  81. package/dist/src/parser/declarations/functions.js +13 -1
  82. package/dist/src/parser/declarations/functions.js.map +1 -1
  83. package/dist/src/parser/modules.js +8 -3
  84. package/dist/src/parser/modules.js.map +1 -1
  85. package/dist/src/parser/parser.d.ts +1 -0
  86. package/dist/src/parser/parser.js +23 -0
  87. package/dist/src/parser/parser.js.map +1 -1
  88. package/dist/tests/cli/check.test.d.ts +6 -0
  89. package/dist/tests/cli/check.test.js +68 -0
  90. package/dist/tests/cli/check.test.js.map +1 -0
  91. package/dist/tests/cli/main.test.js +19 -0
  92. package/dist/tests/cli/main.test.js.map +1 -1
  93. package/dist/tests/cli/watch.test.d.ts +6 -0
  94. package/dist/tests/cli/watch.test.js +72 -0
  95. package/dist/tests/cli/watch.test.js.map +1 -0
  96. package/dist/tests/codegen/expressions.test.js +15 -3
  97. package/dist/tests/codegen/expressions.test.js.map +1 -1
  98. package/dist/tests/codegen/llvm.test.js +16 -0
  99. package/dist/tests/codegen/llvm.test.js.map +1 -1
  100. package/dist/tests/diagnostics/diagnostic.test.js +8 -0
  101. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -1
  102. package/dist/tests/docs/structure.test.d.ts +1 -0
  103. package/dist/tests/docs/structure.test.js +92 -0
  104. package/dist/tests/docs/structure.test.js.map +1 -0
  105. package/dist/tests/driver/compiler.test.js +6 -0
  106. package/dist/tests/driver/compiler.test.js.map +1 -1
  107. package/dist/tests/driver/config.test.js +9 -0
  108. package/dist/tests/driver/config.test.js.map +1 -1
  109. package/dist/tests/driver/icon.test.js +19 -32
  110. package/dist/tests/driver/icon.test.js.map +1 -1
  111. package/dist/tests/driver/invalid-input.test.d.ts +10 -0
  112. package/dist/tests/driver/invalid-input.test.js +29 -0
  113. package/dist/tests/driver/invalid-input.test.js.map +1 -0
  114. package/dist/tests/driver/modules.test.js +42 -3
  115. package/dist/tests/driver/modules.test.js.map +1 -1
  116. package/dist/tests/driver/toolchain-provider.test.js +27 -1
  117. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  118. package/dist/tests/driver/toolchain.test.js +60 -2
  119. package/dist/tests/driver/toolchain.test.js.map +1 -1
  120. package/dist/tests/e2e/array-buffer.test.d.ts +5 -0
  121. package/dist/tests/e2e/array-buffer.test.js +38 -0
  122. package/dist/tests/e2e/array-buffer.test.js.map +1 -0
  123. package/dist/tests/e2e/array-from-iterables.test.d.ts +7 -0
  124. package/dist/tests/e2e/array-from-iterables.test.js +34 -0
  125. package/dist/tests/e2e/array-from-iterables.test.js.map +1 -0
  126. package/dist/tests/e2e/array-symbol-iterator.test.d.ts +8 -0
  127. package/dist/tests/e2e/array-symbol-iterator.test.js +42 -0
  128. package/dist/tests/e2e/array-symbol-iterator.test.js.map +1 -0
  129. package/dist/tests/e2e/async-generators.test.d.ts +1 -0
  130. package/dist/tests/e2e/async-generators.test.js +154 -0
  131. package/dist/tests/e2e/async-generators.test.js.map +1 -0
  132. package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
  133. package/dist/tests/e2e/await-ordering.test.js +37 -0
  134. package/dist/tests/e2e/await-ordering.test.js.map +1 -0
  135. package/dist/tests/e2e/compile-builtins.test.js +1 -1
  136. package/dist/tests/e2e/compile-modules.test.js +7 -0
  137. package/dist/tests/e2e/compile-modules.test.js.map +1 -1
  138. package/dist/tests/e2e/date-parse.test.d.ts +8 -0
  139. package/dist/tests/e2e/date-parse.test.js +38 -0
  140. package/dist/tests/e2e/date-parse.test.js.map +1 -0
  141. package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
  142. package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
  143. package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
  144. package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
  145. package/dist/tests/e2e/globals-microtask.test.js +37 -0
  146. package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
  147. package/dist/tests/e2e/gui-media.test.js +8 -1
  148. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  149. package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
  150. package/dist/tests/e2e/inspect-builtins.test.js +43 -0
  151. package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
  152. package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
  153. package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
  154. package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
  155. package/dist/tests/e2e/json-circular.test.d.ts +6 -0
  156. package/dist/tests/e2e/json-circular.test.js +43 -0
  157. package/dist/tests/e2e/json-circular.test.js.map +1 -0
  158. package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
  159. package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
  160. package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
  161. package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
  162. package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
  163. package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
  164. package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
  165. package/dist/tests/e2e/json-stringify-space.test.js +23 -0
  166. package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
  167. package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
  168. package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
  169. package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
  170. package/dist/tests/e2e/native-extensions.test.js +1 -1
  171. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  172. package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
  173. package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
  174. package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
  175. package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
  176. package/dist/tests/e2e/property-descriptors.test.js +25 -0
  177. package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
  178. package/dist/tests/e2e/property-ic.test.d.ts +1 -0
  179. package/dist/tests/e2e/property-ic.test.js +55 -0
  180. package/dist/tests/e2e/property-ic.test.js.map +1 -0
  181. package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
  182. package/dist/tests/e2e/runtime-errors.test.js +52 -0
  183. package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
  184. package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
  185. package/dist/tests/e2e/structured-clone.test.js +49 -0
  186. package/dist/tests/e2e/structured-clone.test.js.map +1 -0
  187. package/dist/tests/e2e/text-codec.test.d.ts +6 -0
  188. package/dist/tests/e2e/text-codec.test.js +24 -0
  189. package/dist/tests/e2e/text-codec.test.js.map +1 -0
  190. package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
  191. package/dist/tests/e2e/typed-array-views.test.js +39 -0
  192. package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
  193. package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
  194. package/dist/tests/e2e/url-search-params.test.js +30 -0
  195. package/dist/tests/e2e/url-search-params.test.js.map +1 -0
  196. package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
  197. package/dist/tests/e2e/weak-collections.test.js +88 -0
  198. package/dist/tests/e2e/weak-collections.test.js.map +1 -0
  199. package/dist/tests/parser/declarations.test.js +12 -0
  200. package/dist/tests/parser/declarations.test.js.map +1 -1
  201. package/dist/tests/parser/module-syntax.test.js +9 -0
  202. package/dist/tests/parser/module-syntax.test.js.map +1 -1
  203. package/dist/tests/parser/parser.test.js +7 -0
  204. package/dist/tests/parser/parser.test.js.map +1 -1
  205. package/dist/tests/version.test.js +5 -1
  206. package/dist/tests/version.test.js.map +1 -1
  207. package/doc/ai/README.md +4 -3
  208. package/doc/ai/cli.md +41 -0
  209. package/doc/ai/contributing.md +18 -15
  210. package/doc/ai/extensions.md +9 -7
  211. package/doc/ai/language-support.md +17 -13
  212. package/doc/ai/troubleshooting.md +11 -9
  213. package/doc/ai/zh-CN/README.md +3 -2
  214. package/doc/ai/zh-CN/cli.md +35 -0
  215. package/doc/ai/zh-CN/contributing.md +15 -14
  216. package/doc/ai/zh-CN/extensions.md +8 -6
  217. package/doc/ai/zh-CN/language-support.md +17 -14
  218. package/doc/ai/zh-CN/troubleshooting.md +9 -8
  219. package/doc/gui/build.md +13 -4
  220. package/doc/gui/known-issues.md +9 -5
  221. package/doc/gui/rendering.md +3 -1
  222. package/doc/gui.md +4 -3
  223. package/doc/icon.md +5 -4
  224. package/doc/implemented/async.md +38 -0
  225. package/doc/implemented/binder.md +13 -0
  226. package/doc/implemented/cli.md +47 -0
  227. package/doc/implemented/codegen.md +33 -0
  228. package/doc/implemented/collections.md +26 -0
  229. package/doc/implemented/driver.md +19 -0
  230. package/doc/implemented/extensions.md +19 -0
  231. package/doc/implemented/fetch.md +12 -0
  232. package/doc/implemented/lexer.md +23 -0
  233. package/doc/implemented/modules.md +28 -0
  234. package/doc/implemented/node/assert.md +17 -0
  235. package/doc/implemented/node/buffer.md +29 -0
  236. package/doc/implemented/node/child-process.md +29 -0
  237. package/doc/implemented/node/crypto.md +9 -0
  238. package/doc/implemented/node/dgram.md +15 -0
  239. package/doc/implemented/node/events.md +37 -0
  240. package/doc/implemented/node/fs-promises.md +38 -0
  241. package/doc/implemented/node/fs.md +112 -0
  242. package/doc/implemented/node/http.md +21 -0
  243. package/doc/implemented/node/net.md +17 -0
  244. package/doc/implemented/node/os.md +22 -0
  245. package/doc/implemented/node/path.md +33 -0
  246. package/doc/implemented/node/process.md +23 -0
  247. package/doc/implemented/node/querystring.md +20 -0
  248. package/doc/implemented/node/stream-promises.md +8 -0
  249. package/doc/implemented/node/stream.md +19 -0
  250. package/doc/implemented/node/test.md +10 -0
  251. package/doc/implemented/node/url.md +8 -0
  252. package/doc/implemented/node/util.md +25 -0
  253. package/doc/implemented/node/worker-threads.md +10 -0
  254. package/doc/implemented/node/zlib.md +8 -0
  255. package/doc/implemented/node.md +48 -0
  256. package/doc/implemented/operators.md +38 -0
  257. package/doc/implemented/parser.md +58 -0
  258. package/doc/implemented/pipeline.md +28 -0
  259. package/doc/implemented/runtime-core.md +32 -0
  260. package/doc/implemented/stdlib.md +78 -0
  261. package/doc/implemented/strings.md +27 -0
  262. package/doc/implemented/tests.md +10 -0
  263. package/doc/implemented/typed-arrays.md +26 -0
  264. package/doc/implemented/value-model.md +18 -0
  265. package/doc/implemented.md +54 -355
  266. package/doc/node-implemented.md +3 -585
  267. package/doc/node-unimplemented.md +3 -164
  268. package/doc/requirements.md +23 -8
  269. package/doc/unimplemented/classes.md +22 -0
  270. package/doc/unimplemented/deviations.md +27 -0
  271. package/doc/unimplemented/expressions.md +26 -0
  272. package/doc/unimplemented/functions.md +21 -0
  273. package/doc/unimplemented/modules.md +22 -0
  274. package/doc/unimplemented/node/async.md +17 -0
  275. package/doc/unimplemented/node/bun.md +9 -0
  276. package/doc/unimplemented/node/fs-promises.md +16 -0
  277. package/doc/unimplemented/node/fs.md +31 -0
  278. package/doc/unimplemented/node/globals.md +23 -0
  279. package/doc/unimplemented/node/modules.md +21 -0
  280. package/doc/unimplemented/node.md +21 -0
  281. package/doc/unimplemented/statements.md +18 -0
  282. package/doc/unimplemented/stdlib.md +54 -0
  283. package/doc/unimplemented/toolchain.md +14 -0
  284. package/doc/unimplemented/types.md +12 -0
  285. package/doc/unimplemented.md +18 -275
  286. package/doc/xbintsc.config.schema.json +12 -0
  287. package/doc/zh-CN/gui/build.md +11 -3
  288. package/doc/zh-CN/gui/known-issues.md +9 -4
  289. package/doc/zh-CN/gui/rendering.md +2 -1
  290. package/doc/zh-CN/gui.md +3 -2
  291. package/doc/zh-CN/icon.md +5 -4
  292. package/doc/zh-CN/implemented/async.md +38 -0
  293. package/doc/zh-CN/implemented/binder.md +13 -0
  294. package/doc/zh-CN/implemented/cli.md +46 -0
  295. package/doc/zh-CN/implemented/codegen.md +33 -0
  296. package/doc/zh-CN/implemented/collections.md +26 -0
  297. package/doc/zh-CN/implemented/driver.md +19 -0
  298. package/doc/zh-CN/implemented/extensions.md +19 -0
  299. package/doc/zh-CN/implemented/fetch.md +12 -0
  300. package/doc/zh-CN/implemented/lexer.md +23 -0
  301. package/doc/zh-CN/implemented/modules.md +28 -0
  302. package/doc/zh-CN/implemented/node/assert.md +17 -0
  303. package/doc/zh-CN/implemented/node/buffer.md +25 -0
  304. package/doc/zh-CN/implemented/node/child-process.md +27 -0
  305. package/doc/zh-CN/implemented/node/crypto.md +9 -0
  306. package/doc/zh-CN/implemented/node/dgram.md +15 -0
  307. package/doc/zh-CN/implemented/node/events.md +36 -0
  308. package/doc/zh-CN/implemented/node/fs-promises.md +27 -0
  309. package/doc/zh-CN/implemented/node/fs.md +105 -0
  310. package/doc/zh-CN/implemented/node/http.md +17 -0
  311. package/doc/zh-CN/implemented/node/net.md +17 -0
  312. package/doc/zh-CN/implemented/node/os.md +21 -0
  313. package/doc/zh-CN/implemented/node/path.md +26 -0
  314. package/doc/zh-CN/implemented/node/process.md +23 -0
  315. package/doc/zh-CN/implemented/node/querystring.md +20 -0
  316. package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
  317. package/doc/zh-CN/implemented/node/stream.md +15 -0
  318. package/doc/zh-CN/implemented/node/test.md +10 -0
  319. package/doc/zh-CN/implemented/node/url.md +8 -0
  320. package/doc/zh-CN/implemented/node/util.md +25 -0
  321. package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
  322. package/doc/zh-CN/implemented/node/zlib.md +8 -0
  323. package/doc/zh-CN/implemented/node.md +45 -0
  324. package/doc/zh-CN/implemented/operators.md +38 -0
  325. package/doc/zh-CN/implemented/parser.md +58 -0
  326. package/doc/zh-CN/implemented/pipeline.md +25 -0
  327. package/doc/zh-CN/implemented/runtime-core.md +31 -0
  328. package/doc/zh-CN/implemented/stdlib.md +76 -0
  329. package/doc/zh-CN/implemented/strings.md +27 -0
  330. package/doc/zh-CN/implemented/tests.md +10 -0
  331. package/doc/zh-CN/implemented/typed-arrays.md +26 -0
  332. package/doc/zh-CN/implemented/value-model.md +18 -0
  333. package/doc/zh-CN/implemented.md +50 -350
  334. package/doc/zh-CN/node-implemented.md +4 -531
  335. package/doc/zh-CN/node-unimplemented.md +4 -139
  336. package/doc/zh-CN/plan-require-node-modules.md +4 -4
  337. package/doc/zh-CN/requirements.md +20 -6
  338. package/doc/zh-CN/unimplemented/classes.md +22 -0
  339. package/doc/zh-CN/unimplemented/deviations.md +24 -0
  340. package/doc/zh-CN/unimplemented/expressions.md +24 -0
  341. package/doc/zh-CN/unimplemented/functions.md +21 -0
  342. package/doc/zh-CN/unimplemented/modules.md +19 -0
  343. package/doc/zh-CN/unimplemented/node/async.md +17 -0
  344. package/doc/zh-CN/unimplemented/node/bun.md +8 -0
  345. package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
  346. package/doc/zh-CN/unimplemented/node/fs.md +24 -0
  347. package/doc/zh-CN/unimplemented/node/globals.md +14 -0
  348. package/doc/zh-CN/unimplemented/node/modules.md +15 -0
  349. package/doc/zh-CN/unimplemented/node.md +18 -0
  350. package/doc/zh-CN/unimplemented/statements.md +15 -0
  351. package/doc/zh-CN/unimplemented/stdlib.md +54 -0
  352. package/doc/zh-CN/unimplemented/toolchain.md +14 -0
  353. package/doc/zh-CN/unimplemented/types.md +11 -0
  354. package/doc/zh-CN/unimplemented.md +14 -237
  355. package/llms.txt +32 -4
  356. package/package.json +1 -1
  357. package/runtime/ext_gui/renderer_shaders.h +2 -2
  358. package/runtime/ext_gui/stb_image.h +1 -17
  359. package/runtime/ext_node/child_process/child_process.c +173 -73
  360. package/runtime/rt.h +15 -0
  361. package/runtime/rt_internal.h +106 -0
  362. package/runtime/xt_alloc.c +43 -7
  363. package/runtime/xt_array_buffer.c +284 -0
  364. package/runtime/xt_async.c +46 -21
  365. package/runtime/xt_bigint/helpers.inc +3 -3
  366. package/runtime/xt_builtins.c +21 -17
  367. package/runtime/xt_constructors.c +12 -2
  368. package/runtime/xt_containers/access.inc +148 -3
  369. package/runtime/xt_containers/objects.inc +26 -2
  370. package/runtime/xt_containers/shapes.inc +71 -0
  371. package/runtime/xt_containers.c +1 -0
  372. package/runtime/xt_coroutine.c +17 -0
  373. package/runtime/xt_generator.c +299 -10
  374. package/runtime/xt_io/inspect.inc +112 -0
  375. package/runtime/xt_loop.c +35 -4
  376. package/runtime/xt_performance.c +37 -0
  377. package/runtime/xt_promise.c +63 -1
  378. package/runtime/xt_stdlib/arrays.inc +1 -1
  379. package/runtime/xt_stdlib/dispatch.inc +46 -11
  380. package/runtime/xt_stdlib/strings.inc +1 -1
  381. package/runtime/xt_stdlib2/array-statics.inc +25 -0
  382. package/runtime/xt_stdlib2/arrays.inc +5 -3
  383. package/runtime/xt_stdlib2/container.inc +5 -0
  384. package/runtime/xt_stdlib2/date.inc +111 -3
  385. package/runtime/xt_stdlib2/error.inc +24 -0
  386. package/runtime/xt_stdlib2/json.inc +310 -19
  387. package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
  388. package/runtime/xt_stdlib2/objects.inc +122 -0
  389. package/runtime/xt_stdlib2/set.inc +1 -1
  390. package/runtime/xt_structured_clone.c +159 -0
  391. package/runtime/xt_symbol.c +2 -2
  392. package/runtime/xt_text_codec.c +69 -0
  393. package/runtime/xt_typed_array/construction.inc +35 -5
  394. package/runtime/xt_typed_array/elements.inc +159 -0
  395. package/runtime/xt_typed_array/methods.inc +21 -5
  396. package/runtime/xt_typed_array.c +7 -10
  397. package/runtime/xt_url.c +375 -0
  398. package/runtime/xt_values/arithmetic.inc +2 -2
  399. package/runtime/xt_values/conversions.inc +1 -1
  400. package/runtime/xt_weak.c +281 -0
  401. package/scripts/build-gui.ts +133 -60
  402. package/scripts/check-version.ts +3 -3
  403. package/src/binder/declarations.ts +14 -3
  404. package/src/cli/hints.ts +8 -1
  405. package/src/cli/main.ts +119 -18
  406. package/src/cli/watch.ts +101 -0
  407. package/src/codegen/generator/calls/access.ts +10 -2
  408. package/src/codegen/generator/calls/closures.ts +12 -4
  409. package/src/codegen/generator/context.ts +23 -3
  410. package/src/codegen/generator/expressions/operators.ts +27 -13
  411. package/src/codegen/generator/expressions/primary.ts +4 -0
  412. package/src/codegen/generator/module.ts +0 -7
  413. package/src/codegen/generator/numeric.ts +85 -11
  414. package/src/codegen/generator/state.ts +23 -0
  415. package/src/codegen/generator/statements/control-flow.ts +1 -4
  416. package/src/codegen/generator/statements/loops.ts +50 -16
  417. package/src/codegen/generator/tables.ts +26 -1
  418. package/src/diagnostics/diagnostic.ts +23 -3
  419. package/src/driver/app-artifacts.ts +77 -0
  420. package/src/driver/build-key.ts +55 -0
  421. package/src/driver/bundler/graph.ts +63 -13
  422. package/src/driver/bundler/merge.ts +4 -1
  423. package/src/driver/compiler.ts +93 -327
  424. package/src/driver/config.ts +11 -0
  425. package/src/driver/frontend.ts +120 -0
  426. package/src/driver/index.ts +0 -1
  427. package/src/driver/options.ts +70 -0
  428. package/src/driver/runtime-objects.ts +133 -0
  429. package/src/driver/toolchain-provider.ts +4 -0
  430. package/src/driver/toolchain.ts +154 -10
  431. package/src/driver/version.ts +12 -0
  432. package/src/driver/win-icon.ts +36 -36
  433. package/src/parser/declarations/classes.ts +4 -0
  434. package/src/parser/declarations/functions.ts +12 -1
  435. package/src/parser/modules.ts +8 -4
  436. package/src/parser/parser.ts +28 -0
@@ -0,0 +1,19 @@
1
+ # 驱动、增量编译与工具链
2
+
3
+ > 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/driver.md)
4
+
5
+ 实现位置:`src/driver/compiler.ts`(编排)、`src/driver/frontend.ts`、
6
+ `src/driver/build-key.ts`、`src/driver/runtime-objects.ts`、
7
+ `src/driver/app-artifacts.ts`、`src/driver/cache.ts`、`src/driver/toolchain.ts`、
8
+ `src/driver/paths.ts`、`src/driver/version.ts`。
9
+
10
+ - 编译流水线:读源 → 模块打包(`src/driver/modules.ts`,当入口含 `import`/`export` 时)→ 解析 → 绑定/检查 → IR → 目标文件 → 链接。
11
+ - 增量缓存:以「编译器版本 + 源码哈希 + emit 类型 + 优化级别 + LTO/PGO 模式 + 平台 + 扩展指纹(名称、链接参数、原生对象内容)」为键,产物存在且新鲜则跳过构建。`--pgo-use` 总是重新构建,因为 profile 数据可能变化而源码不变。缓存键在 `src/driver/build-key.ts` 中组装。
12
+ - C 运行时与扩展源按内容哈希缓存目标文件,只编译一次(缓存键包含 LTO/PGO 参数)。核心翻译单元列表 `RUNTIME_SOURCES` 位于 `src/driver/runtime-objects.ts`。
13
+ - 工具链封装:查找 `clang`(可用 `xbintsc_CLANG` 覆盖)、编译 IR、编译 C、链接。
14
+ - LTO(`--lto` / `"lto": true`):程序与运行时都编译为 LLVM bitcode(`-flto`),并用 `-fuse-ld=lld` 链接;需要 lld。
15
+ - PGO(先 `--pgo-generate[=dir]`,再 `--pgo-use[=dir]`,或配置 `"pgo"` / `"pgoDir"`):生成 IR 与运行时 C 都用 `-fprofile-generate=<dir>` 插桩;运行插桩后的二进制,`--pgo-use` 会用 `llvm-profdata` 合并 `.profraw`(优先使用 clang 旁边的副本,可用 `xbintsc_LLVM_PROFDATA` 覆盖),再以 `-fprofile-use=<dir>` 重新构建。
16
+ - 链接参数:非 Windows 自动加 `-lm`;扩展可追加链接参数。
17
+ - 项目编译配置(`src/driver/config.ts`、`xbintsc.config.json`):`entry`、`outDir`、`output`、`optimize`、`lto`、`pgo`、`pgoDir`、`extensions`、`extNative`、`force` 与 `app`(`name`、`icon`、`bundle`、`bundleId`)。从入口/当前目录向上查找,可用 `--config` 指定、`--no-config` 关闭;所有路径以配置文件所在目录为基准;CLI 参数优先于配置。
18
+ - 应用图标(`src/driver/icon.ts`、`win-icon.ts`、`mac-bundle.ts`,`--icon`/`app.icon`):PNG/ICO/ICNS 以 `xt_app_icon_*` 符号内嵌;Windows 上通过 `llvm-rc` 合成 PE 资源;macOS 上打包为 `Foo.app`(用 `sips`/`iconutil` 生成 `AppIcon.icns`)。`gui` 扩展用内嵌字节调用 `SDL_SetWindowIcon`;`xbintsc_RC` 可覆盖资源编译器。
19
+ - 编译器版本:`COMPILER_VERSION` 位于 `src/driver/version.ts`,是缓存键的一部分。pre-commit 钩子只在 `main`/`master` 上(与 `package.json` 一起)提升它,因此功能分支不会改动版本文件。
@@ -0,0 +1,19 @@
1
+ # 扩展机制(Extensions)
2
+
3
+ > 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/extensions.md)
4
+
5
+ 实现位置:`src/extensions/registry.ts`、`src/extensions/node/`
6
+
7
+ - 扩展是普通对象:`runtimeSources()`(额外 C 源)、`linkerFlags()`(额外链接参数)、`builtins()`(全局标识符 → 运行时符号,统一 `(argc, argv)` ABI)与 `modules()`(导入说明符 → 命名导出 / 命名空间)。
8
+ - `ExtensionRegistry`:注册 / 注销 / 查询 / 汇总 builtins、modules、runtime 源、链接参数。
9
+ - 内置核心扩展 `core`:暴露 `print`(映射 `xt_println`),始终注册。
10
+ - Node 扩展 `node`:
11
+ - 模块化组织:`src/extensions/node/fs/` + `runtime/ext_node/fs/read_file.c`
12
+ - 暴露可导入模块(`fs`、`fs/promises`、`path`、`os`、`process` 等),同时支持裸名称与 `node:` 前缀;`import { readFileSync } from "fs"` 解析到 `xt_node_read_text_file`,`path`/`os`/`process` 的导出映射到命名空间分发器。
13
+ - 添加新模块只需新增目录 + C 实现,核心编译器无需改动。
14
+ - 原生 C++/Rust 扩展(`src/extensions/native.ts`、`--ext-native`):
15
+ - `nativeObjects()` 链接以 `(argc, argv)` ABI 暴露 `extern "C"` 符号的预编译对象/静态库;JSON manifest 把它们映射为 builtins/modules(`linkerFlags` / `linkerFlagsByPlatform` 用于 C++/Rust 运行时)。
16
+ - 编写辅助位于 `runtime/xt_ext.h`(C/C++)与 `runtime/xt_ext.rs`(Rust);可运行工程在 `examples/extensions/`。
17
+ - 驱动原样链接这些产物,增量缓存会对其内容取指纹,因此重建库会使缓存二进制失效。
18
+ - CI 在 Linux、macOS、Windows 上都会构建两种语言的示例;Windows 下系统 clang 链接 MSVC ABI(C++ `-lmsvcprt`,Rust `*-pc-windows-msvc` 加 Windows 系统库)。
19
+ - Node 模块覆盖情况见 [Node 扩展](./node.md)。
@@ -0,0 +1,12 @@
1
+ # fetch
2
+
3
+ > 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/fetch.md)
4
+
5
+ 实现位置:`runtime/xt_fetch.c`。
6
+
7
+ - 全局 `fetch(input, init)` 是阻塞式 HTTP/1.1 客户端,返回的 promise 已经 settle(交换同步完成,不经过 reactor 调度)。
8
+ - 只接受 `http://` URL —— 由于未链接 TLS 后端,`https://` 会以 `TypeError` 拒绝。
9
+ - 选项:`method`、`headers`(普通对象或 `Headers`)、`body` 与 `redirect`(`follow` / `manual` / `error`);最多跟随 20 次重定向,并在 301/302/303 时将 POST 改为 GET。
10
+ - 解析出的 `Response` 形状对象暴露 `ok` / `status` / `statusText` / `url` / `headers` 以及 `text()` / `json()` / `arrayBuffer()` / `bytes()` / `clone()`。
11
+ - `Headers` 大小写不敏感,提供 `get` / `has` / `set` / `append` / `delete` / `keys` / `values` / `entries` / `forEach` / `getSetCookie`。
12
+ - 非法 URL 与网络失败会以 `TypeError` 拒绝。
@@ -0,0 +1,23 @@
1
+ # 词法分析(Lexer)
2
+
3
+ > 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/lexer.md)
4
+
5
+ 实现位置:`src/lexer/scanner.ts`、`src/lexer/token.ts`
6
+
7
+ - 完整 Token 分类:标识符、关键字、私有标识符、数字、字符串、模板、正则(扫描)、所有标点与运算符。
8
+ - 完整关键字表:`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
+ - 数字字面量:
10
+ - 十进制、`0x` 十六进制、`0o` 八进制、`0b` 二进制
11
+ - 下划线分隔 `1_000_000`
12
+ - 小数、指数 `1.5e3`
13
+ - BigInt 字面量(`10n`、`0xFFn`)求值为任意精度整数(算术、位运算、移位、比较、`toString(radix)`、`BigInt()` / `BigInt.asIntN` / `BigInt.asUintN`)
14
+ - BigInt 字面量的值在词法 / 语法阶段即精确解析为 `bigint`(不经过 `Number`),超过 2^53 的字面量在 token / AST 中也保持完整精度
15
+ - 字符串字面量:
16
+ - 单引号 / 双引号
17
+ - 转义:`\n \t \r \b \f \0 \\ \' \"`、`\xHH`、`\uHHHH`、`\u{...}`
18
+ - 模板字面量(词法层):无替换模板、模板头 `TemplateHead`、模板中 `TemplateMiddle`、模板尾 `TemplateTail`,支持 `${}` 与转义。
19
+ - 正则字面量扫描(`/pattern/flags`),并区分除法 `/`。
20
+ - 私有标识符 `#name`。
21
+ - 注释:单行 `//` 与块注释 `/* */`(含未闭合诊断)。
22
+ - 换行与空白跟踪(用于 ASI),BOM / CRLF 规范化(`SourceFile`)。
23
+ - 词法诊断:未终止字符串 / 模板 / 注释、非法字符、非法数字、非法转义。
@@ -0,0 +1,28 @@
1
+ # 模块系统
2
+
3
+ > 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/modules.md)
4
+
5
+ 实现位置:`src/parser/parser.ts`(语法)、`src/driver/modules.ts`(打包)、
6
+ `src/driver/frontend.ts`(`parseEntry`)。
7
+
8
+ ## 语法
9
+
10
+ - `import default, { named } from "..."`、`import * as ns from "..."`(相对模块的命名空间导入会降级为合成对象字面量;扩展模块如 `path` 亦已支持)、`import "./side-effect"`、`import type`
11
+ - `export default`、`export { a as b }`、`export *`、`export =`
12
+ - import attributes(`with` / `assert`)
13
+
14
+ ## 运行时语义
15
+
16
+ - `import` / `export` 的**运行时语义**由 `src/driver/modules.ts` 在驱动层完成:递归解析相对依赖**以及裸名称的 `node_modules` 包**(遵循 `exports` / `module` / `main` 与包子路径),按模块前缀重命名顶层符号、改写引用,合并为单文件后重新绑定。
17
+ - 包可以是 ESM 或 CommonJS:`node_modules` 内的 CJS 文件会获得合成的 `module` / `exports`,`require` 调用被降级为依赖的导出对象,静态识别出的导出对 ESM 导入方可见;`node_modules` 之外的 `require()` 仍报错并提示改用 `import`。循环依赖报错。
18
+ - `.js` 系列说明符解析到对应 `.ts` 源码;省略后缀时优先 TypeScript 后缀而非同名的 JavaScript 文件;纯 `.js` / `.jsx` / `.mjs` / `.cjs` 源码也可直接打包。
19
+ - 导入绑定与命名空间成员是模块求值时的快照(无实时绑定)—— 见[未实现:模块系统](../unimplemented/modules.md)。
20
+ - 纯类型导入与再导出(`import type { T } from "..."`、`import { type T } from "..."`、`export type { T } from "..."`)会被擦除,**不构成模块依赖边**:目标模块不会被加载或打包,模块之间的纯类型循环也不属于循环依赖。若需要仅求值一个模块而不绑定名字,请使用副作用导入(`import "./mod"`)。
21
+
22
+ ## import.meta
23
+
24
+ - `import.meta.url` / `.dirname` / `.filename`,由正在运行的可执行文件路径解析。
25
+
26
+ ## 扩展模块
27
+
28
+ - 扩展模块(如 `fs`)可通过裸名称或 `node:` 前缀的 `import` 引入,并解析到运行时入口;见[扩展机制](./extensions.md)。
@@ -0,0 +1,17 @@
1
+ # `assert` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/assert.md)
4
+
5
+ 实现位置:`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
+ 具名导入与命名空间形式都分发到 `xt_assert_static`:
13
+
14
+ ```ts
15
+ import assert from "node:assert";
16
+ assert.strictEqual(1 + 1, 2);
17
+ ```
@@ -0,0 +1,25 @@
1
+ # `buffer` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/buffer.md)
4
+
5
+ 实现位置:`src/extensions/node/buffer/index.ts`、`runtime/ext_node/buffer/buffer.c`
6
+
7
+ xbintsc 没有原生的二进制值类型,`Buffer` 以**普通对象**表示:每个字节是数字属性 `"0".."n-1"`,再加一个 `length` 属性,并共享 `xt_buffer_proto()` 原型提供实例方法。`xt_node_is_buffer` / `xt_node_buffer_bytes` 供其它模块跨模块访问字节。
8
+
9
+ | 静态方法 | 说明 |
10
+ | --- | --- |
11
+ | `Buffer.from(value[, encoding])` | 从字符串(hex / base64 / utf8)、数组或 Buffer 构造 |
12
+ | `Buffer.alloc(size[, fill])` | 分配并填充 |
13
+ | `Buffer.allocUnsafe(size)` | 分配 |
14
+ | `Buffer.isBuffer(value)` | 判定 |
15
+ | `Buffer.byteLength(value[, encoding])` | 字节长度 |
16
+ | `Buffer.concat(list[, totalLength])` | 拼接 |
17
+ | `Buffer.compare(a, b)` | 比较 |
18
+
19
+ 实例方法:`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`。
20
+
21
+ ```ts
22
+ const buf = Buffer.from("hello");
23
+ console.log(buf.toString(), buf.length); // hello 5
24
+ console.log(Buffer.alloc(4, 65).toString()); // AAAA
25
+ ```
@@ -0,0 +1,27 @@
1
+ # `child_process` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/child-process.md)
4
+
5
+ 位置:`src/extensions/node/child_process/index.ts`、`runtime/ext_node/child_process/child_process.c`
6
+
7
+ `spawnSync(command, args[, options])` 运行一个程序直到结束,返回
8
+ `{ status, stdout, stderr }`。`options.cwd` 设置子进程工作目录;
9
+ `options.stdio: "inherit"` 让子进程共用父进程的 stdout/stderr(`xbintsc run`
10
+ 用它把被编译程序的输出实时透传),否则 stdout/stderr 会作为 UTF-8 字符串捕获。
11
+
12
+ | 选项 | 说明 |
13
+ | --- | --- |
14
+ | `cwd` | 子进程的工作目录 |
15
+ | `stdio: "inherit"` | 共用父进程的 stdout/stderr,而不是捕获 |
16
+ | `encoding` | 接受但忽略(输出始终按 UTF-8 解码) |
17
+
18
+ Windows 上子进程通过 `CreateProcess` 启动,stdout/stderr 由读线程经匿名管道持续排空。
19
+ 不使用临时文件,因此受限的 `%TEMP%` 不会让 `spawnSync` 失败,输出超过管道缓冲区时
20
+ 也不会死锁。
21
+
22
+ ```ts
23
+ import { spawnSync } from "child_process";
24
+
25
+ const result = spawnSync("clang", ["--version"], { encoding: "utf8" });
26
+ console.log(result.status, result.stdout.split("\n")[0]);
27
+ ```
@@ -0,0 +1,9 @@
1
+ # `crypto` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/crypto.md)
4
+
5
+ 实现位置:`src/extensions/node/crypto/index.ts`、`runtime/ext_node/crypto/crypto.c`
6
+
7
+ - `createHash(algorithm)` 返回带 `update(...)` 与 `digest([encoding])` 的哈希对象。
8
+ - 支持流式形式(`setEncoding` / `write` / `end` / `read`)。
9
+ - 提供 SHA-1 与 SHA-256。
@@ -0,0 +1,15 @@
1
+ # `dgram` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/dgram.md)
4
+
5
+ 实现位置:`src/extensions/node/dgram/index.ts`、`runtime/ext_node/dgram/dgram.c`
6
+
7
+ UDP 套接字。`dgram.createSocket(type | options[, cb])` 返回 EventEmitter。
8
+
9
+ | 方法 | 说明 |
10
+ | --- | --- |
11
+ | `bind([port][, address][, cb])` | 绑定(未绑定时 `send` 会自动绑定) |
12
+ | `send(msg[, offset, length,] port[, address][, cb])` | 发送数据报 |
13
+ | `close([cb])` / `address()` | 关闭 / 查询地址 |
14
+ | `setBroadcast(b)` / `setTTL(n)` / `setMulticastTTL(n)` | 套接字选项 |
15
+ | `on('message', (msg, rinfo) => ...)` | 收到数据报,`rinfo` 含 `address` / `port` / `family` / `size` |
@@ -0,0 +1,36 @@
1
+ # `events` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/events.md)
4
+
5
+ 位置:`src/extensions/node/events/index.ts`、`runtime/ext_node/events/events.c`
6
+
7
+ 提供独立的 `EventEmitter`,既可以作为**全局构造函数**使用
8
+ (`new EventEmitter()`),也可以作为命名导出(`import { EventEmitter } from
9
+ "events"`)。实例与 `stream` / `net` / `http` 共用运行时事件发射器(监听器存放
10
+ 在内部的 `__xt_events` 属性上),并在此基础上提供更完整的 `events` 接口:
11
+
12
+ | 方法 | 说明 |
13
+ | --- | --- |
14
+ | `on(name, fn)` / `addListener(name, fn)` | 追加监听器 |
15
+ | `once(name, fn)` | 最多触发一次,然后自行移除 |
16
+ | `prependListener(name, fn)` / `prependOnceListener(name, fn)` | 插入到最前 |
17
+ | `off(name, fn)` / `removeListener(name, fn)` | 移除监听器 |
18
+ | `removeAllListeners([name])` | 清空某个(或全部)事件 |
19
+ | `emit(name[, ...args])` | 触发监听器 |
20
+ | `listeners(name)` / `rawListeners(name)` | 监听器数组 |
21
+ | `listenerCount(name)` | 监听器数量 |
22
+ | `eventNames()` | 当前有监听器的事件名 |
23
+ | `setMaxListeners(n)` / `getMaxListeners()` | 记录(默认 10) |
24
+
25
+ 通过命名空间(`import ee from "events"`)可访问的静态方法:`listenerCount`、
26
+ `getEventListeners`、`getMaxListeners`、`setMaxListeners`、`once`、
27
+ `addAbortListener`。
28
+
29
+ ```ts
30
+ import { EventEmitter } from "events";
31
+
32
+ const em = new EventEmitter();
33
+ em.once("ready", () => console.log("ready"));
34
+ em.emit("ready"); // ready
35
+ em.emit("ready"); // 无输出:监听器已执行过
36
+ ```
@@ -0,0 +1,27 @@
1
+ # `fs/promises` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/fs-promises.md)
4
+
5
+ 实现位置:`src/extensions/node/fs-promises/index.ts`、`runtime/ext_node/fs/promises.c`
6
+
7
+ 无异步 I/O 调度器,故每个函数把对应的同步 `fs` 实现包进**已 settle 的 Promise**。失败时会以同步形式抛出的同构 Node `Error`(含 `code` / `errno` / `syscall` / `path`)**reject**。`fs.promises` 也可从 `fs` 模块访问(`import { promises as fsp } from "fs"`),两个命名空间都暴露 `constants` 对象。
8
+
9
+ 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`。
10
+
11
+ `open(...)` 解析为 **`FileHandle`**,带有:`read`、`write`、`readFile`、`writeFile`、`appendFile`、`close`、`stat`、`truncate`、`chmod`、`chown`、`utimes`、`sync`、`datasync`。
12
+
13
+ ```ts
14
+ import { readFile, writeFile, open } from "fs/promises";
15
+
16
+ async function main(): Promise<void> {
17
+ await writeFile("/tmp/a.txt", "hi");
18
+ console.log(await readFile("/tmp/a.txt"));
19
+ const handle = await open("/tmp/a.txt", "r");
20
+ console.log(await handle.readFile("utf8"));
21
+ await handle.close();
22
+ }
23
+ main();
24
+ ```
25
+
26
+
27
+ 已知偏差见[未实现:`fs/promises`](../../unimplemented/node/fs-promises.md)。
@@ -0,0 +1,105 @@
1
+ # `fs` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/fs.md)
4
+
5
+ 实现位置:`src/extensions/node/fs/*.ts`、`runtime/ext_node/fs/*.c`
6
+
7
+ ## 可用函数(从 `fs` 导入)
8
+
9
+ | 导入函数 | 运行时符号 | 说明 |
10
+ | --- | --- | --- |
11
+ | `readFileSync(path[, options])` | `xt_node_read_text_file` | 同步读取文件,返回字符串;支持编码选项 |
12
+ | `readTextFile(path)` | `xt_node_read_text_file` | `readFileSync` 的别名(同一符号) |
13
+ | `writeFileSync(path, data[, options])` | `xt_node_write_file` | 覆盖写入;接受字符串或 `Buffer` |
14
+ | `appendFileSync(path, data[, options])` | `xt_node_append_file` | 追加写入;接受字符串或 `Buffer` |
15
+ | `existsSync(path)` | `xt_node_exists` | 是否存在,返回布尔值 |
16
+ | `readdirSync(path[, options])` | `xt_node_read_dir` | 目录项名称;`{ withFileTypes: true }` 返回 `Dirent`,`{ recursive: true }` 递归 |
17
+ | `mkdirSync(path[, options])` | `xt_node_mkdir` | 创建目录,`{ recursive: true }` 递归创建,`{ mode }` 生效 |
18
+ | `rmSync(path[, options])` | `xt_node_rm` | 删除文件/目录,`{ recursive: true }` 递归删除 |
19
+ | `unlinkSync(path)` | `xt_node_unlink` | 删除文件 |
20
+ | `rmdirSync(path)` | `xt_node_rmdir` | 删除空目录 |
21
+ | `renameSync(oldPath, newPath)` | `xt_node_rename` | 重命名 / 移动 |
22
+ | `copyFileSync(src, dest[, flags])` | `xt_node_copy_file` | 复制文件;支持 `COPYFILE_EXCL` |
23
+ | `cpSync(src, dest[, options])` | `xt_node_cp` | 递归复制;`recursive` / `force` / `errorOnExist` / `dereference` / `preserveTimestamps` |
24
+ | `realpathSync(path)` | `xt_node_realpath` | 解析为绝对路径 |
25
+ | `statSync(path)` | `xt_node_stat` | 文件元信息对象(跟随符号链接) |
26
+ | `lstatSync(path)` | `xt_node_lstat` | 文件元信息对象(不跟随符号链接) |
27
+ | `statfsSync(path)` | `xt_node_statfs` | 文件系统统计(`bsize` / `blocks` / `bfree` …) |
28
+ | `accessSync(path[, mode])` | `xt_node_access` | 检查可访问性 |
29
+ | `chmodSync(path, mode)` | `xt_node_chmod` | 修改权限 |
30
+ | `lchmodSync(path, mode)` | `xt_node_lchmod` | 修改符号链接权限 |
31
+ | `chownSync(path, uid, gid)` | `xt_node_chown` | 修改属主 |
32
+ | `lchownSync(path, uid, gid)` | `xt_node_lchown` | 修改符号链接属主 |
33
+ | `truncateSync(path[, len])` | `xt_node_truncate` | 截断文件 |
34
+ | `utimesSync(path, atime, mtime)` | `xt_node_utimes` | 设置访问/修改时间(秒数或 `Date`) |
35
+ | `lutimesSync(path, atime, mtime)` | `xt_node_lutimes` | 设置符号链接时间 |
36
+ | `mkdtempSync(prefix)` | `xt_node_mkdtemp` | 创建唯一临时目录 |
37
+ | `linkSync(existing, newPath)` | `xt_node_link` | 硬链接 |
38
+ | `symlinkSync(target, path[, type])` | `xt_node_symlink` | 符号链接 |
39
+ | `readlinkSync(path)` | `xt_node_readlink` | 读取符号链接目标 |
40
+ | `opendirSync(path[, options])` | `xt_node_opendir` | 返回 `Dir`(`readSync` / `closeSync` / `read` / `close`) |
41
+ | `globSync(pattern[, options])` | `xt_node_glob` | glob 匹配(`*` / `?` / `[...]` / `**`),`{ cwd, withFileTypes }` |
42
+ | `openSync(path[, flags[, mode]])` | `xt_node_open` | 打开文件描述符 |
43
+ | `closeSync(fd)` | `xt_node_close` | 关闭描述符 |
44
+ | `readSync(fd, buffer, offset, length, position)` | `xt_node_read` | 读入 `Buffer` |
45
+ | `writeSync(fd, data[, offset[, length[, position]]])` | `xt_node_write` | 写入字符串 / `Buffer` |
46
+ | `readvSync(fd, buffers[, position])` | `xt_node_readv` | 分散读 |
47
+ | `writevSync(fd, buffers[, position])` | `xt_node_writev` | 聚集写 |
48
+ | `fstatSync(fd)` | `xt_node_fstat` | 描述符的 `stat` |
49
+ | `fsyncSync(fd)` / `fdatasyncSync(fd)` | `xt_node_fsync` / `xt_node_fdatasync` | 刷新描述符 |
50
+ | `ftruncateSync(fd[, len])` | `xt_node_ftruncate` | 截断描述符 |
51
+ | `fchmodSync(fd, mode)` | `xt_node_fchmod` | 描述符的 `chmod` |
52
+ | `fchownSync(fd, uid, gid)` | `xt_node_fchown` | 描述符的 `chown` |
53
+ | `futimesSync(fd, atime, mtime)` | `xt_node_futimes` | 描述符的 `utimes` |
54
+ | `watch(filename[, options][, listener])` | `xt_node_watch` | 返回发射器形态的 watcher(不会触发,见[未实现:`fs`](../../unimplemented/node/fs.md)) |
55
+ | `watchFile(filename[, options], listener)` | `xt_node_watch_file` | 轮询形态的 `StatWatcher`(不会触发) |
56
+ | `unwatchFile(filename[, listener])` | `xt_node_unwatch_file` | 停止监听 |
57
+ | `constants` | `xt_fs_constants` | `F_OK` / `R_OK` / `W_OK` / `X_OK`、`COPYFILE_*`、`O_*`、`S_IF*`(宿主值) |
58
+ | `promises` | `xt_fs_promises` | `fs/promises` 门面(见 [`fs/promises`](./fs-promises.md)) |
59
+
60
+ ## 编码支持
61
+
62
+ `readFileSync` / `writeFileSync` / `appendFileSync` 的 `options` 可以是编码字符串,也可以是 `{ encoding: "..." }`:
63
+
64
+ | 编码 | 读取 | 写入 |
65
+ | --- | --- | --- |
66
+ | 默认 / `utf8` / `utf-8` / `ascii` / `latin1` / `binary` | 原始 UTF-8 文本 | 按文本字节写入 |
67
+ | `hex` | 小写十六进制字符串 | 解析十六进制后写入 |
68
+ | `base64` | Base64 字符串 | 解析 Base64 后写入 |
69
+ | `base64url` | Base64url 字符串 | 解析 Base64url 后写入 |
70
+ | `utf16le` / `ucs2` | 按文本直接读取原始字节(不做 UTF-16 解码) | 按 UTF-8 文本写入 |
71
+
72
+ > `readFileSync` 默认仍返回**字符串**而不是 `Buffer`(即使 `Buffer` 类已存在),这样 `console.log(readFileSync(p))` 仍打印文本。
73
+
74
+ ## `statSync` 返回结构
75
+
76
+ 返回普通对象,数值属性:`size`、`mode`、`uid`、`gid`、`dev`、`ino`、`nlink`、`rdev`、`blksize`、`blocks`、`atimeMs`、`mtimeMs`、`ctimeMs`、`birthtimeMs`。
77
+ 方法(原生闭包,可调用):`isFile()`、`isDirectory()`、`isSymbolicLink()`、`isFIFO()`、`isSocket()`、`isBlockDevice()`、`isCharacterDevice()`。
78
+
79
+ ## 调用方式
80
+
81
+ `fs` 的导出通过 `import` 引入(也可用 `node:fs` 别名),不再以裸全局标识符暴露:
82
+
83
+ ```ts
84
+ import { readFileSync, writeFileSync, existsSync } from "fs";
85
+
86
+ const text = readFileSync("examples/data.txt");
87
+ writeFileSync("/tmp/out.txt", text);
88
+ console.log(existsSync("/tmp/out.txt"));
89
+ ```
90
+
91
+ ## 错误处理
92
+
93
+ 失败时函数会**抛出** Node 形态的 `Error` 对象,带有 `name`(`Error`)、`message`、`code`(如 `ENOENT`)、`errno`(数值 `errno`)、`syscall` 与 `path`。`existsSync` 仍返回布尔值,不会抛出。
94
+
95
+ ```ts
96
+ import { readFileSync } from "fs";
97
+ try {
98
+ readFileSync("/does/not/exist");
99
+ } catch (error) {
100
+ console.log((error as any).code); // ENOENT
101
+ }
102
+ ```
103
+
104
+
105
+ 已知偏差见[未实现:`fs`](../../unimplemented/node/fs.md)。
@@ -0,0 +1,17 @@
1
+ # `http` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/http.md)
4
+
5
+ 实现位置:`src/extensions/node/http/index.ts`、`runtime/ext_node/http/http.c`
6
+
7
+ 服务端包裹一个 `net` 服务端:每个连接累积字节直到完整请求(请求行 + 头 + `Content-Length` body)可用,再以 `req`/`res` 调用 `request` 监听器。客户端包裹一个 `net` 套接字,写出 HTTP/1.1 请求并在连接关闭后解析响应。
8
+
9
+ | API | 说明 |
10
+ | --- | --- |
11
+ | `http.createServer([requestListener])` | 创建 HTTP 服务端 |
12
+ | `http.request(options[, cb])` | 创建 `ClientRequest`(`write` / `end` / `setHeader`) |
13
+ | `http.get(url[, cb])` | 发起 GET |
14
+
15
+ `IncomingMessage`(`req` / 响应):`method`、`url`、`httpVersion`、`headers`、`statusCode`、`data` / `end` 事件、`setEncoding`。
16
+
17
+ `ServerResponse`(`res`):`writeHead(status[, message][, headers])`、`setHeader` / `getHeader` / `removeHeader` / `getHeaders`、`write(chunk)`、`end([chunk])`,事件 `finish` / `close`。响应固定带 `Connection: close`(不做 keep-alive)。
@@ -0,0 +1,17 @@
1
+ # `net` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/net.md)
4
+
5
+ 实现位置:`src/extensions/node/net/index.ts`、`runtime/ext_node/net/net.c`
6
+
7
+ TCP 服务端与客户端,基于核心事件循环。
8
+
9
+ | API | 说明 |
10
+ | --- | --- |
11
+ | `net.createServer([connectionListener])` | 创建 TCP 服务端(`Server` 构造函数等价) |
12
+ | `net.connect(...)` / `net.createConnection(...)` | 连接(阻塞式 connect,之后注册事件循环) |
13
+ | `net.isIP(s)` / `net.isIPv4(s)` / `net.isIPv6(s)` | 地址判定 |
14
+
15
+ `Server`:`listen(port[, host][, cb])`、`close([cb])`、`address()`、`getConnections(cb)`,事件 `listening` / `connection` / `close`。
16
+
17
+ `Socket`:`write(data[, cb])`、`end([data])`、`destroy()`、`address()`、`setEncoding(enc)`、`pause()` / `resume()`,事件 `data` / `end` / `close` / `connect` / `error`。
@@ -0,0 +1,21 @@
1
+ # `os` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/os.md)
4
+
5
+ 实现位置:`src/extensions/node/os/index.ts`、`runtime/ext_node/os/os.c`
6
+
7
+ 采用 `os.<name>(...)` 命名空间调用,降为 `xt_os_static(<name>, argc, argv)`。
8
+ 以命名空间方式导入(`import os from "os"`),或单独导入函数(`import { platform } from "os"`)。
9
+
10
+ | 方法 | 说明 |
11
+ | --- | --- |
12
+ | `os.platform()` | `darwin` / `linux` / `win32` / ... |
13
+ | `os.arch()` | `x64` / `arm64` / `ia32` / `arm` |
14
+ | `os.type()` | `Darwin` / `Linux` / `Windows_NT` / ... |
15
+ | `os.release()` | 内核版本 |
16
+ | `os.endianness()` | `LE` / `BE` |
17
+ | `os.homedir()` | 用户主目录 |
18
+ | `os.tmpdir()` | 临时目录 |
19
+ | `os.hostname()` | 主机名 |
20
+ | `os.totalmem()` / `os.freemem()` | 总内存 / 可用内存(字节) |
21
+ | `os.cpus()` | CPU 条目数组(`model` / `speed` 占位) |
@@ -0,0 +1,26 @@
1
+ # `path` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/path.md)
4
+
5
+ 实现位置:`src/extensions/node/path/index.ts`、`runtime/ext_node/path/path.c`
6
+
7
+ 采用 `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"`)。
8
+
9
+ | 方法 | 说明 |
10
+ | --- | --- |
11
+ | `path.join(...parts)` | 拼接并规范化 |
12
+ | `path.resolve(...parts)` | 解析为绝对路径 |
13
+ | `path.normalize(path)` | 规范化 |
14
+ | `path.dirname(path)` | 目录名 |
15
+ | `path.basename(path[, ext])` | 文件名,可去掉扩展名 |
16
+ | `path.extname(path)` | 扩展名 |
17
+ | `path.isAbsolute(path)` | 是否绝对路径 |
18
+ | `path.relative(from, to)` | 相对路径 |
19
+
20
+ ```ts
21
+ import path from "path";
22
+ import { basename } from "path";
23
+
24
+ console.log(path.join("a", "b", "..", "c")); // a/c
25
+ console.log(basename("/x/y/z.txt")); // z.txt
26
+ ```
@@ -0,0 +1,23 @@
1
+ # `process` 对象
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/process.md)
4
+
5
+ 实现位置:`src/extensions/node/process/index.ts`、`runtime/ext_node/process/process.c`
6
+
7
+ 方法调用降为 `xt_process_call(<name>, argc, argv)`,属性访问降为 `xt_process_get(<name>)`。
8
+ 通过 `import process from "process"` 导入后使用。
9
+
10
+ | 方法 / 属性 | 说明 |
11
+ | --- | --- |
12
+ | `process.cwd()` | 当前工作目录 |
13
+ | `process.exit([code])` | 退出进程 |
14
+ | `process.uptime()` | 进程运行时间(秒) |
15
+ | `process.hrtime()` | `[秒, 纳秒]` 数组 |
16
+ | `process.getuid()` | 用户 ID(Windows 返回 0) |
17
+ | `process.platform` / `process.arch` | 平台 / 架构 |
18
+ | `process.pid` / `process.ppid` | 进程 ID / 父进程 ID |
19
+ | `process.argv` | 参数数组(`argv[0]` 为可执行文件) |
20
+ | `process.env` | 环境变量对象 |
21
+ | `process.version` / `process.title` | 占位字符串 |
22
+
23
+ > `argv` 由生成的 `main` 通过 `xt_set_program_args` 捕获后提供给运行时。
@@ -0,0 +1,20 @@
1
+ # `querystring` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/querystring.md)
4
+
5
+ 位置:`src/extensions/node/querystring/index.ts`、`runtime/ext_node/querystring/querystring.c`
6
+
7
+ | 函数 | 说明 |
8
+ | --- | --- |
9
+ | `parse(str[, sep[, eq]])` / `decode` | 解析为对象;重复的键会变成数组 |
10
+ | `stringify(obj[, sep[, eq]])` / `encode` | 序列化;空格变成 `+`,数组会重复键 |
11
+ | `escape(str)` / `unescape(str)` | 百分号编码 / 解码(`+` 解码为空格) |
12
+
13
+ 默认值:`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
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/stream-promises.md)
4
+
5
+ 实现位置:`src/extensions/node/stream-promises/index.ts`、`runtime/ext_node/stream/pipeline.c`
6
+
7
+ - `pipeline(...)` 同步排空给定流,并返回一个已 resolve 的 Promise,因此 `await pipeline(...)` 可用。
8
+ - 支持的转换阶段为 `zlib.createGzip()`,见 [`zlib`](./zlib.md)。
@@ -0,0 +1,15 @@
1
+ # `stream` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/stream.md)
4
+
5
+ 实现位置:`src/extensions/node/stream/index.ts`、`runtime/ext_node/stream/stream.c`
6
+
7
+ `Readable` / `Writable` / `Duplex` / `Transform` / `PassThrough` 作为**全局构造函数**使用(`new Readable()` 等);`stream.Readable.from(...)` 等静态方法通过 `stream` 命名空间解析。流是 EventEmitter,采用**同步事件模型**:`on('data')` 时冲刷 `push` 缓冲,`write` 即时投递。
8
+
9
+ | 方法 | 说明 |
10
+ | --- | --- |
11
+ | `push(chunk)` / `read([n])` | Readable 端 |
12
+ | `write(chunk)` / `end([chunk])` | Writable 端 |
13
+ | `pipe(destination)` | 数据转发 |
14
+ | `on('data' / 'end' / 'finish')` | 事件 |
15
+ | `pause()` / `resume()` / `setEncoding(enc)` / `destroy()` | 流控制 |
@@ -0,0 +1,10 @@
1
+ # `test` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/test.md)
4
+
5
+ 实现位置:`src/extensions/node/test/index.ts`、`runtime/ext_node/test/test.c`
6
+
7
+ - `test(name, fn)` 立即执行 `fn`,捕获断言失败并输出 TAP。
8
+ - `it` / `describe` / `skip` / `todo` / `only` 以及 `before` / `after` / `beforeEach` / `afterEach` 钩子。
9
+ - 失败时进程以非零码退出。
10
+ - 默认导出可调用,因此 `import test from "node:test"` 可用。
@@ -0,0 +1,8 @@
1
+ # `url` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/url.md)
4
+
5
+ 实现位置:`src/extensions/node/url/index.ts`、`runtime/ext_node/url/url.c`
6
+
7
+ - `pathToFileURL(path)` 与 `fileURLToPath(url)`。
8
+ - 这两个助手用于在 `import.meta.url`、`process.argv[1]` 与文件系统路径之间转换。
@@ -0,0 +1,25 @@
1
+ # `util` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/util.md)
4
+
5
+ 位置:`src/extensions/node/util/index.ts`、`runtime/ext_node/util/util.c`
6
+
7
+ 同时支持命名导入(`import { format } from "util"`)与命名空间调用
8
+ (`import util from "util"` / `import * as util from "util"`)。
9
+
10
+ | 函数 | 说明 |
11
+ | --- | --- |
12
+ | `format(fmt, ...args)` | 支持 `%s` `%d` `%i` `%f` `%j` `%o` `%O` `%c` `%%` 占位符 |
13
+ | `formatWithOptions(opts, fmt, ...args)` | 接受选项但忽略 |
14
+ | `inspect(value)` | 递归打印(限制深度,字符串带引号) |
15
+ | `isDeepStrictEqual(a, b)` | 结构比较(`NaN` 等于 `NaN`) |
16
+ | `inherits(ctor, superCtor)` | 连接原型链 |
17
+ | `deprecate(fn, msg)` | 原样返回 `fn`(没有告警通道) |
18
+ | `promisify(fn)` | 把「回调在末尾」的函数包装为 `Promise` |
19
+ | `isString` `isNumber` `isBoolean` `isUndefined` `isNull` `isFunction` `isArray` `isObject` `isBuffer` `isDate` `isRegExp` `isPromise` `isError` | 类型判断 |
20
+
21
+ ```ts
22
+ import { format, promisify } from "util";
23
+
24
+ console.log(format("%s=%d", "n", 3)); // n=3
25
+ ```
@@ -0,0 +1,9 @@
1
+ # `worker_threads` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/worker-threads.md)
4
+
5
+ 实现位置:`src/extensions/node/worker_threads/index.ts`、`runtime/ext_node/worker_threads/worker_threads.c`
6
+
7
+ - `Worker`、`isMainThread`、`workerData`、`parentPort`。
8
+ - xbintsc 通过把当前可执行文件作为子进程重新运行来模拟 worker;`isMainThread` /
9
+ `workerData` / `parentPort` 是值绑定(无参运行时 getter),`Worker` 是构造器。
@@ -0,0 +1,8 @@
1
+ # `zlib` 模块
2
+
3
+ > 属于[Node 扩展:已实现](../node.md) · [English](../../../implemented/node/zlib.md)
4
+
5
+ 实现位置:`src/extensions/node/zlib/index.ts`、`runtime/ext_node/zlib/zlib.c`
6
+
7
+ - 仅实现 `createGzip()`。它返回 gzip 转换流,供
8
+ [`stream/promises`](./stream-promises.md) 的 `pipeline` 使用。