xbintsc 0.3.87 → 0.5.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -11
- package/README.md +11 -9
- package/README.zh-CN.md +7 -7
- 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 +17 -4
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/closures.js +13 -1
- package/dist/src/codegen/generator/calls/closures.js.map +1 -1
- package/dist/src/codegen/generator/calls/invocation.js +4 -3
- package/dist/src/codegen/generator/calls/invocation.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 +11 -1
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/module.d.ts +0 -1
- package/dist/src/codegen/generator/module.js +10 -17
- 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 +27 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.js +2 -7
- 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.d.ts +9 -0
- package/dist/src/codegen/generator/tables.js +100 -3
- 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 +94 -230
- 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 +111 -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/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/closures.test.js +8 -0
- package/dist/tests/codegen/closures.test.js.map +1 -1
- 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.d.ts +10 -0
- package/dist/tests/e2e/async-await.test.js +247 -0
- package/dist/tests/e2e/async-await.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/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-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-coverage-globals.test.js +46 -0
- package/dist/tests/e2e/runtime-coverage-globals.test.js.map +1 -1
- 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/string-utf16.test.d.ts +6 -0
- package/dist/tests/e2e/string-utf16.test.js +133 -0
- package/dist/tests/e2e/string-utf16.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 +26 -21
- package/doc/ai/extensions.md +12 -9
- package/doc/ai/language-support.md +26 -19
- package/doc/ai/troubleshooting.md +15 -12
- 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 +19 -18
- package/doc/ai/zh-CN/extensions.md +10 -7
- package/doc/ai/zh-CN/language-support.md +26 -20
- package/doc/ai/zh-CN/troubleshooting.md +12 -10
- package/doc/gui/build.md +13 -4
- package/doc/gui/known-issues.md +9 -5
- package/doc/gui/rendering.md +3 -1
- package/doc/gui.md +4 -3
- package/doc/icon.md +5 -4
- package/doc/implemented/async.md +38 -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 +12 -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 +38 -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 -352
- 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 +17 -0
- package/doc/unimplemented/node/bun.md +9 -0
- package/doc/unimplemented/node/fs-promises.md +16 -0
- package/doc/unimplemented/node/fs.md +31 -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 -274
- package/doc/xbintsc.config.schema.json +12 -0
- package/doc/zh-CN/gui/build.md +11 -3
- package/doc/zh-CN/gui/known-issues.md +9 -4
- package/doc/zh-CN/gui/rendering.md +2 -1
- package/doc/zh-CN/gui.md +3 -2
- package/doc/zh-CN/icon.md +5 -4
- package/doc/zh-CN/implemented/async.md +38 -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 +12 -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 +27 -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 -347
- 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 +17 -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 -236
- package/llms.txt +32 -4
- package/package.json +1 -1
- package/runtime/ext_gui/renderer_shaders.h +2 -2
- package/runtime/ext_gui/stb_image.h +1 -17
- package/runtime/ext_node/child_process/child_process.c +173 -73
- package/runtime/rt.h +47 -0
- package/runtime/rt_internal.h +205 -10
- package/runtime/xt_alloc.c +49 -7
- package/runtime/xt_array_buffer.c +284 -0
- package/runtime/xt_async.c +222 -0
- package/runtime/xt_bigint/helpers.inc +3 -3
- package/runtime/xt_builtins.c +59 -51
- package/runtime/xt_constructors.c +399 -0
- package/runtime/xt_containers/access.inc +195 -14
- package/runtime/xt_containers/arrays.inc +26 -2
- package/runtime/xt_containers/objects.inc +226 -5
- package/runtime/xt_containers/shapes.inc +71 -0
- package/runtime/xt_containers.c +1 -0
- package/runtime/xt_coroutine.c +229 -0
- package/runtime/xt_generator.c +325 -167
- package/runtime/xt_io/inspect.inc +147 -2
- package/runtime/xt_loop.c +35 -4
- package/runtime/xt_performance.c +37 -0
- package/runtime/xt_promise.c +125 -18
- package/runtime/xt_stdlib/arrays.inc +1 -1
- package/runtime/xt_stdlib/dispatch.inc +64 -13
- package/runtime/xt_stdlib/strings.inc +74 -17
- package/runtime/xt_stdlib2/array-statics.inc +28 -3
- 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 +35 -0
- package/runtime/xt_stdlib2/json.inc +353 -33
- package/runtime/xt_stdlib2/number-string-statics.inc +24 -15
- package/runtime/xt_stdlib2/objects.inc +123 -1
- package/runtime/xt_stdlib2/regexp-match.inc +2 -2
- package/runtime/xt_stdlib2/set.inc +7 -1
- package/runtime/xt_stdlib2/strings.inc +70 -40
- 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 +78 -7
- package/runtime/xt_typed_array/elements.inc +159 -0
- package/runtime/xt_typed_array/methods.inc +21 -5
- package/runtime/xt_typed_array.c +11 -10
- package/runtime/xt_url.c +375 -0
- package/runtime/xt_values/arithmetic.inc +2 -2
- package/runtime/xt_values/constructors.inc +8 -0
- package/runtime/xt_values/conversions.inc +1 -1
- package/runtime/xt_values/strings.inc +19 -3
- package/runtime/xt_values/utf16.inc +340 -0
- package/runtime/xt_values.c +1 -0
- 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 +17 -4
- package/src/codegen/generator/calls/closures.ts +12 -1
- package/src/codegen/generator/calls/invocation.ts +4 -3
- package/src/codegen/generator/context.ts +23 -3
- package/src/codegen/generator/expressions/operators.ts +27 -13
- package/src/codegen/generator/expressions/primary.ts +10 -1
- package/src/codegen/generator/module.ts +10 -19
- package/src/codegen/generator/numeric.ts +85 -11
- package/src/codegen/generator/state.ts +27 -0
- package/src/codegen/generator/statements/control-flow.ts +2 -6
- package/src/codegen/generator/statements/loops.ts +50 -16
- package/src/codegen/generator/tables.ts +110 -3
- 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 +93 -324
- 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 +133 -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/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,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end tests for *real* `async`/`await` suspension.
|
|
3
|
+
*
|
|
4
|
+
* An `async` function runs its body on a stackful coroutine. When it awaits a
|
|
5
|
+
* promise that has not settled yet, the coroutine suspends and the event loop
|
|
6
|
+
* (timers, sockets, ...) takes over; the promise's settlement resumes the
|
|
7
|
+
* coroutine exactly where it stopped. These tests therefore depend on work that
|
|
8
|
+
* can only complete after the program body returns.
|
|
9
|
+
*/
|
|
10
|
+
import { expect, it } from "vitest";
|
|
11
|
+
import { describeE2E } from "./harness.js";
|
|
12
|
+
import { makeDifferential } from "./differential-helpers.js";
|
|
13
|
+
const prelude = `
|
|
14
|
+
function sleep(ms: number): Promise<void> {
|
|
15
|
+
return new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
18
|
+
describeE2E("end-to-end real async/await", (harness) => {
|
|
19
|
+
const { runProgram } = harness;
|
|
20
|
+
const { diff } = makeDifferential(harness);
|
|
21
|
+
diff("resumes an async function after a timer settles its promise", `${prelude}
|
|
22
|
+
const order: string[] = [];
|
|
23
|
+
async function main(): Promise<void> {
|
|
24
|
+
order.push("start");
|
|
25
|
+
await sleep(5);
|
|
26
|
+
order.push("timer");
|
|
27
|
+
const value = await new Promise<number>((resolve) => setTimeout(() => resolve(7), 1));
|
|
28
|
+
order.push("value:" + value);
|
|
29
|
+
}
|
|
30
|
+
main().then(() => {
|
|
31
|
+
order.push("done");
|
|
32
|
+
console.log(order.join(","));
|
|
33
|
+
});
|
|
34
|
+
console.log("body");`);
|
|
35
|
+
it("keeps the program alive until an awaited timer resolves", () => {
|
|
36
|
+
const source = `${prelude}
|
|
37
|
+
async function main(): Promise<void> {
|
|
38
|
+
await sleep(10);
|
|
39
|
+
console.log("after");
|
|
40
|
+
}
|
|
41
|
+
main();
|
|
42
|
+
console.log("before");`;
|
|
43
|
+
expect(runProgram(source)).toBe("before\nafter");
|
|
44
|
+
});
|
|
45
|
+
it("runs independent async functions concurrently", () => {
|
|
46
|
+
/* Do not assert which timer fires first: Windows timer granularity can
|
|
47
|
+
* batch 1ms and 8ms deadlines into the same reactor turn. Instead observe
|
|
48
|
+
* that both bodies reach their `await` before either resumes (peak 2),
|
|
49
|
+
* and that `Promise.all` keeps the array order regardless of completion
|
|
50
|
+
* order. */
|
|
51
|
+
const source = `${prelude}
|
|
52
|
+
let active = 0;
|
|
53
|
+
let peak = 0;
|
|
54
|
+
async function task(ms: number): Promise<number> {
|
|
55
|
+
active++;
|
|
56
|
+
if (active > peak) peak = active;
|
|
57
|
+
await sleep(ms);
|
|
58
|
+
active--;
|
|
59
|
+
return ms;
|
|
60
|
+
}
|
|
61
|
+
async function main(): Promise<void> {
|
|
62
|
+
const results = await Promise.all([task(8), task(1)]);
|
|
63
|
+
console.log("peak", peak, "results", results.join(","));
|
|
64
|
+
}
|
|
65
|
+
main();`;
|
|
66
|
+
expect(runProgram(source)).toBe("peak 2 results 8,1");
|
|
67
|
+
});
|
|
68
|
+
it("finishes independent async functions in delay order with long timers", () => {
|
|
69
|
+
/* The timers are far enough apart (50ms vs 200ms) that even a platform
|
|
70
|
+
* with ~15ms timer granularity cannot merge them into one reactor turn, so
|
|
71
|
+
* completion order is observable and deterministic. */
|
|
72
|
+
const source = `${prelude}
|
|
73
|
+
const order: string[] = [];
|
|
74
|
+
async function task(name: string, ms: number): Promise<void> {
|
|
75
|
+
await sleep(ms);
|
|
76
|
+
order.push(name);
|
|
77
|
+
}
|
|
78
|
+
async function main(): Promise<void> {
|
|
79
|
+
await Promise.all([task("slow", 200), task("fast", 50)]);
|
|
80
|
+
console.log(order.join(","));
|
|
81
|
+
}
|
|
82
|
+
main();`;
|
|
83
|
+
expect(runProgram(source)).toBe("fast,slow");
|
|
84
|
+
});
|
|
85
|
+
it("rejects when an awaited timer promise rejects and is catchable", () => {
|
|
86
|
+
const source = `${prelude}
|
|
87
|
+
function fail(ms: number): Promise<number> {
|
|
88
|
+
return new Promise<number>((_resolve, reject) => setTimeout(() => reject("boom"), ms));
|
|
89
|
+
}
|
|
90
|
+
async function main(): Promise<void> {
|
|
91
|
+
try {
|
|
92
|
+
await fail(2);
|
|
93
|
+
console.log("unreachable");
|
|
94
|
+
} catch (error) {
|
|
95
|
+
console.log("caught", error);
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await fail(1);
|
|
99
|
+
} finally {
|
|
100
|
+
console.log("finally");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
main();`;
|
|
104
|
+
expect(runProgram(source)).toBe("caught boom\nfinally");
|
|
105
|
+
});
|
|
106
|
+
it("rejects the returned promise when the body throws after resuming", () => {
|
|
107
|
+
const source = `${prelude}
|
|
108
|
+
async function boom(): Promise<void> {
|
|
109
|
+
await sleep(1);
|
|
110
|
+
throw new Error("late");
|
|
111
|
+
}
|
|
112
|
+
boom().catch((error: any) => console.log("rejected", error.message));`;
|
|
113
|
+
expect(runProgram(source)).toBe("rejected late");
|
|
114
|
+
});
|
|
115
|
+
it("suspends across loops, closures and nested async calls", () => {
|
|
116
|
+
const source = `${prelude}
|
|
117
|
+
async function twice(n: number): Promise<number> {
|
|
118
|
+
await sleep(1);
|
|
119
|
+
return n * 2;
|
|
120
|
+
}
|
|
121
|
+
async function sum(limit: number): Promise<number> {
|
|
122
|
+
let total = 0;
|
|
123
|
+
for (let i = 0; i < limit; i++) {
|
|
124
|
+
total += await twice(i);
|
|
125
|
+
}
|
|
126
|
+
return total;
|
|
127
|
+
}
|
|
128
|
+
async function main(): Promise<void> {
|
|
129
|
+
const total = await sum(4);
|
|
130
|
+
console.log("total", total);
|
|
131
|
+
}
|
|
132
|
+
main();`;
|
|
133
|
+
expect(runProgram(source)).toBe("total 12");
|
|
134
|
+
});
|
|
135
|
+
it("resumes two coroutines waiting on the same promise", () => {
|
|
136
|
+
const source = `${prelude}
|
|
137
|
+
async function main(): Promise<void> {
|
|
138
|
+
const shared = new Promise<string>((resolve) => setTimeout(() => resolve("shared"), 3));
|
|
139
|
+
const results = await Promise.all([
|
|
140
|
+
(async () => "a:" + (await shared))(),
|
|
141
|
+
(async () => "b:" + (await shared))(),
|
|
142
|
+
]);
|
|
143
|
+
console.log(results.join(" "));
|
|
144
|
+
}
|
|
145
|
+
main();`;
|
|
146
|
+
expect(runProgram(source)).toBe("a:shared b:shared");
|
|
147
|
+
});
|
|
148
|
+
it("awaits a promise resolved by a socket callback", () => {
|
|
149
|
+
const source = `
|
|
150
|
+
import net from "node:net";
|
|
151
|
+
|
|
152
|
+
function once(socket: any, event: string): Promise<any> {
|
|
153
|
+
return new Promise<any>((resolve) => socket.on(event, resolve));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function main(): Promise<void> {
|
|
157
|
+
const server = net.createServer((socket: any) => {
|
|
158
|
+
socket.on("data", (data: any) => {
|
|
159
|
+
socket.write("echo:" + data);
|
|
160
|
+
socket.end();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
server.listen(0, () => {});
|
|
164
|
+
await new Promise<void>((resolve) => server.on("listening", resolve));
|
|
165
|
+
const client = net.connect(server.address().port, "127.0.0.1");
|
|
166
|
+
client.write("ping");
|
|
167
|
+
const data = await once(client, "data");
|
|
168
|
+
await once(client, "end");
|
|
169
|
+
server.close();
|
|
170
|
+
console.log("client", data);
|
|
171
|
+
}
|
|
172
|
+
main();`;
|
|
173
|
+
expect(runProgram(source, { extensions: true })).toBe("client echo:ping");
|
|
174
|
+
});
|
|
175
|
+
it("awaits fs/promises across an event-loop turn", () => {
|
|
176
|
+
const base = `${JSON.stringify(harness.workdir)} + "/async-fs-" + Math.random().toString(36).slice(2)`;
|
|
177
|
+
const source = `
|
|
178
|
+
import { promises as fsp } from "fs";
|
|
179
|
+
|
|
180
|
+
async function main(): Promise<void> {
|
|
181
|
+
const base = ${base};
|
|
182
|
+
await fsp.mkdir(base, { recursive: true });
|
|
183
|
+
const order: string[] = [];
|
|
184
|
+
setTimeout(() => order.push("timer"), 1);
|
|
185
|
+
await fsp.writeFile(base + "/a.txt", "hello");
|
|
186
|
+
order.push("write");
|
|
187
|
+
const text = await fsp.readFile(base + "/a.txt", "utf8");
|
|
188
|
+
order.push("read:" + text);
|
|
189
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 5));
|
|
190
|
+
order.push("waited");
|
|
191
|
+
console.log(order.join(","));
|
|
192
|
+
await fsp.rm(base, { recursive: true, force: true });
|
|
193
|
+
}
|
|
194
|
+
main();`;
|
|
195
|
+
expect(runProgram(source, { extensions: true })).toBe("write,read:hello,timer,waited");
|
|
196
|
+
});
|
|
197
|
+
it("keeps a pending await alive while unrelated timers fire", () => {
|
|
198
|
+
const source = `${prelude}
|
|
199
|
+
const log: string[] = [];
|
|
200
|
+
async function main(): Promise<void> {
|
|
201
|
+
setTimeout(() => log.push("early"), 1);
|
|
202
|
+
await sleep(6);
|
|
203
|
+
log.push("late");
|
|
204
|
+
console.log(log.join(","));
|
|
205
|
+
}
|
|
206
|
+
main();`;
|
|
207
|
+
expect(runProgram(source)).toBe("early,late");
|
|
208
|
+
});
|
|
209
|
+
it("runs async callbacks scheduled by then() and setTimeout()", () => {
|
|
210
|
+
const source = `${prelude}
|
|
211
|
+
Promise.resolve().then(async () => {
|
|
212
|
+
await sleep(1);
|
|
213
|
+
console.log("then");
|
|
214
|
+
});
|
|
215
|
+
setTimeout(async () => {
|
|
216
|
+
await sleep(1);
|
|
217
|
+
console.log("timer");
|
|
218
|
+
}, 2);`;
|
|
219
|
+
expect(runProgram(source)).toBe("then\ntimer");
|
|
220
|
+
});
|
|
221
|
+
it("awaits a top-level promise by blocking on the event loop", () => {
|
|
222
|
+
const source = `${prelude}
|
|
223
|
+
await sleep(50);
|
|
224
|
+
console.log("top-level");`;
|
|
225
|
+
expect(runProgram(source)).toBe("top-level");
|
|
226
|
+
});
|
|
227
|
+
it("keeps suspended coroutines reachable across collections", () => {
|
|
228
|
+
const source = `${prelude}
|
|
229
|
+
async function worker(id: number): Promise<number> {
|
|
230
|
+
let total = 0;
|
|
231
|
+
for (let i = 0; i < 20; i++) {
|
|
232
|
+
const junk: any[] = [];
|
|
233
|
+
for (let j = 0; j < 10; j++) junk.push({ id, i, j, text: "x".repeat(40) + j });
|
|
234
|
+
await sleep(i % 2);
|
|
235
|
+
total += junk.length;
|
|
236
|
+
}
|
|
237
|
+
return total;
|
|
238
|
+
}
|
|
239
|
+
async function main(): Promise<void> {
|
|
240
|
+
const results = await Promise.all([worker(1), worker(2)]);
|
|
241
|
+
console.log("alive", results.join(","));
|
|
242
|
+
}
|
|
243
|
+
main();`;
|
|
244
|
+
expect(runProgram(source, { env: { XT_GC_THRESHOLD: "1048576" }, timeout: 60000 })).toBe("alive 200,200");
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=async-await.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-await.test.js","sourceRoot":"","sources":["../../../tests/e2e/async-await.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -26,7 +26,14 @@ function mediaSrc(absolutePath) {
|
|
|
26
26
|
return absolutePath.split("\\").join("/");
|
|
27
27
|
}
|
|
28
28
|
const resourcesAvailable = existsSync(moviePath) && existsSync(soundPath);
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Windows builds the GUI archive without FFmpeg on purpose (see
|
|
31
|
+
* `doc/gui/known-issues.md`), so media elements are inert there and the suite
|
|
32
|
+
* would only report the expected `error` events as failures. It stays skipped
|
|
33
|
+
* even with `xbintsc_GUI_TESTS=1`.
|
|
34
|
+
*/
|
|
35
|
+
const mediaAvailable = process.platform !== "win32";
|
|
36
|
+
describe.skipIf(!guiAvailable || !resourcesAvailable || !mediaAvailable)("gui extension — media", () => {
|
|
30
37
|
const harness = createGuiHarness();
|
|
31
38
|
beforeAll(() => harness.setup());
|
|
32
39
|
afterAll(() => harness.cleanup());
|