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.
- package/asconfig.schema.json +25 -3
- package/create/index.ts +4 -1
- 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.d.ts +7 -1
- package/dist/warpo.js +83 -3
- package/dist/warpo.js.map +1 -0
- package/package.json +36 -8
- package/tsconfig-warpo.json +2 -3
- package/{assemblyscript/std/assembly → types/std}/index.d.ts +26 -340
- package/types/std/package.json +3 -0
- package/types/std/tsconfig.json +4 -0
- package/types/tsconfig-base.json +15 -0
- package/types/tsconfig-std.json +13 -0
- package/types/warpo/index.d.ts +95 -1
- package/types/wasi_snapshot_preview1/index.d.ts +52 -0
- package/types/wasi_snapshot_preview1/package.json +3 -0
- package/types/wasi_snapshot_preview1/tsconfig.json +4 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
package/dist/warpo.js
CHANGED
|
@@ -1,4 +1,84 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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":";AAEA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,GAAG,IAAI,UAAU,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AASjF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAElD,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAiB,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAkB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,mFAAmF;IACnF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IACE,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,OAAO;QACjB,KAAK,KAAK,MAAM;QAChB,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,IAAI,EACd,CAAC;QACD,OAAO,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACxD,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAEhE,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,kBAAkB,CAAC,IAAI,CAAC;SACxB,QAAQ,CAAC,gBAAgB,EAAE,uCAAuC,CAAC;SACnE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,kBAAkB,GAAG,CAAC,IAAc,EAAE,EAAE;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,CAAC,CAAC;QACF,MAAM,mBAAmB,GAAG,CAAC,IAAc,EAAE,EAAE;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrE,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChG,CAAC,CAAC;QACF,UAAU,GAAG,MAAM,WAAW,CAAC;YAC7B,IAAI,EAAE,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;YACnG,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,UAAU,CAAC,KAAK,CAAC;SACjB,kBAAkB,CAAC,IAAI,CAAC;SACxB,QAAQ,CAAC,eAAe,EAAE,6CAA6C,CAAC;SACxE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3D,UAAU,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;SAClD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACjC,KAAK,CAAC,GAAG,EAAE;QACV,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC"}
|