@galaxy-tool-util/schema 0.2.0 → 1.0.0
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/index.d.ts +86 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -2
- package/dist/index.js.map +1 -1
- package/dist/schema/parameter-defaults.d.ts +36 -0
- package/dist/schema/parameter-defaults.d.ts.map +1 -0
- package/dist/schema/parameter-defaults.js +128 -0
- package/dist/schema/parameter-defaults.js.map +1 -0
- package/dist/schema/parsed-tool.d.ts +47 -0
- package/dist/schema/parsed-tool.d.ts.map +1 -0
- package/dist/schema/parsed-tool.js +49 -0
- package/dist/schema/parsed-tool.js.map +1 -0
- package/dist/schema/type-guards.d.ts +14 -0
- package/dist/schema/type-guards.d.ts.map +1 -0
- package/dist/schema/type-guards.js +25 -0
- package/dist/schema/type-guards.js.map +1 -0
- package/dist/test-format/cross-check/check.d.ts +18 -0
- package/dist/test-format/cross-check/check.d.ts.map +1 -0
- package/dist/test-format/cross-check/check.js +89 -0
- package/dist/test-format/cross-check/check.js.map +1 -0
- package/dist/test-format/cross-check/extract-format2.d.ts +13 -0
- package/dist/test-format/cross-check/extract-format2.d.ts.map +1 -0
- package/dist/test-format/cross-check/extract-format2.js +98 -0
- package/dist/test-format/cross-check/extract-format2.js.map +1 -0
- package/dist/test-format/cross-check/extract-native.d.ts +4 -0
- package/dist/test-format/cross-check/extract-native.d.ts.map +1 -0
- package/dist/test-format/cross-check/extract-native.js +89 -0
- package/dist/test-format/cross-check/extract-native.js.map +1 -0
- package/dist/test-format/cross-check/extract.d.ts +9 -0
- package/dist/test-format/cross-check/extract.d.ts.map +1 -0
- package/dist/test-format/cross-check/extract.js +16 -0
- package/dist/test-format/cross-check/extract.js.map +1 -0
- package/dist/test-format/cross-check/index.d.ts +7 -0
- package/dist/test-format/cross-check/index.d.ts.map +1 -0
- package/dist/test-format/cross-check/index.js +6 -0
- package/dist/test-format/cross-check/index.js.map +1 -0
- package/dist/test-format/cross-check/type-compat.d.ts +23 -0
- package/dist/test-format/cross-check/type-compat.d.ts.map +1 -0
- package/dist/test-format/cross-check/type-compat.js +48 -0
- package/dist/test-format/cross-check/type-compat.js.map +1 -0
- package/dist/test-format/cross-check/types.d.ts +23 -0
- package/dist/test-format/cross-check/types.d.ts.map +1 -0
- package/dist/test-format/cross-check/types.js +10 -0
- package/dist/test-format/cross-check/types.js.map +1 -0
- package/dist/test-format/index.d.ts +3 -0
- package/dist/test-format/index.d.ts.map +1 -0
- package/dist/test-format/index.js +3 -0
- package/dist/test-format/index.js.map +1 -0
- package/dist/test-format/tests.schema.generated.d.ts +5610 -0
- package/dist/test-format/tests.schema.generated.d.ts.map +1 -0
- package/dist/test-format/tests.schema.generated.js +6899 -0
- package/dist/test-format/tests.schema.generated.js.map +1 -0
- package/dist/test-format/validate.d.ts +20 -0
- package/dist/test-format/validate.d.ts.map +1 -0
- package/dist/test-format/validate.js +41 -0
- package/dist/test-format/validate.js.map +1 -0
- package/dist/tool-state-validator.d.ts +30 -0
- package/dist/tool-state-validator.d.ts.map +1 -0
- package/dist/tool-state-validator.js +59 -0
- package/dist/tool-state-validator.js.map +1 -0
- package/dist/workflow/clean.d.ts +29 -3
- package/dist/workflow/clean.d.ts.map +1 -1
- package/dist/workflow/clean.js +199 -28
- package/dist/workflow/clean.js.map +1 -1
- package/dist/workflow/fill-defaults.d.ts +39 -0
- package/dist/workflow/fill-defaults.d.ts.map +1 -0
- package/dist/workflow/fill-defaults.js +53 -0
- package/dist/workflow/fill-defaults.js.map +1 -0
- package/dist/workflow/index.d.ts +17 -5
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +17 -3
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/lint-profiles.d.ts +27 -0
- package/dist/workflow/lint-profiles.d.ts.map +1 -0
- package/dist/workflow/lint-profiles.js +49 -0
- package/dist/workflow/lint-profiles.js.map +1 -0
- package/dist/workflow/lint-rules.d.ts +15 -0
- package/dist/workflow/lint-rules.d.ts.map +1 -0
- package/dist/workflow/lint-rules.js +15 -0
- package/dist/workflow/lint-rules.js.map +1 -0
- package/dist/workflow/lint.d.ts +4 -18
- package/dist/workflow/lint.d.ts.map +1 -1
- package/dist/workflow/lint.js +9 -30
- package/dist/workflow/lint.js.map +1 -1
- package/dist/workflow/lint_profiles.yml +41 -0
- package/dist/workflow/linting.d.ts +54 -0
- package/dist/workflow/linting.d.ts.map +1 -0
- package/dist/workflow/linting.js +71 -0
- package/dist/workflow/linting.js.map +1 -0
- package/dist/workflow/mermaid.d.ts +11 -0
- package/dist/workflow/mermaid.d.ts.map +1 -0
- package/dist/workflow/mermaid.js +158 -0
- package/dist/workflow/mermaid.js.map +1 -0
- package/dist/workflow/minimal-tool-state.d.ts +15 -0
- package/dist/workflow/minimal-tool-state.d.ts.map +1 -0
- package/dist/workflow/minimal-tool-state.js +16 -0
- package/dist/workflow/minimal-tool-state.js.map +1 -0
- package/dist/workflow/param-navigation.d.ts +26 -0
- package/dist/workflow/param-navigation.d.ts.map +1 -0
- package/dist/workflow/param-navigation.js +60 -0
- package/dist/workflow/param-navigation.js.map +1 -0
- package/dist/workflow/raw/gxformat2.effect.d.ts +341 -117
- package/dist/workflow/raw/gxformat2.effect.d.ts.map +1 -1
- package/dist/workflow/raw/gxformat2.effect.js +107 -109
- package/dist/workflow/raw/gxformat2.effect.js.map +1 -1
- package/dist/workflow/raw/native.d.ts +2 -2
- package/dist/workflow/raw/native.d.ts.map +1 -1
- package/dist/workflow/raw/native.effect.d.ts +150 -3
- package/dist/workflow/raw/native.effect.d.ts.map +1 -1
- package/dist/workflow/raw/native.effect.js +3 -5
- package/dist/workflow/raw/native.effect.js.map +1 -1
- package/dist/workflow/report-models.d.ts +412 -0
- package/dist/workflow/report-models.d.ts.map +1 -0
- package/dist/workflow/report-models.js +342 -0
- package/dist/workflow/report-models.js.map +1 -0
- package/dist/workflow/roundtrip.d.ts +31 -8
- package/dist/workflow/roundtrip.d.ts.map +1 -1
- package/dist/workflow/roundtrip.js +107 -26
- package/dist/workflow/roundtrip.js.map +1 -1
- package/dist/workflow/schema-rules.d.ts +38 -0
- package/dist/workflow/schema-rules.d.ts.map +1 -0
- package/dist/workflow/schema-rules.js +28 -0
- package/dist/workflow/schema-rules.js.map +1 -0
- package/dist/workflow/schema_rules.yml +69 -0
- package/dist/workflow/serialize.d.ts +30 -0
- package/dist/workflow/serialize.d.ts.map +1 -0
- package/dist/workflow/serialize.js +37 -0
- package/dist/workflow/serialize.js.map +1 -0
- package/dist/workflow/state-merge.d.ts +15 -32
- package/dist/workflow/state-merge.d.ts.map +1 -1
- package/dist/workflow/state-merge.js +30 -207
- package/dist/workflow/state-merge.js.map +1 -1
- package/dist/workflow/stateful-validate.d.ts +21 -0
- package/dist/workflow/stateful-validate.d.ts.map +1 -1
- package/dist/workflow/stateful-validate.js +27 -0
- package/dist/workflow/stateful-validate.js.map +1 -1
- package/dist/workflow/step-skeleton.d.ts +29 -0
- package/dist/workflow/step-skeleton.d.ts.map +1 -0
- package/dist/workflow/step-skeleton.js +55 -0
- package/dist/workflow/step-skeleton.js.map +1 -0
- package/dist/workflow/strict-checks.d.ts +22 -0
- package/dist/workflow/strict-checks.d.ts.map +1 -0
- package/dist/workflow/strict-checks.js +95 -0
- package/dist/workflow/strict-checks.js.map +1 -0
- package/dist/workflow/tool-state-io.d.ts +14 -0
- package/dist/workflow/tool-state-io.d.ts.map +1 -0
- package/dist/workflow/tool-state-io.js +33 -0
- package/dist/workflow/tool-state-io.js.map +1 -0
- package/dist/workflow/validators.d.ts +34 -0
- package/dist/workflow/validators.d.ts.map +1 -0
- package/dist/workflow/validators.js +83 -0
- package/dist/workflow/validators.js.map +1 -0
- package/dist/workflow/walk-helpers.d.ts +29 -0
- package/dist/workflow/walk-helpers.d.ts.map +1 -0
- package/dist/workflow/walk-helpers.js +89 -0
- package/dist/workflow/walk-helpers.js.map +1 -0
- package/dist/workflow/walker.d.ts +12 -0
- package/dist/workflow/walker.d.ts.map +1 -1
- package/dist/workflow/walker.js +27 -8
- package/dist/workflow/walker.js.map +1 -1
- package/package.json +6 -7
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { isCompatibleType, jsTypeOf } from "./type-compat.js";
|
|
2
|
+
/**
|
|
3
|
+
* JSON-pointer escaping per RFC 6901 — `~` → `~0`, `/` → `~1`.
|
|
4
|
+
*/
|
|
5
|
+
function jptrEscape(s) {
|
|
6
|
+
return s.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
7
|
+
}
|
|
8
|
+
function jptr(parts) {
|
|
9
|
+
return "/" + parts.map((p) => jptrEscape(String(p))).join("/");
|
|
10
|
+
}
|
|
11
|
+
function asRecord(v) {
|
|
12
|
+
return v && typeof v === "object" && !Array.isArray(v)
|
|
13
|
+
? v
|
|
14
|
+
: undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Cross-check a parsed tests document against workflow inputs/outputs. Emits
|
|
18
|
+
* one diagnostic per violation with a JSON-pointer path into the tests doc
|
|
19
|
+
* (matches Ajv's `instancePath`). Keywords:
|
|
20
|
+
*
|
|
21
|
+
* workflow_input_undefined job key not declared in workflow
|
|
22
|
+
* workflow_input_required required workflow input missing from job (and no default)
|
|
23
|
+
* workflow_input_type job value's JS type incompatible with declared type
|
|
24
|
+
* workflow_output_undefined output assertion name not declared in workflow
|
|
25
|
+
*/
|
|
26
|
+
export function checkTestsAgainstWorkflow(testsDoc, workflow) {
|
|
27
|
+
if (!Array.isArray(testsDoc))
|
|
28
|
+
return [];
|
|
29
|
+
const inputByName = new Map(workflow.inputs.map((i) => [i.name, i]));
|
|
30
|
+
const outputNames = new Set(workflow.outputs.map((o) => o.name));
|
|
31
|
+
const diagnostics = [];
|
|
32
|
+
for (let testIdx = 0; testIdx < testsDoc.length; testIdx++) {
|
|
33
|
+
const entry = asRecord(testsDoc[testIdx]);
|
|
34
|
+
if (!entry)
|
|
35
|
+
continue;
|
|
36
|
+
const job = asRecord(entry.job) ?? {};
|
|
37
|
+
const outputs = asRecord(entry.outputs) ?? {};
|
|
38
|
+
// Inputs: flag unknowns, check types.
|
|
39
|
+
for (const [name, value] of Object.entries(job)) {
|
|
40
|
+
const declared = inputByName.get(name);
|
|
41
|
+
if (!declared) {
|
|
42
|
+
diagnostics.push({
|
|
43
|
+
path: jptr([testIdx, "job", name]),
|
|
44
|
+
message: `Input '${name}' is not defined in the associated workflow.`,
|
|
45
|
+
keyword: "workflow_input_undefined",
|
|
46
|
+
params: { input: name },
|
|
47
|
+
});
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const actualType = jsTypeOf(value);
|
|
51
|
+
if (!isCompatibleType(declared.type, actualType)) {
|
|
52
|
+
diagnostics.push({
|
|
53
|
+
path: jptr([testIdx, "job", name]),
|
|
54
|
+
message: `Input '${name}' has an invalid type. Expected '${declared.type}' but found '${actualType}'.`,
|
|
55
|
+
keyword: "workflow_input_type",
|
|
56
|
+
params: { input: name, declaredType: declared.type, actualType },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Inputs: flag required ones missing from the job.
|
|
61
|
+
for (const declared of workflow.inputs) {
|
|
62
|
+
if (declared.optional === true)
|
|
63
|
+
continue;
|
|
64
|
+
if (declared.default !== undefined)
|
|
65
|
+
continue;
|
|
66
|
+
if (Object.prototype.hasOwnProperty.call(job, declared.name))
|
|
67
|
+
continue;
|
|
68
|
+
diagnostics.push({
|
|
69
|
+
path: jptr([testIdx, "job"]),
|
|
70
|
+
message: `Input '${declared.name}' is required but no value or default was provided.`,
|
|
71
|
+
keyword: "workflow_input_required",
|
|
72
|
+
params: { input: declared.name },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Outputs: flag assertions for outputs the workflow doesn't declare.
|
|
76
|
+
for (const name of Object.keys(outputs)) {
|
|
77
|
+
if (!outputNames.has(name)) {
|
|
78
|
+
diagnostics.push({
|
|
79
|
+
path: jptr([testIdx, "outputs", name]),
|
|
80
|
+
message: `Output '${name}' is not defined in the associated workflow.`,
|
|
81
|
+
keyword: "workflow_output_undefined",
|
|
82
|
+
params: { output: name },
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return diagnostics;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WorkflowInput, WorkflowOutput } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extract workflow inputs from a parsed Format2 (.gxwf.yml) workflow dict.
|
|
4
|
+
*
|
|
5
|
+
* Handles both dict form (`inputs: { name: { type: ... } }`) and list form
|
|
6
|
+
* (`inputs: [{ id: name, type: ... }]`). Plugin accepts both.
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractFormat2Inputs(parsed: unknown): WorkflowInput[];
|
|
9
|
+
/**
|
|
10
|
+
* Extract workflow outputs from a parsed Format2 workflow dict.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractFormat2Outputs(parsed: unknown): WorkflowOutput[];
|
|
13
|
+
//# sourceMappingURL=extract-format2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-format2.d.ts","sourceRoot":"","sources":["../../../src/test-format/cross-check/extract-format2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgChE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAqBrE;AAUD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,EAAE,CAqBvE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
function asRecord(v) {
|
|
2
|
+
return v && typeof v === "object" && !Array.isArray(v)
|
|
3
|
+
? v
|
|
4
|
+
: undefined;
|
|
5
|
+
}
|
|
6
|
+
function asString(v) {
|
|
7
|
+
return typeof v === "string" ? v : undefined;
|
|
8
|
+
}
|
|
9
|
+
function parseInputEntry(name, raw) {
|
|
10
|
+
// Shorthand: `name: File` or `name: int` — a bare string is the type.
|
|
11
|
+
if (typeof raw === "string") {
|
|
12
|
+
return { name, type: raw };
|
|
13
|
+
}
|
|
14
|
+
const entry = asRecord(raw);
|
|
15
|
+
if (!entry) {
|
|
16
|
+
return { name, type: "data" };
|
|
17
|
+
}
|
|
18
|
+
const type = asString(entry.type) ?? "data";
|
|
19
|
+
const doc = asString(entry.doc);
|
|
20
|
+
const optional = typeof entry.optional === "boolean" ? entry.optional : undefined;
|
|
21
|
+
const hasDefault = Object.prototype.hasOwnProperty.call(entry, "default");
|
|
22
|
+
const out = { name, type };
|
|
23
|
+
if (doc !== undefined)
|
|
24
|
+
out.doc = doc;
|
|
25
|
+
if (optional !== undefined)
|
|
26
|
+
out.optional = optional;
|
|
27
|
+
if (hasDefault)
|
|
28
|
+
out.default = entry.default;
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extract workflow inputs from a parsed Format2 (.gxwf.yml) workflow dict.
|
|
33
|
+
*
|
|
34
|
+
* Handles both dict form (`inputs: { name: { type: ... } }`) and list form
|
|
35
|
+
* (`inputs: [{ id: name, type: ... }]`). Plugin accepts both.
|
|
36
|
+
*/
|
|
37
|
+
export function extractFormat2Inputs(parsed) {
|
|
38
|
+
const wf = asRecord(parsed);
|
|
39
|
+
if (!wf)
|
|
40
|
+
return [];
|
|
41
|
+
const inputs = wf.inputs;
|
|
42
|
+
if (inputs === undefined || inputs === null)
|
|
43
|
+
return [];
|
|
44
|
+
if (Array.isArray(inputs)) {
|
|
45
|
+
const out = [];
|
|
46
|
+
for (const entry of inputs) {
|
|
47
|
+
const r = asRecord(entry);
|
|
48
|
+
if (!r)
|
|
49
|
+
continue;
|
|
50
|
+
const name = asString(r.id) ?? asString(r.name);
|
|
51
|
+
if (!name)
|
|
52
|
+
continue;
|
|
53
|
+
out.push(parseInputEntry(name, r));
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
const dict = asRecord(inputs);
|
|
58
|
+
if (!dict)
|
|
59
|
+
return [];
|
|
60
|
+
return Object.entries(dict).map(([name, raw]) => parseInputEntry(name, raw));
|
|
61
|
+
}
|
|
62
|
+
function parseOutputEntry(name, raw) {
|
|
63
|
+
const entry = asRecord(raw);
|
|
64
|
+
const doc = entry ? asString(entry.doc) : undefined;
|
|
65
|
+
const out = { name };
|
|
66
|
+
if (doc !== undefined)
|
|
67
|
+
out.doc = doc;
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract workflow outputs from a parsed Format2 workflow dict.
|
|
72
|
+
*/
|
|
73
|
+
export function extractFormat2Outputs(parsed) {
|
|
74
|
+
const wf = asRecord(parsed);
|
|
75
|
+
if (!wf)
|
|
76
|
+
return [];
|
|
77
|
+
const outputs = wf.outputs;
|
|
78
|
+
if (outputs === undefined || outputs === null)
|
|
79
|
+
return [];
|
|
80
|
+
if (Array.isArray(outputs)) {
|
|
81
|
+
const out = [];
|
|
82
|
+
for (const entry of outputs) {
|
|
83
|
+
const r = asRecord(entry);
|
|
84
|
+
if (!r)
|
|
85
|
+
continue;
|
|
86
|
+
const name = asString(r.id) ?? asString(r.name);
|
|
87
|
+
if (!name)
|
|
88
|
+
continue;
|
|
89
|
+
out.push(parseOutputEntry(name, r));
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
const dict = asRecord(outputs);
|
|
94
|
+
if (!dict)
|
|
95
|
+
return [];
|
|
96
|
+
return Object.entries(dict).map(([name, raw]) => parseOutputEntry(name, raw));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=extract-format2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-format2.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/extract-format2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkflowInput, WorkflowOutput } from "./types.js";
|
|
2
|
+
export declare function extractNativeInputs(parsed: unknown): WorkflowInput[];
|
|
3
|
+
export declare function extractNativeOutputs(parsed: unknown): WorkflowOutput[];
|
|
4
|
+
//# sourceMappingURL=extract-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-native.d.ts","sourceRoot":"","sources":["../../../src/test-format/cross-check/extract-native.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuChE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAqBpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,EAAE,CAmBtE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { parseToolState } from "../../workflow/tool-state-io.js";
|
|
2
|
+
const INPUT_STEP_TYPES = new Set(["data_input", "data_collection_input", "parameter_input"]);
|
|
3
|
+
function asRecord(v) {
|
|
4
|
+
return v && typeof v === "object" && !Array.isArray(v)
|
|
5
|
+
? v
|
|
6
|
+
: undefined;
|
|
7
|
+
}
|
|
8
|
+
function asString(v) {
|
|
9
|
+
return typeof v === "string" ? v : undefined;
|
|
10
|
+
}
|
|
11
|
+
function inputTypeFor(stepType, toolState) {
|
|
12
|
+
if (stepType === "data_input")
|
|
13
|
+
return "data";
|
|
14
|
+
if (stepType === "data_collection_input")
|
|
15
|
+
return "collection";
|
|
16
|
+
// parameter_input — tool_state carries `parameter_type` (e.g. "integer", "text", "boolean").
|
|
17
|
+
return asString(toolState.parameter_type) ?? "data";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Return parsed steps as an array ordered by numeric id. Native workflows
|
|
21
|
+
* store `steps` as a dict keyed by stringified id.
|
|
22
|
+
*/
|
|
23
|
+
function orderedSteps(parsed) {
|
|
24
|
+
const steps = asRecord(parsed.steps);
|
|
25
|
+
if (!steps)
|
|
26
|
+
return [];
|
|
27
|
+
return Object.entries(steps)
|
|
28
|
+
.map(([key, value]) => {
|
|
29
|
+
const step = asRecord(value);
|
|
30
|
+
const id = step && typeof step.id === "number" ? step.id : Number.parseInt(key, 10);
|
|
31
|
+
return { id: Number.isFinite(id) ? id : 0, step };
|
|
32
|
+
})
|
|
33
|
+
.filter((e) => !!e.step)
|
|
34
|
+
.sort((a, b) => a.id - b.id)
|
|
35
|
+
.map((e) => e.step);
|
|
36
|
+
}
|
|
37
|
+
export function extractNativeInputs(parsed) {
|
|
38
|
+
const wf = asRecord(parsed);
|
|
39
|
+
if (!wf)
|
|
40
|
+
return [];
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const step of orderedSteps(wf)) {
|
|
43
|
+
const stepType = asString(step.type);
|
|
44
|
+
if (!stepType || !INPUT_STEP_TYPES.has(stepType))
|
|
45
|
+
continue;
|
|
46
|
+
const name = asString(step.label);
|
|
47
|
+
if (!name)
|
|
48
|
+
continue;
|
|
49
|
+
const toolState = parseToolState(step.tool_state);
|
|
50
|
+
const type = inputTypeFor(stepType, toolState);
|
|
51
|
+
const input = { name, type };
|
|
52
|
+
const doc = asString(step.annotation);
|
|
53
|
+
if (doc)
|
|
54
|
+
input.doc = doc;
|
|
55
|
+
if (typeof toolState.optional === "boolean")
|
|
56
|
+
input.optional = toolState.optional;
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(toolState, "default")) {
|
|
58
|
+
input.default = toolState.default;
|
|
59
|
+
}
|
|
60
|
+
out.push(input);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
export function extractNativeOutputs(parsed) {
|
|
65
|
+
const wf = asRecord(parsed);
|
|
66
|
+
if (!wf)
|
|
67
|
+
return [];
|
|
68
|
+
const out = [];
|
|
69
|
+
for (const step of orderedSteps(wf)) {
|
|
70
|
+
const workflowOutputs = step.workflow_outputs;
|
|
71
|
+
if (!Array.isArray(workflowOutputs))
|
|
72
|
+
continue;
|
|
73
|
+
for (const wo of workflowOutputs) {
|
|
74
|
+
const r = asRecord(wo);
|
|
75
|
+
if (!r)
|
|
76
|
+
continue;
|
|
77
|
+
const name = asString(r.label) ?? asString(r.output_name);
|
|
78
|
+
if (!name)
|
|
79
|
+
continue;
|
|
80
|
+
const entry = { name };
|
|
81
|
+
const uuid = asString(r.uuid);
|
|
82
|
+
if (uuid)
|
|
83
|
+
entry.uuid = uuid;
|
|
84
|
+
out.push(entry);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=extract-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-native.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/extract-native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkflowFormat } from "../../workflow/detect-format.js";
|
|
2
|
+
import type { WorkflowInput, WorkflowOutput } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Format-aware extractor. Uses the schema package's `resolveFormat` so
|
|
5
|
+
* callers don't have to sniff native vs format2 themselves.
|
|
6
|
+
*/
|
|
7
|
+
export declare function extractWorkflowInputs(parsed: Record<string, unknown>, format?: WorkflowFormat): WorkflowInput[];
|
|
8
|
+
export declare function extractWorkflowOutputs(parsed: Record<string, unknown>, format?: WorkflowFormat): WorkflowOutput[];
|
|
9
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/test-format/cross-check/extract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,cAAc,GACtB,aAAa,EAAE,CAGjB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,cAAc,GACtB,cAAc,EAAE,CAGlB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { resolveFormat } from "../../workflow/serialize.js";
|
|
2
|
+
import { extractFormat2Inputs, extractFormat2Outputs } from "./extract-format2.js";
|
|
3
|
+
import { extractNativeInputs, extractNativeOutputs } from "./extract-native.js";
|
|
4
|
+
/**
|
|
5
|
+
* Format-aware extractor. Uses the schema package's `resolveFormat` so
|
|
6
|
+
* callers don't have to sniff native vs format2 themselves.
|
|
7
|
+
*/
|
|
8
|
+
export function extractWorkflowInputs(parsed, format) {
|
|
9
|
+
const f = format ?? resolveFormat(parsed);
|
|
10
|
+
return f === "format2" ? extractFormat2Inputs(parsed) : extractNativeInputs(parsed);
|
|
11
|
+
}
|
|
12
|
+
export function extractWorkflowOutputs(parsed, format) {
|
|
13
|
+
const f = format ?? resolveFormat(parsed);
|
|
14
|
+
return f === "format2" ? extractFormat2Outputs(parsed) : extractNativeOutputs(parsed);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhF;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA+B,EAC/B,MAAuB;IAEvB,MAAM,CAAC,GAAG,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAA+B,EAC/B,MAAuB;IAEvB,MAAM,CAAC,GAAG,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { WorkflowInput, WorkflowOutput, WorkflowDataType } from "./types.js";
|
|
2
|
+
export { extractWorkflowInputs, extractWorkflowOutputs } from "./extract.js";
|
|
3
|
+
export { extractFormat2Inputs, extractFormat2Outputs } from "./extract-format2.js";
|
|
4
|
+
export { extractNativeInputs, extractNativeOutputs } from "./extract-native.js";
|
|
5
|
+
export { isCompatibleType, jsTypeOf } from "./type-compat.js";
|
|
6
|
+
export { checkTestsAgainstWorkflow, type WorkflowShape } from "./check.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-format/cross-check/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { extractWorkflowInputs, extractWorkflowOutputs } from "./extract.js";
|
|
2
|
+
export { extractFormat2Inputs, extractFormat2Outputs } from "./extract-format2.js";
|
|
3
|
+
export { extractNativeInputs, extractNativeOutputs } from "./extract-native.js";
|
|
4
|
+
export { isCompatibleType, jsTypeOf } from "./type-compat.js";
|
|
5
|
+
export { checkTestsAgainstWorkflow } from "./check.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAsB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { WorkflowDataType } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Coarse compatibility check between a workflow-declared input type and the
|
|
4
|
+
* runtime type tag of a test-job value. Matches the VS Code plugin's
|
|
5
|
+
* `server-common/src/utils.ts::isCompatibleType` signature — callers pass a
|
|
6
|
+
* runtime type *string*, not the raw value. Plugin callers derive the string
|
|
7
|
+
* from an AST node's `.type` (YAML-language-server vocabulary:
|
|
8
|
+
* `"string" | "number" | "boolean" | "null" | "object" | "array"`); our CLI
|
|
9
|
+
* derives it from `typeof` via {@link jsTypeOf}.
|
|
10
|
+
*
|
|
11
|
+
* Unmapped declared types (`data`, `collection`, `color`, custom) fall
|
|
12
|
+
* through as compatible — the strict structural check lives in the JSON
|
|
13
|
+
* Schema layer.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isCompatibleType(expectedType: WorkflowDataType, actualType: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* JS-side runtime type tag for a test-job value, in the same vocabulary
|
|
18
|
+
* YAML-language-server's AST emits — so `isCompatibleType` produces the same
|
|
19
|
+
* answer regardless of whether the caller walked an AST (plugin) or parsed
|
|
20
|
+
* YAML into plain values (CLI).
|
|
21
|
+
*/
|
|
22
|
+
export declare function jsTypeOf(value: unknown): string;
|
|
23
|
+
//# sourceMappingURL=type-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-compat.d.ts","sourceRoot":"","sources":["../../../src/test-format/cross-check/type-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAoB5F;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI/C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coarse compatibility check between a workflow-declared input type and the
|
|
3
|
+
* runtime type tag of a test-job value. Matches the VS Code plugin's
|
|
4
|
+
* `server-common/src/utils.ts::isCompatibleType` signature — callers pass a
|
|
5
|
+
* runtime type *string*, not the raw value. Plugin callers derive the string
|
|
6
|
+
* from an AST node's `.type` (YAML-language-server vocabulary:
|
|
7
|
+
* `"string" | "number" | "boolean" | "null" | "object" | "array"`); our CLI
|
|
8
|
+
* derives it from `typeof` via {@link jsTypeOf}.
|
|
9
|
+
*
|
|
10
|
+
* Unmapped declared types (`data`, `collection`, `color`, custom) fall
|
|
11
|
+
* through as compatible — the strict structural check lives in the JSON
|
|
12
|
+
* Schema layer.
|
|
13
|
+
*/
|
|
14
|
+
export function isCompatibleType(expectedType, actualType) {
|
|
15
|
+
switch (expectedType) {
|
|
16
|
+
case "int":
|
|
17
|
+
case "integer":
|
|
18
|
+
case "long":
|
|
19
|
+
case "double":
|
|
20
|
+
case "float":
|
|
21
|
+
return actualType === "number";
|
|
22
|
+
case "boolean":
|
|
23
|
+
return actualType === "boolean";
|
|
24
|
+
case "text":
|
|
25
|
+
case "string":
|
|
26
|
+
return actualType === "string";
|
|
27
|
+
case "File":
|
|
28
|
+
return actualType === "string" || actualType === "object";
|
|
29
|
+
case "null":
|
|
30
|
+
return actualType === "null";
|
|
31
|
+
default:
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* JS-side runtime type tag for a test-job value, in the same vocabulary
|
|
37
|
+
* YAML-language-server's AST emits — so `isCompatibleType` produces the same
|
|
38
|
+
* answer regardless of whether the caller walked an AST (plugin) or parsed
|
|
39
|
+
* YAML into plain values (CLI).
|
|
40
|
+
*/
|
|
41
|
+
export function jsTypeOf(value) {
|
|
42
|
+
if (value === null)
|
|
43
|
+
return "null";
|
|
44
|
+
if (Array.isArray(value))
|
|
45
|
+
return "array";
|
|
46
|
+
return typeof value;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=type-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-compat.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/type-compat.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAA8B,EAAE,UAAkB;IACjF,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,KAAK,CAAC;QACX,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,UAAU,KAAK,QAAQ,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,UAAU,KAAK,SAAS,CAAC;QAClC,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,UAAU,KAAK,QAAQ,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,CAAC;QAC5D,KAAK,MAAM;YACT,OAAO,UAAU,KAAK,MAAM,CAAC;QAC/B;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,OAAO,KAAK,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical DTOs for workflow cross-check. Shared with the VS Code plugin so
|
|
3
|
+
* extractors + the comparator can be reused; plugin keeps AST ranges.
|
|
4
|
+
*
|
|
5
|
+
* `type` is stringified whatever the workflow declares ("File", "data",
|
|
6
|
+
* "int", "integer", "string", ...). Callers should not canonicalize — the
|
|
7
|
+
* vocabulary is semi-open and differs subtly between native and format2.
|
|
8
|
+
*/
|
|
9
|
+
export type WorkflowDataType = "boolean" | "collection" | "color" | "data" | "double" | "File" | "float" | "int" | "integer" | "long" | "null" | "string" | "text" | (string & {});
|
|
10
|
+
export interface WorkflowInput {
|
|
11
|
+
name: string;
|
|
12
|
+
doc?: string;
|
|
13
|
+
type: WorkflowDataType;
|
|
14
|
+
default?: unknown;
|
|
15
|
+
optional?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkflowOutput {
|
|
18
|
+
name: string;
|
|
19
|
+
doc?: string;
|
|
20
|
+
uuid?: string;
|
|
21
|
+
type?: WorkflowDataType;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/test-format/cross-check/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,YAAY,GACZ,OAAO,GACP,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,KAAK,GACL,SAAS,GACT,MAAM,GACN,MAAM,GACN,QAAQ,GACR,MAAM,GACN,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical DTOs for workflow cross-check. Shared with the VS Code plugin so
|
|
3
|
+
* extractors + the comparator can be reused; plugin keeps AST ranges.
|
|
4
|
+
*
|
|
5
|
+
* `type` is stringified whatever the workflow declares ("File", "data",
|
|
6
|
+
* "int", "integer", "string", ...). Callers should not canonicalize — the
|
|
7
|
+
* vocabulary is semi-open and differs subtly between native and format2.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/test-format/cross-check/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { validateTestsFile, testsSchema, type TestFormatDiagnostic } from "./validate.js";
|
|
2
|
+
export { type WorkflowInput, type WorkflowOutput, type WorkflowDataType, extractWorkflowInputs, extractWorkflowOutputs, extractFormat2Inputs, extractFormat2Outputs, extractNativeInputs, extractNativeOutputs, isCompatibleType, jsTypeOf, checkTestsAgainstWorkflow, type WorkflowShape, } from "./cross-check/index.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-format/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,yBAAyB,EACzB,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { validateTestsFile, testsSchema } from "./validate.js";
|
|
2
|
+
export { extractWorkflowInputs, extractWorkflowOutputs, extractFormat2Inputs, extractFormat2Outputs, extractNativeInputs, extractNativeOutputs, isCompatibleType, jsTypeOf, checkTestsAgainstWorkflow, } from "./cross-check/index.js";
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test-format/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAA6B,MAAM,eAAe,CAAC;AAC1F,OAAO,EAIL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,yBAAyB,GAE1B,MAAM,wBAAwB,CAAC"}
|