xbintsc 0.3.9 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +14 -11
  2. package/README.zh-CN.md +13 -11
  3. package/dist/src/codegen/generator/calls/invocation.js +3 -0
  4. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  5. package/dist/src/codegen/generator/context.d.ts +5 -0
  6. package/dist/src/codegen/generator/context.js +10 -1
  7. package/dist/src/codegen/generator/context.js.map +1 -1
  8. package/dist/src/codegen/generator/expressions/primary.js +17 -0
  9. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  10. package/dist/src/codegen/generator/state.js +3 -0
  11. package/dist/src/codegen/generator/state.js.map +1 -1
  12. package/dist/src/codegen/generator/tables.js +3 -0
  13. package/dist/src/codegen/generator/tables.js.map +1 -1
  14. package/dist/src/driver/index.d.ts +1 -1
  15. package/dist/src/driver/index.js +1 -1
  16. package/dist/src/driver/index.js.map +1 -1
  17. package/dist/src/driver/paths.d.ts +7 -0
  18. package/dist/src/driver/paths.js +9 -0
  19. package/dist/src/driver/paths.js.map +1 -1
  20. package/dist/src/extensions/node/assert/index.d.ts +10 -0
  21. package/dist/src/extensions/node/assert/index.js +37 -0
  22. package/dist/src/extensions/node/assert/index.js.map +1 -0
  23. package/dist/src/extensions/node/fs/index.js +3 -1
  24. package/dist/src/extensions/node/fs/index.js.map +1 -1
  25. package/dist/src/extensions/node/fs/streams.d.ts +6 -0
  26. package/dist/src/extensions/node/fs/streams.js +9 -0
  27. package/dist/src/extensions/node/fs/streams.js.map +1 -0
  28. package/dist/src/extensions/node/index.js +10 -0
  29. package/dist/src/extensions/node/index.js.map +1 -1
  30. package/dist/src/extensions/node/stream-promises/index.d.ts +9 -0
  31. package/dist/src/extensions/node/stream-promises/index.js +16 -0
  32. package/dist/src/extensions/node/stream-promises/index.js.map +1 -0
  33. package/dist/src/extensions/node/test/index.d.ts +10 -0
  34. package/dist/src/extensions/node/test/index.js +30 -0
  35. package/dist/src/extensions/node/test/index.js.map +1 -0
  36. package/dist/src/extensions/node/worker_threads/index.d.ts +10 -0
  37. package/dist/src/extensions/node/worker_threads/index.js +22 -0
  38. package/dist/src/extensions/node/worker_threads/index.js.map +1 -0
  39. package/dist/src/extensions/node/zlib/index.d.ts +8 -0
  40. package/dist/src/extensions/node/zlib/index.js +15 -0
  41. package/dist/src/extensions/node/zlib/index.js.map +1 -0
  42. package/dist/src/extensions/registry.d.ts +6 -0
  43. package/dist/src/extensions/registry.js.map +1 -1
  44. package/dist/tests/driver/paths.test.js +11 -1
  45. package/dist/tests/driver/paths.test.js.map +1 -1
  46. package/dist/tests/e2e/compile-node.test.js +67 -1
  47. package/dist/tests/e2e/compile-node.test.js.map +1 -1
  48. package/package.json +1 -1
  49. package/runtime/ext_node/assert/assert.c +207 -0
  50. package/runtime/ext_node/crypto/crypto.c +230 -14
  51. package/runtime/ext_node/fs/streams.c +31 -0
  52. package/runtime/ext_node/stream/pipeline.c +147 -0
  53. package/runtime/ext_node/test/test.c +102 -0
  54. package/runtime/ext_node/worker_threads/worker_threads.c +206 -0
  55. package/runtime/ext_node/zlib/zlib.c +19 -0
  56. package/runtime/xt_io.c +86 -0
  57. package/scripts/package-release.ts +11 -3
  58. package/src/codegen/generator/calls/invocation.ts +2 -0
  59. package/src/codegen/generator/context.ts +10 -1
  60. package/src/codegen/generator/expressions/primary.ts +17 -0
  61. package/src/codegen/generator/state.ts +3 -0
  62. package/src/codegen/generator/tables.ts +3 -0
  63. package/src/driver/index.ts +1 -1
  64. package/src/driver/paths.ts +14 -0
  65. package/src/extensions/node/assert/index.ts +44 -0
  66. package/src/extensions/node/fs/index.ts +3 -1
  67. package/src/extensions/node/fs/streams.ts +11 -0
  68. package/src/extensions/node/index.ts +10 -0
  69. package/src/extensions/node/stream-promises/index.ts +18 -0
  70. package/src/extensions/node/test/index.ts +35 -0
  71. package/src/extensions/node/worker_threads/index.ts +26 -0
  72. package/src/extensions/node/zlib/index.ts +17 -0
  73. package/src/extensions/registry.ts +6 -0
@@ -8,13 +8,15 @@ import { resolveFrom } from "../module.js";
8
8
  import { readFileBuiltins } from "./read-file.js";
9
9
  import { writeFileBuiltins } from "./write-file.js";
10
10
  import { fsOpsBuiltins } from "./fs-ops.js";
11
+ import { fsStreamBuiltins } from "./streams.js";
11
12
  export const fsModule = {
12
13
  name: "fs",
13
14
  runtimeSources: () => [
14
15
  resolveFrom(import.meta.url, "../../../../runtime/ext_node/fs/read_file.c"),
15
16
  resolveFrom(import.meta.url, "../../../../runtime/ext_node/fs/write_file.c"),
16
17
  resolveFrom(import.meta.url, "../../../../runtime/ext_node/fs/fs_ops.c"),
18
+ resolveFrom(import.meta.url, "../../../../runtime/ext_node/fs/streams.c"),
17
19
  ],
18
- builtins: () => ({ ...readFileBuiltins, ...writeFileBuiltins, ...fsOpsBuiltins }),
20
+ builtins: () => ({ ...readFileBuiltins, ...writeFileBuiltins, ...fsOpsBuiltins, ...fsStreamBuiltins }),
19
21
  };
20
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/node/fs/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAe;IAClC,IAAI,EAAE,IAAI;IACV,cAAc,EAAE,GAAG,EAAE,CAAC;QACpB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,6CAA6C,CAAC;QAC3E,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,8CAA8C,CAAC;QAC5E,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,0CAA0C,CAAC;KACzE;IACD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,iBAAiB,EAAE,GAAG,aAAa,EAAE,CAAC;CAClF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/node/fs/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,QAAQ,GAAe;IAClC,IAAI,EAAE,IAAI;IACV,cAAc,EAAE,GAAG,EAAE,CAAC;QACpB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,6CAA6C,CAAC;QAC3E,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,8CAA8C,CAAC;QAC5E,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,0CAA0C,CAAC;QACxE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,2CAA2C,CAAC;KAC1E;IACD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,iBAAiB,EAAE,GAAG,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC;CACvG,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Builtins for Node's `fs` streaming factories. xbintsc has no asynchronous
3
+ * streaming, so these return descriptor objects consumed by `stream/promises`.
4
+ */
5
+ import type { BuiltinFunction } from "../../registry.js";
6
+ export declare const fsStreamBuiltins: Readonly<Record<string, BuiltinFunction>>;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Builtins for Node's `fs` streaming factories. xbintsc has no asynchronous
3
+ * streaming, so these return descriptor objects consumed by `stream/promises`.
4
+ */
5
+ export const fsStreamBuiltins = {
6
+ createReadStream: { symbol: "xt_node_create_read_stream" },
7
+ createWriteStream: { symbol: "xt_node_create_write_stream" },
8
+ };
9
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../../../../../src/extensions/node/fs/streams.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAA8C;IACzE,gBAAgB,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE;IAC1D,iBAAiB,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE;CAC7D,CAAC"}
@@ -16,6 +16,9 @@ import { osModule } from "./os/index.js";
16
16
  import { processModule } from "./process/index.js";
17
17
  import { bufferModule } from "./buffer/index.js";
18
18
  import { streamModule } from "./stream/index.js";
19
+ import { streamPromisesModule } from "./stream-promises/index.js";
20
+ import { zlibModule } from "./zlib/index.js";
21
+ import { workerThreadsModule } from "./worker_threads/index.js";
19
22
  import { netModule } from "./net/index.js";
20
23
  import { dgramModule } from "./dgram/index.js";
21
24
  import { httpModule } from "./http/index.js";
@@ -25,6 +28,8 @@ import { childProcessModule } from "./child_process/index.js";
25
28
  import { eventsModule } from "./events/index.js";
26
29
  import { utilModule } from "./util/index.js";
27
30
  import { querystringModule } from "./querystring/index.js";
31
+ import { assertModule } from "./assert/index.js";
32
+ import { testModule } from "./test/index.js";
28
33
  /** Every Node module the extension currently provides. */
29
34
  const modules = [
30
35
  fsModule,
@@ -34,6 +39,9 @@ const modules = [
34
39
  processModule,
35
40
  bufferModule,
36
41
  streamModule,
42
+ streamPromisesModule,
43
+ zlibModule,
44
+ workerThreadsModule,
37
45
  netModule,
38
46
  dgramModule,
39
47
  httpModule,
@@ -43,6 +51,8 @@ const modules = [
43
51
  eventsModule,
44
52
  utilModule,
45
53
  querystringModule,
54
+ assertModule,
55
+ testModule,
46
56
  ];
47
57
  export const nodeExtension = {
48
58
  name: "node",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/node/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,0DAA0D;AAC1D,MAAM,OAAO,GAA0B;IACrC,QAAQ;IACR,gBAAgB;IAChB,UAAU;IACV,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,WAAW;IACX,UAAU;IACV,SAAS;IACT,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,UAAU;IACV,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,6EAA6E;IAC1F,2EAA2E;IAC3E,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACxF,2EAA2E;IAC3E,+DAA+D;IAC/D,uEAAuE;IACvE,yEAAyE;IACzE,uDAAuD;IACvD,OAAO,EAAE,GAAG,EAAE;QACZ,MAAM,OAAO,GAAoC,EAAE,CAAC;QACpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAoB;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;aAC/D,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC7B,OAAO,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;QACzC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/node/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,0DAA0D;AAC1D,MAAM,OAAO,GAA0B;IACrC,QAAQ;IACR,gBAAgB;IAChB,UAAU;IACV,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,oBAAoB;IACpB,UAAU;IACV,mBAAmB;IACnB,SAAS;IACT,WAAW;IACX,UAAU;IACV,SAAS;IACT,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,UAAU;IACV,iBAAiB;IACjB,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,6EAA6E;IAC1F,2EAA2E;IAC3E,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACxF,2EAA2E;IAC3E,+DAA+D;IAC/D,uEAAuE;IACvE,yEAAyE;IACzE,uDAAuD;IACvD,OAAO,EAAE,GAAG,EAAE;QACZ,MAAM,OAAO,GAAoC,EAAE,CAAC;QACpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAoB;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;aAC/D,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC7B,OAAO,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;QACzC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Node's `stream/promises` module.
3
+ *
4
+ * Provides `pipeline`, implemented synchronously in
5
+ * `runtime/ext_node/stream/pipeline.c` and returned as an already-resolved
6
+ * promise so `await pipeline(...)` works.
7
+ */
8
+ import type { NodeModule } from "../module.js";
9
+ export declare const streamPromisesModule: NodeModule;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Node's `stream/promises` module.
3
+ *
4
+ * Provides `pipeline`, implemented synchronously in
5
+ * `runtime/ext_node/stream/pipeline.c` and returned as an already-resolved
6
+ * promise so `await pipeline(...)` works.
7
+ */
8
+ import { resolveFrom } from "../module.js";
9
+ export const streamPromisesModule = {
10
+ name: "stream/promises",
11
+ runtimeSources: () => [resolveFrom(import.meta.url, "../../../../runtime/ext_node/stream/pipeline.c")],
12
+ builtins: () => ({
13
+ pipeline: { symbol: "xt_node_stream_pipeline" },
14
+ }),
15
+ };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/node/stream-promises/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,iBAAiB;IACvB,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,gDAAgD,CAAC,CAAC;IACtG,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACf,QAAQ,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE;KAChD,CAAC;CACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Node's `test` module (`node:test`).
3
+ *
4
+ * A minimal synchronous test runner: `test(name, fn)` executes `fn` immediately,
5
+ * catching assertion failures and reporting TAP output. `import test from
6
+ * "node:test"` binds the callable default export; `import { test }` and
7
+ * `test.skip` / `test.todo` / `test.only` are also provided.
8
+ */
9
+ import type { NodeModule } from "../module.js";
10
+ export declare const testModule: NodeModule;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Node's `test` module (`node:test`).
3
+ *
4
+ * A minimal synchronous test runner: `test(name, fn)` executes `fn` immediately,
5
+ * catching assertion failures and reporting TAP output. `import test from
6
+ * "node:test"` binds the callable default export; `import { test }` and
7
+ * `test.skip` / `test.todo` / `test.only` are also provided.
8
+ */
9
+ import { resolveFrom } from "../module.js";
10
+ const runTest = { symbol: "xt_node_test" };
11
+ const exports = {
12
+ default: runTest,
13
+ test: runTest,
14
+ it: runTest,
15
+ describe: runTest,
16
+ skip: { symbol: "xt_node_test_skip" },
17
+ todo: { symbol: "xt_node_test_todo" },
18
+ only: { symbol: "xt_node_test" },
19
+ before: { symbol: "xt_node_test_hook" },
20
+ after: { symbol: "xt_node_test_hook" },
21
+ beforeEach: { symbol: "xt_node_test_hook" },
22
+ afterEach: { symbol: "xt_node_test_hook" },
23
+ };
24
+ export const testModule = {
25
+ name: "test",
26
+ runtimeSources: () => [resolveFrom(import.meta.url, "../../../../runtime/ext_node/test/test.c")],
27
+ builtins: () => ({}),
28
+ exports: () => exports,
29
+ };
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/node/test/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,cAAc,EAAW,CAAC;AAEpD,MAAM,OAAO,GAAkB;IAC7B,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,OAAO;IACb,EAAE,EAAE,OAAO;IACX,QAAQ,EAAE,OAAO;IACjB,IAAI,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;IACrC,IAAI,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;IACrC,IAAI,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;IAChC,MAAM,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;IACvC,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;IACtC,UAAU,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAC3C,SAAS,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;IAChG,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;CACvB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Node's `worker_threads` module.
3
+ *
4
+ * xbintsc emulates a worker by re-running the current executable as a child
5
+ * process; `isMainThread`, `workerData` and `parentPort` become value bindings
6
+ * (nullary runtime getters) and `Worker` is a constructor. See
7
+ * `runtime/ext_node/worker_threads/worker_threads.c`.
8
+ */
9
+ import type { NodeModule } from "../module.js";
10
+ export declare const workerThreadsModule: NodeModule;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Node's `worker_threads` module.
3
+ *
4
+ * xbintsc emulates a worker by re-running the current executable as a child
5
+ * process; `isMainThread`, `workerData` and `parentPort` become value bindings
6
+ * (nullary runtime getters) and `Worker` is a constructor. See
7
+ * `runtime/ext_node/worker_threads/worker_threads.c`.
8
+ */
9
+ import { resolveFrom } from "../module.js";
10
+ const exports = {
11
+ Worker: { symbol: "xt_worker_ctor", isConstructor: true },
12
+ isMainThread: { valueSymbol: "xt_worker_is_main_thread" },
13
+ workerData: { valueSymbol: "xt_worker_data" },
14
+ parentPort: { valueSymbol: "xt_worker_parent_port" },
15
+ };
16
+ export const workerThreadsModule = {
17
+ name: "worker_threads",
18
+ runtimeSources: () => [resolveFrom(import.meta.url, "../../../../runtime/ext_node/worker_threads/worker_threads.c")],
19
+ builtins: () => ({}),
20
+ exports: () => exports,
21
+ };
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/node/worker_threads/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,OAAO,GAAkB;IAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE;IACzD,YAAY,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE;IACzD,UAAU,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAC7C,UAAU,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE;CACrD,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,IAAI,EAAE,gBAAgB;IACtB,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,8DAA8D,CAAC,CAAC;IACpH,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;CACvB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Node's `zlib` module.
3
+ *
4
+ * Only `createGzip()` is implemented. It returns a descriptor consumed by
5
+ * `stream/promises`' `pipeline`; see `runtime/ext_node/zlib/zlib.c`.
6
+ */
7
+ import type { NodeModule } from "../module.js";
8
+ export declare const zlibModule: NodeModule;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Node's `zlib` module.
3
+ *
4
+ * Only `createGzip()` is implemented. It returns a descriptor consumed by
5
+ * `stream/promises`' `pipeline`; see `runtime/ext_node/zlib/zlib.c`.
6
+ */
7
+ import { resolveFrom } from "../module.js";
8
+ export const zlibModule = {
9
+ name: "zlib",
10
+ runtimeSources: () => [resolveFrom(import.meta.url, "../../../../runtime/ext_node/zlib/zlib.c")],
11
+ builtins: () => ({
12
+ createGzip: { symbol: "xt_node_create_gzip" },
13
+ }),
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/node/zlib/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;IAChG,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACf,UAAU,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE;KAC9C,CAAC;CACH,CAAC"}
@@ -26,6 +26,12 @@ export interface ModuleExport {
26
26
  readonly returnVoid?: boolean;
27
27
  readonly namespace?: string;
28
28
  readonly method?: string;
29
+ /**
30
+ * Runtime getter used when the binding is read as a *value* rather than
31
+ * called (e.g. `import { isMainThread } from "worker_threads"`). The symbol
32
+ * has the uniform `(i32, i64*)` ABI and is invoked with no arguments.
33
+ */
34
+ readonly valueSymbol?: string;
29
35
  /**
30
36
  * Marks a runtime symbol as a constructor callable with `new` (it has the
31
37
  * `(i32, i64*)` signature). Lets `import { EventEmitter } from "events"` be
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/extensions/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/extensions/registry.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { join } from "node:path";
3
3
  import { existsSync } from "node:fs";
4
- import { findPackageRoot, findRuntimeDir, platformSlug, releaseArchiveBase, releaseArchiveExtension, vendorRootDir, } from "../../src/driver/paths.js";
4
+ import { findPackageRoot, findRuntimeDir, platformSlug, releaseArchiveBase, releaseArchiveExtension, releaseArchiveFileName, vendorRootDir, } from "../../src/driver/paths.js";
5
5
  describe("platformSlug", () => {
6
6
  it("joins the platform and architecture", () => {
7
7
  expect(platformSlug()).toBe(`${process.platform}-${process.arch}`);
@@ -17,6 +17,16 @@ describe("releaseArchiveBase", () => {
17
17
  expect(releaseArchiveBase()).toBe(`xbintsc-${process.platform}-${process.arch}`);
18
18
  });
19
19
  });
20
+ describe("releaseArchiveFileName", () => {
21
+ it("embeds the version between the name and the platform", () => {
22
+ expect(releaseArchiveFileName("0.3.8", "linux", "x64")).toBe("xbintsc-0.3.8-linux-x64");
23
+ expect(releaseArchiveFileName("1.0.0", "darwin", "arm64")).toBe("xbintsc-1.0.0-darwin-arm64");
24
+ expect(releaseArchiveFileName("1.0.0", "win32", "x64")).toBe("xbintsc-1.0.0-win32-x64");
25
+ });
26
+ it("defaults to the host platform", () => {
27
+ expect(releaseArchiveFileName("0.3.8")).toBe(`xbintsc-0.3.8-${process.platform}-${process.arch}`);
28
+ });
29
+ });
20
30
  describe("releaseArchiveExtension", () => {
21
31
  it("uses .tar.zst when zstd is available", () => {
22
32
  expect(releaseArchiveExtension(true)).toBe(".tar.zst");
@@ -1 +1 @@
1
- {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../tests/driver/paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,eAAe,EACf,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC3E,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../tests/driver/paths.test.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@
4
4
  * to a native binary and executed through the shared {@link describeE2E}
5
5
  * harness, so the suite is skipped when no clang-compatible compiler is found.
6
6
  */
7
- import { writeFileSync } from "node:fs";
7
+ import { readFileSync, writeFileSync } from "node:fs";
8
+ import { gunzipSync } from "node:zlib";
8
9
  import { join } from "node:path";
9
10
  import { expect, it } from "vitest";
10
11
  import { describeE2E } from "./harness.js";
@@ -132,5 +133,70 @@ describeE2E("end-to-end compilation (node extension)", (harness) => {
132
133
  expect(stdout).toContain("hello-from-child");
133
134
  expect(stdout).toContain("status 0");
134
135
  });
136
+ it("hashes with SHA-1 and the streaming crypto API", () => {
137
+ const source = `
138
+ import { createHash } from "node:crypto";
139
+ const hasher = createHash("sha1");
140
+ hasher.setEncoding("hex");
141
+ hasher.write("abc");
142
+ hasher.end();
143
+ console.log(hasher.read());
144
+ console.log(createHash("sha256").update("abc").digest("hex"));
145
+ `;
146
+ expect(runProgram(source, { extensions: true })).toBe("a9993e364706816aba3e25717850c26c9cd0d89d\nba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
147
+ });
148
+ it("runs node:test assertions through node:assert", () => {
149
+ const source = `
150
+ import assert from "node:assert";
151
+ import test from "node:test";
152
+ test("strict and deep equality", () => {
153
+ assert.strictEqual(1, 1);
154
+ assert.deepStrictEqual({ a: [1, 2] }, { a: [1, 2] });
155
+ assert.throws(() => { throw new Error("boom"); });
156
+ });
157
+ `;
158
+ const result = runProgramFull(source, { extensions: true });
159
+ expect(result.status).toBe(0);
160
+ expect(result.stdout).toContain("ok 1 - strict and deep equality");
161
+ });
162
+ it("exits non-zero when a node:test assertion fails", () => {
163
+ const source = `
164
+ import assert from "node:assert";
165
+ import test from "node:test";
166
+ test("fails", () => { assert.strictEqual(1, 2); });
167
+ `;
168
+ const result = runProgramFull(source, { extensions: true });
169
+ expect(result.status).toBe(1);
170
+ expect(result.stdout).toContain("not ok 1 - fails");
171
+ });
172
+ it("pipes a file through gzip with stream/promises", () => {
173
+ const sourcePath = join(harness.workdir, `pipe-src-${Math.random().toString(36).slice(2)}.txt`);
174
+ const destPath = join(harness.workdir, `pipe-dest-${Math.random().toString(36).slice(2)}.gz`);
175
+ writeFileSync(sourcePath, "hello gzip");
176
+ const source = `
177
+ import { createReadStream, createWriteStream } from "node:fs";
178
+ import { pipeline } from "node:stream/promises";
179
+ import { createGzip } from "node:zlib";
180
+ await pipeline(
181
+ createReadStream(${JSON.stringify(sourcePath)}),
182
+ createGzip(),
183
+ createWriteStream(${JSON.stringify(destPath)}),
184
+ );
185
+ `;
186
+ expect(runProgram(source, { extensions: true })).toBe("");
187
+ expect(gunzipSync(readFileSync(destPath)).toString("utf8")).toBe("hello gzip");
188
+ });
189
+ it("runs a worker_threads worker and relays its message", () => {
190
+ const source = `
191
+ import { Worker, isMainThread, workerData, parentPort } from "node:worker_threads";
192
+ if (isMainThread) {
193
+ const worker = new Worker(import.meta.filename, { workerData: "some data" });
194
+ worker.on("message", (msg) => console.log("Reply from Thread:", msg));
195
+ } else {
196
+ parentPort.postMessage(btoa(workerData.toUpperCase()));
197
+ }
198
+ `;
199
+ expect(runProgram(source, { extensions: true })).toBe("Reply from Thread: U09NRSBEQVRB");
200
+ });
135
201
  });
136
202
  //# sourceMappingURL=compile-node.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile-node.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile-node.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile-node.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile-node.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xbintsc",
3
- "version": "0.3.9",
3
+ "version": "0.3.10",
4
4
  "description": "xbintsc - a TypeScript binary compiler (TypeScript -> LLVM IR -> native binary)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,207 @@
1
+ /*
2
+ * Node.js `assert` module for xbintsc.
3
+ *
4
+ * Implements the commonly used assertion surface on top of the runtime's
5
+ * exception machinery: a failed assertion throws an `AssertionError`, exactly
6
+ * like Node. `node:test` catches that error and reports the test as failed.
7
+ *
8
+ * All entry points share the namespace dispatcher `xt_assert_static`, so both
9
+ * `import assert from "node:assert"` (`assert.strictEqual(...)`) and named
10
+ * imports (`import { strictEqual } from "assert"`) work.
11
+ */
12
+
13
+ #include "../node_common.h"
14
+
15
+ #include <string.h>
16
+
17
+ /* An `AssertionError` is an ordinary Error-family object; set the error kind so
18
+ * `xt_to_string`/inspection formats it as `AssertionError: message`. */
19
+ static void assert_throw(xt_value actual, xt_value expected, xt_value message) {
20
+ xt_value error = xt_object_new();
21
+ ((xt_object *)XT_GET_PTR(error))->header.kind = XT_OBJECT_KIND_ERROR;
22
+ xt_node_set(error, "name", xt_string_from_cstr("AssertionError"));
23
+ xt_node_set(error, "message", message);
24
+ xt_node_set(error, "code", xt_string_from_cstr("ERR_ASSERTION"));
25
+ if (!xt_truthy(xt_is_nullish(actual))) xt_node_set(error, "actual", actual);
26
+ if (!xt_truthy(xt_is_nullish(expected))) xt_node_set(error, "expected", expected);
27
+ xt_throw(error);
28
+ }
29
+
30
+ /* `message` is the user supplied message (or undefined); otherwise `fallback`
31
+ * is used. */
32
+ static xt_value assert_message(xt_value message, const char *fallback) {
33
+ if (!xt_truthy(xt_is_nullish(message))) return xt_to_string(message);
34
+ return xt_string_from_cstr(fallback);
35
+ }
36
+
37
+ static xt_value assert_join3(xt_value a, const char *middle, xt_value b) {
38
+ xt_value left = xt_add(a, xt_string_from_cstr(middle));
39
+ return xt_add(left, xt_to_string(b));
40
+ }
41
+
42
+ /* -- deep equality -------------------------------------------------------- */
43
+
44
+ static int assert_deep_equal(xt_value a, xt_value b, int depth) {
45
+ if (depth > 32) return xt_truthy(xt_seq(a, b));
46
+ if (XT_IS_ARRAY(a) && XT_IS_ARRAY(b)) {
47
+ int32_t count = (int32_t)xt_to_number(xt_array_length(a));
48
+ if (count != (int32_t)xt_to_number(xt_array_length(b))) return 0;
49
+ for (int32_t i = 0; i < count; i++) {
50
+ if (!assert_deep_equal(xt_array_get(a, xt_number(i)), xt_array_get(b, xt_number(i)), depth + 1)) return 0;
51
+ }
52
+ return 1;
53
+ }
54
+ if (XT_IS_OBJECT(a) && XT_IS_OBJECT(b)) {
55
+ xt_value keysA = xt_object_keys(a);
56
+ xt_value keysB = xt_object_keys(b);
57
+ int32_t count = (int32_t)xt_to_number(xt_array_length(keysA));
58
+ if (count != (int32_t)xt_to_number(xt_array_length(keysB))) return 0;
59
+ for (int32_t i = 0; i < count; i++) {
60
+ xt_value key = xt_array_get(keysA, xt_number(i));
61
+ if (!xt_truthy(xt_object_has(b, key))) return 0;
62
+ if (!assert_deep_equal(xt_object_get(a, key), xt_object_get(b, key), depth + 1)) return 0;
63
+ }
64
+ return 1;
65
+ }
66
+ return xt_truthy(xt_seq(a, b));
67
+ }
68
+
69
+ /* -- assertions ----------------------------------------------------------- */
70
+
71
+ static xt_value assert_ok(int32_t argc, xt_value *argv) {
72
+ xt_value value = xt_arg(argc, argv, 0);
73
+ if (!xt_truthy(value)) {
74
+ assert_throw(value, XT_UNDEFINED, assert_message(xt_arg(argc, argv, 1), "The expression evaluated to a falsy value"));
75
+ }
76
+ return xt_undefined();
77
+ }
78
+
79
+ static xt_value assert_equality(int32_t argc, xt_value *argv, int strict, const char *headline, const char *operator) {
80
+ xt_value actual = xt_arg(argc, argv, 0);
81
+ xt_value expected = xt_arg(argc, argv, 1);
82
+ xt_value message = xt_arg(argc, argv, 2);
83
+ int equal = strict ? xt_truthy(xt_seq(actual, expected)) : xt_truthy(xt_eq(actual, expected));
84
+ if (equal) return xt_undefined();
85
+ xt_value text = xt_string_from_cstr(headline);
86
+ text = xt_add(text, xt_to_string(actual));
87
+ text = xt_add(text, xt_string_from_cstr(operator));
88
+ text = xt_add(text, xt_to_string(expected));
89
+ text = xt_add(text, xt_string_from_cstr("\n"));
90
+ if (!xt_truthy(xt_is_nullish(message))) text = xt_to_string(message);
91
+ assert_throw(actual, expected, text);
92
+ return xt_undefined();
93
+ }
94
+
95
+ static xt_value assert_deep(int32_t argc, xt_value *argv, int negate) {
96
+ xt_value actual = xt_arg(argc, argv, 0);
97
+ xt_value expected = xt_arg(argc, argv, 1);
98
+ xt_value message = xt_arg(argc, argv, 2);
99
+ int equal = assert_deep_equal(actual, expected, 0);
100
+ if (negate) equal = !equal;
101
+ if (equal) return xt_undefined();
102
+ xt_value text = xt_string_from_cstr(
103
+ negate ? "Expected values to be strictly not deep-equal:\n\n" : "Expected values to be strictly deep-equal:\n\n");
104
+ text = assert_join3(text, " !== ", expected);
105
+ text = xt_add(text, xt_string_from_cstr("\n"));
106
+ if (!xt_truthy(xt_is_nullish(message))) text = xt_to_string(message);
107
+ assert_throw(actual, expected, text);
108
+ return xt_undefined();
109
+ }
110
+
111
+ static xt_value assert_fail(int32_t argc, xt_value *argv) {
112
+ xt_value message = xt_arg(argc, argv, 0);
113
+ assert_throw(XT_UNDEFINED, XT_UNDEFINED, assert_message(message, "Failed"));
114
+ return xt_undefined();
115
+ }
116
+
117
+ static xt_value assert_throws(int32_t argc, xt_value *argv, int negate) {
118
+ xt_value fn = xt_arg(argc, argv, 0);
119
+ xt_value message = xt_arg(argc, argv, 2);
120
+ if (!XT_IS_FUNCTION(fn)) {
121
+ assert_throw(XT_UNDEFINED, XT_UNDEFINED,
122
+ assert_message(message, negate ? "Expected a function" : "Expected a function to throw"));
123
+ }
124
+ void *frame = xt_try_enter();
125
+ if (xt_try_setjmp(frame) == 0) {
126
+ xt_closure_call(fn, 0, NULL);
127
+ xt_try_leave(frame);
128
+ if (negate) return xt_undefined();
129
+ assert_throw(XT_UNDEFINED, XT_UNDEFINED,
130
+ assert_message(message, "Missing expected exception"));
131
+ }
132
+ xt_value error = xt_try_exception(frame);
133
+ xt_try_leave(frame);
134
+ if (negate) {
135
+ xt_value text = xt_string_from_cstr("Got unwanted exception: ");
136
+ text = xt_add(text, xt_to_string(error));
137
+ assert_throw(XT_UNDEFINED, XT_UNDEFINED, xt_truthy(xt_is_nullish(message)) ? text : xt_to_string(message));
138
+ }
139
+ return xt_undefined();
140
+ }
141
+
142
+ static xt_value assert_if_error(int32_t argc, xt_value *argv) {
143
+ xt_value value = xt_arg(argc, argv, 0);
144
+ if (!xt_truthy(xt_is_nullish(value))) {
145
+ if (XT_IS_OBJECT(value)) xt_throw(value);
146
+ assert_throw(XT_UNDEFINED, XT_UNDEFINED, xt_to_string(value));
147
+ }
148
+ return xt_undefined();
149
+ }
150
+
151
+ static xt_value assert_match(int32_t argc, xt_value *argv, int negate) {
152
+ xt_value value = xt_arg(argc, argv, 0);
153
+ xt_value pattern = xt_arg(argc, argv, 1);
154
+ xt_value message = xt_arg(argc, argv, 2);
155
+ xt_value text = xt_to_string(value);
156
+ int matched = 0;
157
+ if (xt_truthy(xt_is_nullish(pattern))) {
158
+ matched = 0;
159
+ } else if (XT_IS_STRING(pattern)) {
160
+ matched = strstr(xt_string_data(text), xt_string_data(pattern)) != NULL;
161
+ } else {
162
+ /* A RegExp (or anything else) is delegated to String.prototype.match. */
163
+ xt_value key = xt_string_from_cstr("match");
164
+ xt_value result = xt_call_method(text, key, 1, &pattern);
165
+ matched = !xt_truthy(xt_is_nullish(result));
166
+ }
167
+ if (negate) matched = !matched;
168
+ if (matched) return xt_undefined();
169
+ assert_throw(value, pattern, assert_message(message, "The input did not match the regular expression"));
170
+ return xt_undefined();
171
+ }
172
+
173
+ xt_value xt_assert_static(xt_value name, int32_t argc, xt_value *argv) {
174
+ const char *fn = xt_string_data(name);
175
+ if (!fn) return xt_undefined();
176
+ if (strcmp(fn, "ok") == 0) return assert_ok(argc, argv);
177
+ if (strcmp(fn, "fail") == 0) return assert_fail(argc, argv);
178
+ if (strcmp(fn, "equal") == 0) return assert_equality(argc, argv, 0, "Expected values to be loosely equal:\n\n", " != ");
179
+ if (strcmp(fn, "notEqual") == 0) {
180
+ /* `notEqual` succeeds when the values differ. */
181
+ if (xt_truthy(xt_eq(xt_arg(argc, argv, 0), xt_arg(argc, argv, 1)))) {
182
+ assert_throw(xt_arg(argc, argv, 0), xt_arg(argc, argv, 1),
183
+ assert_message(xt_arg(argc, argv, 2), "Expected values to not be loosely equal"));
184
+ }
185
+ return xt_undefined();
186
+ }
187
+ if (strcmp(fn, "strictEqual") == 0) return assert_equality(argc, argv, 1, "Expected values to be strictly equal:\n\n", " !== ");
188
+ if (strcmp(fn, "notStrictEqual") == 0) {
189
+ if (xt_truthy(xt_seq(xt_arg(argc, argv, 0), xt_arg(argc, argv, 1)))) {
190
+ assert_throw(xt_arg(argc, argv, 0), xt_arg(argc, argv, 1),
191
+ assert_message(xt_arg(argc, argv, 2), "Expected values to be strictly not equal"));
192
+ }
193
+ return xt_undefined();
194
+ }
195
+ if (strcmp(fn, "deepEqual") == 0 || strcmp(fn, "deepStrictEqual") == 0) return assert_deep(argc, argv, 0);
196
+ if (strcmp(fn, "notDeepEqual") == 0 || strcmp(fn, "notDeepStrictEqual") == 0) return assert_deep(argc, argv, 1);
197
+ if (strcmp(fn, "throws") == 0) return assert_throws(argc, argv, 0);
198
+ if (strcmp(fn, "doesNotThrow") == 0) return assert_throws(argc, argv, 1);
199
+ if (strcmp(fn, "ifError") == 0) return assert_if_error(argc, argv);
200
+ if (strcmp(fn, "match") == 0) return assert_match(argc, argv, 0);
201
+ if (strcmp(fn, "doesNotMatch") == 0) return assert_match(argc, argv, 1);
202
+ if (strcmp(fn, "rejects") == 0 || strcmp(fn, "doesNotReject") == 0) {
203
+ /* No async rejection surface yet: resolve immediately. */
204
+ return xt_promise_resolve(xt_undefined());
205
+ }
206
+ return xt_undefined();
207
+ }