warpo 2.3.0 → 2.5.0-alpha-1

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 (119) hide show
  1. package/asconfig.schema.json +25 -3
  2. package/create/index.ts +4 -1
  3. package/dist/debug_server/dapServer.d.ts +1 -0
  4. package/dist/debug_server/dapServer.js +27 -0
  5. package/dist/debug_server/dapServer.js.map +1 -0
  6. package/dist/debug_server/debugSession.d.ts +19 -0
  7. package/dist/debug_server/debugSession.js +71 -0
  8. package/dist/debug_server/debugSession.js.map +1 -0
  9. package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
  10. package/dist/debug_server/tests/debugSession.test.js +61 -0
  11. package/dist/debug_server/tests/debugSession.test.js.map +1 -0
  12. package/dist/debug_server/tests/launcher.d.ts +10 -0
  13. package/dist/debug_server/tests/launcher.js +21 -0
  14. package/dist/debug_server/tests/launcher.js.map +1 -0
  15. package/dist/scripts/lib.d.ts +7 -0
  16. package/dist/{lib.js → scripts/lib.js} +20 -6
  17. package/dist/scripts/lib.js.map +1 -0
  18. package/dist/test_runner/cli.d.ts +2 -0
  19. package/dist/test_runner/cli.js +85 -0
  20. package/dist/test_runner/cli.js.map +1 -0
  21. package/dist/test_runner/core/analyze.d.ts +13 -0
  22. package/dist/test_runner/core/analyze.js +58 -0
  23. package/dist/test_runner/core/analyze.js.map +1 -0
  24. package/dist/test_runner/core/compile.d.ts +4 -0
  25. package/dist/test_runner/core/compile.js +23 -0
  26. package/dist/test_runner/core/compile.js.map +1 -0
  27. package/dist/test_runner/core/compiler.d.ts +11 -0
  28. package/dist/test_runner/core/compiler.js +47 -0
  29. package/dist/test_runner/core/compiler.js.map +1 -0
  30. package/dist/test_runner/core/covRecorder.d.ts +5 -0
  31. package/dist/test_runner/core/covRecorder.js +26 -0
  32. package/dist/test_runner/core/covRecorder.js.map +1 -0
  33. package/dist/test_runner/core/execute.d.ts +4 -0
  34. package/dist/test_runner/core/execute.js +76 -0
  35. package/dist/test_runner/core/execute.js.map +1 -0
  36. package/dist/test_runner/core/executionRecorder.d.ts +52 -0
  37. package/dist/test_runner/core/executionRecorder.js +164 -0
  38. package/dist/test_runner/core/executionRecorder.js.map +1 -0
  39. package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
  40. package/dist/test_runner/core/mockStatusRecorder.js +62 -0
  41. package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
  42. package/dist/test_runner/executionResult.d.ts +11 -0
  43. package/dist/test_runner/executionResult.js +112 -0
  44. package/dist/test_runner/executionResult.js.map +1 -0
  45. package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
  46. package/dist/test_runner/generator/html-generator/genCode.js +124 -0
  47. package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
  48. package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
  49. package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
  50. package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
  51. package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
  52. package/dist/test_runner/generator/html-generator/index.js +33 -0
  53. package/dist/test_runner/generator/html-generator/index.js.map +1 -0
  54. package/dist/test_runner/generator/index.d.ts +9 -0
  55. package/dist/test_runner/generator/index.js +30 -0
  56. package/dist/test_runner/generator/index.js.map +1 -0
  57. package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
  58. package/dist/test_runner/generator/json-generator/index.js +45 -0
  59. package/dist/test_runner/generator/json-generator/index.js.map +1 -0
  60. package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
  61. package/dist/test_runner/generator/table-generator/index.js +85 -0
  62. package/dist/test_runner/generator/table-generator/index.js.map +1 -0
  63. package/dist/test_runner/index.d.ts +3 -0
  64. package/dist/test_runner/index.js +70 -0
  65. package/dist/test_runner/index.js.map +1 -0
  66. package/dist/test_runner/interface.d.ts +36 -0
  67. package/dist/test_runner/interface.js +12 -0
  68. package/dist/test_runner/interface.js.map +1 -0
  69. package/dist/test_runner/parser/index.d.ts +35 -0
  70. package/dist/test_runner/parser/index.js +146 -0
  71. package/dist/test_runner/parser/index.js.map +1 -0
  72. package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
  73. package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
  74. package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
  75. package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
  76. package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
  77. package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
  78. package/dist/test_runner/testOption.d.ts +16 -0
  79. package/dist/test_runner/testOption.js +2 -0
  80. package/dist/test_runner/testOption.js.map +1 -0
  81. package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
  82. package/dist/test_runner/utils/errorTraceHandler.js +87 -0
  83. package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
  84. package/dist/test_runner/utils/escape.d.ts +1 -0
  85. package/dist/test_runner/utils/escape.js +14 -0
  86. package/dist/test_runner/utils/escape.js.map +1 -0
  87. package/dist/test_runner/utils/index.d.ts +14 -0
  88. package/dist/test_runner/utils/index.js +88 -0
  89. package/dist/test_runner/utils/index.js.map +1 -0
  90. package/dist/test_runner/utils/interface.d.ts +100 -0
  91. package/dist/test_runner/utils/interface.js +86 -0
  92. package/dist/test_runner/utils/interface.js.map +1 -0
  93. package/dist/test_runner/utils/name.d.ts +2 -0
  94. package/dist/test_runner/utils/name.js +3 -0
  95. package/dist/test_runner/utils/name.js.map +1 -0
  96. package/dist/test_runner/utils/pathResolver.d.ts +6 -0
  97. package/dist/test_runner/utils/pathResolver.js +98 -0
  98. package/dist/test_runner/utils/pathResolver.js.map +1 -0
  99. package/dist/test_runner/utils/projectRoot.d.ts +1 -0
  100. package/dist/test_runner/utils/projectRoot.js +4 -0
  101. package/dist/test_runner/utils/projectRoot.js.map +1 -0
  102. package/dist/test_runner/utils/wasm.d.ts +12 -0
  103. package/dist/test_runner/utils/wasm.js +45 -0
  104. package/dist/test_runner/utils/wasm.js.map +1 -0
  105. package/dist/warpo.d.ts +7 -1
  106. package/dist/warpo.js +83 -3
  107. package/dist/warpo.js.map +1 -0
  108. package/package.json +36 -8
  109. package/tsconfig-warpo.json +2 -3
  110. package/{assemblyscript/std/assembly → types/std}/index.d.ts +26 -340
  111. package/types/std/package.json +3 -0
  112. package/types/std/tsconfig.json +4 -0
  113. package/types/tsconfig-base.json +15 -0
  114. package/types/tsconfig-std.json +13 -0
  115. package/types/warpo/index.d.ts +95 -1
  116. package/types/wasi_snapshot_preview1/index.d.ts +52 -0
  117. package/types/wasi_snapshot_preview1/package.json +3 -0
  118. package/types/wasi_snapshot_preview1/tsconfig.json +4 -0
  119. package/dist/lib.d.ts +0 -5
@@ -58,6 +58,11 @@
58
58
  "description": "Type of runtime to use, either 'incremental' or 'radical'.",
59
59
  "enum": ["incremental", "radical"]
60
60
  },
61
+ "host": {
62
+ "type": "string",
63
+ "description": "Host API selection for imports.",
64
+ "enum": ["none", "wasi_snapshot_preview1"]
65
+ },
61
66
  "stats": {
62
67
  "type": "boolean",
63
68
  "description": "Whether to output compilation statistics."
@@ -96,15 +101,32 @@
96
101
  "maximum": 2
97
102
  },
98
103
  "use": {
104
+ "$ref": "#/$defs/UseSchema"
105
+ }
106
+ },
107
+ "additionalProperties": false
108
+ },
109
+ "UseSchema": {
110
+ "description": "AssemblyScript --use options. Either an object map (name -> value) or an array of strings in A=B form.",
111
+ "oneOf": [
112
+ {
99
113
  "type": "object",
100
- "description": "Additional compiler flags or environment variables for this build target.",
114
+ "description": "Map form: { \"NAME\": \"VALUE\" }",
101
115
  "additionalProperties": {
102
116
  "type": "string",
103
117
  "description": "Value for the use option."
104
118
  }
119
+ },
120
+ {
121
+ "type": "array",
122
+ "description": "Array form: [\"NAME=VALUE\", ...] (same format as CLI --use)",
123
+ "items": {
124
+ "type": "string",
125
+ "description": "A single use entry in NAME=VALUE form.",
126
+ "pattern": "^\\s*[^=\\s]+\\s*=.*$"
127
+ }
105
128
  }
106
- },
107
- "additionalProperties": false
129
+ ]
108
130
  }
109
131
  }
110
132
  }
package/create/index.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import * as api from "./__warpo_create";
2
2
  import { __collect } from "rt/index";
3
3
 
4
- __collect(); // trigger GC to ensure the env is loaded.
4
+ __collect();
5
+
6
+ // @ts-ignore: decorators
7
+ @lazy
5
8
  export const __dirname: string = api.getCreateFileDirName();
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { createServer } from "node:net";
4
+ import { WarpoDebugSession } from "./debugSession.js";
5
+ const port = Number(process.argv[2]) || 0;
6
+ const server = createServer((socket) => {
7
+ const session = new WarpoDebugSession();
8
+ session.setRunAsServer(true);
9
+ session.start(socket, socket);
10
+ let closed = false;
11
+ const closeSession = () => {
12
+ if (!closed) {
13
+ closed = true;
14
+ session.dispose();
15
+ server.close();
16
+ }
17
+ };
18
+ socket.on("close", closeSession);
19
+ socket.on("error", closeSession);
20
+ });
21
+ server.listen(port, "127.0.0.1", () => {
22
+ const addr = server.address();
23
+ if (addr && typeof addr !== "string") {
24
+ process.stderr.write(`DAP server listening on port ${addr.port}\n`);
25
+ }
26
+ });
27
+ //# sourceMappingURL=dapServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dapServer.js","sourceRoot":"","sources":["../../tools/debug_server/dapServer.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAE1C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;IACrC,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACxC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IACtE,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { LoggingDebugSession } from "@vscode/debugadapter";
2
+ import type { DebugProtocol } from "@vscode/debugprotocol";
3
+ interface WarpoLaunchRequestArguments extends DebugProtocol.LaunchRequestArguments {
4
+ program: string;
5
+ }
6
+ export declare class WarpoDebugSession extends LoggingDebugSession {
7
+ private static threadId;
8
+ private breakpointId;
9
+ private breakpoints;
10
+ private log;
11
+ protected initializeRequest(response: DebugProtocol.InitializeResponse, _args: DebugProtocol.InitializeRequestArguments): void;
12
+ protected setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): void;
13
+ protected configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, _args: DebugProtocol.ConfigurationDoneArguments): void;
14
+ protected launchRequest(response: DebugProtocol.LaunchResponse, args: WarpoLaunchRequestArguments): void;
15
+ protected threadsRequest(response: DebugProtocol.ThreadsResponse): void;
16
+ protected disconnectRequest(response: DebugProtocol.DisconnectResponse, _args: DebugProtocol.DisconnectArguments): void;
17
+ private logAllBreakpoints;
18
+ }
19
+ export {};
@@ -0,0 +1,71 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { LoggingDebugSession, InitializedEvent, Thread, Breakpoint, logger } from "@vscode/debugadapter";
4
+ import * as path from "node:path";
5
+ export class WarpoDebugSession extends LoggingDebugSession {
6
+ static threadId = 1;
7
+ breakpointId = 0;
8
+ breakpoints = new Map();
9
+ log(msg) {
10
+ logger.log(msg);
11
+ }
12
+ initializeRequest(response, _args) {
13
+ response.body = response.body || {};
14
+ response.body.supportsConfigurationDoneRequest = true;
15
+ response.body.supportsSetVariable = false;
16
+ response.body.supportsBreakpointLocationsRequest = false;
17
+ this.sendResponse(response);
18
+ this.sendEvent(new InitializedEvent());
19
+ }
20
+ setBreakPointsRequest(response, args) {
21
+ const sourcePath = args.source.path || "";
22
+ const clientLines = args.breakpoints || [];
23
+ const bps = clientLines.map((bp) => {
24
+ const id = ++this.breakpointId;
25
+ const info = {
26
+ id,
27
+ line: bp.line,
28
+ verified: true,
29
+ source: sourcePath,
30
+ };
31
+ this.log(`Breakpoint set: ${path.basename(sourcePath)}:${bp.line}`);
32
+ return info;
33
+ });
34
+ this.breakpoints.set(sourcePath, bps);
35
+ const breakpoints = bps.map((bp) => {
36
+ const dbp = new Breakpoint(bp.verified, bp.line);
37
+ dbp.id = bp.id;
38
+ return dbp;
39
+ });
40
+ response.body = { breakpoints };
41
+ this.sendResponse(response);
42
+ }
43
+ configurationDoneRequest(response, _args) {
44
+ super.configurationDoneRequest(response, _args);
45
+ this.logAllBreakpoints();
46
+ }
47
+ launchRequest(response, args) {
48
+ this.log(`Launch requested for: ${args.program}`);
49
+ this.sendResponse(response);
50
+ }
51
+ threadsRequest(response) {
52
+ response.body = {
53
+ threads: [new Thread(WarpoDebugSession.threadId, "main")],
54
+ };
55
+ this.sendResponse(response);
56
+ }
57
+ disconnectRequest(response, _args) {
58
+ this.log("Debug session ended.");
59
+ this.sendResponse(response);
60
+ }
61
+ logAllBreakpoints() {
62
+ this.log("=== Registered Breakpoints ===");
63
+ for (const [source, bps] of this.breakpoints) {
64
+ for (const bp of bps) {
65
+ this.log(` ${path.basename(source)}:${bp.line} (id=${bp.id}, verified=${bp.verified})`);
66
+ }
67
+ }
68
+ this.log("==============================");
69
+ }
70
+ }
71
+ //# sourceMappingURL=debugSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugSession.js","sourceRoot":"","sources":["../../tools/debug_server/debugSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { DebugClient } from "@vscode/debugadapter-testsupport";
4
+ import * as assert from "node:assert/strict";
5
+ import * as path from "node:path";
6
+ import { describe, it, beforeEach, afterEach } from "node:test";
7
+ import { fileURLToPath } from "node:url";
8
+ import { launchDapServer } from "./launcher.js";
9
+ const DIRNAME = path.dirname(fileURLToPath(import.meta.url));
10
+ const DAP_SERVER = path.resolve(DIRNAME, "..", "..", "..", "dist", "debug_server", "dapServer.js");
11
+ const waitForExit = (child, timeoutMs) => new Promise((resolve) => {
12
+ if (child.exitCode !== null) {
13
+ resolve(true);
14
+ return;
15
+ }
16
+ const timer = setTimeout(() => {
17
+ child.removeListener("exit", onExit);
18
+ resolve(false);
19
+ }, timeoutMs);
20
+ const onExit = () => {
21
+ clearTimeout(timer);
22
+ resolve(true);
23
+ };
24
+ child.once("exit", onExit);
25
+ });
26
+ void describe("WarpoDebugSession", () => {
27
+ let dc;
28
+ let serverChild;
29
+ beforeEach(async () => {
30
+ const { port, child } = await launchDapServer(DAP_SERVER);
31
+ serverChild = child;
32
+ dc = new DebugClient("", "", "warpo");
33
+ await dc.start(port);
34
+ });
35
+ afterEach(async () => {
36
+ try {
37
+ await dc.stop();
38
+ }
39
+ catch {
40
+ // Ignore shutdown errors from the client.
41
+ }
42
+ const exited = await waitForExit(serverChild, 1000);
43
+ if (!exited) {
44
+ serverChild.kill();
45
+ await waitForExit(serverChild, 1000);
46
+ }
47
+ });
48
+ void it("should accept breakpoints and return them verified", async () => {
49
+ await dc.initializeRequest();
50
+ const response = await dc.setBreakpointsRequest({
51
+ source: { path: "test.ts" },
52
+ breakpoints: [{ line: 5 }, { line: 10 }],
53
+ });
54
+ assert.equal(response.body.breakpoints.length, 2);
55
+ assert.equal(response.body.breakpoints[0].verified, true);
56
+ assert.equal(response.body.breakpoints[0].line, 5);
57
+ assert.equal(response.body.breakpoints[1].verified, true);
58
+ assert.equal(response.body.breakpoints[1].line, 10);
59
+ });
60
+ });
61
+ //# sourceMappingURL=debugSession.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugSession.test.js","sourceRoot":"","sources":["../../../tools/debug_server/tests/debugSession.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ChildProcess } from "node:child_process";
2
+ export interface DapServerHandle {
3
+ port: number;
4
+ child: ChildProcess;
5
+ }
6
+ export declare function launchDapServer(script: string): Promise<DapServerHandle>;
7
+ declare const launcher: {
8
+ launchDapServer: typeof launchDapServer;
9
+ };
10
+ export default launcher;
@@ -0,0 +1,21 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { spawn } from "node:child_process";
4
+ export function launchDapServer(script) {
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(process.execPath, [script, "0"], { stdio: ["pipe", "pipe", "pipe"] });
7
+ child.on("error", (err) => reject(err));
8
+ child.on("exit", (code) => reject(new Error(`DAP server exited with code ${code}`)));
9
+ let buffer = "";
10
+ child.stderr.on("data", (chunk) => {
11
+ buffer += chunk.toString();
12
+ const match = /DAP server listening on port (\d+)/.exec(buffer);
13
+ if (match) {
14
+ resolve({ port: Number(match[1]), child });
15
+ }
16
+ });
17
+ });
18
+ }
19
+ const launcher = { launchDapServer };
20
+ export default launcher;
21
+ //# sourceMappingURL=launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../tools/debug_server/tests/launcher.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAgB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAOzD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAE1F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAErF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,QAAQ,GAAG,EAAE,eAAe,EAAE,CAAC;AACrC,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface Option {
2
+ env: NodeJS.Dict<string>;
3
+ argv: string[];
4
+ cwd?: string;
5
+ onStdout?: (chunk: string) => void;
6
+ }
7
+ export declare function build(options: Option): Promise<number>;
@@ -3,6 +3,7 @@ import { execSync, spawn } from "node:child_process";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  const dirname = import.meta.dirname;
6
+ const warpoRoot = join(dirname, "..", "..");
6
7
  function download_url(version) {
7
8
  const arch = os.arch();
8
9
  const platform = os.platform();
@@ -20,16 +21,28 @@ function get_binary() {
20
21
  if (process.env["WARPO_FORCE_DOWNLOAD"] !== "1" && existsSync(join(dirname, "warpo"))) {
21
22
  return join(dirname, "warpo", "warpo_asc");
22
23
  }
23
- const version = process.env["WARPO_DOWNLOAD_VERSION"] ||
24
- JSON.parse(readFileSync(join(dirname, "..", "package.json"), "utf8")).version;
24
+ const version = process.env["WARPO_DOWNLOAD_VERSION"] || JSON.parse(readFileSync(join(warpoRoot, "package.json"), "utf8")).version;
25
+ if (version === "0.0.0") {
26
+ // for development purpose, use local build
27
+ return join(warpoRoot, "build", "warpo", "warpo_asc");
28
+ }
25
29
  const url = download_url(version);
26
30
  console.log(`downloading warpo from ${url}`);
27
31
  execSync(`curl -L ${url} | tar xz -C ${dirname}`, { stdio: "inherit" });
28
32
  return join(dirname, "warpo", "warpo_asc");
29
33
  }
30
- export async function main(options) {
34
+ export async function build(options) {
31
35
  const binary = get_binary();
32
- const ps = spawn(binary, options.argv, { stdio: "inherit", env: options.env });
36
+ const ps = spawn(binary, options.argv, {
37
+ stdio: options.onStdout === undefined ? "inherit" : ["inherit", "pipe", "inherit"],
38
+ env: options.env,
39
+ cwd: options.cwd,
40
+ });
41
+ if (options.onStdout !== undefined) {
42
+ ps.stdout.on("data", (chunk) => {
43
+ options.onStdout(chunk.toString("utf8"));
44
+ });
45
+ }
33
46
  return new Promise((resolve, reject) => {
34
47
  function shutdown() {
35
48
  ps.kill("SIGTERM");
@@ -37,10 +50,11 @@ export async function main(options) {
37
50
  }
38
51
  process.on("SIGINT", shutdown);
39
52
  process.on("SIGTERM", shutdown);
40
- ps.on("close", (e) => {
53
+ ps.on("close", (code) => {
41
54
  process.removeListener("SIGINT", shutdown);
42
55
  process.removeListener("SIGTERM", shutdown);
43
- resolve(e);
56
+ resolve(code ?? 0);
44
57
  });
45
58
  });
46
59
  }
60
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../tools/scripts/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env -S node --experimental-wasi-unstable-preview1
2
+ export declare function runFromCliArgs(args: string[]): Promise<number>;
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env -S node --experimental-wasi-unstable-preview1
2
+ // Copyright (C) 2025 wasm-ecosystem
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ import chalk from "chalk";
5
+ import fs from "fs-extra";
6
+ import { resolve } from "node:path";
7
+ import { pathToFileURL } from "node:url";
8
+ import { Command } from "commander";
9
+ import { validateArgument, start } from "./index.js";
10
+ import { Repository } from "./utils/name.js";
11
+ function createProgram() {
12
+ const program = new Command();
13
+ program
14
+ .option("--config <config file>", "path of config file", "as-test.config.js")
15
+ .option("--output <path>", "coverage report output folder")
16
+ .option("--mode <output mode>", "coverage report output format")
17
+ .option("--coverageLimit [error warning...]", "set warn(yellow) and error(red) upper limit in coverage report")
18
+ .option("--collectCoverage <boolean>", "whether to collect coverage information and report")
19
+ .option("--testFiles <testFiles...>", "run only specified test files")
20
+ .option("--testNamePattern <test name pattern>", "run only tests with a name that matches the regex pattern")
21
+ .option("--onlyFailures", "Run tests that failed in the previous")
22
+ .addHelpText("beforeAll", `submit feature requests or issues: ${Repository}/issues`);
23
+ return program;
24
+ }
25
+ export async function runFromCliArgs(args) {
26
+ const program = createProgram();
27
+ program.parse(args, { from: "user" });
28
+ const options = program.opts();
29
+ const configPath = resolve(".", options["config"]);
30
+ if (!fs.pathExistsSync(configPath)) {
31
+ console.error(chalk.redBright("Miss config file") + "\n");
32
+ console.error(program.helpInformation());
33
+ return 3;
34
+ }
35
+ const config = (await import(pathToFileURL(configPath).href)).default;
36
+ const includes = config.include;
37
+ if (includes === undefined) {
38
+ console.error(chalk.redBright("Miss include in config file") + "\n");
39
+ return 3;
40
+ }
41
+ const excludes = config.exclude || [];
42
+ validateArgument(includes, excludes);
43
+ const testFiles = options["testFiles"] ?? null;
44
+ const onlyFailures = options["onlyFailures"] || false;
45
+ const testNamePattern = options["testNamePattern"] ?? null;
46
+ if (onlyFailures && testNamePattern !== null) {
47
+ console.error(chalk.redBright("Cannot use --onlyFailures and --testNamePattern together") + "\n");
48
+ return 3;
49
+ }
50
+ // if enabled testcase or testNamePattern or onlyFailures, disable collectCoverage by default
51
+ const collectCoverage = (options["collectCoverage"] === "false" ? false : options["collectCoverage"] === "true" ? true : null) ??
52
+ config.collectCoverage ??
53
+ (testFiles === null && options["testNamePattern"] === undefined && !onlyFailures);
54
+ const entryFiles = config.entryFiles ?? null;
55
+ const warnLimitValue = options["coverageLimit"]?.at(1);
56
+ const errorLimitValue = options["coverageLimit"]?.at(0);
57
+ const testOption = {
58
+ includes,
59
+ excludes,
60
+ testFiles,
61
+ entryFiles,
62
+ testNamePattern,
63
+ collectCoverage,
64
+ onlyFailures,
65
+ flags: config.flags || "",
66
+ imports: config.imports || undefined,
67
+ outputFolder: options["output"] || config.output || "coverage",
68
+ mode: options["mode"] || config.mode || "table",
69
+ };
70
+ if (warnLimitValue !== undefined) {
71
+ testOption.warnLimit = Number(warnLimitValue);
72
+ }
73
+ if (errorLimitValue !== undefined) {
74
+ testOption.errorLimit = Number(errorLimitValue);
75
+ }
76
+ try {
77
+ return await start(testOption);
78
+ }
79
+ catch (e) {
80
+ console.error(chalk.redBright("framework crash, error message: ") + chalk.yellowBright(`${e?.stack}`) + "\n");
81
+ console.error(`please submit an issue at ${Repository}/issues`);
82
+ return 255;
83
+ }
84
+ }
85
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../tools/test_runner/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Will transform all source file to get all relative functions
3
+ */
4
+ import { TestOption } from "../testOption.js";
5
+ type AnalyzeOption = Pick<TestOption, "includes" | "excludes" | "testFiles" | "testNamePattern" | "entryFiles">;
6
+ interface UnittestPackage {
7
+ readonly testCodePaths: string[];
8
+ readonly sourceCodePaths: string[];
9
+ readonly entryFiles: string[];
10
+ readonly filterByName: (fullTestName: string) => boolean;
11
+ }
12
+ export declare function analyze({ includes, excludes, testNamePattern, testFiles, entryFiles }: AnalyzeOption, failedTestNames: string[]): UnittestPackage;
13
+ export {};
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Will transform all source file to get all relative functions
3
+ */
4
+ import ignore from "ignore";
5
+ import { join, relative, resolve } from "node:path";
6
+ import { getIncludeFiles } from "../utils/pathResolver.js";
7
+ import assert from "node:assert";
8
+ export function analyze({ includes, excludes, testNamePattern, testFiles, entryFiles }, failedTestNames) {
9
+ const testCodePaths = testFiles ?? getRelatedFiles(includes, excludes, (path) => path.endsWith(".test.ts"));
10
+ const sourceCodePaths = getRelatedFiles(includes, excludes, (path) => path.endsWith(".ts") && !path.endsWith(".test.ts"));
11
+ return {
12
+ // if specify testFiles, use testFiles for unittest
13
+ // otherwise, get testFiles(*.test.ts) in includes directory
14
+ testCodePaths: testCodePaths,
15
+ // get all source files in includes directory
16
+ sourceCodePaths: sourceCodePaths,
17
+ entryFiles: entryFiles ?? getEntryFiles(includes, sourceCodePaths),
18
+ filterByName: getFilterByName(testNamePattern, failedTestNames),
19
+ };
20
+ }
21
+ function getEntryFiles(includes, sourceCodePaths) {
22
+ // entry files must be in source code paths
23
+ return includes
24
+ .map((include) => (include.endsWith(".ts") ? include : join(include, "index.ts")))
25
+ .filter((include) => include.endsWith(".ts") && sourceCodePaths.includes(include));
26
+ }
27
+ function getFilterByName(testNamePattern, failedTestNames) {
28
+ assert(!(testNamePattern !== null && failedTestNames.length > 0), "Cannot use testNamePattern and failedTestNames together");
29
+ if (testNamePattern !== null) {
30
+ const regexPattern = new RegExp(testNamePattern);
31
+ return (fullTestName) => regexPattern.test(fullTestName);
32
+ }
33
+ if (failedTestNames.length > 0) {
34
+ return (fullTestName) => failedTestNames.includes(fullTestName);
35
+ }
36
+ return () => true;
37
+ }
38
+ // a. include in config
39
+ // b. exclude in config
40
+ function getRelatedFiles(includes, excludes, filter) {
41
+ const result = [];
42
+ const includeFiles = getIncludeFiles(includes, (path) => path.endsWith(".ts")); // a
43
+ const exc = ignore().add(excludes);
44
+ for (const path of includeFiles) {
45
+ const relativePath = relative(".", path);
46
+ if (relativePath.startsWith("..")) {
47
+ throw new Error(`file ${path} out of scope (${resolve(".")})`);
48
+ }
49
+ if (exc.ignores(relativePath)) {
50
+ continue; // ab
51
+ }
52
+ if (filter(path)) {
53
+ result.push(path.replaceAll(/\\/g, "/"));
54
+ }
55
+ }
56
+ return result;
57
+ }
58
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../tools/test_runner/core/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { TestOption } from "../testOption.js";
2
+ import { WebAssemblyModule } from "../utils/wasm.js";
3
+ export type CompileOption = Pick<TestOption, "outputFolder" | "flags" | "collectCoverage">;
4
+ export declare function compile(testCodePaths: string[], entryFiles: string[], option: CompileOption): Promise<WebAssemblyModule>;
@@ -0,0 +1,23 @@
1
+ import { join, relative } from "node:path";
2
+ import { compileImpl } from "./compiler.js";
3
+ import { WebAssemblyModule } from "../utils/wasm.js";
4
+ export async function compile(testCodePaths, entryFiles, option) {
5
+ const { outputFolder, flags, collectCoverage } = option;
6
+ const ret = new WebAssemblyModule(join(outputFolder, "test").replaceAll(/\\/g, "/"));
7
+ await compileImpl({
8
+ sources: combineWithEntryFiles({ testCodePaths, entryFiles }),
9
+ output: ret,
10
+ userDefinedFlags: flags,
11
+ collectCoverage,
12
+ });
13
+ return ret;
14
+ }
15
+ function getNewPath(newFolder, oldFolder, srcPath) {
16
+ return join(newFolder, relative(oldFolder, srcPath)).replaceAll(/\\/g, "/");
17
+ }
18
+ function combineWithEntryFiles({ testCodePaths, entryFiles, }) {
19
+ // Because AS has recursive import resolution issue.
20
+ // put entryFiles firstly will force ASC compile entry file firstly, which can avoid compilation failed due to test files import ordering
21
+ return entryFiles.concat(testCodePaths);
22
+ }
23
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../tools/test_runner/core/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,aAAuB,EACvB,UAAoB,EACpB,MAAqB;IAErB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACrF,MAAM,WAAW,CAAC;QAChB,OAAO,EAAE,qBAAqB,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;QAC7D,MAAM,EAAE,GAAG;QACX,gBAAgB,EAAE,KAAK;QACvB,eAAe;KAChB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;IACvE,OAAO,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,aAAa,EACb,UAAU,GAIX;IACC,oDAAoD;IACpD,yIAAyI;IACzI,OAAO,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { WebAssemblyModule } from "../utils/wasm.js";
2
+ export declare class CompilationError extends Error {
3
+ constructor(errorMessage: string | undefined);
4
+ }
5
+ export interface CompilationOption {
6
+ sources: string[];
7
+ output: WebAssemblyModule;
8
+ userDefinedFlags: string;
9
+ collectCoverage: boolean;
10
+ }
11
+ export declare function compileImpl(option: CompilationOption): Promise<void>;