@galaxy-tool-util/cli 0.2.0 → 0.4.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.
Files changed (98) hide show
  1. package/dist/bin/gxwf.js +43 -19
  2. package/dist/bin/gxwf.js.map +1 -1
  3. package/dist/commands/add.js +2 -2
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/clean-tree.d.ts +3 -17
  6. package/dist/commands/clean-tree.d.ts.map +1 -1
  7. package/dist/commands/clean-tree.js +30 -29
  8. package/dist/commands/clean-tree.js.map +1 -1
  9. package/dist/commands/clean.d.ts +3 -0
  10. package/dist/commands/clean.d.ts.map +1 -1
  11. package/dist/commands/clean.js +12 -2
  12. package/dist/commands/clean.js.map +1 -1
  13. package/dist/commands/clear.js +4 -4
  14. package/dist/commands/clear.js.map +1 -1
  15. package/dist/commands/convert-tree.d.ts +2 -1
  16. package/dist/commands/convert-tree.d.ts.map +1 -1
  17. package/dist/commands/convert-tree.js +23 -7
  18. package/dist/commands/convert-tree.js.map +1 -1
  19. package/dist/commands/convert.d.ts +2 -1
  20. package/dist/commands/convert.d.ts.map +1 -1
  21. package/dist/commands/convert.js +36 -4
  22. package/dist/commands/convert.js.map +1 -1
  23. package/dist/commands/info.d.ts.map +1 -1
  24. package/dist/commands/info.js +5 -4
  25. package/dist/commands/info.js.map +1 -1
  26. package/dist/commands/lint-tree.d.ts +3 -19
  27. package/dist/commands/lint-tree.d.ts.map +1 -1
  28. package/dist/commands/lint-tree.js +46 -58
  29. package/dist/commands/lint-tree.js.map +1 -1
  30. package/dist/commands/lint.d.ts +8 -4
  31. package/dist/commands/lint.d.ts.map +1 -1
  32. package/dist/commands/lint.js +61 -13
  33. package/dist/commands/lint.js.map +1 -1
  34. package/dist/commands/list.js +3 -3
  35. package/dist/commands/list.js.map +1 -1
  36. package/dist/commands/populate-workflow.js +2 -2
  37. package/dist/commands/populate-workflow.js.map +1 -1
  38. package/dist/commands/render-results.d.ts +3 -3
  39. package/dist/commands/render-results.d.ts.map +1 -1
  40. package/dist/commands/render-results.js +8 -4
  41. package/dist/commands/render-results.js.map +1 -1
  42. package/dist/commands/report-output.d.ts +34 -0
  43. package/dist/commands/report-output.d.ts.map +1 -0
  44. package/dist/commands/report-output.js +70 -0
  45. package/dist/commands/report-output.js.map +1 -0
  46. package/dist/commands/resolve-tool.js +1 -1
  47. package/dist/commands/resolve-tool.js.map +1 -1
  48. package/dist/commands/roundtrip-tree.d.ts +3 -1
  49. package/dist/commands/roundtrip-tree.d.ts.map +1 -1
  50. package/dist/commands/roundtrip-tree.js +67 -5
  51. package/dist/commands/roundtrip-tree.js.map +1 -1
  52. package/dist/commands/roundtrip.d.ts +2 -1
  53. package/dist/commands/roundtrip.d.ts.map +1 -1
  54. package/dist/commands/roundtrip.js +30 -8
  55. package/dist/commands/roundtrip.js.map +1 -1
  56. package/dist/commands/schema.js +2 -2
  57. package/dist/commands/schema.js.map +1 -1
  58. package/dist/commands/strict-options.d.ts +22 -0
  59. package/dist/commands/strict-options.d.ts.map +1 -0
  60. package/dist/commands/strict-options.js +18 -0
  61. package/dist/commands/strict-options.js.map +1 -0
  62. package/dist/commands/validate-tests-tree.d.ts +36 -0
  63. package/dist/commands/validate-tests-tree.d.ts.map +1 -0
  64. package/dist/commands/validate-tests-tree.js +191 -0
  65. package/dist/commands/validate-tests-tree.js.map +1 -0
  66. package/dist/commands/validate-tests.d.ts +21 -0
  67. package/dist/commands/validate-tests.d.ts.map +1 -0
  68. package/dist/commands/validate-tests.js +83 -0
  69. package/dist/commands/validate-tests.js.map +1 -0
  70. package/dist/commands/validate-tree.d.ts +3 -20
  71. package/dist/commands/validate-tree.d.ts.map +1 -1
  72. package/dist/commands/validate-tree.js +53 -47
  73. package/dist/commands/validate-tree.js.map +1 -1
  74. package/dist/commands/validate-workflow-json-schema.d.ts +8 -2
  75. package/dist/commands/validate-workflow-json-schema.d.ts.map +1 -1
  76. package/dist/commands/validate-workflow-json-schema.js +104 -58
  77. package/dist/commands/validate-workflow-json-schema.js.map +1 -1
  78. package/dist/commands/validate-workflow.d.ts +17 -10
  79. package/dist/commands/validate-workflow.d.ts.map +1 -1
  80. package/dist/commands/validate-workflow.js +185 -59
  81. package/dist/commands/validate-workflow.js.map +1 -1
  82. package/dist/commands/workflow-io.d.ts +2 -11
  83. package/dist/commands/workflow-io.d.ts.map +1 -1
  84. package/dist/commands/workflow-io.js +7 -16
  85. package/dist/commands/workflow-io.js.map +1 -1
  86. package/dist/index.d.ts +15 -0
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +12 -0
  89. package/dist/index.js.map +1 -1
  90. package/dist/workflow/_templates-bundled.d.ts +2 -0
  91. package/dist/workflow/_templates-bundled.d.ts.map +1 -0
  92. package/dist/workflow/_templates-bundled.js +324 -0
  93. package/dist/workflow/_templates-bundled.js.map +1 -0
  94. package/dist/workflow/report-templates.d.ts +13 -0
  95. package/dist/workflow/report-templates.d.ts.map +1 -0
  96. package/dist/workflow/report-templates.js +91 -0
  97. package/dist/workflow/report-templates.js.map +1 -0
  98. package/package.json +7 -5
@@ -0,0 +1,191 @@
1
+ /**
2
+ * ``gxwf validate-tests-tree`` — batch-validate every workflow-test file
3
+ * (``*-tests.yml``, ``*-tests.yaml``, ``*.gxwf-tests.yml``, ``*.gxwf-tests.yaml``)
4
+ * under a directory against the ``galaxy.tool_util_models.Tests`` JSON Schema.
5
+ *
6
+ * Unlike ``validate-tree`` this uses its own discovery pass because test
7
+ * documents don't carry a ``class: GalaxyWorkflow`` / ``a_galaxy_workflow``
8
+ * marker — classification is filename-based.
9
+ *
10
+ * With ``--auto-workflow``, each test file is paired with a sibling workflow
11
+ * by suffix convention and cross-checked. Silent no-op when no sibling is
12
+ * found.
13
+ */
14
+ import { readdir, readFile, stat } from "node:fs/promises";
15
+ import { dirname, join, relative } from "node:path";
16
+ import { parse as parseYaml } from "yaml";
17
+ import { checkTestsAgainstWorkflow, extractWorkflowInputs, extractWorkflowOutputs, resolveFormat, validateTestsFile, } from "@galaxy-tool-util/schema";
18
+ const EXCLUDE_DIRS = new Set([".git", ".hg", ".venv", "node_modules", "__pycache__", ".snakemake"]);
19
+ const TEST_SUFFIXES = [".gxwf-tests.yml", ".gxwf-tests.yaml", "-tests.yml", "-tests.yaml"];
20
+ const WORKFLOW_EXTS = [".gxwf.yml", ".gxwf.yaml", ".yml", ".yaml", ".ga"];
21
+ function isTestFile(name) {
22
+ return TEST_SUFFIXES.some((s) => name.endsWith(s));
23
+ }
24
+ /**
25
+ * Derive the workflow basename a given tests file pairs with.
26
+ * `foo.gxwf-tests.yml` → `foo`; `bar-tests.yml` → `bar`.
27
+ */
28
+ function stripTestsSuffix(name) {
29
+ for (const suffix of TEST_SUFFIXES) {
30
+ if (name.endsWith(suffix))
31
+ return name.slice(0, -suffix.length);
32
+ }
33
+ return undefined;
34
+ }
35
+ async function fileExists(path) {
36
+ try {
37
+ const s = await stat(path);
38
+ return s.isFile();
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Locate a sibling workflow for a tests file. Returns the first existing
46
+ * candidate in suffix-priority order, or undefined if none found.
47
+ */
48
+ async function findSiblingWorkflow(testsPath) {
49
+ const base = stripTestsSuffix(testsPath.split("/").pop() ?? "");
50
+ if (!base)
51
+ return undefined;
52
+ const dir = dirname(testsPath);
53
+ for (const ext of WORKFLOW_EXTS) {
54
+ const candidate = join(dir, `${base}${ext}`);
55
+ if (await fileExists(candidate))
56
+ return candidate;
57
+ }
58
+ return undefined;
59
+ }
60
+ async function loadWorkflowShape(path) {
61
+ const raw = await readFile(path, "utf-8");
62
+ const parsed = path.endsWith(".ga") || path.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
63
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
64
+ throw new Error(`Workflow ${path} did not parse to an object.`);
65
+ }
66
+ const dict = parsed;
67
+ const format = resolveFormat(dict);
68
+ return {
69
+ inputs: extractWorkflowInputs(dict, format),
70
+ outputs: extractWorkflowOutputs(dict, format),
71
+ };
72
+ }
73
+ async function discoverTestFiles(root) {
74
+ const out = [];
75
+ await walk(root, out);
76
+ out.sort();
77
+ return out;
78
+ }
79
+ async function walk(dir, out) {
80
+ let entries;
81
+ try {
82
+ entries = await readdir(dir, { withFileTypes: true });
83
+ }
84
+ catch {
85
+ return;
86
+ }
87
+ for (const entry of entries) {
88
+ if (entry.isDirectory()) {
89
+ if (!EXCLUDE_DIRS.has(entry.name)) {
90
+ await walk(join(dir, entry.name), out);
91
+ }
92
+ continue;
93
+ }
94
+ if (entry.isFile() && isTestFile(entry.name)) {
95
+ out.push(join(dir, entry.name));
96
+ }
97
+ }
98
+ }
99
+ async function validateOne(path, root, autoWorkflow) {
100
+ const rel = relative(root, path);
101
+ let parsed;
102
+ try {
103
+ const raw = await readFile(path, "utf-8");
104
+ parsed = parseYaml(raw);
105
+ }
106
+ catch (err) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ return {
109
+ path: rel,
110
+ valid: false,
111
+ loadError: true,
112
+ errors: [
113
+ { path: "(root)", message: `YAML parse error: ${msg}`, keyword: "yaml", params: {} },
114
+ ],
115
+ };
116
+ }
117
+ const { valid: schemaValid, errors } = validateTestsFile(parsed);
118
+ const allErrors = [...errors];
119
+ let pairedWorkflow;
120
+ if (autoWorkflow) {
121
+ const sibling = await findSiblingWorkflow(path);
122
+ if (sibling) {
123
+ pairedWorkflow = relative(root, sibling);
124
+ try {
125
+ const shape = await loadWorkflowShape(sibling);
126
+ allErrors.push(...checkTestsAgainstWorkflow(parsed, shape));
127
+ }
128
+ catch (err) {
129
+ const msg = err instanceof Error ? err.message : String(err);
130
+ allErrors.push({
131
+ path: "(root)",
132
+ message: `Failed to load workflow ${pairedWorkflow}: ${msg}`,
133
+ keyword: "workflow_load_error",
134
+ params: { workflow: pairedWorkflow },
135
+ });
136
+ }
137
+ }
138
+ }
139
+ const valid = schemaValid && allErrors.length === 0;
140
+ const report = { path: rel, valid, errors: allErrors };
141
+ if (pairedWorkflow)
142
+ report.workflow = pairedWorkflow;
143
+ return report;
144
+ }
145
+ export async function runValidateTestsTree(dir, opts = {}) {
146
+ const paths = await discoverTestFiles(dir);
147
+ const files = [];
148
+ for (const p of paths) {
149
+ files.push(await validateOne(p, dir, opts.autoWorkflow === true));
150
+ }
151
+ const summary = {
152
+ total: files.length,
153
+ ok: files.filter((f) => f.valid).length,
154
+ fail: files.filter((f) => !f.valid && !f.loadError).length,
155
+ error: files.filter((f) => f.loadError).length,
156
+ };
157
+ const report = {
158
+ root: dir,
159
+ files: files.map(({ path, valid, errors, workflow }) => {
160
+ const entry = { path, valid, errors };
161
+ if (workflow)
162
+ entry.workflow = workflow;
163
+ return entry;
164
+ }),
165
+ summary,
166
+ };
167
+ if (opts.json) {
168
+ console.log(JSON.stringify(report, null, 2));
169
+ }
170
+ else {
171
+ for (const f of files) {
172
+ const wfNote = f.workflow ? ` [workflow: ${f.workflow}]` : "";
173
+ if (f.loadError) {
174
+ console.error(` ${f.path}: ERROR (${f.errors[0]?.message ?? "load failed"})`);
175
+ }
176
+ else if (f.valid) {
177
+ console.log(` ${f.path}: OK${wfNote}`);
178
+ }
179
+ else {
180
+ console.error(` ${f.path}: ${f.errors.length} validation error(s)${wfNote}`);
181
+ for (const e of f.errors) {
182
+ console.error(` ${e.path}: ${e.message} [${e.keyword}]`);
183
+ }
184
+ }
185
+ }
186
+ const s = summary;
187
+ console.log(`\nSummary: ${s.total} files | ${s.ok} OK, ${s.fail} FAIL, ${s.error} ERROR`);
188
+ }
189
+ process.exitCode = summary.fail > 0 || summary.error > 0 ? 1 : 0;
190
+ }
191
+ //# sourceMappingURL=validate-tests-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tests-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ``gxwf validate-tests`` — validate a workflow-test file (``*-tests.yml`` /
3
+ * ``*.gxwf-tests.yml``) against the JSON Schema synced from Galaxy's
4
+ * ``galaxy.tool_util_models.Tests`` Pydantic model.
5
+ *
6
+ * With ``--workflow <path>`` also cross-checks inputs/outputs against the
7
+ * referenced workflow: unknown job keys, missing required inputs, type
8
+ * mismatches, unknown output assertions.
9
+ */
10
+ import { type TestFormatDiagnostic } from "@galaxy-tool-util/schema";
11
+ export interface ValidateTestsOptions {
12
+ json?: boolean;
13
+ workflow?: string;
14
+ }
15
+ export interface ValidateTestsReport {
16
+ file: string;
17
+ valid: boolean;
18
+ errors: TestFormatDiagnostic[];
19
+ }
20
+ export declare function runValidateTests(filePath: string, opts?: ValidateTestsOptions): Promise<void>;
21
+ //# sourceMappingURL=validate-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tests.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAML,KAAK,oBAAoB,EAE1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAiBD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * ``gxwf validate-tests`` — validate a workflow-test file (``*-tests.yml`` /
3
+ * ``*.gxwf-tests.yml``) against the JSON Schema synced from Galaxy's
4
+ * ``galaxy.tool_util_models.Tests`` Pydantic model.
5
+ *
6
+ * With ``--workflow <path>`` also cross-checks inputs/outputs against the
7
+ * referenced workflow: unknown job keys, missing required inputs, type
8
+ * mismatches, unknown output assertions.
9
+ */
10
+ import { readFile } from "node:fs/promises";
11
+ import { parse as parseYaml } from "yaml";
12
+ import { checkTestsAgainstWorkflow, extractWorkflowInputs, extractWorkflowOutputs, resolveFormat, validateTestsFile, } from "@galaxy-tool-util/schema";
13
+ async function loadWorkflowShape(path) {
14
+ const raw = await readFile(path, "utf-8");
15
+ const parsed = path.endsWith(".ga") || path.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
16
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
17
+ throw new Error(`Workflow ${path} did not parse to an object.`);
18
+ }
19
+ const dict = parsed;
20
+ const format = resolveFormat(dict);
21
+ return {
22
+ inputs: extractWorkflowInputs(dict, format),
23
+ outputs: extractWorkflowOutputs(dict, format),
24
+ };
25
+ }
26
+ export async function runValidateTests(filePath, opts = {}) {
27
+ const raw = await readFile(filePath, "utf-8");
28
+ let parsed;
29
+ try {
30
+ parsed = parseYaml(raw);
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : String(err);
34
+ if (opts.json) {
35
+ const report = {
36
+ file: filePath,
37
+ valid: false,
38
+ errors: [
39
+ { path: "(root)", message: `YAML parse error: ${msg}`, keyword: "yaml", params: {} },
40
+ ],
41
+ };
42
+ console.log(JSON.stringify(report, null, 2));
43
+ }
44
+ else {
45
+ console.error(`${filePath}: YAML parse error: ${msg}`);
46
+ }
47
+ process.exitCode = 2;
48
+ return;
49
+ }
50
+ const { valid: schemaValid, errors } = validateTestsFile(parsed);
51
+ const allErrors = [...errors];
52
+ if (opts.workflow) {
53
+ try {
54
+ const shape = await loadWorkflowShape(opts.workflow);
55
+ allErrors.push(...checkTestsAgainstWorkflow(parsed, shape));
56
+ }
57
+ catch (err) {
58
+ const msg = err instanceof Error ? err.message : String(err);
59
+ allErrors.push({
60
+ path: "(root)",
61
+ message: `Failed to load workflow ${opts.workflow}: ${msg}`,
62
+ keyword: "workflow_load_error",
63
+ params: { workflow: opts.workflow },
64
+ });
65
+ }
66
+ }
67
+ const valid = schemaValid && allErrors.length === 0;
68
+ if (opts.json) {
69
+ const report = { file: filePath, valid, errors: allErrors };
70
+ console.log(JSON.stringify(report, null, 2));
71
+ }
72
+ else if (valid) {
73
+ console.log(`${filePath}: OK`);
74
+ }
75
+ else {
76
+ console.error(`${filePath}: ${allErrors.length} validation error(s)`);
77
+ for (const e of allErrors) {
78
+ console.error(` ${e.path}: ${e.message} [${e.keyword}]`);
79
+ }
80
+ }
81
+ process.exitCode = valid ? 0 : 1;
82
+ }
83
+ //# sourceMappingURL=validate-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests.js","sourceRoot":"","sources":["../../src/commands/validate-tests.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { type StepValidationResult } from "./validate-workflow.js";
2
- import { type TreeSummary } from "./tree.js";
3
- export interface ValidateTreeOptions {
1
+ import { type StrictOptions } from "./strict-options.js";
2
+ import { type ReportOutputOptions } from "./report-output.js";
3
+ export interface ValidateTreeOptions extends StrictOptions, ReportOutputOptions {
4
4
  format?: string;
5
5
  toolState?: boolean;
6
6
  cacheDir?: string;
@@ -8,22 +8,5 @@ export interface ValidateTreeOptions {
8
8
  toolSchemaDir?: string;
9
9
  json?: boolean;
10
10
  }
11
- export interface WorkflowValidateResult {
12
- relativePath: string;
13
- format: string;
14
- steps: StepValidationResult[];
15
- }
16
- export interface ValidateTreeReport {
17
- root: string;
18
- results: (WorkflowValidateResult | {
19
- relativePath: string;
20
- error: string;
21
- })[];
22
- summary: TreeSummary & {
23
- stepOk: number;
24
- stepFail: number;
25
- stepSkip: number;
26
- };
27
- }
28
11
  export declare function runValidateTree(dir: string, opts: ValidateTreeOptions): Promise<void>;
29
12
  //# sourceMappingURL=validate-tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAmD,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,sBAAsB,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC9E,OAAO,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF3F"}
1
+ {"version":3,"file":"validate-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQ/E,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,mBAAoB,SAAQ,aAAa,EAAE,mBAAmB;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyG3F"}
@@ -1,19 +1,19 @@
1
- /**
2
- * `gxwf validate-tree` batch validate all workflows under a directory.
3
- */
4
- import { ToolCache } from "@galaxy-tool-util/core";
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
+ import { checkStrictEncoding, checkStrictStructure, buildWorkflowValidationResult, buildTreeValidationReport, } from "@galaxy-tool-util/schema";
5
3
  import { dirname } from "node:path";
6
4
  import { createDefaultResolver } from "./url-resolver.js";
5
+ import { resolveStrictOptions } from "./strict-options.js";
7
6
  import { resolveFormat } from "./workflow-io.js";
8
7
  import { validateNativeSteps, validateFormat2Steps, } from "./validate-workflow.js";
9
- import { collectTree, summarizeOutcomes } from "./tree.js";
8
+ import { collectTree } from "./tree.js";
9
+ import { writeReportOutput, writeReportHtml } from "./report-output.js";
10
10
  export async function runValidateTree(dir, opts) {
11
11
  const mode = opts.mode === "json-schema" ? "json-schema" : "effect";
12
12
  // Load tool cache once for all files
13
13
  let cache;
14
14
  if (opts.toolState !== false) {
15
15
  try {
16
- cache = new ToolCache({ cacheDir: opts.cacheDir });
16
+ cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
17
17
  await cache.index.load();
18
18
  }
19
19
  catch (e) {
@@ -29,89 +29,95 @@ export async function runValidateTree(dir, opts) {
29
29
  validateNativeStepsJsonSchema = (data, cache, prefix, expansionOpts) => mod.validateNativeStepsJsonSchema(data, cache, opts.toolSchemaDir, prefix, expansionOpts);
30
30
  validateFormat2StepsJsonSchema = (data, cache, prefix, expansionOpts) => mod.validateFormat2StepsJsonSchema(data, cache, opts.toolSchemaDir, prefix, expansionOpts);
31
31
  }
32
+ const strict = resolveStrictOptions(opts);
32
33
  const treeResult = await collectTree(dir, async (info, data) => {
33
34
  const format = resolveFormat(data, opts.format);
35
+ // Per-file strict checks
36
+ if (strict.strictEncoding) {
37
+ const encErrors = checkStrictEncoding(data, format);
38
+ if (encErrors.length > 0) {
39
+ throw new Error(`Encoding: ${encErrors.join("; ")}`);
40
+ }
41
+ }
42
+ if (strict.strictStructure) {
43
+ const structErrors = checkStrictStructure(data, format);
44
+ if (structErrors.length > 0) {
45
+ throw new Error(`Structure: ${structErrors.join("; ")}`);
46
+ }
47
+ }
34
48
  const expansionOpts = {
35
49
  resolver: createDefaultResolver({ workflowDirectory: dirname(info.path) }),
36
50
  };
37
- let steps = [];
51
+ let stepResults = [];
38
52
  if (cache && opts.toolState !== false) {
39
53
  const validateNative = validateNativeStepsJsonSchema ?? validateNativeSteps;
40
54
  const validateF2 = validateFormat2StepsJsonSchema ?? validateFormat2Steps;
41
- steps =
55
+ stepResults =
42
56
  format === "native"
43
57
  ? await validateNative(data, cache, "", expansionOpts)
44
58
  : await validateF2(data, cache, "", expansionOpts);
45
59
  }
46
- return { relativePath: info.relativePath, format, steps };
60
+ // --strict-state: promote skips to failures
61
+ if (strict.strictState && stepResults.some((s) => s.status !== "ok" && s.status !== "fail")) {
62
+ throw new Error("Strict state: skipped steps not allowed");
63
+ }
64
+ return buildWorkflowValidationResult(info.relativePath, stepResults);
47
65
  });
48
- const report = buildValidateReport(treeResult);
66
+ const report = buildReport(treeResult);
67
+ await writeReportOutput("validate_tree.md.j2", report, { reportMarkdown: opts.reportMarkdown });
68
+ await writeReportHtml("validate-tree", report, opts.reportHtml);
49
69
  if (opts.json) {
50
70
  console.log(JSON.stringify(report, null, 2));
51
71
  process.exitCode = computeValidateExitCode(report);
52
72
  return;
53
73
  }
54
74
  // Text output
55
- for (const outcome of treeResult.outcomes) {
56
- if (outcome.error) {
57
- console.error(` ${outcome.info.relativePath}: ERROR (${outcome.error})`);
75
+ for (const wf of report.workflows) {
76
+ if (wf.error) {
77
+ console.error(` ${wf.path}: ERROR (${wf.error})`);
58
78
  continue;
59
79
  }
60
- if (outcome.skipped) {
61
- console.warn(` ${outcome.info.relativePath}: SKIPPED (${outcome.skipReason})`);
80
+ if (wf.skipped_reason) {
81
+ console.warn(` ${wf.path}: SKIPPED (${wf.skipped_reason})`);
62
82
  continue;
63
83
  }
64
- const r = outcome.result;
65
- const ok = r.steps.filter((s) => s.status === "ok").length;
66
- const fail = r.steps.filter((s) => s.status === "fail").length;
67
- const skip = r.steps.filter((s) => s.status === "skip").length;
68
- const total = r.steps.length;
69
- if (fail > 0) {
70
- console.error(` ${r.relativePath}: ${total} steps (${ok} OK, ${fail} FAIL, ${skip} SKIP)`);
71
- for (const s of r.steps.filter((s) => s.status === "fail")) {
72
- for (const err of s.errors) {
73
- console.error(` Step ${s.stepLabel} (${s.toolId}): ${err}`);
74
- }
84
+ const s = wf.summary;
85
+ const total = s.ok + s.fail + s.skip;
86
+ if (s.fail > 0) {
87
+ console.error(` ${wf.path}: ${total} steps (${s.ok} OK, ${s.fail} FAIL, ${s.skip} SKIP)`);
88
+ for (const f of wf.failures ?? []) {
89
+ console.error(` Step ${f.step} (${f.tool_id}): ${f.message}`);
75
90
  }
76
91
  }
77
92
  else {
78
- console.log(` ${r.relativePath}: ${total} steps (${ok} OK, ${skip} SKIP)`);
93
+ console.log(` ${wf.path}: ${total} steps (${s.ok} OK, ${s.skip} SKIP)`);
79
94
  }
80
95
  }
81
96
  const s = report.summary;
82
- console.log(`\nSummary: ${s.total} workflows | ${s.stepOk} OK, ${s.stepFail} FAIL, ${s.stepSkip} SKIP`);
97
+ const total = report.workflows.length;
98
+ console.log(`\nSummary: ${total} workflows | ${s.ok} OK, ${s.fail} FAIL, ${s.skip} SKIP`);
83
99
  process.exitCode = computeValidateExitCode(report);
84
100
  }
85
- function buildValidateReport(treeResult) {
86
- const results = [];
87
- let stepOk = 0;
88
- let stepFail = 0;
89
- let stepSkip = 0;
101
+ function buildReport(treeResult) {
102
+ const workflows = [];
90
103
  for (const o of treeResult.outcomes) {
91
104
  if (o.error) {
92
- results.push({ relativePath: o.info.relativePath, error: o.error });
105
+ workflows.push(buildWorkflowValidationResult(o.info.relativePath, [], { error: o.error }));
93
106
  continue;
94
107
  }
95
108
  if (o.skipped) {
96
- results.push({ relativePath: o.info.relativePath, error: `SKIPPED: ${o.skipReason}` });
109
+ workflows.push(buildWorkflowValidationResult(o.info.relativePath, [], {
110
+ skipped_reason: o.skipReason ?? null,
111
+ }));
97
112
  continue;
98
113
  }
99
- const r = o.result;
100
- results.push(r);
101
- stepOk += r.steps.filter((s) => s.status === "ok").length;
102
- stepFail += r.steps.filter((s) => s.status === "fail").length;
103
- stepSkip += r.steps.filter((s) => s.status === "skip").length;
114
+ workflows.push(o.result);
104
115
  }
105
- const wfSummary = summarizeOutcomes(treeResult.outcomes, (r) => r.steps.some((s) => s.status === "fail"));
106
- return {
107
- root: treeResult.root,
108
- results,
109
- summary: { ...wfSummary, stepOk, stepFail, stepSkip },
110
- };
116
+ return buildTreeValidationReport(treeResult.root, workflows);
111
117
  }
112
118
  function computeValidateExitCode(report) {
113
119
  const s = report.summary;
114
- if (s.stepFail > 0 || s.error > 0)
120
+ if (s.fail > 0 || s.error > 0)
115
121
  return 1;
116
122
  return 0;
117
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validate-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,EAC7B,yBAAyB,GAK1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAsB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAmB,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAA4B,MAAM,oBAAoB,CAAC;AAWlG,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,IAAyB;IAC1E,MAAM,IAAI,GAAmB,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEpF,qCAAqC;IACrC,IAAI,KAA4B,CAAC;IACjC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,KAAK,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,6BAAqE,CAAC;IAC1E,IAAI,8BAAuE,CAAC;IAC5E,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAC/D,6BAA6B,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CACrE,GAAG,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAC5F,8BAA8B,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CACtE,GAAG,CAAC,8BAA8B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,MAAM,WAAW,CAA2B,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACvF,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhD,yBAAyB;QACzB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAqB;YACtC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC3E,CAAC;QAEF,IAAI,WAAW,GAA2B,EAAE,CAAC;QAC7C,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,6BAA6B,IAAI,mBAAmB,CAAC;YAC5E,MAAM,UAAU,GAAG,8BAA8B,IAAI,oBAAoB,CAAC;YAC1E,WAAW;gBACT,MAAM,KAAK,QAAQ;oBACjB,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC;oBACtD,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;QACzD,CAAC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,6BAA6B,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,iBAAiB,CAAC,qBAAqB,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAChG,MAAM,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAEhE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,cAAc;IACd,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,cAAc,GAAG,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAQ,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAErC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;YAC3F,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;IAC1F,OAAO,CAAC,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,UAAgD;IACnE,MAAM,SAAS,GAA+B,EAAE,CAAC;IAEjD,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,SAAS,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3F,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,CACZ,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE;gBACrD,cAAc,EAAG,CAAC,CAAC,UAAgC,IAAI,IAAI;aAC5D,CAAC,CACH,CAAC;YACF,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,yBAAyB,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA4B;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACzB,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -7,10 +7,16 @@
7
7
  *
8
8
  * Mirrors Galaxy's validation_json_schema.py.
9
9
  */
10
- import { ToolCache } from "@galaxy-tool-util/core";
10
+ import type { ToolCache } from "@galaxy-tool-util/core";
11
11
  import { type ExpansionOptions } from "@galaxy-tool-util/schema";
12
12
  import type { ValidateWorkflowOptions, WorkflowFormat, StepValidationResult } from "./validate-workflow.js";
13
- export declare function runValidateWorkflowJsonSchema(data: Record<string, unknown>, format: WorkflowFormat, opts: ValidateWorkflowOptions, expansionOpts?: ExpansionOptions): Promise<void>;
13
+ /**
14
+ * Validate workflow structure using the AJV-compiled JSON Schema (Draft 2020-12).
15
+ * Returns an array of error strings; empty if valid.
16
+ * Mirrors `decodeStructureErrors` but uses the AJV path instead of Effect decode.
17
+ */
18
+ export declare function decodeStructureErrorsJsonSchema(data: Record<string, unknown>, format: WorkflowFormat): string[];
19
+ export declare function runValidateWorkflowJsonSchema(filePath: string, data: Record<string, unknown>, format: WorkflowFormat, opts: ValidateWorkflowOptions, expansionOpts?: ExpansionOptions): Promise<void>;
14
20
  export declare function validateNativeStepsJsonSchema(data: Record<string, unknown>, cache: ToolCache, toolSchemaDir?: string, prefix?: string, expansionOpts?: ExpansionOptions): Promise<StepValidationResult[]>;
15
21
  export declare function validateFormat2StepsJsonSchema(data: Record<string, unknown>, cache: ToolCache, toolSchemaDir?: string, prefix?: string, expansionOpts?: ExpansionOptions): Promise<StepValidationResult[]>;
16
22
  //# sourceMappingURL=validate-workflow-json-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-workflow-json-schema.d.ts","sourceRoot":"","sources":["../../src/commands/validate-workflow-json-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAcL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AA4HhC,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,uBAAuB,EAC7B,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqFf;AAID,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AA4GD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC"}
1
+ {"version":3,"file":"validate-workflow-json-schema.d.ts","sourceRoot":"","sources":["../../src/commands/validate-workflow-json-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAeL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AA0HhC;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,GACrB,MAAM,EAAE,CAOV;AAID,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,uBAAuB,EAC7B,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAsGf;AAID,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAwHD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC"}