@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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for reading a native step's `tool_state`.
|
|
3
|
+
*
|
|
4
|
+
* Native workflows store parameter state as either:
|
|
5
|
+
* - a JSON-encoded string (`.ga` on disk), or
|
|
6
|
+
* - a parsed dict (after normalization / in-memory manipulation).
|
|
7
|
+
*
|
|
8
|
+
* Consumers elsewhere in the package duplicated this logic (cross-check
|
|
9
|
+
* extractor, normalized native builder, clean). Kept here as the shared
|
|
10
|
+
* root. `clean.ts` wraps this with legacy-dict decoding; it's a superset, not
|
|
11
|
+
* a replacement.
|
|
12
|
+
*/
|
|
13
|
+
export function parseToolState(raw) {
|
|
14
|
+
if (typeof raw === "string") {
|
|
15
|
+
if (raw === "")
|
|
16
|
+
return {};
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
/* fall through to empty */
|
|
25
|
+
}
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
29
|
+
return raw;
|
|
30
|
+
}
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=tool-state-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-state-io.js","sourceRoot":"","sources":["../../src/workflow/tool-state-io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,OAAO,MAAiC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,GAA8B,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Effect-schema validator dispatch for workflow dict inputs.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors gxformat2/validators.py. Callers pass a parsed workflow dict and get
|
|
5
|
+
* back the decoded value or throw on validation failure. Used by the schema-rule
|
|
6
|
+
* catalog runner and declarative-operation tests.
|
|
7
|
+
*
|
|
8
|
+
* The generated Effect schemas make `class` a required literal; Python's
|
|
9
|
+
* pydantic models default it. `withClass` injects the discriminator when
|
|
10
|
+
* missing so pass/fail semantics match Python byte-for-byte — see the plan
|
|
11
|
+
* note about `Format2MissingClass` being unenforceable today.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Return `raw` with `class: cls` injected if missing, and the same injection
|
|
15
|
+
* applied recursively to step subworkflows. Native steps embed subworkflows
|
|
16
|
+
* under `.subworkflow`; format2 steps embed them under `.run` (when `run` is
|
|
17
|
+
* an inline dict, not a URL).
|
|
18
|
+
*
|
|
19
|
+
* The cls string must match the parent document's class: nested format2
|
|
20
|
+
* subworkflows inherit `"GalaxyWorkflow"`, native inherit `"NativeGalaxyWorkflow"`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function withClass(raw: unknown, cls: string): unknown;
|
|
23
|
+
export declare function validateFormat2(wf: unknown): unknown;
|
|
24
|
+
export declare function validateFormat2Strict(wf: unknown): unknown;
|
|
25
|
+
export declare function validateNative(wf: unknown): unknown;
|
|
26
|
+
export declare function validateNativeStrict(wf: unknown): unknown;
|
|
27
|
+
/**
|
|
28
|
+
* Pick the validator matching a fixture filename's format.
|
|
29
|
+
*
|
|
30
|
+
* `.ga` → native; anything else → format2. `strict` picks the closed-schema
|
|
31
|
+
* flavor that rejects unknown fields.
|
|
32
|
+
*/
|
|
33
|
+
export declare function validatorForFixture(fixtureName: string, strict: boolean): (wf: unknown) => unknown;
|
|
34
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/workflow/validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAkB5D;AAgBD,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIpD;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAI1D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAInD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,GACd,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAK1B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Effect-schema validator dispatch for workflow dict inputs.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors gxformat2/validators.py. Callers pass a parsed workflow dict and get
|
|
5
|
+
* back the decoded value or throw on validation failure. Used by the schema-rule
|
|
6
|
+
* catalog runner and declarative-operation tests.
|
|
7
|
+
*
|
|
8
|
+
* The generated Effect schemas make `class` a required literal; Python's
|
|
9
|
+
* pydantic models default it. `withClass` injects the discriminator when
|
|
10
|
+
* missing so pass/fail semantics match Python byte-for-byte — see the plan
|
|
11
|
+
* note about `Format2MissingClass` being unenforceable today.
|
|
12
|
+
*/
|
|
13
|
+
import { Schema } from "effect";
|
|
14
|
+
import { GalaxyWorkflowSchema } from "./raw/gxformat2.effect.js";
|
|
15
|
+
import { NativeGalaxyWorkflowSchema } from "./raw/native.effect.js";
|
|
16
|
+
/**
|
|
17
|
+
* Return `raw` with `class: cls` injected if missing, and the same injection
|
|
18
|
+
* applied recursively to step subworkflows. Native steps embed subworkflows
|
|
19
|
+
* under `.subworkflow`; format2 steps embed them under `.run` (when `run` is
|
|
20
|
+
* an inline dict, not a URL).
|
|
21
|
+
*
|
|
22
|
+
* The cls string must match the parent document's class: nested format2
|
|
23
|
+
* subworkflows inherit `"GalaxyWorkflow"`, native inherit `"NativeGalaxyWorkflow"`.
|
|
24
|
+
*/
|
|
25
|
+
export function withClass(raw, cls) {
|
|
26
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
27
|
+
return raw;
|
|
28
|
+
const obj = raw;
|
|
29
|
+
const result = "class" in obj ? { ...obj } : { ...obj, class: cls };
|
|
30
|
+
const steps = result.steps;
|
|
31
|
+
if (!steps || typeof steps !== "object")
|
|
32
|
+
return result;
|
|
33
|
+
if (Array.isArray(steps)) {
|
|
34
|
+
result.steps = steps.map((step) => injectStepSubworkflow(step, cls));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const next = {};
|
|
38
|
+
for (const [key, step] of Object.entries(steps)) {
|
|
39
|
+
next[key] = injectStepSubworkflow(step, cls);
|
|
40
|
+
}
|
|
41
|
+
result.steps = next;
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
function injectStepSubworkflow(step, cls) {
|
|
46
|
+
if (!step || typeof step !== "object")
|
|
47
|
+
return step;
|
|
48
|
+
const s = step;
|
|
49
|
+
if (s.subworkflow && typeof s.subworkflow === "object") {
|
|
50
|
+
return { ...s, subworkflow: withClass(s.subworkflow, cls) };
|
|
51
|
+
}
|
|
52
|
+
// format2 steps embed subworkflows under `run` when it's an inline dict.
|
|
53
|
+
// Skip string runs (URLs) and missing runs.
|
|
54
|
+
if (s.run && typeof s.run === "object" && !Array.isArray(s.run)) {
|
|
55
|
+
return { ...s, run: withClass(s.run, cls) };
|
|
56
|
+
}
|
|
57
|
+
return s;
|
|
58
|
+
}
|
|
59
|
+
export function validateFormat2(wf) {
|
|
60
|
+
return Schema.decodeUnknownSync(GalaxyWorkflowSchema, { onExcessProperty: "ignore" })(withClass(wf, "GalaxyWorkflow"));
|
|
61
|
+
}
|
|
62
|
+
export function validateFormat2Strict(wf) {
|
|
63
|
+
return Schema.decodeUnknownSync(GalaxyWorkflowSchema, { onExcessProperty: "error" })(withClass(wf, "GalaxyWorkflow"));
|
|
64
|
+
}
|
|
65
|
+
export function validateNative(wf) {
|
|
66
|
+
return Schema.decodeUnknownSync(NativeGalaxyWorkflowSchema, { onExcessProperty: "ignore" })(withClass(wf, "NativeGalaxyWorkflow"));
|
|
67
|
+
}
|
|
68
|
+
export function validateNativeStrict(wf) {
|
|
69
|
+
return Schema.decodeUnknownSync(NativeGalaxyWorkflowSchema, { onExcessProperty: "error" })(withClass(wf, "NativeGalaxyWorkflow"));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Pick the validator matching a fixture filename's format.
|
|
73
|
+
*
|
|
74
|
+
* `.ga` → native; anything else → format2. `strict` picks the closed-schema
|
|
75
|
+
* flavor that rejects unknown fields.
|
|
76
|
+
*/
|
|
77
|
+
export function validatorForFixture(fixtureName, strict) {
|
|
78
|
+
if (fixtureName.endsWith(".ga")) {
|
|
79
|
+
return strict ? validateNativeStrict : validateNative;
|
|
80
|
+
}
|
|
81
|
+
return strict ? validateFormat2Strict : validateFormat2;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/workflow/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helper functions for walking Galaxy parameter trees.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from state-merge.ts to break a circular dependency:
|
|
5
|
+
* walker.ts needs these helpers, and state-merge.ts needs walkNativeState.
|
|
6
|
+
*
|
|
7
|
+
* Ported from Python galaxy.tool_util.parameters.visitor.
|
|
8
|
+
*/
|
|
9
|
+
import type { ConditionalParameterModel, ConditionalWhen } from "../schema/bundle-types.js";
|
|
10
|
+
/** Build flat pipe-separated state path: `name` or `prefix|name`. */
|
|
11
|
+
export declare function flatStatePath(name: string, prefix?: string): string;
|
|
12
|
+
/** Filter a flat key-value map to keys starting with a given prefix. */
|
|
13
|
+
export declare function keysStartingWith<T>(map: Record<string, T>, prefix: string): Record<string, T>;
|
|
14
|
+
/**
|
|
15
|
+
* Split flat connection keys for a repeat into per-instance arrays.
|
|
16
|
+
*
|
|
17
|
+
* Connection keys use the pattern `repeatName_N|paramName`.
|
|
18
|
+
* Returns an array of per-instance connection dicts.
|
|
19
|
+
*/
|
|
20
|
+
export declare function repeatInputsToArray<T>(statePath: string, inputs: Record<string, T>): Record<string, T>[];
|
|
21
|
+
/**
|
|
22
|
+
* Select the matching ConditionalWhen for a conditional state dict.
|
|
23
|
+
*
|
|
24
|
+
* Matches the test parameter's value in state against each when's
|
|
25
|
+
* discriminator. Falls back to the default when if no match found.
|
|
26
|
+
* Returns null if no match at all (graceful degradation).
|
|
27
|
+
*/
|
|
28
|
+
export declare function selectWhichWhen(conditional: ConditionalParameterModel, state: Record<string, unknown>): ConditionalWhen | null;
|
|
29
|
+
//# sourceMappingURL=walk-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-helpers.d.ts","sourceRoot":"","sources":["../../src/workflow/walk-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,eAAe,EAGhB,MAAM,2BAA2B,CAAC;AAKnC,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAQ7F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GACxB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAuBrB;AAID;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,yBAAyB,EACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,eAAe,GAAG,IAAI,CAmBxB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helper functions for walking Galaxy parameter trees.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from state-merge.ts to break a circular dependency:
|
|
5
|
+
* walker.ts needs these helpers, and state-merge.ts needs walkNativeState.
|
|
6
|
+
*
|
|
7
|
+
* Ported from Python galaxy.tool_util.parameters.visitor.
|
|
8
|
+
*/
|
|
9
|
+
import { parseBool } from "./coercions.js";
|
|
10
|
+
// --- Path helpers ---
|
|
11
|
+
/** Build flat pipe-separated state path: `name` or `prefix|name`. */
|
|
12
|
+
export function flatStatePath(name, prefix) {
|
|
13
|
+
return prefix != null ? `${prefix}|${name}` : name;
|
|
14
|
+
}
|
|
15
|
+
/** Filter a flat key-value map to keys starting with a given prefix. */
|
|
16
|
+
export function keysStartingWith(map, prefix) {
|
|
17
|
+
const result = {};
|
|
18
|
+
for (const [key, value] of Object.entries(map)) {
|
|
19
|
+
if (key.startsWith(prefix)) {
|
|
20
|
+
result[key] = value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Split flat connection keys for a repeat into per-instance arrays.
|
|
27
|
+
*
|
|
28
|
+
* Connection keys use the pattern `repeatName_N|paramName`.
|
|
29
|
+
* Returns an array of per-instance connection dicts.
|
|
30
|
+
*/
|
|
31
|
+
export function repeatInputsToArray(statePath, inputs) {
|
|
32
|
+
const repeatInputs = keysStartingWith(inputs, statePath + "_");
|
|
33
|
+
let highestCount = -1;
|
|
34
|
+
for (const key of Object.keys(repeatInputs)) {
|
|
35
|
+
const numStr = key.slice(statePath.length + 1).split("|")[0];
|
|
36
|
+
const num = parseInt(numStr, 10);
|
|
37
|
+
if (!isNaN(num) && num > highestCount) {
|
|
38
|
+
highestCount = num;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const params = [];
|
|
42
|
+
for (let i = 0; i <= highestCount; i++) {
|
|
43
|
+
params.push({});
|
|
44
|
+
}
|
|
45
|
+
for (const [key, value] of Object.entries(repeatInputs)) {
|
|
46
|
+
const numStr = key.slice(statePath.length + 1).split("|")[0];
|
|
47
|
+
const num = parseInt(numStr, 10);
|
|
48
|
+
if (!isNaN(num)) {
|
|
49
|
+
params[num][key] = value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return params;
|
|
53
|
+
}
|
|
54
|
+
// --- Conditional branch selection ---
|
|
55
|
+
/**
|
|
56
|
+
* Select the matching ConditionalWhen for a conditional state dict.
|
|
57
|
+
*
|
|
58
|
+
* Matches the test parameter's value in state against each when's
|
|
59
|
+
* discriminator. Falls back to the default when if no match found.
|
|
60
|
+
* Returns null if no match at all (graceful degradation).
|
|
61
|
+
*/
|
|
62
|
+
export function selectWhichWhen(conditional, state) {
|
|
63
|
+
const testParam = conditional.test_parameter;
|
|
64
|
+
const testValue = state[testParam.name];
|
|
65
|
+
// Try exact match first
|
|
66
|
+
for (const when of conditional.whens) {
|
|
67
|
+
if (_testValueMatchesDiscriminator(testParam, testValue, when.discriminator)) {
|
|
68
|
+
return when;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Fall back to default when
|
|
72
|
+
for (const when of conditional.whens) {
|
|
73
|
+
if (when.is_default_when) {
|
|
74
|
+
return when;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function _testValueMatchesDiscriminator(testParam, testValue, discriminator) {
|
|
80
|
+
if (testParam.parameter_type === "gx_boolean") {
|
|
81
|
+
// Boolean coercion: handle string "true"/"false"/"True"/"False" and actual booleans
|
|
82
|
+
const boolValue = parseBool(testValue);
|
|
83
|
+
const discBool = typeof discriminator === "boolean" ? discriminator : parseBool(discriminator);
|
|
84
|
+
return boolValue === discBool;
|
|
85
|
+
}
|
|
86
|
+
// Select: string comparison
|
|
87
|
+
return String(testValue) === String(discriminator);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=walk-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-helpers.js","sourceRoot":"","sources":["../../src/workflow/walk-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,uBAAuB;AAEvB,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAe;IACzD,OAAO,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAI,GAAsB,EAAE,MAAc;IACxE,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,MAAyB;IAEzB,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC;IAC/D,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;YACtC,YAAY,GAAG,GAAG,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uCAAuC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,WAAsC,EACtC,KAA8B;IAE9B,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC;IAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAExC,wBAAwB;IACxB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,8BAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,8BAA8B,CACrC,SAAuD,EACvD,SAAkB,EAClB,aAA+B;IAE/B,IAAI,SAAS,CAAC,cAAc,KAAK,YAAY,EAAE,CAAC;QAC9C,oFAAoF;QACpF,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/F,OAAO,SAAS,KAAK,QAAQ,CAAC;IAChC,CAAC;IACD,4BAA4B;IAC5B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -20,6 +20,18 @@ export type LeafCallback = (toolInput: ToolParameterModel, value: unknown, state
|
|
|
20
20
|
export interface WalkNativeOptions {
|
|
21
21
|
prefix?: string;
|
|
22
22
|
checkUnknownKeys?: boolean;
|
|
23
|
+
/** Copy undeclared keys from input state to output (default: false). */
|
|
24
|
+
preserveUnknownKeys?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Switch repeat handling to `_initialize_repeat_state` semantics (default: false).
|
|
27
|
+
* When true:
|
|
28
|
+
* - inputConnections are ignored for instance count,
|
|
29
|
+
* - instance count is padded to `repeat.min` (never shrinks existing state),
|
|
30
|
+
* - the repeat key is always written to output, even when empty (`[]`).
|
|
31
|
+
* Used by expand-defaults, which must surface every declared repeat as a
|
|
32
|
+
* container the user can populate.
|
|
33
|
+
*/
|
|
34
|
+
repeatMinPad?: boolean;
|
|
23
35
|
}
|
|
24
36
|
/**
|
|
25
37
|
* Walk native workflow tool_state using the parameter tree.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/workflow/walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,2BAA2B,CAAC;AAKnC,uEAAuE;AACvE,eAAO,MAAM,UAAU,EAAE,OAAO,MAA6B,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,CACzB,SAAS,EAAE,kBAAkB,EAC7B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,KACd,OAAO,GAAG,OAAO,UAAU,CAAC;AAEjC,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/workflow/walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,2BAA2B,CAAC;AAKnC,uEAAuE;AACvE,eAAO,MAAM,UAAU,EAAE,OAAO,MAA6B,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,CACzB,SAAS,EAAE,kBAAkB,EAC7B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,KACd,OAAO,GAAG,OAAO,UAAU,CAAC;AAEjC,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,UAAU,EAAE,kBAAkB,EAAE,EAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqHzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,kBAAkB,EAAE,EAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,YAAY,EAAE,YAAY,EAC1B,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4EzB;AAED,mEAAmE;AACnE,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,GAAG,EAAE,MAAM;aACX,MAAM,CAAC,EAAE,MAAM;gBADf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,YAAA;CAMlC"}
|
package/dist/workflow/walker.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* - No legacy decode: string containers are errors, not silently accommodated
|
|
14
14
|
* - SKIP_VALUE sentinel omits a value from the output
|
|
15
15
|
*/
|
|
16
|
-
import { flatStatePath, repeatInputsToArray, selectWhichWhen } from "./
|
|
16
|
+
import { flatStatePath, repeatInputsToArray, selectWhichWhen } from "./walk-helpers.js";
|
|
17
17
|
import { STALE_KEYS } from "./stale-keys.js";
|
|
18
18
|
/** Sentinel: return from leaf callback to omit a value from output. */
|
|
19
19
|
export const SKIP_VALUE = Symbol("SKIP_VALUE");
|
|
@@ -32,6 +32,8 @@ export const SKIP_VALUE = Symbol("SKIP_VALUE");
|
|
|
32
32
|
export function walkNativeState(inputConnections, toolInputs, state, leafCallback, options) {
|
|
33
33
|
const prefix = options?.prefix;
|
|
34
34
|
const checkUnknownKeys = options?.checkUnknownKeys ?? false;
|
|
35
|
+
const preserveUnknownKeys = options?.preserveUnknownKeys ?? false;
|
|
36
|
+
const repeatMinPad = options?.repeatMinPad ?? false;
|
|
35
37
|
const result = {};
|
|
36
38
|
const visitedKeys = new Set();
|
|
37
39
|
for (const toolInput of toolInputs) {
|
|
@@ -47,7 +49,7 @@ export function walkNativeState(inputConnections, toolInputs, state, leafCallbac
|
|
|
47
49
|
const when = selectWhichWhen(conditional, stateDict);
|
|
48
50
|
const branchParams = when != null ? when.parameters : [];
|
|
49
51
|
// Walk the test parameter + branch parameters
|
|
50
|
-
const innerResult = walkNativeState(inputConnections, [conditional.test_parameter, ...branchParams], stateDict, leafCallback, { prefix: statePath, checkUnknownKeys });
|
|
52
|
+
const innerResult = walkNativeState(inputConnections, [conditional.test_parameter, ...branchParams], stateDict, leafCallback, { prefix: statePath, checkUnknownKeys, preserveUnknownKeys, repeatMinPad });
|
|
51
53
|
if (Object.keys(innerResult).length > 0) {
|
|
52
54
|
result[name] = innerResult;
|
|
53
55
|
}
|
|
@@ -60,16 +62,25 @@ export function walkNativeState(inputConnections, toolInputs, state, leafCallbac
|
|
|
60
62
|
const stateArray = Array.isArray(repeatState)
|
|
61
63
|
? repeatState
|
|
62
64
|
: [];
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
let instanceCount;
|
|
66
|
+
if (repeatMinPad) {
|
|
67
|
+
instanceCount = Math.max(stateArray.length, repeat.min ?? 0);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const connectionInstances = repeatInputsToArray(statePath, inputConnections);
|
|
71
|
+
instanceCount = Math.max(stateArray.length, connectionInstances.length);
|
|
72
|
+
}
|
|
65
73
|
const instances = [];
|
|
66
74
|
for (let i = 0; i < instanceCount; i++) {
|
|
67
75
|
const instanceState = stateArray[i] ?? {};
|
|
68
76
|
const instancePrefix = `${statePath}_${i}`;
|
|
69
|
-
const instanceResult = walkNativeState(inputConnections, repeat.parameters, instanceState, leafCallback, { prefix: instancePrefix, checkUnknownKeys });
|
|
77
|
+
const instanceResult = walkNativeState(inputConnections, repeat.parameters, instanceState, leafCallback, { prefix: instancePrefix, checkUnknownKeys, preserveUnknownKeys, repeatMinPad });
|
|
70
78
|
instances.push(instanceResult);
|
|
71
79
|
}
|
|
72
|
-
|
|
80
|
+
// Preserve explicit empty arrays (valid state); omit only when key is absent.
|
|
81
|
+
// In repeatMinPad mode (expand-defaults), always write the key — mirrors
|
|
82
|
+
// Python's _initialize_repeat_state which creates tool_state[name] = [].
|
|
83
|
+
if (repeatMinPad || name in state || instances.length > 0) {
|
|
73
84
|
result[name] = instances;
|
|
74
85
|
}
|
|
75
86
|
}
|
|
@@ -78,7 +89,7 @@ export function walkNativeState(inputConnections, toolInputs, state, leafCallbac
|
|
|
78
89
|
const sectionState = state[name];
|
|
79
90
|
_assertNotStringContainer(name, parameterType, sectionState);
|
|
80
91
|
const stateDict = sectionState ?? {};
|
|
81
|
-
const innerResult = walkNativeState(inputConnections, section.parameters, stateDict, leafCallback, { prefix: statePath, checkUnknownKeys });
|
|
92
|
+
const innerResult = walkNativeState(inputConnections, section.parameters, stateDict, leafCallback, { prefix: statePath, checkUnknownKeys, preserveUnknownKeys, repeatMinPad });
|
|
82
93
|
if (Object.keys(innerResult).length > 0) {
|
|
83
94
|
result[name] = innerResult;
|
|
84
95
|
}
|
|
@@ -99,6 +110,13 @@ export function walkNativeState(inputConnections, toolInputs, state, leafCallbac
|
|
|
99
110
|
}
|
|
100
111
|
}
|
|
101
112
|
}
|
|
113
|
+
else if (preserveUnknownKeys) {
|
|
114
|
+
for (const key of Object.keys(state)) {
|
|
115
|
+
if (!visitedKeys.has(key)) {
|
|
116
|
+
result[key] = state[key];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
102
120
|
return result;
|
|
103
121
|
}
|
|
104
122
|
/**
|
|
@@ -141,7 +159,8 @@ export function walkFormat2State(toolInputs, state, leafCallback, prefix) {
|
|
|
141
159
|
const instanceResult = walkFormat2State(repeat.parameters, stateArray[i], leafCallback, instancePrefix);
|
|
142
160
|
instances.push(instanceResult);
|
|
143
161
|
}
|
|
144
|
-
|
|
162
|
+
// Preserve explicit empty arrays (valid state); omit only when key is absent
|
|
163
|
+
if (name in state || instances.length > 0) {
|
|
145
164
|
result[name] = instances;
|
|
146
165
|
}
|
|
147
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/workflow/walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/workflow/walker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@galaxy-tool-util/schema",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Effect Schema parameter types and validators for Galaxy tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -30,15 +30,14 @@
|
|
|
30
30
|
],
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"effect": "^3.21.0"
|
|
34
|
-
},
|
|
35
|
-
"devDependencies": {
|
|
36
33
|
"ajv": "^8.18.0",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
34
|
+
"ajv-formats": "^3.0.1",
|
|
35
|
+
"effect": "^3.21.0",
|
|
36
|
+
"yaml": "^2.8.3"
|
|
39
37
|
},
|
|
38
|
+
"devDependencies": {},
|
|
40
39
|
"scripts": {
|
|
41
|
-
"build": "tsc",
|
|
40
|
+
"build": "tsc && node ../../scripts/copy-schema-assets.mjs",
|
|
42
41
|
"typecheck": "tsc --noEmit",
|
|
43
42
|
"test": "tsc --noEmit && vitest run",
|
|
44
43
|
"test:watch": "vitest",
|