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
@@ -0,0 +1,88 @@
1
+ export function json2map(json) {
2
+ const res = new Map();
3
+ for (const key in json) {
4
+ const value = json[key];
5
+ if (value === undefined) {
6
+ throw new Error(`json parse failed: ${JSON.stringify(json)}`);
7
+ }
8
+ res.set(key, value);
9
+ }
10
+ return res;
11
+ }
12
+ /**
13
+ * return if the functionName is in fileName.
14
+ * @param fileName example: "assembly/assertCollector.ts"
15
+ * @param functionName example:
16
+ * "start:assembly/assertCollector~anonymous|0"
17
+ * || "assembly/assertCollector/addDescription"
18
+ */
19
+ export function isFunctionInsideFile(fileName, functionName) {
20
+ // `/`: parent is File
21
+ // `#`: parent is Class, this is non-static
22
+ // `.`: parent is Class, this is static
23
+ // `<`: generic
24
+ // `~`: parent is Function
25
+ const regex = new RegExp(`^(start:)?${fileName.slice(0, -3)}[/~](?<rest>.+)`);
26
+ const matchPrefix = regex.exec(functionName);
27
+ const rest = matchPrefix?.groups?.["rest"] ?? null;
28
+ if (rest === null) {
29
+ return false;
30
+ }
31
+ const specialCharIndex = rest.search(/[/#.<~]/g);
32
+ if (specialCharIndex === -1) {
33
+ return true;
34
+ }
35
+ return rest[specialCharIndex] !== "/";
36
+ }
37
+ export function checkGenerics(functionName) {
38
+ // FIXME: cannot handle nested generic method in generic class
39
+ const startIndex = functionName.indexOf("<");
40
+ const endIndex = functionName.lastIndexOf(">");
41
+ if (startIndex !== -1 && endIndex !== -1) {
42
+ return functionName.slice(0, startIndex) + functionName.slice(endIndex + 1);
43
+ }
44
+ return undefined;
45
+ }
46
+ export function checkVarargs(functionName) {
47
+ if (functionName.endsWith("@varargs")) {
48
+ return functionName.slice(0, -8);
49
+ }
50
+ return undefined;
51
+ }
52
+ export function injectDefaultFunction(infos, importObject, importsArg) {
53
+ for (const info of infos) {
54
+ const { module, name, kind } = info;
55
+ const importObjectModule = importObject[module] ?? {};
56
+ importObject[module] = importObjectModule;
57
+ if (importObjectModule[name] !== undefined) {
58
+ continue;
59
+ }
60
+ if (module === "env" && name === "abort") {
61
+ importObjectModule[name] = (msg, file, line, col) => {
62
+ const exports = importsArg.exports;
63
+ throw new WebAssembly.RuntimeError(`abort: ${exports.__getString(msg)} at ${exports.__getString(file)}:${line}:${col}`);
64
+ };
65
+ continue;
66
+ }
67
+ if (module === "env" && name === "trace") {
68
+ importObjectModule[name] = (msg, n, ...args) => {
69
+ const exports = importsArg.exports;
70
+ importsArg.framework.log(`trace: ${exports.__getString(msg)}${n > 0 ? " " : ""}${args.slice(0, n).join(", ")}`);
71
+ };
72
+ continue;
73
+ }
74
+ if (kind === "function") {
75
+ importObjectModule[name] = () => {
76
+ // https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tobigint
77
+ // https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tonumber
78
+ // When return js value to wasm, spec requires to convert the value to bigint for i64 and number for others.
79
+ // Here return a number does not work for bigint because a TypeError will be thrown.
80
+ // The common solution is to return boolean that can be converted to both number and bigint
81
+ return false;
82
+ };
83
+ continue;
84
+ }
85
+ throw new Error(`unsupported import: ${module}.${name} of kind ${kind}`);
86
+ }
87
+ }
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ export declare const COVERAGE_DEBUG_INFO_SECTION_NAME = "warpo.coverage.debug-info";
2
+ export declare const TEST_EXPECT_INFO_SECTION_NAME = "warpo.test.expect-info";
3
+ export type CodeSnippetIndex = number;
4
+ export type FunctionIndex = number;
5
+ export type LineIndex = number;
6
+ export type ColumnIndex = number;
7
+ export type FileIndex = number;
8
+ export type UncoveredBasicBlocks = Set<CodeSnippetIndex>;
9
+ export type UncoveredLines = Set<LineIndex>;
10
+ export type BranchInfo = [CodeSnippetIndex, CodeSnippetIndex];
11
+ export type BranchInfos = BranchInfo[];
12
+ export type LineRange = [FileIndex, LineIndex, ColumnIndex][];
13
+ export type LineInfos = (LineRange | null)[];
14
+ export type LineInfoMap = Map<number, Set<LineIndex>>;
15
+ export interface CovDebugInfo {
16
+ branchInfo: BranchInfos;
17
+ index: FunctionIndex;
18
+ lineInfo: LineInfos;
19
+ }
20
+ export interface CovInfo {
21
+ branchInfo: BranchInfos;
22
+ lineInfo: LineInfoMap;
23
+ }
24
+ export interface DebugInfo {
25
+ debugInfos: Record<string, CovDebugInfo>;
26
+ debugFiles: string[];
27
+ }
28
+ export type CovTrace = [FunctionIndex, CodeSnippetIndex];
29
+ export type TestCaseName = string;
30
+ export type ExpectInfoIndex = string;
31
+ export type AssertExpectValue = string;
32
+ export type AssertActualValue = string;
33
+ export type AssertMessage = [ExpectInfoIndex, AssertActualValue, AssertExpectValue];
34
+ export type AssertFailMessage = Record<TestCaseName, AssertMessage[]>;
35
+ export type CrashInfo = Set<TestCaseName>;
36
+ export type FailedLogMessages = Record<TestCaseName, string[]>;
37
+ export type FailedInfo = {
38
+ hasCrash: boolean;
39
+ assertMessages: string[];
40
+ logMessages: string[];
41
+ };
42
+ export type FailedInfoMap = Map<TestCaseName, FailedInfo>;
43
+ export type ExpectInfoDebugLocation = string;
44
+ export type ExpectInfo = Record<ExpectInfoIndex, ExpectInfoDebugLocation>;
45
+ export interface IExecutionResult {
46
+ fail: number;
47
+ total: number;
48
+ crashInfo: CrashInfo;
49
+ failedInfo: AssertFailMessage;
50
+ failedLogMessages: FailedLogMessages;
51
+ }
52
+ export declare class Rate {
53
+ used: number;
54
+ total: number;
55
+ getRate(): number;
56
+ toString(): string;
57
+ static summarize(rates: Rate[]): Rate;
58
+ }
59
+ export declare class FileCoverageResult {
60
+ filename: string;
61
+ constructor(filename: string);
62
+ statementCoverageRate: Rate;
63
+ branchCoverageRate: Rate;
64
+ functionCoverageRate: Rate;
65
+ lineCoverageRate: Rate;
66
+ sourceUsedCount: CodeCoverage[];
67
+ uncoveredLines: Set<number>;
68
+ }
69
+ export declare class FunctionCoverageResult {
70
+ functionName: string;
71
+ constructor(functionName: string);
72
+ branchCoverageRate: Rate;
73
+ uncoveredLines: UncoveredLines;
74
+ lineRange: [number, number];
75
+ /**
76
+ * first means lineIndex;
77
+ * second means usedCount;
78
+ */
79
+ sourceUsedCount: Map<number, number>;
80
+ /**
81
+ * Now assemblyscript will compile foo<T>() to different function like foo<f64>() , foo<u32>() etc;
82
+ * We need merge the generic function to foo() for coverage statistics
83
+ */
84
+ static mergeFromGeneric(nameWithoutGeneric: string, infos: FunctionCoverageResult[]): FunctionCoverageResult;
85
+ }
86
+ export declare class CodeCoverage {
87
+ static readonly default = -1;
88
+ source: string;
89
+ /**
90
+ * Default means not a effect line;
91
+ * 0 means not used but effect;
92
+ * more than 0 means a used line;
93
+ */
94
+ usedCount: number;
95
+ constructor(src: string);
96
+ }
97
+ export interface TestNameInfo {
98
+ testName: string;
99
+ testFilePath: string;
100
+ }
@@ -0,0 +1,86 @@
1
+ // NOTE: These custom section names must stay in sync with the C++ instrumentation:
2
+ // - defaultCoverageDebugInfoSectionName
3
+ // - defaultTestExpectInfoSectionName
4
+ // in passes/instrumentation/CoverageInstrumentation.cpp. If they diverge, the test runner
5
+ // will fail at runtime with a missing-section error.
6
+ export const COVERAGE_DEBUG_INFO_SECTION_NAME = "warpo.coverage.debug-info";
7
+ export const TEST_EXPECT_INFO_SECTION_NAME = "warpo.test.expect-info";
8
+ // output
9
+ export class Rate {
10
+ used = 0;
11
+ total = 0;
12
+ getRate() {
13
+ return this.total === 0 ? 100 : Math.round((this.used / this.total) * 10000) / 100;
14
+ }
15
+ toString() {
16
+ return `${this.used}/${this.total}`;
17
+ }
18
+ static summarize(rates) {
19
+ return rates.reduce((prev, curr) => {
20
+ prev.used += curr.used;
21
+ prev.total += curr.total;
22
+ return prev;
23
+ }, new Rate());
24
+ }
25
+ }
26
+ export class FileCoverageResult {
27
+ filename;
28
+ constructor(filename) {
29
+ this.filename = filename;
30
+ }
31
+ statementCoverageRate = new Rate();
32
+ branchCoverageRate = new Rate();
33
+ functionCoverageRate = new Rate();
34
+ lineCoverageRate = new Rate();
35
+ sourceUsedCount = [];
36
+ uncoveredLines = new Set();
37
+ }
38
+ export class FunctionCoverageResult {
39
+ functionName;
40
+ constructor(functionName) {
41
+ this.functionName = functionName;
42
+ }
43
+ branchCoverageRate = new Rate();
44
+ uncoveredLines = new Set();
45
+ lineRange = [Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER];
46
+ /**
47
+ * first means lineIndex;
48
+ * second means usedCount;
49
+ */
50
+ sourceUsedCount = new Map();
51
+ /**
52
+ * Now assemblyscript will compile foo<T>() to different function like foo<f64>() , foo<u32>() etc;
53
+ * We need merge the generic function to foo() for coverage statistics
54
+ */
55
+ static mergeFromGeneric(nameWithoutGeneric, infos) {
56
+ const result = new FunctionCoverageResult(nameWithoutGeneric);
57
+ result.lineRange = [
58
+ Math.min(...infos.map((info) => info.lineRange[0])),
59
+ Math.max(...infos.map((info) => info.lineRange[1])),
60
+ ];
61
+ result.branchCoverageRate = Rate.summarize(infos.map((info) => info.branchCoverageRate));
62
+ for (const info of infos) {
63
+ for (const line of info.uncoveredLines)
64
+ result.uncoveredLines.add(line);
65
+ for (const [lineIndex, count] of info.sourceUsedCount.entries()) {
66
+ const srcLineUsedCount = result.sourceUsedCount.get(lineIndex);
67
+ result.sourceUsedCount.set(lineIndex, srcLineUsedCount === undefined ? count : srcLineUsedCount + count);
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ }
73
+ export class CodeCoverage {
74
+ static default = -1;
75
+ source;
76
+ /**
77
+ * Default means not a effect line;
78
+ * 0 means not used but effect;
79
+ * more than 0 means a used line;
80
+ */
81
+ usedCount = CodeCoverage.default;
82
+ constructor(src) {
83
+ this.source = src;
84
+ }
85
+ }
86
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const OrganizationName = "wasm-ecosystem";
2
+ export declare const Repository = "https://github.com/wasm-ecosystem/warpo";
@@ -0,0 +1,3 @@
1
+ export const OrganizationName = "wasm-ecosystem";
2
+ export const Repository = "https://github.com/wasm-ecosystem/warpo";
3
+ //# sourceMappingURL=name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/name.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,yCAAyC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function splitCommand(cmdline: string): {
2
+ cmd: string;
3
+ argv: string[];
4
+ };
5
+ export declare function findRoot(filePaths: string[]): string;
6
+ export declare function getIncludeFiles(includePatterns: string[], filter: (path: string) => boolean): string[];
@@ -0,0 +1,98 @@
1
+ import assert from "node:assert";
2
+ import fs from "fs-extra";
3
+ import { glob } from "glob";
4
+ import { dirname, join, relative, resolve } from "node:path";
5
+ export function splitCommand(cmdline) {
6
+ const res = new Array();
7
+ let depth = 0;
8
+ let last = 0;
9
+ for (let i = 0; i < cmdline.length; i++) {
10
+ const ch = cmdline.charAt(i);
11
+ if (ch === '"' || ch === "'" || ch === "`") {
12
+ depth++;
13
+ }
14
+ else if (ch === " " && depth % 2 === 0 && (i === 0 || cmdline.charAt(i - 1) !== "\\")) {
15
+ if (last !== i) {
16
+ const argv = cmdline.slice(last, i).replaceAll(/\\ /g, " ");
17
+ res.push(argv);
18
+ }
19
+ last = i + 1;
20
+ }
21
+ }
22
+ if (last !== cmdline.length) {
23
+ res.push(cmdline.slice(last));
24
+ }
25
+ const cmd = res[0];
26
+ if (cmd === undefined)
27
+ throw new Error(`Invalid Command: ${cmdline}`);
28
+ const argv = res.slice(1);
29
+ return { cmd: cmd, argv: argv };
30
+ }
31
+ function getAllFileInFolder(folder, filter = () => true) {
32
+ const res = [];
33
+ let sub;
34
+ try {
35
+ sub = fs.readdirSync(folder).map((v) => join(folder, v));
36
+ }
37
+ catch (error) {
38
+ if (error instanceof Error) {
39
+ console.error(error.stack);
40
+ }
41
+ throw new Error(`read "${folder}" info failed`);
42
+ }
43
+ for (const f of sub) {
44
+ const st = fs.statSync(f);
45
+ if (st.isFile() && filter(f)) {
46
+ res.push(f);
47
+ }
48
+ else if (st.isDirectory()) {
49
+ res.push(...getAllFileInFolder(f, filter));
50
+ }
51
+ }
52
+ return res;
53
+ }
54
+ export function findRoot(filePaths) {
55
+ if (filePaths.length === 1) {
56
+ const filePath = filePaths[0];
57
+ assert(filePath !== undefined);
58
+ return dirname(filePath);
59
+ }
60
+ const absPaths = filePaths.map((p) => {
61
+ return resolve(p);
62
+ });
63
+ const p0 = absPaths[0];
64
+ if (p0 === undefined) {
65
+ throw new Error("include length is zeros");
66
+ }
67
+ let root = p0;
68
+ while (!absPaths.every((v) => v.startsWith(root))) {
69
+ root = dirname(root);
70
+ }
71
+ root = relative(".", root);
72
+ if (root === "") {
73
+ root = ".";
74
+ }
75
+ if (root.startsWith("..")) {
76
+ throw new Error("file path out of project range");
77
+ }
78
+ return root;
79
+ }
80
+ export function getIncludeFiles(includePatterns, filter) {
81
+ const flatPatterns = includePatterns.flatMap((pattern) => {
82
+ return glob.sync(pattern);
83
+ });
84
+ const files = flatPatterns.flatMap((flatPattern) => {
85
+ const st = fs.statSync(flatPattern);
86
+ if (st.isDirectory()) {
87
+ return getAllFileInFolder(flatPattern, filter);
88
+ }
89
+ else if (st.isFile() && filter(flatPattern)) {
90
+ return [flatPattern];
91
+ }
92
+ else {
93
+ return [];
94
+ }
95
+ });
96
+ return files;
97
+ }
98
+ //# sourceMappingURL=pathResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathResolver.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/pathResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const projectRoot: string;
@@ -0,0 +1,4 @@
1
+ import { join } from "node:path";
2
+ import { fileURLToPath, URL } from "node:url";
3
+ export const projectRoot = join(fileURLToPath(new URL(".", import.meta.url)), "..", "..");
4
+ //# sourceMappingURL=projectRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectRoot.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/projectRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare class WebAssemblyModule {
2
+ baseName: string;
3
+ private m;
4
+ constructor(baseName: string);
5
+ get wasm(): string;
6
+ get sourceMap(): string;
7
+ get traceFile(): string;
8
+ getModule(): Promise<WebAssembly.Module>;
9
+ getCustomSectionPayload(sectionName: string): Promise<Uint8Array | null>;
10
+ getCustomSectionUtf8(sectionName: string): Promise<string | null>;
11
+ getImports(): Promise<WebAssembly.ModuleImportDescriptor[]>;
12
+ }
@@ -0,0 +1,45 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { openAsBlob } from "fs";
4
+ import { relative } from "path";
5
+ export class WebAssemblyModule {
6
+ baseName;
7
+ m = null;
8
+ constructor(baseName) {
9
+ this.baseName = relative(process.cwd(), baseName).replaceAll(/\\/g, "/");
10
+ }
11
+ get wasm() {
12
+ return this.baseName.concat(".instrumented.wasm");
13
+ }
14
+ get sourceMap() {
15
+ return this.baseName.concat(".instrumented.wasm.map");
16
+ }
17
+ get traceFile() {
18
+ return this.baseName.concat(".trace");
19
+ }
20
+ async getModule() {
21
+ if (this.m)
22
+ return this.m;
23
+ const bytes = await (await openAsBlob(this.wasm)).arrayBuffer();
24
+ this.m = new WebAssembly.Module(bytes);
25
+ return this.m;
26
+ }
27
+ async getCustomSectionPayload(sectionName) {
28
+ const sections = WebAssembly.Module.customSections(await this.getModule(), sectionName);
29
+ if (sections.length === 0)
30
+ return null;
31
+ if (sections.length > 1)
32
+ throw new Error(`multiple wasm custom sections found: '${sectionName}'`);
33
+ return new Uint8Array(sections[0]);
34
+ }
35
+ async getCustomSectionUtf8(sectionName) {
36
+ const payload = await this.getCustomSectionPayload(sectionName);
37
+ if (payload === null)
38
+ return null;
39
+ return new TextDecoder("utf-8").decode(payload);
40
+ }
41
+ async getImports() {
42
+ return WebAssembly.Module.imports(await this.getModule());
43
+ }
44
+ }
45
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/wasm.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,OAAO,iBAAiB;IAC5B,QAAQ,CAAS;IACT,CAAC,GAA8B,IAAI,CAAC;IAC5C,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChE,IAAI,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,CAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,WAAmB;QAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;QACxF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,WAAW,GAAG,CAAC,CAAC;QAClG,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,WAAmB;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;CACF"}
package/dist/warpo.d.ts CHANGED
@@ -1,2 +1,8 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export interface CliOption {
3
+ env: NodeJS.Dict<string>;
4
+ argv: string[];
5
+ cwd?: string;
6
+ onStdout?: (chunk: string) => void;
7
+ }
8
+ export declare function main(options: CliOption): Promise<number>;
package/dist/warpo.js CHANGED
@@ -1,4 +1,84 @@
1
1
  #!/usr/bin/env node
2
- import { main } from "./lib.js";
3
- import { argv, env } from "node:process";
4
- process.exit(await main({ argv: argv.slice(2), env: env }));
2
+ // Copyright (C) 2025 wasm-ecosystem
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+ import { argv as processArgv, env as processEnv, exit as processExit } from "node:process";
8
+ import { Command } from "commander";
9
+ import { build as runCompiler } from "./scripts/lib.js";
10
+ import { runFromCliArgs as runUnitTestsFromCliArgs } from "./test_runner/cli.js";
11
+ const warpoRoot = join(import.meta.dirname, "..");
12
+ function getVersion() {
13
+ try {
14
+ return JSON.parse(readFileSync(join(warpoRoot, "package.json"), "utf8")).version;
15
+ }
16
+ catch {
17
+ return "unknown";
18
+ }
19
+ }
20
+ export async function main(options) {
21
+ const args = options.argv;
22
+ // Preserve legacy behavior: direct compiler invocation when not using subcommands.
23
+ const first = args[0];
24
+ if (first !== undefined &&
25
+ first !== "build" &&
26
+ first !== "test" &&
27
+ first !== "-h" &&
28
+ first !== "--help" &&
29
+ first !== "--version" &&
30
+ first !== "-v") {
31
+ return await runCompiler({ argv: args, env: options.env, cwd: options.cwd });
32
+ }
33
+ let returnCode = 0;
34
+ const program = new Command();
35
+ program.name("warpo").description("compiler + tooling");
36
+ program.showHelpAfterError(true);
37
+ program.version(getVersion(), "-v, --version", "Print version");
38
+ program
39
+ .command("build")
40
+ .description("Build AssemblyScript project via WARPO compiler")
41
+ .allowUnknownOption(true)
42
+ .argument("[buildArgs...]", "Arguments passed through to warpo_asc")
43
+ .action(async () => {
44
+ const index = args.indexOf("build");
45
+ const buildArgs = index === -1 ? [] : args.slice(index + 1);
46
+ const cwd = options.cwd ?? process.cwd();
47
+ const handleConfigOption = (args) => {
48
+ const configPath = join(cwd, "asconfig.json");
49
+ const hasConfig = args.includes("--config") || args.includes("-c");
50
+ return !hasConfig && existsSync(configPath) ? [...args, "--config", configPath] : args;
51
+ };
52
+ const handleProjectOption = (args) => {
53
+ const hasProject = args.includes("--project") || args.includes("-p");
54
+ return !hasProject && existsSync(join(cwd, "create.ts")) ? [...args, "--project", cwd] : args;
55
+ };
56
+ returnCode = await runCompiler({
57
+ argv: [handleConfigOption, handleProjectOption].reduce((args, handler) => handler(args), buildArgs),
58
+ env: options.env,
59
+ cwd: options.cwd,
60
+ onStdout: options.onStdout,
61
+ });
62
+ });
63
+ program
64
+ .command("test")
65
+ .description("Run unit tests via WARPO test runner")
66
+ .helpOption(false)
67
+ .allowUnknownOption(true)
68
+ .argument("[testArgs...]", "Arguments passed through to the test runner")
69
+ .action(async () => {
70
+ const index = args.indexOf("test");
71
+ const testArgs = index === -1 ? [] : args.slice(index + 1);
72
+ returnCode = await runUnitTestsFromCliArgs(testArgs);
73
+ });
74
+ await program.parseAsync(args, { from: "user" });
75
+ return returnCode;
76
+ }
77
+ if (typeof processArgv[1] === "string" && import.meta.url === pathToFileURL(processArgv[1]).href) {
78
+ main({ argv: processArgv.slice(2), env: processEnv })
79
+ .then((code) => processExit(code))
80
+ .catch(() => {
81
+ processExit(255);
82
+ });
83
+ }
84
+ //# sourceMappingURL=warpo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warpo.js","sourceRoot":"","sources":["../tools/warpo.ts"],"names":[],"mappings":"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"}