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.
- package/AGENTS.md +20 -10
- package/README.md +8 -7
- package/README.zh-CN.md +6 -6
- package/dist/src/binder/declarations.js +14 -3
- package/dist/src/binder/declarations.js.map +1 -1
- package/dist/src/cli/hints.js +7 -1
- package/dist/src/cli/hints.js.map +1 -1
- package/dist/src/cli/main.js +115 -15
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/watch.d.ts +25 -0
- package/dist/src/cli/watch.js +93 -0
- package/dist/src/cli/watch.js.map +1 -0
- package/dist/src/codegen/generator/calls/access.js +11 -2
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/closures.js +12 -4
- package/dist/src/codegen/generator/calls/closures.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +8 -0
- package/dist/src/codegen/generator/context.js +22 -3
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/expressions/operators.js +17 -15
- package/dist/src/codegen/generator/expressions/operators.js.map +1 -1
- package/dist/src/codegen/generator/expressions/primary.js +5 -0
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/module.js +0 -7
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/numeric.d.ts +6 -3
- package/dist/src/codegen/generator/numeric.js +54 -11
- package/dist/src/codegen/generator/numeric.js.map +1 -1
- package/dist/src/codegen/generator/state.js +23 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.js +1 -4
- package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
- package/dist/src/codegen/generator/statements/loops.js +48 -16
- package/dist/src/codegen/generator/statements/loops.js.map +1 -1
- package/dist/src/codegen/generator/tables.js +26 -1
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/diagnostics/diagnostic.d.ts +3 -1
- package/dist/src/diagnostics/diagnostic.js +23 -3
- package/dist/src/diagnostics/diagnostic.js.map +1 -1
- package/dist/src/driver/app-artifacts.d.ts +42 -0
- package/dist/src/driver/app-artifacts.js +53 -0
- package/dist/src/driver/app-artifacts.js.map +1 -0
- package/dist/src/driver/build-key.d.ts +29 -0
- package/dist/src/driver/build-key.js +35 -0
- package/dist/src/driver/build-key.js.map +1 -0
- package/dist/src/driver/bundler/graph.js +61 -12
- package/dist/src/driver/bundler/graph.js.map +1 -1
- package/dist/src/driver/bundler/merge.js +7 -1
- package/dist/src/driver/bundler/merge.js.map +1 -1
- package/dist/src/driver/compiler.d.ts +10 -67
- package/dist/src/driver/compiler.js +95 -234
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/config.d.ts +3 -0
- package/dist/src/driver/config.js +8 -0
- package/dist/src/driver/config.js.map +1 -1
- package/dist/src/driver/frontend.d.ts +37 -0
- package/dist/src/driver/frontend.js +92 -0
- package/dist/src/driver/frontend.js.map +1 -0
- package/dist/src/driver/index.d.ts +1 -1
- package/dist/src/driver/index.js.map +1 -1
- package/dist/src/driver/options.d.ts +64 -0
- package/dist/src/driver/options.js +9 -0
- package/dist/src/driver/options.js.map +1 -0
- package/dist/src/driver/runtime-objects.d.ts +38 -0
- package/dist/src/driver/runtime-objects.js +112 -0
- package/dist/src/driver/runtime-objects.js.map +1 -0
- package/dist/src/driver/toolchain-provider.d.ts +4 -0
- package/dist/src/driver/toolchain-provider.js +4 -0
- package/dist/src/driver/toolchain-provider.js.map +1 -1
- package/dist/src/driver/toolchain.d.ts +32 -1
- package/dist/src/driver/toolchain.js +115 -11
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/driver/version.d.ts +12 -0
- package/dist/src/driver/version.js +13 -0
- package/dist/src/driver/version.js.map +1 -0
- package/dist/src/driver/win-icon.d.ts +7 -9
- package/dist/src/driver/win-icon.js +37 -35
- package/dist/src/driver/win-icon.js.map +1 -1
- package/dist/src/extensions/node/fs/index.d.ts +4 -3
- package/dist/src/extensions/node/fs/index.js +12 -3
- package/dist/src/extensions/node/fs/index.js.map +1 -1
- package/dist/src/extensions/node/fs-promises/index.d.ts +5 -5
- package/dist/src/extensions/node/fs-promises/index.js +15 -6
- package/dist/src/extensions/node/fs-promises/index.js.map +1 -1
- package/dist/src/parser/declarations/classes.js +5 -0
- package/dist/src/parser/declarations/classes.js.map +1 -1
- package/dist/src/parser/declarations/functions.js +13 -1
- package/dist/src/parser/declarations/functions.js.map +1 -1
- package/dist/src/parser/modules.js +8 -3
- package/dist/src/parser/modules.js.map +1 -1
- package/dist/src/parser/parser.d.ts +1 -0
- package/dist/src/parser/parser.js +23 -0
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/tests/cli/check.test.d.ts +6 -0
- package/dist/tests/cli/check.test.js +68 -0
- package/dist/tests/cli/check.test.js.map +1 -0
- package/dist/tests/cli/main.test.js +19 -0
- package/dist/tests/cli/main.test.js.map +1 -1
- package/dist/tests/cli/watch.test.d.ts +6 -0
- package/dist/tests/cli/watch.test.js +72 -0
- package/dist/tests/cli/watch.test.js.map +1 -0
- package/dist/tests/codegen/expressions.test.js +15 -3
- package/dist/tests/codegen/expressions.test.js.map +1 -1
- package/dist/tests/codegen/llvm.test.js +16 -0
- package/dist/tests/codegen/llvm.test.js.map +1 -1
- package/dist/tests/diagnostics/diagnostic.test.js +8 -0
- package/dist/tests/diagnostics/diagnostic.test.js.map +1 -1
- package/dist/tests/docs/structure.test.d.ts +1 -0
- package/dist/tests/docs/structure.test.js +92 -0
- package/dist/tests/docs/structure.test.js.map +1 -0
- package/dist/tests/driver/compiler.test.js +6 -0
- package/dist/tests/driver/compiler.test.js.map +1 -1
- package/dist/tests/driver/config.test.js +9 -0
- package/dist/tests/driver/config.test.js.map +1 -1
- package/dist/tests/driver/icon.test.js +19 -32
- package/dist/tests/driver/icon.test.js.map +1 -1
- package/dist/tests/driver/invalid-input.test.d.ts +10 -0
- package/dist/tests/driver/invalid-input.test.js +29 -0
- package/dist/tests/driver/invalid-input.test.js.map +1 -0
- package/dist/tests/driver/modules.test.js +42 -3
- package/dist/tests/driver/modules.test.js.map +1 -1
- package/dist/tests/driver/toolchain-provider.test.js +27 -1
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
- package/dist/tests/driver/toolchain.test.js +60 -2
- package/dist/tests/driver/toolchain.test.js.map +1 -1
- package/dist/tests/e2e/array-buffer.test.d.ts +5 -0
- package/dist/tests/e2e/array-buffer.test.js +38 -0
- package/dist/tests/e2e/array-buffer.test.js.map +1 -0
- package/dist/tests/e2e/array-from-iterables.test.d.ts +7 -0
- package/dist/tests/e2e/array-from-iterables.test.js +34 -0
- package/dist/tests/e2e/array-from-iterables.test.js.map +1 -0
- package/dist/tests/e2e/array-symbol-iterator.test.d.ts +8 -0
- package/dist/tests/e2e/array-symbol-iterator.test.js +42 -0
- package/dist/tests/e2e/array-symbol-iterator.test.js.map +1 -0
- package/dist/tests/e2e/async-await.test.js +1 -1
- package/dist/tests/e2e/async-fs.test.d.ts +9 -0
- package/dist/tests/e2e/async-fs.test.js +119 -0
- package/dist/tests/e2e/async-fs.test.js.map +1 -0
- package/dist/tests/e2e/async-generators.test.d.ts +1 -0
- package/dist/tests/e2e/async-generators.test.js +154 -0
- package/dist/tests/e2e/async-generators.test.js.map +1 -0
- package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
- package/dist/tests/e2e/await-ordering.test.js +37 -0
- package/dist/tests/e2e/await-ordering.test.js.map +1 -0
- package/dist/tests/e2e/compile-builtins.test.js +1 -1
- package/dist/tests/e2e/compile-modules.test.js +7 -0
- package/dist/tests/e2e/compile-modules.test.js.map +1 -1
- package/dist/tests/e2e/date-parse.test.d.ts +8 -0
- package/dist/tests/e2e/date-parse.test.js +38 -0
- package/dist/tests/e2e/date-parse.test.js.map +1 -0
- package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
- package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
- package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
- package/dist/tests/e2e/fetch.test.js +24 -0
- package/dist/tests/e2e/fetch.test.js.map +1 -1
- package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
- package/dist/tests/e2e/globals-microtask.test.js +37 -0
- package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
- package/dist/tests/e2e/gui-inline-svg.test.d.ts +11 -0
- package/dist/tests/e2e/gui-inline-svg.test.js +160 -0
- package/dist/tests/e2e/gui-inline-svg.test.js.map +1 -0
- package/dist/tests/e2e/gui-media.test.js +8 -1
- package/dist/tests/e2e/gui-media.test.js.map +1 -1
- package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
- package/dist/tests/e2e/inspect-builtins.test.js +43 -0
- package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
- package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
- package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
- package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
- package/dist/tests/e2e/json-circular.test.d.ts +6 -0
- package/dist/tests/e2e/json-circular.test.js +43 -0
- package/dist/tests/e2e/json-circular.test.js.map +1 -0
- package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
- package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
- package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
- package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
- package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
- package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
- package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
- package/dist/tests/e2e/json-stringify-space.test.js +23 -0
- package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
- package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
- package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
- package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
- package/dist/tests/e2e/native-extensions.test.js +1 -1
- package/dist/tests/e2e/native-extensions.test.js.map +1 -1
- package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
- package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
- package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
- package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
- package/dist/tests/e2e/property-descriptors.test.js +25 -0
- package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
- package/dist/tests/e2e/property-ic.test.d.ts +1 -0
- package/dist/tests/e2e/property-ic.test.js +55 -0
- package/dist/tests/e2e/property-ic.test.js.map +1 -0
- package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
- package/dist/tests/e2e/runtime-errors.test.js +52 -0
- package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
- package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
- package/dist/tests/e2e/structured-clone.test.js +49 -0
- package/dist/tests/e2e/structured-clone.test.js.map +1 -0
- package/dist/tests/e2e/text-codec.test.d.ts +6 -0
- package/dist/tests/e2e/text-codec.test.js +24 -0
- package/dist/tests/e2e/text-codec.test.js.map +1 -0
- package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
- package/dist/tests/e2e/typed-array-views.test.js +39 -0
- package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
- package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
- package/dist/tests/e2e/url-search-params.test.js +30 -0
- package/dist/tests/e2e/url-search-params.test.js.map +1 -0
- package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
- package/dist/tests/e2e/weak-collections.test.js +88 -0
- package/dist/tests/e2e/weak-collections.test.js.map +1 -0
- package/dist/tests/parser/declarations.test.js +12 -0
- package/dist/tests/parser/declarations.test.js.map +1 -1
- package/dist/tests/parser/module-syntax.test.js +9 -0
- package/dist/tests/parser/module-syntax.test.js.map +1 -1
- package/dist/tests/parser/parser.test.js +7 -0
- package/dist/tests/parser/parser.test.js.map +1 -1
- package/dist/tests/version.test.js +5 -1
- package/dist/tests/version.test.js.map +1 -1
- package/doc/ai/README.md +4 -3
- package/doc/ai/cli.md +41 -0
- package/doc/ai/contributing.md +20 -16
- package/doc/ai/extensions.md +13 -10
- package/doc/ai/language-support.md +19 -14
- package/doc/ai/troubleshooting.md +11 -9
- package/doc/ai/zh-CN/README.md +3 -2
- package/doc/ai/zh-CN/cli.md +35 -0
- package/doc/ai/zh-CN/contributing.md +16 -15
- package/doc/ai/zh-CN/extensions.md +12 -9
- package/doc/ai/zh-CN/language-support.md +19 -15
- package/doc/ai/zh-CN/troubleshooting.md +9 -8
- package/doc/gui/api.md +8 -0
- package/doc/gui/build.md +13 -4
- package/doc/gui/known-issues.md +19 -14
- package/doc/gui/media.md +32 -3
- package/doc/gui/rendering.md +3 -1
- package/doc/gui.md +28 -5
- package/doc/icon.md +5 -4
- package/doc/implemented/async.md +51 -0
- package/doc/implemented/binder.md +13 -0
- package/doc/implemented/cli.md +47 -0
- package/doc/implemented/codegen.md +33 -0
- package/doc/implemented/collections.md +26 -0
- package/doc/implemented/driver.md +19 -0
- package/doc/implemented/extensions.md +19 -0
- package/doc/implemented/fetch.md +44 -0
- package/doc/implemented/lexer.md +23 -0
- package/doc/implemented/modules.md +28 -0
- package/doc/implemented/node/assert.md +17 -0
- package/doc/implemented/node/buffer.md +29 -0
- package/doc/implemented/node/child-process.md +29 -0
- package/doc/implemented/node/crypto.md +9 -0
- package/doc/implemented/node/dgram.md +15 -0
- package/doc/implemented/node/events.md +37 -0
- package/doc/implemented/node/fs-promises.md +49 -0
- package/doc/implemented/node/fs.md +112 -0
- package/doc/implemented/node/http.md +21 -0
- package/doc/implemented/node/net.md +17 -0
- package/doc/implemented/node/os.md +22 -0
- package/doc/implemented/node/path.md +33 -0
- package/doc/implemented/node/process.md +23 -0
- package/doc/implemented/node/querystring.md +20 -0
- package/doc/implemented/node/stream-promises.md +8 -0
- package/doc/implemented/node/stream.md +19 -0
- package/doc/implemented/node/test.md +10 -0
- package/doc/implemented/node/url.md +8 -0
- package/doc/implemented/node/util.md +25 -0
- package/doc/implemented/node/worker-threads.md +10 -0
- package/doc/implemented/node/zlib.md +8 -0
- package/doc/implemented/node.md +48 -0
- package/doc/implemented/operators.md +38 -0
- package/doc/implemented/parser.md +58 -0
- package/doc/implemented/pipeline.md +28 -0
- package/doc/implemented/runtime-core.md +32 -0
- package/doc/implemented/stdlib.md +78 -0
- package/doc/implemented/strings.md +27 -0
- package/doc/implemented/tests.md +10 -0
- package/doc/implemented/typed-arrays.md +26 -0
- package/doc/implemented/value-model.md +18 -0
- package/doc/implemented.md +54 -355
- package/doc/node-implemented.md +3 -585
- package/doc/node-unimplemented.md +3 -164
- package/doc/requirements.md +23 -8
- package/doc/unimplemented/classes.md +22 -0
- package/doc/unimplemented/deviations.md +27 -0
- package/doc/unimplemented/expressions.md +26 -0
- package/doc/unimplemented/functions.md +21 -0
- package/doc/unimplemented/modules.md +22 -0
- package/doc/unimplemented/node/async.md +20 -0
- package/doc/unimplemented/node/bun.md +9 -0
- package/doc/unimplemented/node/fs-promises.md +20 -0
- package/doc/unimplemented/node/fs.md +30 -0
- package/doc/unimplemented/node/globals.md +23 -0
- package/doc/unimplemented/node/modules.md +21 -0
- package/doc/unimplemented/node.md +21 -0
- package/doc/unimplemented/statements.md +18 -0
- package/doc/unimplemented/stdlib.md +54 -0
- package/doc/unimplemented/toolchain.md +14 -0
- package/doc/unimplemented/types.md +12 -0
- package/doc/unimplemented.md +18 -275
- package/doc/xbintsc.config.schema.json +12 -0
- package/doc/zh-CN/gui/api.md +7 -0
- package/doc/zh-CN/gui/build.md +11 -3
- package/doc/zh-CN/gui/known-issues.md +17 -11
- package/doc/zh-CN/gui/media.md +26 -2
- package/doc/zh-CN/gui/rendering.md +2 -1
- package/doc/zh-CN/gui.md +21 -3
- package/doc/zh-CN/icon.md +5 -4
- package/doc/zh-CN/implemented/async.md +49 -0
- package/doc/zh-CN/implemented/binder.md +13 -0
- package/doc/zh-CN/implemented/cli.md +46 -0
- package/doc/zh-CN/implemented/codegen.md +33 -0
- package/doc/zh-CN/implemented/collections.md +26 -0
- package/doc/zh-CN/implemented/driver.md +19 -0
- package/doc/zh-CN/implemented/extensions.md +19 -0
- package/doc/zh-CN/implemented/fetch.md +31 -0
- package/doc/zh-CN/implemented/lexer.md +23 -0
- package/doc/zh-CN/implemented/modules.md +28 -0
- package/doc/zh-CN/implemented/node/assert.md +17 -0
- package/doc/zh-CN/implemented/node/buffer.md +25 -0
- package/doc/zh-CN/implemented/node/child-process.md +27 -0
- package/doc/zh-CN/implemented/node/crypto.md +9 -0
- package/doc/zh-CN/implemented/node/dgram.md +15 -0
- package/doc/zh-CN/implemented/node/events.md +36 -0
- package/doc/zh-CN/implemented/node/fs-promises.md +30 -0
- package/doc/zh-CN/implemented/node/fs.md +105 -0
- package/doc/zh-CN/implemented/node/http.md +17 -0
- package/doc/zh-CN/implemented/node/net.md +17 -0
- package/doc/zh-CN/implemented/node/os.md +21 -0
- package/doc/zh-CN/implemented/node/path.md +26 -0
- package/doc/zh-CN/implemented/node/process.md +23 -0
- package/doc/zh-CN/implemented/node/querystring.md +20 -0
- package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
- package/doc/zh-CN/implemented/node/stream.md +15 -0
- package/doc/zh-CN/implemented/node/test.md +10 -0
- package/doc/zh-CN/implemented/node/url.md +8 -0
- package/doc/zh-CN/implemented/node/util.md +25 -0
- package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
- package/doc/zh-CN/implemented/node/zlib.md +8 -0
- package/doc/zh-CN/implemented/node.md +45 -0
- package/doc/zh-CN/implemented/operators.md +38 -0
- package/doc/zh-CN/implemented/parser.md +58 -0
- package/doc/zh-CN/implemented/pipeline.md +25 -0
- package/doc/zh-CN/implemented/runtime-core.md +31 -0
- package/doc/zh-CN/implemented/stdlib.md +76 -0
- package/doc/zh-CN/implemented/strings.md +27 -0
- package/doc/zh-CN/implemented/tests.md +10 -0
- package/doc/zh-CN/implemented/typed-arrays.md +26 -0
- package/doc/zh-CN/implemented/value-model.md +18 -0
- package/doc/zh-CN/implemented.md +50 -350
- package/doc/zh-CN/node-implemented.md +4 -531
- package/doc/zh-CN/node-unimplemented.md +4 -139
- package/doc/zh-CN/plan-require-node-modules.md +4 -4
- package/doc/zh-CN/requirements.md +20 -6
- package/doc/zh-CN/unimplemented/classes.md +22 -0
- package/doc/zh-CN/unimplemented/deviations.md +24 -0
- package/doc/zh-CN/unimplemented/expressions.md +24 -0
- package/doc/zh-CN/unimplemented/functions.md +21 -0
- package/doc/zh-CN/unimplemented/modules.md +19 -0
- package/doc/zh-CN/unimplemented/node/async.md +20 -0
- package/doc/zh-CN/unimplemented/node/bun.md +8 -0
- package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
- package/doc/zh-CN/unimplemented/node/fs.md +24 -0
- package/doc/zh-CN/unimplemented/node/globals.md +14 -0
- package/doc/zh-CN/unimplemented/node/modules.md +15 -0
- package/doc/zh-CN/unimplemented/node.md +18 -0
- package/doc/zh-CN/unimplemented/statements.md +15 -0
- package/doc/zh-CN/unimplemented/stdlib.md +54 -0
- package/doc/zh-CN/unimplemented/toolchain.md +14 -0
- package/doc/zh-CN/unimplemented/types.md +11 -0
- package/doc/zh-CN/unimplemented.md +14 -237
- package/llms.txt +32 -4
- package/package.json +1 -1
- package/runtime/ext_gui/inline_svg.cpp +219 -0
- package/runtime/ext_gui/inline_svg.h +41 -0
- package/runtime/ext_gui/layout.cpp +18 -0
- package/runtime/ext_gui/layout.h +7 -0
- package/runtime/ext_gui/layout_flow.cpp +4 -3
- package/runtime/ext_gui/paint.cpp +14 -0
- package/runtime/ext_gui/paint.h +5 -1
- package/runtime/ext_gui/renderer_image.cpp +53 -25
- package/runtime/ext_gui/renderer_shaders.h +2 -2
- package/runtime/ext_gui/stb_image.h +1 -17
- package/runtime/ext_gui/style_ua.cpp +3 -0
- package/runtime/ext_gui/svg.cpp +122 -39
- package/runtime/ext_gui/svg.h +14 -3
- package/runtime/ext_gui/window.cpp +28 -0
- package/runtime/ext_node/child_process/child_process.c +173 -73
- package/runtime/ext_node/fs/async_api.c +314 -0
- package/runtime/ext_node/fs/async_complete.c +99 -0
- package/runtime/ext_node/fs/async_fh.c +206 -0
- package/runtime/ext_node/fs/async_job.c +81 -0
- package/runtime/ext_node/fs/async_job.h +132 -0
- package/runtime/ext_node/fs/async_worker.c +534 -0
- package/runtime/ext_node/fs/async_worker_dir.c +439 -0
- package/runtime/ext_node/fs/async_worker_dir.h +33 -0
- package/runtime/ext_node/fs/async_worker_fd.c +74 -0
- package/runtime/ext_node/fs/dir.c +60 -15
- package/runtime/ext_node/fs/fs_common.h +9 -0
- package/runtime/ext_node/fs/fs_ops.c +18 -29
- package/runtime/ext_node/fs/parts/builtins.inc +34 -0
- package/runtime/ext_node/fs/parts/platform.inc +66 -0
- package/runtime/ext_node/fs/promises.c +44 -234
- package/runtime/rt.h +15 -0
- package/runtime/rt_internal.h +108 -0
- package/runtime/xt_alloc.c +43 -7
- package/runtime/xt_array_buffer.c +284 -0
- package/runtime/xt_async.c +46 -21
- package/runtime/xt_async_io.c +333 -0
- package/runtime/xt_async_io.h +47 -0
- package/runtime/xt_bigint/helpers.inc +3 -3
- package/runtime/xt_builtins.c +21 -17
- package/runtime/xt_constructors.c +12 -2
- package/runtime/xt_containers/access.inc +148 -3
- package/runtime/xt_containers/objects.inc +26 -2
- package/runtime/xt_containers/shapes.inc +71 -0
- package/runtime/xt_containers.c +1 -0
- package/runtime/xt_coroutine.c +17 -0
- package/runtime/xt_fetch/async.inc +295 -0
- package/runtime/xt_fetch/request.inc +6 -183
- package/runtime/xt_fetch/socket.inc +5 -4
- package/runtime/xt_fetch.c +6 -4
- package/runtime/xt_generator.c +299 -10
- package/runtime/xt_io/inspect.inc +112 -0
- package/runtime/xt_loop.c +79 -7
- package/runtime/xt_performance.c +37 -0
- package/runtime/xt_promise.c +63 -1
- package/runtime/xt_stdlib/arrays.inc +1 -1
- package/runtime/xt_stdlib/dispatch.inc +46 -11
- package/runtime/xt_stdlib/strings.inc +1 -1
- package/runtime/xt_stdlib2/array-statics.inc +25 -0
- package/runtime/xt_stdlib2/arrays.inc +5 -3
- package/runtime/xt_stdlib2/container.inc +5 -0
- package/runtime/xt_stdlib2/date.inc +111 -3
- package/runtime/xt_stdlib2/error.inc +24 -0
- package/runtime/xt_stdlib2/json.inc +310 -19
- package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
- package/runtime/xt_stdlib2/objects.inc +122 -0
- package/runtime/xt_stdlib2/set.inc +1 -1
- package/runtime/xt_structured_clone.c +159 -0
- package/runtime/xt_symbol.c +2 -2
- package/runtime/xt_text_codec.c +69 -0
- package/runtime/xt_typed_array/construction.inc +35 -5
- package/runtime/xt_typed_array/elements.inc +159 -0
- package/runtime/xt_typed_array/methods.inc +21 -5
- package/runtime/xt_typed_array.c +7 -10
- package/runtime/xt_url.c +375 -0
- package/runtime/xt_values/arithmetic.inc +2 -2
- package/runtime/xt_values/conversions.inc +1 -1
- package/runtime/xt_weak.c +281 -0
- package/scripts/build-gui.ts +133 -60
- package/scripts/check-version.ts +3 -3
- package/src/binder/declarations.ts +14 -3
- package/src/cli/hints.ts +8 -1
- package/src/cli/main.ts +119 -18
- package/src/cli/watch.ts +101 -0
- package/src/codegen/generator/calls/access.ts +10 -2
- package/src/codegen/generator/calls/closures.ts +12 -4
- package/src/codegen/generator/context.ts +23 -3
- package/src/codegen/generator/expressions/operators.ts +27 -13
- package/src/codegen/generator/expressions/primary.ts +4 -0
- package/src/codegen/generator/module.ts +0 -7
- package/src/codegen/generator/numeric.ts +85 -11
- package/src/codegen/generator/state.ts +23 -0
- package/src/codegen/generator/statements/control-flow.ts +1 -4
- package/src/codegen/generator/statements/loops.ts +50 -16
- package/src/codegen/generator/tables.ts +26 -1
- package/src/diagnostics/diagnostic.ts +23 -3
- package/src/driver/app-artifacts.ts +77 -0
- package/src/driver/build-key.ts +55 -0
- package/src/driver/bundler/graph.ts +63 -13
- package/src/driver/bundler/merge.ts +4 -1
- package/src/driver/compiler.ts +94 -328
- package/src/driver/config.ts +11 -0
- package/src/driver/frontend.ts +120 -0
- package/src/driver/index.ts +0 -1
- package/src/driver/options.ts +70 -0
- package/src/driver/runtime-objects.ts +134 -0
- package/src/driver/toolchain-provider.ts +4 -0
- package/src/driver/toolchain.ts +154 -10
- package/src/driver/version.ts +12 -0
- package/src/driver/win-icon.ts +36 -36
- package/src/extensions/node/fs/index.ts +12 -3
- package/src/extensions/node/fs-promises/index.ts +15 -6
- package/src/parser/declarations/classes.ts +4 -0
- package/src/parser/declarations/functions.ts +12 -1
- package/src/parser/modules.ts +8 -4
- package/src/parser/parser.ts +28 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# 名字绑定与作用域(Binder)
|
|
2
|
+
|
|
3
|
+
> 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/binder.md)
|
|
4
|
+
|
|
5
|
+
实现位置:`src/binder/binder.ts`
|
|
6
|
+
|
|
7
|
+
- 作用域种类:模块、函数、块、`for`、`catch`
|
|
8
|
+
- 符号种类:`var` / `let` / `const` / `function` / `parameter` / `class` / `interface` / `type` / `enum` / `import` / `namespace`
|
|
9
|
+
- `var` 与函数声明提升到函数作用域;`let` / `const` 保持块作用域
|
|
10
|
+
- 标识符 → 声明 的解析;未解析标识符收集(`CannotFindName`)
|
|
11
|
+
- 闭包捕获分析:被内层函数引用的外部变量标记 `captured` / `boxed`,并穿过中间闭包传递捕获索引
|
|
12
|
+
- 参数登记为局部符号;命名函数表达式自名登记为 `const`
|
|
13
|
+
- 类型专用声明(interface / type alias)不参与值捕获
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# CLI 与编程接口
|
|
2
|
+
|
|
3
|
+
> 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/cli.md)
|
|
4
|
+
|
|
5
|
+
实现位置:`src/cli/main.ts`、`src/index.ts`、`bin/xbintsc.js`
|
|
6
|
+
|
|
7
|
+
## CLI 命令
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
xbintsc build <file.ts> [options] 编译为原生二进制
|
|
11
|
+
xbintsc run <file.ts> [-- args] 编译并执行
|
|
12
|
+
xbintsc emit <file.ts> 打印 LLVM IR
|
|
13
|
+
xbintsc version 打印版本
|
|
14
|
+
xbintsc help 帮助
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## CLI 选项
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
-o, --output <path> 输出路径
|
|
21
|
+
--out <dir> 输出目录(默认 build/)
|
|
22
|
+
--emit <kind> exe | obj | ir(默认 exe)
|
|
23
|
+
-O0..-O3 优化级别(默认 -O2)
|
|
24
|
+
--ext <names> 逗号分隔扩展(如 node)
|
|
25
|
+
--ext-native <m> 从 JSON manifest 注册 C++/Rust 扩展
|
|
26
|
+
--config <path> 使用项目配置(默认自动查找 xbintsc.config.json)
|
|
27
|
+
--no-config 不读取任何项目配置
|
|
28
|
+
--icon <path> 内嵌应用图标(PNG/ICO/ICNS)
|
|
29
|
+
--bundle macOS:同时生成 .app bundle
|
|
30
|
+
--app-name <name> bundle / 显示名称
|
|
31
|
+
--app-id <id> macOS bundle 标识符(如 com.example.demo)
|
|
32
|
+
--force 忽略增量缓存
|
|
33
|
+
--verbose 打印进度信息
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 编程接口
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { build, compileString } from "xbintsc";
|
|
40
|
+
|
|
41
|
+
const { ir } = compileString("console.log(1 + 1);");
|
|
42
|
+
const result = build("program.ts", { emit: "exe", outDir: "build" });
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
选项与结果类型(`BuildOptions`、`BuildResult`、`EmitKind`、`PhaseTiming`)位于
|
|
46
|
+
`src/driver/options.ts`,并由 `src/driver/compiler.ts` / `xbintsc` 重新导出。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# LLVM IR 代码生成(Codegen)
|
|
2
|
+
|
|
3
|
+
> 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/codegen.md)
|
|
4
|
+
|
|
5
|
+
实现位置:`src/codegen/llvm.ts`
|
|
6
|
+
|
|
7
|
+
- 生成 LLVM IR 文本(`.ll`),无需自建寄存器分配(依赖 `alloca` + mem2reg)。
|
|
8
|
+
- 语句 / 块边界值放在 `alloca`;条件与短路运算物化为临时槽,不使用 `phi`。
|
|
9
|
+
- 属性读取按源码位置生成内联缓存:每个访问点拥有一个零初始化的 `[2 x i64]` 全局(`@ic.N`),传给 `xt_get_ic`。普通对象带有驻留的隐藏类 shape(`xt_shape`,`(parent, key)` 转移树),缓存保存 `(shape, 属性下标)`,命中时只需比较 shape 指针并校验一次键,无需线性扫描属性表。插入/删除属性以及整数键重排会重建或转移 shape,从而使旧缓存失效;数组、函数与容器回退到 `xt_get`。
|
|
10
|
+
- 数值运算符保留内联双精度快路径;数值字面量操作数跳过标签检查。若条件表达式本身是比较、`in`、`instanceof` 或 `!`,其值已经是布尔标签,代码生成用 `icmp eq i64 value, XT_TRUE` 代替调用 `xt_truthy`(热循环条件因此少一次调用)。
|
|
11
|
+
- 控制流:`if` / `while` / `do` / `for` / `for...of` / `for...in`,`switch`,`try/catch/finally`,`break` / `continue` / `return`。
|
|
12
|
+
- `for...of` 与展开通过 `xt_iter_open` → `xt_iter_has` / `xt_iter_value` 迭代数组、字符串、类型化数组、`Map`、`Set`、生成器以及任何暴露 `[Symbol.iterator]()` 的对象(`Map` 产出 `[key, value]` 对);非可迭代值抛出 `TypeError`。数组还暴露稳定的 `Array.prototype[Symbol.iterator]`,调用后返回带 `next()` 且自身可迭代的迭代器对象。
|
|
13
|
+
- `switch` 以严格相等逐 `case` 测试,命中后执行并在 `break` 前穿透。
|
|
14
|
+
- `try/catch/finally` 通过运行时 `_setjmp` 帧实现:`xt_try_enter` 入栈、`_setjmp` 捕获、`xt_throw` 长跳转;IR 会把调用方的帧地址(`@llvm.frameaddress(0)`)作为 `_setjmp` 的第二个参数传入,与 clang 编译 MSVC 时的降级方式一致:Windows UCRT 的 `_setjmp` 会把这个帧存入 `_JUMP_BUFFER.Frame`,`longjmp` 再交给 `RtlUnwind` 执行栈展开;若不传该参数,`longjmp` 会展开到错误目标(`STATUS_BAD_FUNCTION_TABLE`)。使用 `_setjmp` 而非导出的 `setjmp` 符号,因为后者的 Windows ABI 是不兼容的双参数例程。含 `try` 的函数会强制局部变量驻留内存(内联汇编逃生点)以保证长跳转后值不丢失。
|
|
15
|
+
- `for...in` 复用 `xt_object_keys` 枚举键(数组 / 字符串得到字符串下标)。
|
|
16
|
+
- 表达式:
|
|
17
|
+
- 标识符、数字、BigInt(任意精度)、字符串、模板、布尔、`null`、`undefined`、`arguments`
|
|
18
|
+
- 算术 / 比较 / 逻辑 / 短路 / 条件 / 位运算 / 一元(含 `typeof` `void`)/ 前后缀增减 / 复合赋值 / 逻辑赋值
|
|
19
|
+
- 数组字面量(含展开 `[...]`)、对象字面量(含简写 / 方法 / 对象展开 `{...obj}`)
|
|
20
|
+
- 类型化数组、`ArrayBuffer`、`DataView`、`TextEncoder` / `TextDecoder`:见[类型化数组与二进制数据](./typed-arrays.md)与[字符串与文本](./strings.md)
|
|
21
|
+
- 属性访问(含 `length` 特判、`Math` 常量)、元素访问、调用
|
|
22
|
+
- 一等公民内建构造器(`const A = Array`、`const M = Map`、`const E = TypeError`、类型化数组):裸引用下降为 `xt_builtin_constructor`,得到带 `name` / `length`、`prototype` 与静态成员(`A.isArray`、`A.from`、`M.prototype` 等)的缓存函数。通过别名调用或 `new` 会分派到同一运行时构造器,`x instanceof A` 沿共享原型链判断。
|
|
23
|
+
- 可选链 `?.` / `?.[]` / `?.()`:以空值判断短路到 `undefined`
|
|
24
|
+
- `delete`、`in`、`instanceof`
|
|
25
|
+
- `this`(保存到函数 `%saved.this`;箭头函数从环境槽读)、`super`(`super.x` / `super(...)`)、`new`、`await`
|
|
26
|
+
- 闭包(箭头函数 / 函数表达式)与捕获环境构建
|
|
27
|
+
- 类:构造器闭包 + 原型对象,存入 LLVM 全局(`@class.<id>`);实例字段在构造器体前初始化;`static` 成员存于构造器属性包;`extends` 设置原型链;`super(...)` 通过原型上的隐藏 `__ctor` 调用。
|
|
28
|
+
- `async` / `async function*`:闭包分别用 `xt_function_set_async` / `xt_function_set_async_generator` 标记,并在栈式协程上运行——见[异步、Promise 与生成器](./async.md)。
|
|
29
|
+
- 标准库调用统一走 `xt_call_method` / `xt_math_call` / `xt_object_*` 与各构造器的 `xt_*` 入口;完整表面见[标准库](./stdlib.md)。
|
|
30
|
+
- 全局字符串池(`@.str.N` 私有常量,UTF-8 转义)。
|
|
31
|
+
- 内置调用:`console.log` / `info` / `warn` / `error`、`Math.*`、`Object.*`、数组 / 字符串方法、全局函数、扩展 builtins(统一 `(argc, argv)` ABI)。
|
|
32
|
+
- `main` 入口(返回 0,调用模块函数,并在返回前 `xt_drain_microtasks`)。
|
|
33
|
+
- 未支持节点统一报 `UnsupportedFeature`,不会崩溃。
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# 集合
|
|
2
|
+
|
|
3
|
+
> 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/collections.md)
|
|
4
|
+
|
|
5
|
+
实现位置:`runtime/xt_stdlib2/container.inc`(Map / Set)与
|
|
6
|
+
`runtime/xt_weak.c`(WeakMap / WeakSet / WeakRef)。
|
|
7
|
+
|
|
8
|
+
## Map 与 Set
|
|
9
|
+
|
|
10
|
+
- `new Map()` / `new Map(iterable)`、`new Set()` / `new Set(iterable)`。
|
|
11
|
+
- `Map`:`size`、`get` / `set` / `has` / `delete` / `clear` / `forEach` / `keys` / `values` / `entries`。
|
|
12
|
+
- `Set`:`size`、`add` / `has` / `delete` / `clear` / `forEach` / `values` / `keys` / `entries`。
|
|
13
|
+
- `for...of` 与展开通过 `[Symbol.iterator]` 迭代;`Map` 产出 `[key, value]` 对,`keys` / `values` / `entries` 按插入序返回数组。
|
|
14
|
+
- `Object.keys` / `values` / `entries` 不会看到集合内部结构。
|
|
15
|
+
- `structuredClone` 支持 `Map` 与 `Set`,保留循环引用与共享引用。
|
|
16
|
+
|
|
17
|
+
## WeakMap、WeakSet 与 WeakRef
|
|
18
|
+
|
|
19
|
+
- `WeakMap`:`get` / `set` / `has` / `delete`;`WeakSet`:`add` / `has` / `delete`;`WeakRef`:`deref()`。
|
|
20
|
+
- 键(以及 `WeakRef` 目标)不会让被引用对象存活:`WeakMap` / `WeakSet` 的键是 **ephemeron**(只有键可达时才保留值),`WeakRef` 目标不可达时会被清空。
|
|
21
|
+
- 栈扫描是保守的,残留的栈字可能延迟弱目标清空。完整 GC 描述见[运行时偏差](../unimplemented/deviations.md)与[未实现:工具链](../unimplemented/toolchain.md)。
|
|
22
|
+
|
|
23
|
+
## 迭代
|
|
24
|
+
|
|
25
|
+
- 任何暴露 `[Symbol.iterator]()` 的对象都可在 `for...of` 与展开中使用。`Array.prototype[Symbol.iterator]` 稳定,调用后返回带 `next()` 且自身可迭代的迭代器对象。
|
|
26
|
+
- 迭代细节另见[代码生成](./codegen.md)与 [Symbol](./stdlib.md)。
|
|
@@ -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,31 @@
|
|
|
1
|
+
# fetch
|
|
2
|
+
|
|
3
|
+
> 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/fetch.md)
|
|
4
|
+
|
|
5
|
+
实现位置:`runtime/xt_fetch.c`、`runtime/xt_fetch/async.inc`、`runtime/xt_async_io.c`。
|
|
6
|
+
|
|
7
|
+
- 全局 `fetch(input, init)` 是 HTTP/1.1 客户端。阻塞的套接字交换(`getaddrinfo`、connect、send、receive)运行在异步 I/O 工作线程池上,因此进行中的请求**不会**卡住事件循环:定时器、套接字与其他 `await` 继续运行,promise 在 reactor 派发完成结果时 settle。
|
|
8
|
+
- 重定向在主线程上处理:每一跳是一次 offload 交换,最多 20 次;301/302/303 会把 POST 改成 GET。
|
|
9
|
+
- 只接受 `http://` URL —— 由于未链接 TLS 后端,`https://` 会以 `TypeError` 拒绝。
|
|
10
|
+
- 选项:`method`、`headers`(普通对象或 `Headers`)、`body` 与 `redirect`(`follow` / `manual` / `error`)。
|
|
11
|
+
- 解析出的 `Response` 形状对象暴露 `ok` / `status` / `statusText` / `url` / `headers` 以及 `text()` / `json()` / `arrayBuffer()` / `bytes()` / `clone()`。响应体在 promise settle 前已完整缓冲;不支持流式响应体。
|
|
12
|
+
- `Headers` 大小写不敏感,提供 `get` / `has` / `set` / `append` / `delete` / `keys` / `values` / `entries` / `forEach` / `getSetCookie`。
|
|
13
|
+
- 非法 URL 与网络失败会以 `TypeError` 拒绝。
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
async function main(): Promise<void> {
|
|
17
|
+
const response = await fetch("http://127.0.0.1:8080/status");
|
|
18
|
+
console.log(response.status, await response.text());
|
|
19
|
+
}
|
|
20
|
+
main();
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
在请求完成前安排的定时器会在交换仍在进行时触发:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
const pending = fetch("http://127.0.0.1:8080/slow");
|
|
27
|
+
setTimeout(() => console.log("timer"), 10); // 会在 150ms 的响应之前运行
|
|
28
|
+
await pending;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
已知限制(仅 `http://`、无 TLS、响应体整体缓冲)列在[运行时偏差](../unimplemented/deviations.md)。
|
|
@@ -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,30 @@
|
|
|
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/async_*.c`、`runtime/ext_node/fs/promises.c`
|
|
6
|
+
|
|
7
|
+
每个函数都会向运行时的异步 I/O 线程池(`runtime/xt_async_io.c`)提交一个 job:阻塞的系统调用在 worker 线程上执行,promise 在事件循环上 settle。因此 `await` 在大文件读取、慢速网络文件系统或描述符操作进行期间会让出,`then` / `catch` 保持标准 Promise 语义。失败时会以与同步形式相同的 Node `Error`(含 `code` / `errno` / `syscall` / `path`)**reject**。
|
|
8
|
+
|
|
9
|
+
`fs.promises` 也可从 `fs` 模块访问(`import { promises as fsp } from "fs"`),两个命名空间都暴露 `constants` 对象。
|
|
10
|
+
|
|
11
|
+
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`。
|
|
12
|
+
|
|
13
|
+
`open(...)` 解析为 **`FileHandle`**,带有:`read`、`write`、`readFile`、`writeFile`、`appendFile`、`close`、`stat`、`truncate`、`chmod`、`chown`、`utimes`、`sync`、`datasync`。这些方法同样会 offload;`read(buffer, …)` 会在 worker 完成后填充调用方的 `Buffer`。
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { readFile, writeFile, open } from "fs/promises";
|
|
17
|
+
|
|
18
|
+
async function main(): Promise<void> {
|
|
19
|
+
await writeFile("/tmp/a.txt", "hi");
|
|
20
|
+
console.log(await readFile("/tmp/a.txt"));
|
|
21
|
+
const handle = await open("/tmp/a.txt", "r");
|
|
22
|
+
console.log(await handle.readFile("utf8"));
|
|
23
|
+
await handle.close();
|
|
24
|
+
}
|
|
25
|
+
main();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
工作由固定的小型线程池(4 个 worker)执行,完成结果按每个 worker 的提交顺序派发;相互独立的操作可以重叠。任何 job 都不会阻塞其他 `await`、定时器或套接字回调。
|
|
29
|
+
|
|
30
|
+
已知偏差见[未实现:`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
|
+
```
|