@galaxy-tool-util/schema 0.1.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/README.md +13 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/schema/bundle-types.d.ts +249 -0
- package/dist/schema/bundle-types.d.ts.map +1 -0
- package/dist/schema/bundle-types.js +74 -0
- package/dist/schema/bundle-types.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/model-factory.d.ts +14 -0
- package/dist/schema/model-factory.d.ts.map +1 -0
- package/dist/schema/model-factory.js +96 -0
- package/dist/schema/model-factory.js.map +1 -0
- package/dist/schema/parameters/base.d.ts +62 -0
- package/dist/schema/parameters/base.d.ts.map +1 -0
- package/dist/schema/parameters/base.js +51 -0
- package/dist/schema/parameters/base.js.map +1 -0
- package/dist/schema/parameters/gx-baseurl.d.ts +2 -0
- package/dist/schema/parameters/gx-baseurl.d.ts.map +1 -0
- package/dist/schema/parameters/gx-baseurl.js +16 -0
- package/dist/schema/parameters/gx-baseurl.js.map +1 -0
- package/dist/schema/parameters/gx-boolean.d.ts +2 -0
- package/dist/schema/parameters/gx-boolean.d.ts.map +1 -0
- package/dist/schema/parameters/gx-boolean.js +29 -0
- package/dist/schema/parameters/gx-boolean.js.map +1 -0
- package/dist/schema/parameters/gx-color.d.ts +2 -0
- package/dist/schema/parameters/gx-color.d.ts.map +1 -0
- package/dist/schema/parameters/gx-color.js +26 -0
- package/dist/schema/parameters/gx-color.js.map +1 -0
- package/dist/schema/parameters/gx-conditional.d.ts +2 -0
- package/dist/schema/parameters/gx-conditional.d.ts.map +1 -0
- package/dist/schema/parameters/gx-conditional.js +56 -0
- package/dist/schema/parameters/gx-conditional.js.map +1 -0
- package/dist/schema/parameters/gx-data-collection.d.ts +2 -0
- package/dist/schema/parameters/gx-data-collection.d.ts.map +1 -0
- package/dist/schema/parameters/gx-data-collection.js +146 -0
- package/dist/schema/parameters/gx-data-collection.js.map +1 -0
- package/dist/schema/parameters/gx-data-column.d.ts +2 -0
- package/dist/schema/parameters/gx-data-column.d.ts.map +1 -0
- package/dist/schema/parameters/gx-data-column.js +49 -0
- package/dist/schema/parameters/gx-data-column.js.map +1 -0
- package/dist/schema/parameters/gx-data.d.ts +2 -0
- package/dist/schema/parameters/gx-data.d.ts.map +1 -0
- package/dist/schema/parameters/gx-data.js +107 -0
- package/dist/schema/parameters/gx-data.js.map +1 -0
- package/dist/schema/parameters/gx-directory-uri.d.ts +2 -0
- package/dist/schema/parameters/gx-directory-uri.d.ts.map +1 -0
- package/dist/schema/parameters/gx-directory-uri.js +19 -0
- package/dist/schema/parameters/gx-directory-uri.js.map +1 -0
- package/dist/schema/parameters/gx-drill-down.d.ts +2 -0
- package/dist/schema/parameters/gx-drill-down.d.ts.map +1 -0
- package/dist/schema/parameters/gx-drill-down.js +40 -0
- package/dist/schema/parameters/gx-drill-down.js.map +1 -0
- package/dist/schema/parameters/gx-float.d.ts +2 -0
- package/dist/schema/parameters/gx-float.d.ts.map +1 -0
- package/dist/schema/parameters/gx-float.js +46 -0
- package/dist/schema/parameters/gx-float.js.map +1 -0
- package/dist/schema/parameters/gx-genomebuild.d.ts +2 -0
- package/dist/schema/parameters/gx-genomebuild.d.ts.map +1 -0
- package/dist/schema/parameters/gx-genomebuild.js +23 -0
- package/dist/schema/parameters/gx-genomebuild.js.map +1 -0
- package/dist/schema/parameters/gx-group-tag.d.ts +2 -0
- package/dist/schema/parameters/gx-group-tag.d.ts.map +1 -0
- package/dist/schema/parameters/gx-group-tag.js +23 -0
- package/dist/schema/parameters/gx-group-tag.js.map +1 -0
- package/dist/schema/parameters/gx-hidden.d.ts +2 -0
- package/dist/schema/parameters/gx-hidden.d.ts.map +1 -0
- package/dist/schema/parameters/gx-hidden.js +33 -0
- package/dist/schema/parameters/gx-hidden.js.map +1 -0
- package/dist/schema/parameters/gx-integer.d.ts +2 -0
- package/dist/schema/parameters/gx-integer.d.ts.map +1 -0
- package/dist/schema/parameters/gx-integer.js +47 -0
- package/dist/schema/parameters/gx-integer.js.map +1 -0
- package/dist/schema/parameters/gx-repeat.d.ts +2 -0
- package/dist/schema/parameters/gx-repeat.d.ts.map +1 -0
- package/dist/schema/parameters/gx-repeat.js +30 -0
- package/dist/schema/parameters/gx-repeat.js.map +1 -0
- package/dist/schema/parameters/gx-rules.d.ts +2 -0
- package/dist/schema/parameters/gx-rules.d.ts.map +1 -0
- package/dist/schema/parameters/gx-rules.js +91 -0
- package/dist/schema/parameters/gx-rules.js.map +1 -0
- package/dist/schema/parameters/gx-section.d.ts +2 -0
- package/dist/schema/parameters/gx-section.d.ts.map +1 -0
- package/dist/schema/parameters/gx-section.js +17 -0
- package/dist/schema/parameters/gx-section.js.map +1 -0
- package/dist/schema/parameters/gx-select.d.ts +2 -0
- package/dist/schema/parameters/gx-select.d.ts.map +1 -0
- package/dist/schema/parameters/gx-select.js +63 -0
- package/dist/schema/parameters/gx-select.js.map +1 -0
- package/dist/schema/parameters/gx-text.d.ts +2 -0
- package/dist/schema/parameters/gx-text.d.ts.map +1 -0
- package/dist/schema/parameters/gx-text.js +22 -0
- package/dist/schema/parameters/gx-text.js.map +1 -0
- package/dist/schema/parameters/index.d.ts +21 -0
- package/dist/schema/parameters/index.d.ts.map +1 -0
- package/dist/schema/parameters/index.js +24 -0
- package/dist/schema/parameters/index.js.map +1 -0
- package/dist/schema/parameters/registry.d.ts +6 -0
- package/dist/schema/parameters/registry.d.ts.map +1 -0
- package/dist/schema/parameters/registry.js +18 -0
- package/dist/schema/parameters/registry.js.map +1 -0
- package/dist/schema/state-representations.d.ts +14 -0
- package/dist/schema/state-representations.d.ts.map +1 -0
- package/dist/schema/state-representations.js +61 -0
- package/dist/schema/state-representations.js.map +1 -0
- package/dist/schema/validators/empty-field.d.ts +2 -0
- package/dist/schema/validators/empty-field.d.ts.map +1 -0
- package/dist/schema/validators/empty-field.js +12 -0
- package/dist/schema/validators/empty-field.js.map +1 -0
- package/dist/schema/validators/expression.d.ts +2 -0
- package/dist/schema/validators/expression.d.ts.map +1 -0
- package/dist/schema/validators/expression.js +42 -0
- package/dist/schema/validators/expression.js.map +1 -0
- package/dist/schema/validators/in-range.d.ts +2 -0
- package/dist/schema/validators/in-range.d.ts.map +1 -0
- package/dist/schema/validators/in-range.js +36 -0
- package/dist/schema/validators/in-range.js.map +1 -0
- package/dist/schema/validators/index.d.ts +8 -0
- package/dist/schema/validators/index.d.ts.map +1 -0
- package/dist/schema/validators/index.js +10 -0
- package/dist/schema/validators/index.js.map +1 -0
- package/dist/schema/validators/length.d.ts +2 -0
- package/dist/schema/validators/length.d.ts.map +1 -0
- package/dist/schema/validators/length.js +29 -0
- package/dist/schema/validators/length.js.map +1 -0
- package/dist/schema/validators/no-options.d.ts +2 -0
- package/dist/schema/validators/no-options.d.ts.map +1 -0
- package/dist/schema/validators/no-options.js +10 -0
- package/dist/schema/validators/no-options.js.map +1 -0
- package/dist/schema/validators/regex.d.ts +27 -0
- package/dist/schema/validators/regex.d.ts.map +1 -0
- package/dist/schema/validators/regex.js +100 -0
- package/dist/schema/validators/regex.js.map +1 -0
- package/dist/schema/validators/registry.d.ts +19 -0
- package/dist/schema/validators/registry.d.ts.map +1 -0
- package/dist/schema/validators/registry.js +29 -0
- package/dist/schema/validators/registry.js.map +1 -0
- package/dist/workflow/clean.d.ts +13 -0
- package/dist/workflow/clean.d.ts.map +1 -0
- package/dist/workflow/clean.js +131 -0
- package/dist/workflow/clean.js.map +1 -0
- package/dist/workflow/detect-format.d.ts +5 -0
- package/dist/workflow/detect-format.d.ts.map +1 -0
- package/dist/workflow/detect-format.js +11 -0
- package/dist/workflow/detect-format.js.map +1 -0
- package/dist/workflow/index.d.ts +9 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +11 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/legacy-encoding.d.ts +40 -0
- package/dist/workflow/legacy-encoding.d.ts.map +1 -0
- package/dist/workflow/legacy-encoding.js +81 -0
- package/dist/workflow/legacy-encoding.js.map +1 -0
- package/dist/workflow/lint.d.ts +49 -0
- package/dist/workflow/lint.d.ts.map +1 -0
- package/dist/workflow/lint.js +402 -0
- package/dist/workflow/lint.js.map +1 -0
- package/dist/workflow/normalized/comments.d.ts +21 -0
- package/dist/workflow/normalized/comments.d.ts.map +1 -0
- package/dist/workflow/normalized/comments.js +80 -0
- package/dist/workflow/normalized/comments.js.map +1 -0
- package/dist/workflow/normalized/ensure.d.ts +21 -0
- package/dist/workflow/normalized/ensure.d.ts.map +1 -0
- package/dist/workflow/normalized/ensure.js +43 -0
- package/dist/workflow/normalized/ensure.js.map +1 -0
- package/dist/workflow/normalized/expanded.d.ts +62 -0
- package/dist/workflow/normalized/expanded.d.ts.map +1 -0
- package/dist/workflow/normalized/expanded.js +173 -0
- package/dist/workflow/normalized/expanded.js.map +1 -0
- package/dist/workflow/normalized/format2.d.ts +149 -0
- package/dist/workflow/normalized/format2.d.ts.map +1 -0
- package/dist/workflow/normalized/format2.js +416 -0
- package/dist/workflow/normalized/format2.js.map +1 -0
- package/dist/workflow/normalized/index.d.ts +9 -0
- package/dist/workflow/normalized/index.d.ts.map +1 -0
- package/dist/workflow/normalized/index.js +9 -0
- package/dist/workflow/normalized/index.js.map +1 -0
- package/dist/workflow/normalized/labels.d.ts +27 -0
- package/dist/workflow/normalized/labels.d.ts.map +1 -0
- package/dist/workflow/normalized/labels.js +59 -0
- package/dist/workflow/normalized/labels.js.map +1 -0
- package/dist/workflow/normalized/native.d.ts +97 -0
- package/dist/workflow/normalized/native.d.ts.map +1 -0
- package/dist/workflow/normalized/native.js +189 -0
- package/dist/workflow/normalized/native.js.map +1 -0
- package/dist/workflow/normalized/toFormat2.d.ts +11 -0
- package/dist/workflow/normalized/toFormat2.d.ts.map +1 -0
- package/dist/workflow/normalized/toFormat2.js +416 -0
- package/dist/workflow/normalized/toFormat2.js.map +1 -0
- package/dist/workflow/normalized/toNative.d.ts +11 -0
- package/dist/workflow/normalized/toNative.d.ts.map +1 -0
- package/dist/workflow/normalized/toNative.js +576 -0
- package/dist/workflow/normalized/toNative.js.map +1 -0
- package/dist/workflow/raw/gxformat2.d.ts +402 -0
- package/dist/workflow/raw/gxformat2.d.ts.map +1 -0
- package/dist/workflow/raw/gxformat2.effect.d.ts +1140 -0
- package/dist/workflow/raw/gxformat2.effect.d.ts.map +1 -0
- package/dist/workflow/raw/gxformat2.effect.js +453 -0
- package/dist/workflow/raw/gxformat2.effect.js.map +1 -0
- package/dist/workflow/raw/gxformat2.js +3 -0
- package/dist/workflow/raw/gxformat2.js.map +1 -0
- package/dist/workflow/raw/index.d.ts +5 -0
- package/dist/workflow/raw/index.d.ts.map +1 -0
- package/dist/workflow/raw/index.js +4 -0
- package/dist/workflow/raw/index.js.map +1 -0
- package/dist/workflow/raw/native.d.ts +439 -0
- package/dist/workflow/raw/native.d.ts.map +1 -0
- package/dist/workflow/raw/native.effect.d.ts +947 -0
- package/dist/workflow/raw/native.effect.d.ts.map +1 -0
- package/dist/workflow/raw/native.effect.js +474 -0
- package/dist/workflow/raw/native.effect.js.map +1 -0
- package/dist/workflow/raw/native.js +20 -0
- package/dist/workflow/raw/native.js.map +1 -0
- package/dist/workflow/replacement-scan.d.ts +21 -0
- package/dist/workflow/replacement-scan.d.ts.map +1 -0
- package/dist/workflow/replacement-scan.js +92 -0
- package/dist/workflow/replacement-scan.js.map +1 -0
- package/dist/workflow/state-merge.d.ts +49 -0
- package/dist/workflow/state-merge.d.ts.map +1 -0
- package/dist/workflow/state-merge.js +248 -0
- package/dist/workflow/state-merge.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow linting — structural checks and best-practice warnings.
|
|
3
|
+
*
|
|
4
|
+
* Port of gxformat2's lint.py + linting.py. Checks workflow structure,
|
|
5
|
+
* output labels, step errors, tool references, output source resolution,
|
|
6
|
+
* input default types, and report markdown.
|
|
7
|
+
*/
|
|
8
|
+
import { normalizedFormat2 } from "./normalized/format2.js";
|
|
9
|
+
import { normalizedNative } from "./normalized/native.js";
|
|
10
|
+
import { ensureFormat2 } from "./normalized/ensure.js";
|
|
11
|
+
import { detectFormat } from "./detect-format.js";
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// LintContext — tracks errors and warnings during linting
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export class LintContext {
|
|
16
|
+
errors = [];
|
|
17
|
+
warnings = [];
|
|
18
|
+
_prefix;
|
|
19
|
+
constructor(prefix = "") {
|
|
20
|
+
this._prefix = prefix;
|
|
21
|
+
}
|
|
22
|
+
error(message) {
|
|
23
|
+
this.errors.push(`${this._prefix}${message}`);
|
|
24
|
+
}
|
|
25
|
+
warn(message) {
|
|
26
|
+
this.warnings.push(`${this._prefix}${message}`);
|
|
27
|
+
}
|
|
28
|
+
child(prefix) {
|
|
29
|
+
const fullPrefix = this._prefix ? `${this._prefix.slice(0, -1)} > ${prefix}] ` : `[${prefix}] `;
|
|
30
|
+
const ctx = new LintContext();
|
|
31
|
+
ctx._prefix = fullPrefix;
|
|
32
|
+
// Share message arrays with parent
|
|
33
|
+
ctx.errors = this.errors;
|
|
34
|
+
ctx.warnings = this.warnings;
|
|
35
|
+
return ctx;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function toLintResult(ctx) {
|
|
39
|
+
return {
|
|
40
|
+
errors: ctx.errors,
|
|
41
|
+
warnings: ctx.warnings,
|
|
42
|
+
error_count: ctx.errors.length,
|
|
43
|
+
warn_count: ctx.warnings.length,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Shared lint helpers
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
function lintStepErrors(ctx, errors) {
|
|
50
|
+
if (errors != null) {
|
|
51
|
+
ctx.warn(`tool step contains error indicated during Galaxy export - ${errors}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function lintToolIfPresent(ctx, toolId) {
|
|
55
|
+
if (toolId && toolId.includes("testtoolshed")) {
|
|
56
|
+
ctx.warn("Step references a tool from the test tool shed, this should be replaced with a production tool");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function validateReport(ctx, report) {
|
|
60
|
+
if (report == null)
|
|
61
|
+
return;
|
|
62
|
+
const markdown = report.markdown;
|
|
63
|
+
if (typeof markdown !== "string") {
|
|
64
|
+
ctx.error(`expected value [${String(markdown)}] with key [markdown] to be of class string`);
|
|
65
|
+
}
|
|
66
|
+
// Note: Galaxy markdown validation (```galaxy directives) not yet ported
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Native workflow linting
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
function lintNativeWorkflow(ctx, nnw, rawDict) {
|
|
72
|
+
// Raw-dict presence checks (fields that normalized models default-fill)
|
|
73
|
+
if (rawDict != null) {
|
|
74
|
+
if (!("a_galaxy_workflow" in rawDict)) {
|
|
75
|
+
ctx.error("expected to find key [a_galaxy_workflow] but absent");
|
|
76
|
+
}
|
|
77
|
+
else if (rawDict.a_galaxy_workflow !== "true") {
|
|
78
|
+
ctx.error(`expected value [${String(rawDict.a_galaxy_workflow)}] with key [a_galaxy_workflow] to be true`);
|
|
79
|
+
}
|
|
80
|
+
if (!("format-version" in rawDict)) {
|
|
81
|
+
ctx.error("expected to find key [format-version] but absent");
|
|
82
|
+
}
|
|
83
|
+
else if (rawDict["format-version"] !== "0.1") {
|
|
84
|
+
ctx.error(`expected value [${String(rawDict["format-version"])}] with key [format-version] to be 0.1`);
|
|
85
|
+
}
|
|
86
|
+
if (!("steps" in rawDict)) {
|
|
87
|
+
ctx.error("expected to find key [steps] but absent");
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
let foundOutputs = false;
|
|
92
|
+
let foundOutputWithoutLabel = false;
|
|
93
|
+
for (const [orderIndex, step] of Object.entries(nnw.steps)) {
|
|
94
|
+
if (!/^\d+$/.test(orderIndex)) {
|
|
95
|
+
ctx.error(`expected step_key to be integer not [${orderIndex}]`);
|
|
96
|
+
}
|
|
97
|
+
for (const wo of step.workflow_outputs) {
|
|
98
|
+
foundOutputs = true;
|
|
99
|
+
if (!wo.label) {
|
|
100
|
+
foundOutputWithoutLabel = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Recurse into subworkflows
|
|
104
|
+
if (step.type === "subworkflow" && step.subworkflow) {
|
|
105
|
+
if (!step.subworkflow.steps || Object.keys(step.subworkflow.steps).length === 0) {
|
|
106
|
+
ctx.error("subworkflow is missing steps or steps are empty");
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
lintNativeWorkflow(ctx, step.subworkflow);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
lintStepErrors(ctx, step.errors);
|
|
113
|
+
lintToolIfPresent(ctx, step.tool_id);
|
|
114
|
+
}
|
|
115
|
+
validateReport(ctx, nnw.report);
|
|
116
|
+
if (!foundOutputs) {
|
|
117
|
+
ctx.warn("Workflow contained no outputs");
|
|
118
|
+
}
|
|
119
|
+
if (foundOutputWithoutLabel) {
|
|
120
|
+
ctx.warn("Workflow contained output without a label");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Format2 workflow linting
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
function validateOutputSources(ctx, nf2) {
|
|
127
|
+
if (!nf2.outputs || nf2.outputs.length === 0)
|
|
128
|
+
return;
|
|
129
|
+
// Collect known labels: step labels/ids + input ids
|
|
130
|
+
const knownLabels = new Set();
|
|
131
|
+
for (const inp of nf2.inputs) {
|
|
132
|
+
if (inp.id)
|
|
133
|
+
knownLabels.add(inp.id);
|
|
134
|
+
if (inp.label)
|
|
135
|
+
knownLabels.add(inp.label);
|
|
136
|
+
}
|
|
137
|
+
for (const step of nf2.steps) {
|
|
138
|
+
if (step.id)
|
|
139
|
+
knownLabels.add(step.id);
|
|
140
|
+
if (step.label)
|
|
141
|
+
knownLabels.add(step.label);
|
|
142
|
+
}
|
|
143
|
+
for (const output of nf2.outputs) {
|
|
144
|
+
const outputSource = output.outputSource;
|
|
145
|
+
if (!outputSource || typeof outputSource !== "string")
|
|
146
|
+
continue;
|
|
147
|
+
// outputSource is "step_label/output_name" — extract step ref
|
|
148
|
+
const slashIdx = outputSource.indexOf("/");
|
|
149
|
+
const stepRef = slashIdx >= 0 ? outputSource.slice(0, slashIdx) : outputSource;
|
|
150
|
+
if (!knownLabels.has(stepRef)) {
|
|
151
|
+
const outputId = output.id || "?";
|
|
152
|
+
ctx.error(`Output '${outputId}' references step '${stepRef}' via outputSource ` +
|
|
153
|
+
`'${outputSource}', but no step or input with that label exists`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function validateInputTypes(ctx, nf2) {
|
|
158
|
+
for (const inp of nf2.inputs) {
|
|
159
|
+
if (inp.default == null)
|
|
160
|
+
continue;
|
|
161
|
+
const inputType = inp.type;
|
|
162
|
+
if (Array.isArray(inputType))
|
|
163
|
+
continue; // array types — skip
|
|
164
|
+
if (inputType === "int" || inputType === "integer") {
|
|
165
|
+
if (typeof inp.default !== "number" || !Number.isInteger(inp.default)) {
|
|
166
|
+
ctx.error("Input default is of invalid type");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (inputType === "float" || inputType === "double") {
|
|
170
|
+
if (typeof inp.default !== "number") {
|
|
171
|
+
ctx.error("Input default is of invalid type");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else if (inputType === "string" || inputType === "text") {
|
|
175
|
+
if (typeof inp.default !== "string") {
|
|
176
|
+
ctx.error("Input default is of invalid type");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function lintFormat2Workflow(ctx, nf2, rawDict) {
|
|
182
|
+
if (rawDict != null) {
|
|
183
|
+
if (!("steps" in rawDict)) {
|
|
184
|
+
ctx.error("expected to find key [steps] but absent");
|
|
185
|
+
}
|
|
186
|
+
if (!("class" in rawDict)) {
|
|
187
|
+
ctx.error("expected to find key [class] but absent");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const step of nf2.steps) {
|
|
191
|
+
lintStepErrors(ctx, step.errors);
|
|
192
|
+
lintToolIfPresent(ctx, step.tool_id);
|
|
193
|
+
if (step.run &&
|
|
194
|
+
typeof step.run === "object" &&
|
|
195
|
+
step.run.class === "GalaxyWorkflow") {
|
|
196
|
+
const subWf = step.run;
|
|
197
|
+
if (!subWf.steps || subWf.steps.length === 0) {
|
|
198
|
+
ctx.error("subworkflow is missing steps or steps are empty");
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
lintFormat2Workflow(ctx, subWf);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
validateOutputSources(ctx, nf2);
|
|
206
|
+
validateInputTypes(ctx, nf2);
|
|
207
|
+
validateReport(ctx, nf2.report);
|
|
208
|
+
}
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
// Public API — lint operations returning LintResult
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Lint a native Galaxy workflow (.ga format).
|
|
214
|
+
* Returns structured lint results with errors and warnings.
|
|
215
|
+
*/
|
|
216
|
+
export function lintNative(workflowDict) {
|
|
217
|
+
const ctx = new LintContext();
|
|
218
|
+
let nnw;
|
|
219
|
+
try {
|
|
220
|
+
nnw = normalizedNative(workflowDict);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
nnw = { steps: {} };
|
|
224
|
+
}
|
|
225
|
+
lintNativeWorkflow(ctx, nnw, workflowDict);
|
|
226
|
+
return toLintResult(ctx);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Lint a Format2 Galaxy workflow (.gxwf.yml format).
|
|
230
|
+
* Returns structured lint results with errors and warnings.
|
|
231
|
+
*/
|
|
232
|
+
export function lintFormat2(workflowDict) {
|
|
233
|
+
const ctx = new LintContext();
|
|
234
|
+
let nf2;
|
|
235
|
+
try {
|
|
236
|
+
nf2 = normalizedFormat2(workflowDict);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
nf2 = { steps: [], inputs: [], outputs: [] };
|
|
240
|
+
}
|
|
241
|
+
lintFormat2Workflow(ctx, nf2, workflowDict);
|
|
242
|
+
return toLintResult(ctx);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Lint a workflow, auto-detecting format.
|
|
246
|
+
* Returns structured lint results with errors and warnings.
|
|
247
|
+
*/
|
|
248
|
+
export function lintWorkflow(workflowDict) {
|
|
249
|
+
const format = detectFormat(workflowDict);
|
|
250
|
+
return format === "native" ? lintNative(workflowDict) : lintFormat2(workflowDict);
|
|
251
|
+
}
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
// Best practices linting
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
const UNTYPED_PARAM_RE = /\$\{.+?\}/;
|
|
256
|
+
function checkJsonForUntypedParams(value) {
|
|
257
|
+
if (Array.isArray(value)) {
|
|
258
|
+
return value.some(checkJsonForUntypedParams);
|
|
259
|
+
}
|
|
260
|
+
if (value !== null && typeof value === "object") {
|
|
261
|
+
return Object.values(value).some(checkJsonForUntypedParams);
|
|
262
|
+
}
|
|
263
|
+
if (typeof value === "string") {
|
|
264
|
+
return UNTYPED_PARAM_RE.test(value);
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
const SKIP_DISCONNECTED_NATIVE_TYPES = new Set([
|
|
269
|
+
"data_input",
|
|
270
|
+
"data_collection_input",
|
|
271
|
+
"parameter_input",
|
|
272
|
+
"pause",
|
|
273
|
+
]);
|
|
274
|
+
function lintStepBestPractices(ctx, step) {
|
|
275
|
+
const stepId = step.label || step.id;
|
|
276
|
+
// disconnected inputs
|
|
277
|
+
for (const stepInput of step.in) {
|
|
278
|
+
if (stepInput.source == null && stepInput.default == null) {
|
|
279
|
+
ctx.warn(`Input ${stepInput.id} of workflow step ${stepId} is disconnected.`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// missing doc
|
|
283
|
+
if (!step.doc) {
|
|
284
|
+
ctx.warn(`Workflow step ${stepId} has no annotation.`);
|
|
285
|
+
}
|
|
286
|
+
// missing label
|
|
287
|
+
if (!step.label) {
|
|
288
|
+
ctx.warn(`Workflow step ${stepId} has no label.`);
|
|
289
|
+
}
|
|
290
|
+
// untyped params in state
|
|
291
|
+
const toolState = step.state || step.tool_state;
|
|
292
|
+
if (toolState && checkJsonForUntypedParams(toolState)) {
|
|
293
|
+
ctx.warn(`Workflow step ${stepId} specifies an untyped parameter as an input.`);
|
|
294
|
+
}
|
|
295
|
+
// untyped params in outputs (PJA equivalents)
|
|
296
|
+
if (step.out && step.out.length > 0 && checkJsonForUntypedParams(step.out)) {
|
|
297
|
+
ctx.warn(`Workflow step ${stepId} specifies an untyped parameter in the post-job actions.`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function lintNativeStepBestPractices(ctx, step) {
|
|
301
|
+
const stepId = step.label || step.annotation || String(step.id);
|
|
302
|
+
// disconnected inputs
|
|
303
|
+
if (!step.type || !SKIP_DISCONNECTED_NATIVE_TYPES.has(step.type)) {
|
|
304
|
+
for (const inputDef of step.inputs) {
|
|
305
|
+
if (inputDef.name && !(inputDef.name in step.input_connections)) {
|
|
306
|
+
ctx.warn(`Input ${inputDef.name} of workflow step ${stepId} is disconnected.`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// untyped params in post_job_actions
|
|
311
|
+
if (step.post_job_actions && Object.keys(step.post_job_actions).length > 0) {
|
|
312
|
+
if (checkJsonForUntypedParams(step.post_job_actions)) {
|
|
313
|
+
ctx.warn(`Workflow step with ID ${step.id} specifies an untyped parameter in the post-job actions.`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
function lintBestPractices(ctx, nf2, rawDict) {
|
|
318
|
+
// annotation/doc
|
|
319
|
+
if (!nf2.doc || !nf2.doc.trim()) {
|
|
320
|
+
ctx.warn("Workflow is not annotated.");
|
|
321
|
+
}
|
|
322
|
+
// creator — access from raw dict since normalization may strip it
|
|
323
|
+
const nf2Creators = nf2.creator;
|
|
324
|
+
const creators = (nf2Creators ?? rawDict.creator);
|
|
325
|
+
if (!creators || !Array.isArray(creators) || creators.length === 0) {
|
|
326
|
+
ctx.warn("Workflow does not specify a creator.");
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
for (const creator of creators) {
|
|
330
|
+
if (creator && typeof creator === "object") {
|
|
331
|
+
const c = creator;
|
|
332
|
+
if (c.class === "Person" && c.identifier && typeof c.identifier === "string") {
|
|
333
|
+
// Check for URI scheme (e.g. https:, orcid:)
|
|
334
|
+
if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*:/.test(c.identifier)) {
|
|
335
|
+
ctx.warn(`Creator identifier "${c.identifier}" should be a fully qualified URI, ` +
|
|
336
|
+
`for example "https://orcid.org/0000-0002-1825-0097".`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// license
|
|
343
|
+
if (!nf2.license) {
|
|
344
|
+
ctx.warn("Workflow does not specify a license.");
|
|
345
|
+
}
|
|
346
|
+
// step-level
|
|
347
|
+
for (const step of nf2.steps) {
|
|
348
|
+
lintStepBestPractices(ctx, step);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Lint best practices for a Format2 Galaxy workflow.
|
|
353
|
+
* Returns structured lint results with warnings about missing annotations,
|
|
354
|
+
* creators, licenses, step labels, and disconnected inputs.
|
|
355
|
+
*/
|
|
356
|
+
export function lintBestPracticesFormat2(workflowDict) {
|
|
357
|
+
const ctx = new LintContext();
|
|
358
|
+
let nf2;
|
|
359
|
+
try {
|
|
360
|
+
nf2 = ensureFormat2(workflowDict);
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
nf2 = null;
|
|
364
|
+
}
|
|
365
|
+
if (nf2) {
|
|
366
|
+
lintBestPractices(ctx, nf2, workflowDict);
|
|
367
|
+
}
|
|
368
|
+
return toLintResult(ctx);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Lint best practices for a native Galaxy workflow.
|
|
372
|
+
* Runs shared format2 best practices plus native-specific checks.
|
|
373
|
+
*/
|
|
374
|
+
export function lintBestPracticesNative(workflowDict) {
|
|
375
|
+
const ctx = new LintContext();
|
|
376
|
+
// Shared best practices on format2 view
|
|
377
|
+
let nf2;
|
|
378
|
+
try {
|
|
379
|
+
nf2 = ensureFormat2(workflowDict);
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
nf2 = null;
|
|
383
|
+
}
|
|
384
|
+
if (nf2) {
|
|
385
|
+
lintBestPractices(ctx, nf2, workflowDict);
|
|
386
|
+
}
|
|
387
|
+
// Native-specific checks
|
|
388
|
+
let nnw;
|
|
389
|
+
try {
|
|
390
|
+
nnw = normalizedNative(workflowDict);
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
nnw = null;
|
|
394
|
+
}
|
|
395
|
+
if (nnw) {
|
|
396
|
+
for (const step of Object.values(nnw.steps)) {
|
|
397
|
+
lintNativeStepBestPractices(ctx, step);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return toLintResult(ctx);
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/workflow/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for converting comments between native and Format2 representations.
|
|
3
|
+
*
|
|
4
|
+
* Port of gxformat2/_comment_helpers.py.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert a native comment dict to Format2 representation.
|
|
8
|
+
*
|
|
9
|
+
* Hoists type-specific fields from nested `data` dict to top level.
|
|
10
|
+
* Renames child_steps → contains_steps and child_comments → contains_comments.
|
|
11
|
+
* Drops the `id` field.
|
|
12
|
+
*/
|
|
13
|
+
export declare function flattenCommentData(nativeComment: Record<string, unknown>): Record<string, unknown>;
|
|
14
|
+
/**
|
|
15
|
+
* Convert a Format2 comment dict to native representation.
|
|
16
|
+
*
|
|
17
|
+
* Collects type-specific top-level fields back into a nested `data` dict.
|
|
18
|
+
* Renames contains_steps → child_steps and contains_comments → child_comments.
|
|
19
|
+
*/
|
|
20
|
+
export declare function unflattenCommentData(format2Comment: Record<string, unknown>): Record<string, unknown>;
|
|
21
|
+
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../src/workflow/normalized/comments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8BzB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for converting comments between native and Format2 representations.
|
|
3
|
+
*
|
|
4
|
+
* Port of gxformat2/_comment_helpers.py.
|
|
5
|
+
*/
|
|
6
|
+
// Mapping from native comment data.* field names to Format2 top-level field names.
|
|
7
|
+
const COMMENT_DATA_FIELDS = {
|
|
8
|
+
text: { text: "text", bold: "bold", italic: "italic", size: "text_size" },
|
|
9
|
+
markdown: { text: "text" },
|
|
10
|
+
frame: { title: "title" },
|
|
11
|
+
freehand: { thickness: "thickness", line: "line" },
|
|
12
|
+
};
|
|
13
|
+
const COMMENT_COMMON_FIELDS = ["type", "position", "size", "color"];
|
|
14
|
+
/**
|
|
15
|
+
* Convert a native comment dict to Format2 representation.
|
|
16
|
+
*
|
|
17
|
+
* Hoists type-specific fields from nested `data` dict to top level.
|
|
18
|
+
* Renames child_steps → contains_steps and child_comments → contains_comments.
|
|
19
|
+
* Drops the `id` field.
|
|
20
|
+
*/
|
|
21
|
+
export function flattenCommentData(nativeComment) {
|
|
22
|
+
const commentType = nativeComment.type;
|
|
23
|
+
const result = {};
|
|
24
|
+
for (const field of COMMENT_COMMON_FIELDS) {
|
|
25
|
+
if (field in nativeComment) {
|
|
26
|
+
result[field] = nativeComment[field];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if ("label" in nativeComment) {
|
|
30
|
+
result.label = nativeComment.label;
|
|
31
|
+
}
|
|
32
|
+
const data = (nativeComment.data ?? {});
|
|
33
|
+
const fieldMap = COMMENT_DATA_FIELDS[commentType] ?? {};
|
|
34
|
+
for (const [nativeName, format2Name] of Object.entries(fieldMap)) {
|
|
35
|
+
if (nativeName in data) {
|
|
36
|
+
result[format2Name] = data[nativeName];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if ("child_steps" in nativeComment) {
|
|
40
|
+
result.contains_steps = nativeComment.child_steps;
|
|
41
|
+
}
|
|
42
|
+
if ("child_comments" in nativeComment) {
|
|
43
|
+
result.contains_comments = nativeComment.child_comments;
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Convert a Format2 comment dict to native representation.
|
|
49
|
+
*
|
|
50
|
+
* Collects type-specific top-level fields back into a nested `data` dict.
|
|
51
|
+
* Renames contains_steps → child_steps and contains_comments → child_comments.
|
|
52
|
+
*/
|
|
53
|
+
export function unflattenCommentData(format2Comment) {
|
|
54
|
+
const commentType = format2Comment.type;
|
|
55
|
+
const result = {};
|
|
56
|
+
for (const field of COMMENT_COMMON_FIELDS) {
|
|
57
|
+
if (field in format2Comment) {
|
|
58
|
+
result[field] = format2Comment[field];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if ("label" in format2Comment) {
|
|
62
|
+
result.label = format2Comment.label;
|
|
63
|
+
}
|
|
64
|
+
const data = {};
|
|
65
|
+
const fieldMap = COMMENT_DATA_FIELDS[commentType] ?? {};
|
|
66
|
+
for (const [nativeName, format2Name] of Object.entries(fieldMap)) {
|
|
67
|
+
if (format2Name in format2Comment) {
|
|
68
|
+
data[nativeName] = format2Comment[format2Name];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
result.data = data;
|
|
72
|
+
if ("contains_steps" in format2Comment) {
|
|
73
|
+
result.child_steps = format2Comment.contains_steps;
|
|
74
|
+
}
|
|
75
|
+
if ("contains_comments" in format2Comment) {
|
|
76
|
+
result.child_comments = format2Comment.contains_comments;
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/workflow/normalized/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polymorphic entry points: accept any workflow representation,
|
|
3
|
+
* return the desired typed model.
|
|
4
|
+
*
|
|
5
|
+
* Port of gxformat2/normalized/_conversion.py ensure_format2/ensure_native.
|
|
6
|
+
*/
|
|
7
|
+
import type { NormalizedFormat2Workflow } from "./format2.js";
|
|
8
|
+
import type { NormalizedNativeWorkflow } from "./native.js";
|
|
9
|
+
/**
|
|
10
|
+
* Ensure a workflow is returned as normalized Format2.
|
|
11
|
+
*
|
|
12
|
+
* Accepts native or Format2 inputs (raw dict), normalizing/converting as needed.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ensureFormat2(raw: unknown): NormalizedFormat2Workflow;
|
|
15
|
+
/**
|
|
16
|
+
* Ensure a workflow is returned as normalized native.
|
|
17
|
+
*
|
|
18
|
+
* Accepts native or Format2 inputs (raw dict), normalizing/converting as needed.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ensureNative(raw: unknown): NormalizedNativeWorkflow;
|
|
21
|
+
//# sourceMappingURL=ensure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure.d.ts","sourceRoot":"","sources":["../../../src/workflow/normalized/ensure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAK5D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,yBAAyB,CAUrE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAenE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polymorphic entry points: accept any workflow representation,
|
|
3
|
+
* return the desired typed model.
|
|
4
|
+
*
|
|
5
|
+
* Port of gxformat2/normalized/_conversion.py ensure_format2/ensure_native.
|
|
6
|
+
*/
|
|
7
|
+
import { normalizedFormat2 } from "./format2.js";
|
|
8
|
+
import { normalizedNative } from "./native.js";
|
|
9
|
+
import { toFormat2 } from "./toFormat2.js";
|
|
10
|
+
import { toNative } from "./toNative.js";
|
|
11
|
+
/**
|
|
12
|
+
* Ensure a workflow is returned as normalized Format2.
|
|
13
|
+
*
|
|
14
|
+
* Accepts native or Format2 inputs (raw dict), normalizing/converting as needed.
|
|
15
|
+
*/
|
|
16
|
+
export function ensureFormat2(raw) {
|
|
17
|
+
const obj = raw;
|
|
18
|
+
// Native workflow → convert
|
|
19
|
+
if (obj.a_galaxy_workflow === "true") {
|
|
20
|
+
return toFormat2(raw);
|
|
21
|
+
}
|
|
22
|
+
// Format2 workflow → normalize
|
|
23
|
+
return normalizedFormat2(raw);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ensure a workflow is returned as normalized native.
|
|
27
|
+
*
|
|
28
|
+
* Accepts native or Format2 inputs (raw dict), normalizing/converting as needed.
|
|
29
|
+
*/
|
|
30
|
+
export function ensureNative(raw) {
|
|
31
|
+
const obj = raw;
|
|
32
|
+
// Native workflow → normalize directly
|
|
33
|
+
if (obj.a_galaxy_workflow === "true") {
|
|
34
|
+
return normalizedNative(raw);
|
|
35
|
+
}
|
|
36
|
+
// Format2 workflow → convert
|
|
37
|
+
if (obj.class === "GalaxyWorkflow") {
|
|
38
|
+
return toNative(raw);
|
|
39
|
+
}
|
|
40
|
+
// Fallback: assume native
|
|
41
|
+
return normalizedNative(raw);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ensure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure.js","sourceRoot":"","sources":["../../../src/workflow/normalized/ensure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,4BAA4B;IAC5B,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,+BAA+B;IAC/B,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,uCAAuC;IACvC,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,6BAA6B;IAC7B,IAAI,GAAG,CAAC,KAAK,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,0BAA0B;IAC1B,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expanded workflow models.
|
|
3
|
+
*
|
|
4
|
+
* Expansion resolves all external references (@import, URL, TRS, base64)
|
|
5
|
+
* in step run/subworkflow fields. Supports async URL fetching via a
|
|
6
|
+
* configurable resolver callback.
|
|
7
|
+
*
|
|
8
|
+
* Port of gxformat2/normalized/_conversion.py expanded_format2/expanded_native
|
|
9
|
+
* and gxformat2/options.py (UrlResolverFn, default_url_resolver, ConversionOptions).
|
|
10
|
+
*/
|
|
11
|
+
import type { NormalizedFormat2Workflow, NormalizedFormat2Step } from "./format2.js";
|
|
12
|
+
import type { NormalizedNativeWorkflow, NormalizedNativeStep } from "./native.js";
|
|
13
|
+
export type ExpandedFormat2Workflow = NormalizedFormat2Workflow;
|
|
14
|
+
export type ExpandedFormat2Step = NormalizedFormat2Step;
|
|
15
|
+
export type ExpandedNativeWorkflow = NormalizedNativeWorkflow;
|
|
16
|
+
export type ExpandedNativeStep = NormalizedNativeStep;
|
|
17
|
+
/**
|
|
18
|
+
* Async callback to resolve a reference string and return a parsed workflow dict.
|
|
19
|
+
*
|
|
20
|
+
* For URL references: fetches the URL and parses the response.
|
|
21
|
+
* For file path references: reads the file and parses it.
|
|
22
|
+
*
|
|
23
|
+
* The resolver receives the raw reference string (URL or file path)
|
|
24
|
+
* and must return a parsed workflow dict.
|
|
25
|
+
*/
|
|
26
|
+
export type RefResolver = (ref: string) => Promise<Record<string, unknown>>;
|
|
27
|
+
/**
|
|
28
|
+
* Options controlling subworkflow expansion.
|
|
29
|
+
*/
|
|
30
|
+
export interface ExpansionOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Resolver for external references. Receives a reference string
|
|
33
|
+
* (URL, base64 URI, or file path) and must return a parsed workflow dict.
|
|
34
|
+
*
|
|
35
|
+
* Must handle both URL references (containing "://") and file path
|
|
36
|
+
* references (bare paths from @import). If not provided, string run
|
|
37
|
+
* values pass through unresolved.
|
|
38
|
+
*
|
|
39
|
+
* See @galaxy-tool-util/cli's createDefaultResolver() for a Node.js
|
|
40
|
+
* implementation handling base64, TRS, HTTP, and file paths.
|
|
41
|
+
*/
|
|
42
|
+
resolver?: RefResolver;
|
|
43
|
+
}
|
|
44
|
+
export declare const MAX_EXPANSION_DEPTH = 10;
|
|
45
|
+
/** Check if a URL matches the GA4GH TRS v2 tools/versions pattern. */
|
|
46
|
+
export declare function isTrsUrl(url: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Normalize and expand a Format2 workflow.
|
|
49
|
+
*
|
|
50
|
+
* Resolves @import, URL, TRS URL, and base64 references in step `run`
|
|
51
|
+
* fields. Uses `options.resolver` (or a no-op that leaves strings as-is)
|
|
52
|
+
* for fetching external references.
|
|
53
|
+
*/
|
|
54
|
+
export declare function expandedFormat2(raw: unknown, options?: ExpansionOptions): Promise<ExpandedFormat2Workflow>;
|
|
55
|
+
/**
|
|
56
|
+
* Normalize and expand a native workflow.
|
|
57
|
+
*
|
|
58
|
+
* Resolves content_id URL references by fetching and converting them.
|
|
59
|
+
* Uses `options.resolver` for fetching external references.
|
|
60
|
+
*/
|
|
61
|
+
export declare function expandedNative(raw: unknown, options?: ExpansionOptions): Promise<ExpandedNativeWorkflow>;
|
|
62
|
+
//# sourceMappingURL=expanded.d.ts.map
|