warpo 2.4.0 → 2.5.0-alpha-2
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/dist/debug_server/dapServer.d.ts +1 -0
- package/dist/debug_server/dapServer.js +27 -0
- package/dist/debug_server/dapServer.js.map +1 -0
- package/dist/debug_server/debugSession.d.ts +19 -0
- package/dist/debug_server/debugSession.js +71 -0
- package/dist/debug_server/debugSession.js.map +1 -0
- package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
- package/dist/debug_server/tests/debugSession.test.js +61 -0
- package/dist/debug_server/tests/debugSession.test.js.map +1 -0
- package/dist/debug_server/tests/launcher.d.ts +10 -0
- package/dist/debug_server/tests/launcher.js +21 -0
- package/dist/debug_server/tests/launcher.js.map +1 -0
- package/dist/scripts/lib.d.ts +7 -0
- package/dist/{lib.js → scripts/lib.js} +20 -6
- package/dist/scripts/lib.js.map +1 -0
- package/dist/test_runner/cli.d.ts +2 -0
- package/dist/test_runner/cli.js +85 -0
- package/dist/test_runner/cli.js.map +1 -0
- package/dist/test_runner/core/analyze.d.ts +13 -0
- package/dist/test_runner/core/analyze.js +58 -0
- package/dist/test_runner/core/analyze.js.map +1 -0
- package/dist/test_runner/core/compile.d.ts +4 -0
- package/dist/test_runner/core/compile.js +23 -0
- package/dist/test_runner/core/compile.js.map +1 -0
- package/dist/test_runner/core/compiler.d.ts +11 -0
- package/dist/test_runner/core/compiler.js +47 -0
- package/dist/test_runner/core/compiler.js.map +1 -0
- package/dist/test_runner/core/covRecorder.d.ts +5 -0
- package/dist/test_runner/core/covRecorder.js +26 -0
- package/dist/test_runner/core/covRecorder.js.map +1 -0
- package/dist/test_runner/core/execute.d.ts +4 -0
- package/dist/test_runner/core/execute.js +76 -0
- package/dist/test_runner/core/execute.js.map +1 -0
- package/dist/test_runner/core/executionRecorder.d.ts +52 -0
- package/dist/test_runner/core/executionRecorder.js +164 -0
- package/dist/test_runner/core/executionRecorder.js.map +1 -0
- package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
- package/dist/test_runner/core/mockStatusRecorder.js +62 -0
- package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
- package/dist/test_runner/executionResult.d.ts +11 -0
- package/dist/test_runner/executionResult.js +112 -0
- package/dist/test_runner/executionResult.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genCode.js +124 -0
- package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
- package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
- package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/index.js +33 -0
- package/dist/test_runner/generator/html-generator/index.js.map +1 -0
- package/dist/test_runner/generator/index.d.ts +9 -0
- package/dist/test_runner/generator/index.js +30 -0
- package/dist/test_runner/generator/index.js.map +1 -0
- package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/json-generator/index.js +45 -0
- package/dist/test_runner/generator/json-generator/index.js.map +1 -0
- package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/table-generator/index.js +85 -0
- package/dist/test_runner/generator/table-generator/index.js.map +1 -0
- package/dist/test_runner/index.d.ts +3 -0
- package/dist/test_runner/index.js +70 -0
- package/dist/test_runner/index.js.map +1 -0
- package/dist/test_runner/interface.d.ts +36 -0
- package/dist/test_runner/interface.js +12 -0
- package/dist/test_runner/interface.js.map +1 -0
- package/dist/test_runner/parser/index.d.ts +35 -0
- package/dist/test_runner/parser/index.js +146 -0
- package/dist/test_runner/parser/index.js.map +1 -0
- package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
- package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
- package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
- package/dist/test_runner/testOption.d.ts +16 -0
- package/dist/test_runner/testOption.js +2 -0
- package/dist/test_runner/testOption.js.map +1 -0
- package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
- package/dist/test_runner/utils/errorTraceHandler.js +87 -0
- package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
- package/dist/test_runner/utils/escape.d.ts +1 -0
- package/dist/test_runner/utils/escape.js +14 -0
- package/dist/test_runner/utils/escape.js.map +1 -0
- package/dist/test_runner/utils/index.d.ts +14 -0
- package/dist/test_runner/utils/index.js +88 -0
- package/dist/test_runner/utils/index.js.map +1 -0
- package/dist/test_runner/utils/interface.d.ts +100 -0
- package/dist/test_runner/utils/interface.js +86 -0
- package/dist/test_runner/utils/interface.js.map +1 -0
- package/dist/test_runner/utils/name.d.ts +2 -0
- package/dist/test_runner/utils/name.js +3 -0
- package/dist/test_runner/utils/name.js.map +1 -0
- package/dist/test_runner/utils/pathResolver.d.ts +6 -0
- package/dist/test_runner/utils/pathResolver.js +98 -0
- package/dist/test_runner/utils/pathResolver.js.map +1 -0
- package/dist/test_runner/utils/projectRoot.d.ts +1 -0
- package/dist/test_runner/utils/projectRoot.js +4 -0
- package/dist/test_runner/utils/projectRoot.js.map +1 -0
- package/dist/test_runner/utils/wasm.d.ts +12 -0
- package/dist/test_runner/utils/wasm.js +45 -0
- package/dist/test_runner/utils/wasm.js.map +1 -0
- package/dist/warpo.js +10 -3
- package/dist/warpo.js.map +1 -0
- package/dist/warpo_internal.d.ts +7 -0
- package/dist/warpo_internal.js +74 -0
- package/dist/warpo_internal.js.map +1 -0
- package/package.json +37 -9
- package/types/std/index.d.ts +8 -261
- package/types/warpo/index.d.ts +94 -0
- package/dist/lib.d.ts +0 -5
|
@@ -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"}
|
|
@@ -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
|
-
|
|
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
|
|
34
|
+
export async function build(options) {
|
|
31
35
|
const binary = get_binary();
|
|
32
|
-
const ps = spawn(binary, options.argv, {
|
|
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", (
|
|
53
|
+
ps.on("close", (code) => {
|
|
41
54
|
process.removeListener("SIGINT", shutdown);
|
|
42
55
|
process.removeListener("SIGTERM", shutdown);
|
|
43
|
-
resolve(
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE5C,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,2DAA2D,CAAC;IACxG,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QAC5F,OAAO,GAAG,QAAQ,IAAI,OAAO,UAAU,OAAO,IAAI,QAAQ,IAAI,IAAI,SAAS,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,MAAM,QAAQ,MAAM,IAAI,+BAA+B,CAAC,CAAC;IAClH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErH,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,2CAA2C;QAC3C,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,GAAG,gBAAgB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE;QACrC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;QAClF,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,SAAS,QAAQ;YACf,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnB,MAAM,EAAE,CAAC;QACX,CAAC;QACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACrC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as warpo from "../../scripts/lib.js";
|
|
2
|
+
export class CompilationError extends Error {
|
|
3
|
+
constructor(errorMessage) {
|
|
4
|
+
super(errorMessage);
|
|
5
|
+
this.name = "CompilationError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
async function buildWithWARPO({ sources, output, userDefinedFlags, collectCoverage, }) {
|
|
9
|
+
let warpoArgv = [
|
|
10
|
+
...sources,
|
|
11
|
+
"-o",
|
|
12
|
+
output.wasm,
|
|
13
|
+
"--exportTable",
|
|
14
|
+
// avoid name conflict with user-defined start functions
|
|
15
|
+
"--exportStart",
|
|
16
|
+
"__unit_test_start",
|
|
17
|
+
"--debug",
|
|
18
|
+
// instrumentation flags
|
|
19
|
+
"--instrument",
|
|
20
|
+
];
|
|
21
|
+
if (!collectCoverage) {
|
|
22
|
+
warpoArgv.push("--instrument-no-coverage");
|
|
23
|
+
}
|
|
24
|
+
if (userDefinedFlags.length > 0) {
|
|
25
|
+
// command line options compatible with ASC
|
|
26
|
+
// --disable => --disable-feature
|
|
27
|
+
// --runtime incremental => remove (only support incremental runtime in warpo)
|
|
28
|
+
// --memoryBase 16 => remove (not supported yet)
|
|
29
|
+
const argv = userDefinedFlags
|
|
30
|
+
.replace("--disable", "--disable-feature")
|
|
31
|
+
.replace("--runtime incremental", "")
|
|
32
|
+
.replace("--memoryBase 16", "")
|
|
33
|
+
.split(" ");
|
|
34
|
+
warpoArgv = warpoArgv.concat(argv);
|
|
35
|
+
}
|
|
36
|
+
const returnCode = await warpo.build({
|
|
37
|
+
argv: warpoArgv,
|
|
38
|
+
env: process.env,
|
|
39
|
+
});
|
|
40
|
+
if (returnCode !== 0) {
|
|
41
|
+
throw new CompilationError(undefined);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function compileImpl(option) {
|
|
45
|
+
await buildWithWARPO(option);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../tools/test_runner/core/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAG9C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,YAAgC;QAC1C,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,KAAK,UAAU,cAAc,CAAC,EAC5B,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,eAAe,GACG;IAClB,IAAI,SAAS,GAAG;QACd,GAAG,OAAO;QACV,IAAI;QACJ,MAAM,CAAC,IAAI;QACX,eAAe;QACf,wDAAwD;QACxD,eAAe;QACf,mBAAmB;QACnB,SAAS;QACT,wBAAwB;QACxB,cAAc;KACf,CAAC;IACF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,2CAA2C;QAC3C,iCAAiC;QACjC,8EAA8E;QAC9E,gDAAgD;QAChD,MAAM,IAAI,GAAG,gBAAgB;aAC1B,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC;aACzC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;aACpC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,KAAK,CAAC,GAAG,CAAC,CAAC;QACd,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;QACnC,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyB;IACzD,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
export class CoverageRecorder {
|
|
3
|
+
_runtimeTrace = [];
|
|
4
|
+
getCollectionFuncSet() {
|
|
5
|
+
return {
|
|
6
|
+
traceExpression: (functionIndex, basicBlockIndex, type) => {
|
|
7
|
+
switch (type) {
|
|
8
|
+
case 1: // call in
|
|
9
|
+
case 2: {
|
|
10
|
+
// call out
|
|
11
|
+
// do not need for now
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
case 0: {
|
|
15
|
+
this._runtimeTrace.push([functionIndex, basicBlockIndex]);
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
outputTrace(traceFile) {
|
|
23
|
+
writeFileSync(traceFile, JSON.stringify(this._runtimeTrace));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=covRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"covRecorder.js","sourceRoot":"","sources":["../../../tools/test_runner/core/covRecorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,OAAO,gBAAgB;IACnB,aAAa,GAA4B,EAAE,CAAC;IAEpD,oBAAoB;QAClB,OAAO;YACL,eAAe,EAAE,CAAC,aAAqB,EAAE,eAAuB,EAAE,IAAY,EAAQ,EAAE;gBACtF,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,CAAC,CAAC,CAAC,UAAU;oBAClB,KAAK,CAAC,CAAC,CAAC,CAAC;wBACP,WAAW;wBACX,sBAAsB;wBACtB,MAAM;oBACR,CAAC;oBACD,KAAK,CAAC,CAAC,CAAC,CAAC;wBACP,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;wBAC1D,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF"}
|