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,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end tests for the asynchronous `fs/promises` implementation.
|
|
3
|
+
*
|
|
4
|
+
* The promise must settle on the event loop, not inside the call, and a worker
|
|
5
|
+
* running a blocking syscall must not stop timers from firing. The FIFO case
|
|
6
|
+
* makes the blocking part deterministic: opening a FIFO for reading blocks until
|
|
7
|
+
* a writer arrives, which happens only after the timer has had time to fire.
|
|
8
|
+
*/
|
|
9
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { expect, it } from "vitest";
|
|
12
|
+
import { describeE2E } from "./harness.js";
|
|
13
|
+
const itPosix = process.platform === "win32" ? it.skip : it;
|
|
14
|
+
describeE2E("async fs/promises", (harness) => {
|
|
15
|
+
it("settles promises on the event loop instead of inside the call", () => {
|
|
16
|
+
const target = JSON.stringify(join(harness.workdir, `settle_${Math.random().toString(36).slice(2)}.txt`));
|
|
17
|
+
const output = harness.runProgram(`
|
|
18
|
+
import { promises as fsp } from "node:fs";
|
|
19
|
+
|
|
20
|
+
async function main(): Promise<void> {
|
|
21
|
+
const target = ${target};
|
|
22
|
+
await fsp.writeFile(target, "hello");
|
|
23
|
+
|
|
24
|
+
let settled = false;
|
|
25
|
+
const pending = fsp.stat(target);
|
|
26
|
+
pending.then(() => { settled = true; });
|
|
27
|
+
console.log("immediate", settled);
|
|
28
|
+
await pending;
|
|
29
|
+
console.log("later", settled);
|
|
30
|
+
await fsp.unlink(target);
|
|
31
|
+
}
|
|
32
|
+
main();
|
|
33
|
+
`, { extensions: true });
|
|
34
|
+
expect(output).toBe("immediate false\nlater true");
|
|
35
|
+
});
|
|
36
|
+
itPosix("fires timers while a read is blocked on a FIFO", () => {
|
|
37
|
+
const suffix = Math.random().toString(36).slice(2);
|
|
38
|
+
const fifo = join(harness.workdir, `pipe_${suffix}`);
|
|
39
|
+
const marker = join(harness.workdir, `pipe_ready_${suffix}`);
|
|
40
|
+
execFileSync("mkfifo", [fifo]);
|
|
41
|
+
const quote = (path) => `'${path.replace(/'/g, "'\\''")}'`;
|
|
42
|
+
// `runProgram` compiles before it runs, so the writer must wait for the
|
|
43
|
+
// compiled program to signal that it is about to read. It then waits long
|
|
44
|
+
// enough for the 10ms timer to be due before unblocking the reader.
|
|
45
|
+
const writer = spawn("sh", ["-c", `while [ ! -f ${quote(marker)} ]; do sleep 0.01; done; sleep 0.5; printf hello > ${quote(fifo)}`], { stdio: "ignore" });
|
|
46
|
+
try {
|
|
47
|
+
const output = harness.runProgram(`
|
|
48
|
+
import { promises as fsp } from "node:fs";
|
|
49
|
+
|
|
50
|
+
async function main(): Promise<void> {
|
|
51
|
+
await fsp.writeFile(${JSON.stringify(marker)}, "ready");
|
|
52
|
+
const order: string[] = [];
|
|
53
|
+
const pending = fsp.readFile(${JSON.stringify(fifo)}, "utf8").then((text) => order.push("read:" + text));
|
|
54
|
+
setTimeout(() => order.push("timer"), 10);
|
|
55
|
+
await pending;
|
|
56
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 10));
|
|
57
|
+
console.log(order.join(","));
|
|
58
|
+
}
|
|
59
|
+
main();
|
|
60
|
+
`, { extensions: true, timeout: 60000 });
|
|
61
|
+
expect(output).toBe("timer,read:hello");
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
writer.kill();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
it("runs independent file operations concurrently", () => {
|
|
68
|
+
const base = JSON.stringify(join(harness.workdir, `concurrent_${Math.random().toString(36).slice(2)}`));
|
|
69
|
+
const output = harness.runProgram(`
|
|
70
|
+
import { promises as fsp } from "node:fs";
|
|
71
|
+
|
|
72
|
+
async function main(): Promise<void> {
|
|
73
|
+
const base = ${base};
|
|
74
|
+
await fsp.mkdir(base, { recursive: true });
|
|
75
|
+
await Promise.all([
|
|
76
|
+
fsp.writeFile(base + "/a.txt", "alpha"),
|
|
77
|
+
fsp.writeFile(base + "/b.txt", "beta"),
|
|
78
|
+
fsp.writeFile(base + "/c.txt", "gamma"),
|
|
79
|
+
]);
|
|
80
|
+
const [a, b, c, listing] = await Promise.all([
|
|
81
|
+
fsp.readFile(base + "/a.txt", "utf8"),
|
|
82
|
+
fsp.readFile(base + "/b.txt", "utf8"),
|
|
83
|
+
fsp.readFile(base + "/c.txt", "utf8"),
|
|
84
|
+
fsp.readdir(base),
|
|
85
|
+
]);
|
|
86
|
+
console.log(a, b, c, listing.length);
|
|
87
|
+
const entries = await fsp.readdir(base, { withFileTypes: true });
|
|
88
|
+
console.log(entries.length, entries[0].isFile());
|
|
89
|
+
await fsp.cp(base + "/a.txt", base + "/a-copy.txt");
|
|
90
|
+
console.log(await fsp.readFile(base + "/a-copy.txt", "utf8"));
|
|
91
|
+
await fsp.rm(base, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
main();
|
|
94
|
+
`, { extensions: true });
|
|
95
|
+
expect(output).toBe("alpha beta gamma 3\n3 true\nalpha");
|
|
96
|
+
});
|
|
97
|
+
it("does not leave a pending job unrooted across a collection", () => {
|
|
98
|
+
const target = JSON.stringify(join(harness.workdir, `fire_forget_${Math.random().toString(36).slice(2)}.txt`));
|
|
99
|
+
// The promise returned by the fire-and-forget call is reachable only through
|
|
100
|
+
// the job's root slot; a stress collection between submission and completion
|
|
101
|
+
// would otherwise sweep it before the worker settles it.
|
|
102
|
+
const output = harness.runProgram(`
|
|
103
|
+
import { promises as fsp } from "node:fs";
|
|
104
|
+
|
|
105
|
+
async function main(): Promise<void> {
|
|
106
|
+
const target = ${target};
|
|
107
|
+
await fsp.writeFile(target, "kept");
|
|
108
|
+
fsp.readFile(target, "utf8");
|
|
109
|
+
console.log("scheduled");
|
|
110
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 50));
|
|
111
|
+
console.log("survived");
|
|
112
|
+
await fsp.unlink(target);
|
|
113
|
+
}
|
|
114
|
+
main();
|
|
115
|
+
`, { extensions: true, env: { XT_GC_THRESHOLD: "1" } });
|
|
116
|
+
expect(output).toBe("scheduled\nsurvived");
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=async-fs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-fs.test.js","sourceRoot":"","sources":["../../../tests/e2e/async-fs.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAE5D,WAAW,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,EAAE;IAC3C,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1G,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAC/B;;;;yBAImB,MAAM;;;;;;;;;;;;OAYxB,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,MAAM,EAAE,CAAC,CAAC;QAC7D,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,MAAM,GAAG,KAAK,CAClB,IAAI,EACJ,CAAC,IAAI,EAAE,gBAAgB,KAAK,CAAC,MAAM,CAAC,sDAAsD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EACxG,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAC/B;;;;gCAIwB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;yCAEb,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;SAOpD,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CACrC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAC/B;;;;uBAIiB,IAAI;;;;;;;;;;;;;;;;;;;;;OAqBpB,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/G,6EAA6E;QAC7E,6EAA6E;QAC7E,yDAAyD;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAC/B;;;;yBAImB,MAAM;;;;;;;;;OASxB,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,CACpD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { it } from "vitest";
|
|
2
|
+
import { describeE2E } from "./harness.js";
|
|
3
|
+
/**
|
|
4
|
+
* `async function*` and `for await...of` are backed by the same stackful
|
|
5
|
+
* coroutine as generators and async functions. The body can await a timer and
|
|
6
|
+
* still resume at the right yield, and every `.next()` request gets a promise.
|
|
7
|
+
*/
|
|
8
|
+
describeE2E("async generators and for await...of", (harness) => {
|
|
9
|
+
it("yields across awaits and completes with a return value", () => {
|
|
10
|
+
harness.expectSameOutputAsNode(`
|
|
11
|
+
async function* count(limit: number) {
|
|
12
|
+
for (let i = 0; i < limit; i++) {
|
|
13
|
+
await Promise.resolve(i);
|
|
14
|
+
yield i * 2;
|
|
15
|
+
}
|
|
16
|
+
return 99;
|
|
17
|
+
}
|
|
18
|
+
async function main() {
|
|
19
|
+
const values: number[] = [];
|
|
20
|
+
for await (const value of count(3)) values.push(value);
|
|
21
|
+
const it = count(2);
|
|
22
|
+
const first = await it.next();
|
|
23
|
+
const second = await it.next();
|
|
24
|
+
const done = await it.next();
|
|
25
|
+
console.log(JSON.stringify({ values, first, second, done }));
|
|
26
|
+
}
|
|
27
|
+
main();
|
|
28
|
+
`);
|
|
29
|
+
});
|
|
30
|
+
it("suspends on a timer between yields", () => {
|
|
31
|
+
harness.expectSameOutputAsNode(`
|
|
32
|
+
async function delay(ms: number) {
|
|
33
|
+
return new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
34
|
+
}
|
|
35
|
+
async function* timed() {
|
|
36
|
+
yield "a";
|
|
37
|
+
await delay(2);
|
|
38
|
+
yield "b";
|
|
39
|
+
}
|
|
40
|
+
async function main() {
|
|
41
|
+
const log: string[] = [];
|
|
42
|
+
setTimeout(() => log.push("timer"), 0);
|
|
43
|
+
for await (const value of timed()) log.push("yield:" + value);
|
|
44
|
+
console.log(log.join(","));
|
|
45
|
+
}
|
|
46
|
+
main();
|
|
47
|
+
`);
|
|
48
|
+
});
|
|
49
|
+
it("supports throw, catch and finally inside the body", () => {
|
|
50
|
+
harness.expectSameOutputAsNode(`
|
|
51
|
+
async function* catching() {
|
|
52
|
+
try {
|
|
53
|
+
yield 1;
|
|
54
|
+
yield 2;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
yield "caught:" + (error as Error).message;
|
|
57
|
+
} finally {
|
|
58
|
+
yield "finally";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function main() {
|
|
62
|
+
const it = catching();
|
|
63
|
+
const out: string[] = [];
|
|
64
|
+
out.push(JSON.stringify(await it.next()));
|
|
65
|
+
out.push(JSON.stringify(await it.throw(new Error("boom"))));
|
|
66
|
+
out.push(JSON.stringify(await it.next()));
|
|
67
|
+
out.push(JSON.stringify(await it.next()));
|
|
68
|
+
console.log(out.join("\\n"));
|
|
69
|
+
}
|
|
70
|
+
main();
|
|
71
|
+
`);
|
|
72
|
+
});
|
|
73
|
+
it("iterates sync generators, arrays and custom async iterables", () => {
|
|
74
|
+
harness.expectSameOutputAsNode(`
|
|
75
|
+
function* syncValues() { yield 1; yield 2; }
|
|
76
|
+
const custom = {
|
|
77
|
+
[Symbol.asyncIterator]() {
|
|
78
|
+
let i = 0;
|
|
79
|
+
return {
|
|
80
|
+
next() {
|
|
81
|
+
i++;
|
|
82
|
+
if (i <= 2) return Promise.resolve({ value: i * 10, done: false });
|
|
83
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
async function main() {
|
|
89
|
+
const out: number[] = [];
|
|
90
|
+
for await (const value of syncValues()) out.push(value);
|
|
91
|
+
for await (const value of [3, 4]) out.push(value);
|
|
92
|
+
for await (const value of custom) out.push(value);
|
|
93
|
+
console.log(out.join(","));
|
|
94
|
+
}
|
|
95
|
+
main();
|
|
96
|
+
`);
|
|
97
|
+
});
|
|
98
|
+
it("keeps a suspended async generator and its await chain alive across collections", () => {
|
|
99
|
+
harness.expectSameOutputAsNode(`
|
|
100
|
+
async function* range(n: number) {
|
|
101
|
+
const buf: number[] = [];
|
|
102
|
+
for (let i = 0; i < n; i++) {
|
|
103
|
+
const hold = { i, text: "v" + i };
|
|
104
|
+
await Promise.resolve(i);
|
|
105
|
+
buf.push(hold.i);
|
|
106
|
+
yield buf.length;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function main() {
|
|
110
|
+
let sum = 0;
|
|
111
|
+
for await (const value of range(300)) {
|
|
112
|
+
const garbage = "x".repeat(40) + value;
|
|
113
|
+
sum += garbage.length;
|
|
114
|
+
}
|
|
115
|
+
console.log(sum);
|
|
116
|
+
}
|
|
117
|
+
main();
|
|
118
|
+
`, { env: { XT_GC_THRESHOLD: "1" } });
|
|
119
|
+
});
|
|
120
|
+
it("resolves queued next() calls in order", () => {
|
|
121
|
+
harness.expectSameOutputAsNode(`
|
|
122
|
+
async function* values() { yield 1; yield 2; }
|
|
123
|
+
async function main() {
|
|
124
|
+
const it = values();
|
|
125
|
+
const first = it.next();
|
|
126
|
+
const second = it.next();
|
|
127
|
+
console.log(JSON.stringify(await first), JSON.stringify(await second));
|
|
128
|
+
}
|
|
129
|
+
main();
|
|
130
|
+
`);
|
|
131
|
+
});
|
|
132
|
+
it("returns done from return() and rejects an escaped throw", () => {
|
|
133
|
+
harness.expectSameOutputAsNode(`
|
|
134
|
+
async function* values() { yield 1; }
|
|
135
|
+
async function* failing() { yield 1; throw new Error("bad"); }
|
|
136
|
+
async function main() {
|
|
137
|
+
const it = values();
|
|
138
|
+
const returned = await it.return(7);
|
|
139
|
+
const after = await it.next();
|
|
140
|
+
const f = failing();
|
|
141
|
+
const first = await f.next();
|
|
142
|
+
let message = "";
|
|
143
|
+
try {
|
|
144
|
+
await f.next();
|
|
145
|
+
} catch (error) {
|
|
146
|
+
message = (error as Error).message;
|
|
147
|
+
}
|
|
148
|
+
console.log(JSON.stringify({ returned, after, first, message }));
|
|
149
|
+
}
|
|
150
|
+
main();
|
|
151
|
+
`);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=async-generators.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-generators.test.js","sourceRoot":"","sources":["../../../tests/e2e/async-generators.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;GAIG;AACH,WAAW,CAAC,qCAAqC,EAAE,CAAC,OAAO,EAAE,EAAE;IAC7D,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;KAkB9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;;;KAgB9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;;;;KAqB9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;;;;;KAsB9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,OAAO,CAAC,sBAAsB,CAC5B;;;;;;;;;;;;;;;;;;;KAmBD,EACC,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;KAS9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;KAkB9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `await` always yields once, even for a non-promise or an already-settled
|
|
3
|
+
* promise, so it interleaves with pending `.then` callbacks exactly like Node.
|
|
4
|
+
*/
|
|
5
|
+
import { it } from "vitest";
|
|
6
|
+
import { describeE2E } from "./harness.js";
|
|
7
|
+
describeE2E("await microtask ordering", (harness) => {
|
|
8
|
+
it("yields for non-promises and settled promises", () => {
|
|
9
|
+
harness.expectSameOutputAsNode(`
|
|
10
|
+
async function run(): Promise<void> {
|
|
11
|
+
console.log("a");
|
|
12
|
+
await 1;
|
|
13
|
+
console.log("b");
|
|
14
|
+
await Promise.resolve(2);
|
|
15
|
+
console.log("c");
|
|
16
|
+
}
|
|
17
|
+
run();
|
|
18
|
+
console.log("caller");
|
|
19
|
+
Promise.resolve().then(() => console.log("then1"));
|
|
20
|
+
`);
|
|
21
|
+
});
|
|
22
|
+
it("queues rejection handling in the same order as Node", () => {
|
|
23
|
+
harness.expectSameOutputAsNode(`
|
|
24
|
+
async function run(): Promise<void> {
|
|
25
|
+
try {
|
|
26
|
+
await Promise.reject("boom");
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.log("caught", error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
run();
|
|
32
|
+
console.log("sync");
|
|
33
|
+
Promise.resolve().then(() => console.log("then"));
|
|
34
|
+
`);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=await-ordering.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"await-ordering.test.js","sourceRoot":"","sources":["../../../tests/e2e/await-ordering.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,0BAA0B,EAAE,CAAC,OAAO,EAAE,EAAE;IAClD,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;KAW9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;KAW9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -131,7 +131,7 @@ describeE2E("end-to-end built-in library", (harness) => {
|
|
|
131
131
|
main();
|
|
132
132
|
Promise.resolve(10).then((x) => console.log("then", x + 1));
|
|
133
133
|
`;
|
|
134
|
-
expect(runProgram(source)).toBe("hello world\n3\nfulfilled rejected\ncaught boom
|
|
134
|
+
expect(runProgram(source)).toBe("hello world\nthen 11\n3\nfulfilled rejected\ncaught boom");
|
|
135
135
|
});
|
|
136
136
|
it("supports Map, Set, JSON and extended standard library methods", () => {
|
|
137
137
|
const source = `
|
|
@@ -44,5 +44,12 @@ describeE2E("end-to-end module bundling", (harness) => {
|
|
|
44
44
|
},
|
|
45
45
|
})).toBe("5");
|
|
46
46
|
});
|
|
47
|
+
it("evaluates a side-effect-only import before the importer", () => {
|
|
48
|
+
const source = `
|
|
49
|
+
import "./side_effect";
|
|
50
|
+
console.log("main");
|
|
51
|
+
`;
|
|
52
|
+
expect(runProgram(source, { files: { "side_effect.ts": 'console.log("side");' } })).toBe("side\nmain");
|
|
53
|
+
});
|
|
47
54
|
});
|
|
48
55
|
//# sourceMappingURL=compile-modules.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-modules.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile-modules.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,4BAA4B,EAAE,CAAC,OAAO,EAAE,EAAE;IACpD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EACpC;;;;;;;;OAQC,CACF,CAAC;QACF,MAAM,MAAM,GAAG;;;;KAId,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,0BAA0B,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG;;;KAGd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG;;;KAGd,CAAC;QACF,MAAM,CACJ,UAAU,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE;gBACL,WAAW,EAAE,kCAAkC;gBAC/C,YAAY,EAAE,6CAA6C;aAC5D;SACF,CAAC,CACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"compile-modules.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile-modules.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,4BAA4B,EAAE,CAAC,OAAO,EAAE,EAAE;IACpD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EACpC;;;;;;;;OAQC,CACF,CAAC;QACF,MAAM,MAAM,GAAG;;;;KAId,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,0BAA0B,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG;;;KAGd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG;;;KAGd,CAAC;QACF,MAAM,CACJ,UAAU,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE;gBACL,WAAW,EAAE,kCAAkC;gBAC/C,YAAY,EAAE,6CAA6C;aAC5D;SACF,CAAC,CACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG;;;KAGd,CAAC;QACF,MAAM,CACJ,UAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAC5E,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Date.parse` / `new Date(string)` for ISO 8601 input.
|
|
3
|
+
*
|
|
4
|
+
* Both used to score every string as 0 (the epoch), so a parsed date silently
|
|
5
|
+
* became 1970-01-01. The supported subset is date-only (`YYYY-MM-DD`, UTC),
|
|
6
|
+
* optional `THH:MM[:SS[.mmm]]`, and a `Z` / `±HH:MM` / `±HHMM` offset.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Date.parse` / `new Date(string)` for ISO 8601 input.
|
|
3
|
+
*
|
|
4
|
+
* Both used to score every string as 0 (the epoch), so a parsed date silently
|
|
5
|
+
* became 1970-01-01. The supported subset is date-only (`YYYY-MM-DD`, UTC),
|
|
6
|
+
* optional `THH:MM[:SS[.mmm]]`, and a `Z` / `±HH:MM` / `±HHMM` offset.
|
|
7
|
+
*/
|
|
8
|
+
import { it } from "vitest";
|
|
9
|
+
import { describeE2E } from "./harness.js";
|
|
10
|
+
describeE2E("Date parsing", (harness) => {
|
|
11
|
+
it("parses ISO 8601 strings like Node", () => {
|
|
12
|
+
harness.expectSameOutputAsNode(`
|
|
13
|
+
console.log(Date.parse("2020-01-01T00:00:00.000Z"));
|
|
14
|
+
console.log(new Date("2020-01-01T12:30:15.250+02:00").toISOString());
|
|
15
|
+
console.log(
|
|
16
|
+
new Date("2020-01-01").getUTCFullYear(),
|
|
17
|
+
new Date("2020-01-01").getUTCMonth(),
|
|
18
|
+
new Date("2020-01-01").getUTCDate(),
|
|
19
|
+
);
|
|
20
|
+
console.log(Number.isNaN(Date.parse("not a date")));
|
|
21
|
+
console.log(Number.isNaN(new Date("nope").getTime()));
|
|
22
|
+
console.log(new Date("2020-02-29T00:00:00Z").toISOString());
|
|
23
|
+
console.log(Number.isNaN(Date.parse("2020-02-30")));
|
|
24
|
+
console.log(new Date("2020-06-15 08:05:00Z").toISOString());
|
|
25
|
+
console.log(new Date("2020-06-15T08:05:00+0800").toISOString());
|
|
26
|
+
`);
|
|
27
|
+
});
|
|
28
|
+
it("throws a RangeError for toISOString on an invalid date", () => {
|
|
29
|
+
harness.expectSameOutputAsNode(`
|
|
30
|
+
try {
|
|
31
|
+
new Date("nope").toISOString();
|
|
32
|
+
} catch (e: any) {
|
|
33
|
+
console.log(e instanceof RangeError, e.name);
|
|
34
|
+
}
|
|
35
|
+
`);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=date-parse.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-parse.test.js","sourceRoot":"","sources":["../../../tests/e2e/date-parse.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;IACtC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;KAc9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,OAAO,CAAC,sBAAsB,CAAC;;;;;;KAM9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `export default function () {}` / `export default class {}` are valid
|
|
3
|
+
* TypeScript. They used to crash the binder because the declaration has no
|
|
4
|
+
* name; the parser now gives them the internal binding name `default` so the
|
|
5
|
+
* bundler can map the default export like any other.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `export default function () {}` / `export default class {}` are valid
|
|
3
|
+
* TypeScript. They used to crash the binder because the declaration has no
|
|
4
|
+
* name; the parser now gives them the internal binding name `default` so the
|
|
5
|
+
* bundler can map the default export like any other.
|
|
6
|
+
*/
|
|
7
|
+
import { it } from "vitest";
|
|
8
|
+
import { describeE2E } from "./harness.js";
|
|
9
|
+
describeE2E("anonymous default exports", (harness) => {
|
|
10
|
+
it("imports an anonymous default function and class", () => {
|
|
11
|
+
harness.expectSameOutputAsNode(`
|
|
12
|
+
import fn from "./lib-fn.ts";
|
|
13
|
+
import C from "./lib-class.ts";
|
|
14
|
+
console.log(fn(), new C().x, new C() instanceof C);
|
|
15
|
+
`, {
|
|
16
|
+
files: {
|
|
17
|
+
"lib-fn.ts": "export default function () { return 7; }",
|
|
18
|
+
"lib-class.ts": "export default class { x = 1; }",
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=default-anonymous-exports.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-anonymous-exports.test.js","sourceRoot":"","sources":["../../../tests/e2e/default-anonymous-exports.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,2BAA2B,EAAE,CAAC,OAAO,EAAE,EAAE;IACnD,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,OAAO,CAAC,sBAAsB,CAC5B;;;;OAIC,EACD;YACE,KAAK,EAAE;gBACL,WAAW,EAAE,0CAA0C;gBACvD,cAAc,EAAE,iCAAiC;aAClD;SACF,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -49,6 +49,11 @@ const server = createServer((req, res) => {
|
|
|
49
49
|
} else if (url === "/cookies") {
|
|
50
50
|
res.writeHead(200, { "set-cookie": ["a=1", "b=2"], "content-type": "text/plain" });
|
|
51
51
|
res.end("cookies");
|
|
52
|
+
} else if (url === "/slow") {
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
res.writeHead(200, { "content-type": "text/plain" });
|
|
55
|
+
res.end("slow");
|
|
56
|
+
}, 150);
|
|
52
57
|
} else if (url === "/bytes") {
|
|
53
58
|
res.writeHead(200, { "content-type": "application/octet-stream" });
|
|
54
59
|
res.end(Buffer.from([0, 1, 2, 255]));
|
|
@@ -254,6 +259,25 @@ describeWithClang("fetch builtin", () => {
|
|
|
254
259
|
"missing true",
|
|
255
260
|
]);
|
|
256
261
|
});
|
|
262
|
+
it("keeps the reactor running while a request is in flight", () => {
|
|
263
|
+
const base = baseUrl();
|
|
264
|
+
const { status, stdout } = run(`
|
|
265
|
+
async function main() {
|
|
266
|
+
const order: string[] = [];
|
|
267
|
+
const slow = fetch("${base}/slow");
|
|
268
|
+
slow.then(async (res) => order.push("response:" + (await res.text())));
|
|
269
|
+
setTimeout(() => order.push("timer"), 10);
|
|
270
|
+
await slow;
|
|
271
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 20));
|
|
272
|
+
console.log(order.join(","));
|
|
273
|
+
}
|
|
274
|
+
main();
|
|
275
|
+
`);
|
|
276
|
+
expect(status).toBe(0);
|
|
277
|
+
// A blocking client would finish the 150ms response before the 10ms timer
|
|
278
|
+
// is even scheduled; a reactor-driven one fires the timer first.
|
|
279
|
+
expect(stdout.trim()).toBe("timer,response:slow");
|
|
280
|
+
});
|
|
257
281
|
it("is usable as a first-class value", () => {
|
|
258
282
|
const base = baseUrl();
|
|
259
283
|
const { status, stdout } = run(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.test.js","sourceRoot":"","sources":["../../../tests/e2e/fetch.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,iBAAiB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEhE,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"fetch.test.js","sourceRoot":"","sources":["../../../tests/e2e/fetch.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,iBAAiB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEhE,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDrB,CAAC;AAEF,iBAAiB,CAAC,eAAe,EAAE,GAAG,EAAE;IACtC,IAAI,OAAe,CAAC;IACpB,IAAI,QAAgB,CAAC;IACrB,IAAI,MAAgC,CAAC;IAErC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACxD,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACzC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QACrG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,MAAM,EAAE,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,SAAS,GAAG,CAAC,MAAc;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjF,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,kEAAkE;QAClE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACnG,CAAC;IAED,SAAS,OAAO;QACd,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,OAAO,oBAAoB,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;mCAEA,IAAI;;;;;qCAKF,IAAI;;;qCAGJ,IAAI;;;uCAGF,IAAI;;;oCAGP,IAAI;;;4CAGI,IAAI;;;6CAGH,IAAI;;;;KAI5C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,aAAa;YACb,kBAAkB;YAClB,0BAA0B;YAC1B,oBAAoB;YACpB,gBAAgB;YAChB,2BAA2B;YAC3B,aAAa;YACb,iBAAiB;YACjB,UAAU;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;mCAEA,IAAI;;;;;;;4CAOK,IAAI;;;;;;;;KAQ3C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,gDAAgD;YAChD,2CAA2C;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;wCAEK,IAAI;;;sCAGN,IAAI;;;0CAGA,IAAI;;;;yBAIrB,IAAI;;;;;;;KAOxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,gCAAgC,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;mCAEA,IAAI;;;;;;;;;;KAUlC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;KAyB9B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,eAAe;YACf,eAAe;YACf,eAAe;YACf,eAAe;YACf,eAAe;YACf,eAAe;YACf,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;;8BAGL,IAAI;;;;;;;;KAQ7B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,0EAA0E;QAC1E,iEAAiE;QACjE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;;;;kCAID,IAAI;;;;KAIjC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node globals that sit on the event loop: `queueMicrotask`, `setImmediate`,
|
|
3
|
+
* `clearImmediate` and `performance.now`.
|
|
4
|
+
*
|
|
5
|
+
* queueMicrotask shares the promise reaction queue (FIFO), setImmediate is a
|
|
6
|
+
* zero-delay timer that forwards extra arguments, and performance.now reads a
|
|
7
|
+
* monotonic clock with sub-millisecond resolution.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node globals that sit on the event loop: `queueMicrotask`, `setImmediate`,
|
|
3
|
+
* `clearImmediate` and `performance.now`.
|
|
4
|
+
*
|
|
5
|
+
* queueMicrotask shares the promise reaction queue (FIFO), setImmediate is a
|
|
6
|
+
* zero-delay timer that forwards extra arguments, and performance.now reads a
|
|
7
|
+
* monotonic clock with sub-millisecond resolution.
|
|
8
|
+
*/
|
|
9
|
+
import { it } from "vitest";
|
|
10
|
+
import { describeE2E } from "./harness.js";
|
|
11
|
+
describeE2E("microtask and immediate globals", (harness) => {
|
|
12
|
+
it("orders microtasks, supports first-class values and performance.now", () => {
|
|
13
|
+
harness.expectSameOutputAsNode(`
|
|
14
|
+
queueMicrotask(() => console.log("micro"));
|
|
15
|
+
Promise.resolve().then(() => console.log("promise"));
|
|
16
|
+
queueMicrotask(() => console.log("micro2"));
|
|
17
|
+
|
|
18
|
+
console.log(typeof performance.now(), performance.now() > 0, typeof performance.now);
|
|
19
|
+
const now = performance.now;
|
|
20
|
+
console.log(typeof now);
|
|
21
|
+
|
|
22
|
+
setImmediate((a: number, b: number) => console.log("immediate", a, b), 1, 2);
|
|
23
|
+
const cancelled = setImmediate(() => console.log("cancelled"));
|
|
24
|
+
clearImmediate(cancelled);
|
|
25
|
+
`);
|
|
26
|
+
});
|
|
27
|
+
it("rejects a non-function microtask callback", () => {
|
|
28
|
+
harness.expectSameOutputAsNode(`
|
|
29
|
+
try {
|
|
30
|
+
queueMicrotask(1 as any);
|
|
31
|
+
} catch (e: any) {
|
|
32
|
+
console.log(e instanceof TypeError, e.name);
|
|
33
|
+
}
|
|
34
|
+
`);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=globals-microtask.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globals-microtask.test.js","sourceRoot":"","sources":["../../../tests/e2e/globals-microtask.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,iCAAiC,EAAE,CAAC,OAAO,EAAE,EAAE;IACzD,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;KAY9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,sBAAsB,CAAC;;;;;;KAM9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end tests for the `gui` extension — inline `<svg>` elements.
|
|
3
|
+
*
|
|
4
|
+
* An inline `<svg>` tree is not an SVG *file*: the document already holds the
|
|
5
|
+
* nodes, so the engine serializes the subtree back into an SVG document and
|
|
6
|
+
* rasterises it exactly like `<img src="logo.svg">`. These tests pin the
|
|
7
|
+
* replaced-element sizing, the display-list entry, the serializer's canonical
|
|
8
|
+
* SVG names (the HTML parser lowercases `viewBox`/`linearGradient`) and the
|
|
9
|
+
* fact that a DOM mutation re-serializes the artwork.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|