@galaxy-tool-util/schema 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 (137) hide show
  1. package/dist/index.d.ts +75 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +48 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/schema/type-guards.d.ts +14 -0
  6. package/dist/schema/type-guards.d.ts.map +1 -0
  7. package/dist/schema/type-guards.js +25 -0
  8. package/dist/schema/type-guards.js.map +1 -0
  9. package/dist/test-format/cross-check/check.d.ts +18 -0
  10. package/dist/test-format/cross-check/check.d.ts.map +1 -0
  11. package/dist/test-format/cross-check/check.js +89 -0
  12. package/dist/test-format/cross-check/check.js.map +1 -0
  13. package/dist/test-format/cross-check/extract-format2.d.ts +13 -0
  14. package/dist/test-format/cross-check/extract-format2.d.ts.map +1 -0
  15. package/dist/test-format/cross-check/extract-format2.js +98 -0
  16. package/dist/test-format/cross-check/extract-format2.js.map +1 -0
  17. package/dist/test-format/cross-check/extract-native.d.ts +4 -0
  18. package/dist/test-format/cross-check/extract-native.d.ts.map +1 -0
  19. package/dist/test-format/cross-check/extract-native.js +89 -0
  20. package/dist/test-format/cross-check/extract-native.js.map +1 -0
  21. package/dist/test-format/cross-check/extract.d.ts +9 -0
  22. package/dist/test-format/cross-check/extract.d.ts.map +1 -0
  23. package/dist/test-format/cross-check/extract.js +16 -0
  24. package/dist/test-format/cross-check/extract.js.map +1 -0
  25. package/dist/test-format/cross-check/index.d.ts +7 -0
  26. package/dist/test-format/cross-check/index.d.ts.map +1 -0
  27. package/dist/test-format/cross-check/index.js +6 -0
  28. package/dist/test-format/cross-check/index.js.map +1 -0
  29. package/dist/test-format/cross-check/type-compat.d.ts +23 -0
  30. package/dist/test-format/cross-check/type-compat.d.ts.map +1 -0
  31. package/dist/test-format/cross-check/type-compat.js +48 -0
  32. package/dist/test-format/cross-check/type-compat.js.map +1 -0
  33. package/dist/test-format/cross-check/types.d.ts +23 -0
  34. package/dist/test-format/cross-check/types.d.ts.map +1 -0
  35. package/dist/test-format/cross-check/types.js +10 -0
  36. package/dist/test-format/cross-check/types.js.map +1 -0
  37. package/dist/test-format/index.d.ts +3 -0
  38. package/dist/test-format/index.d.ts.map +1 -0
  39. package/dist/test-format/index.js +3 -0
  40. package/dist/test-format/index.js.map +1 -0
  41. package/dist/test-format/tests.schema.generated.d.ts +5610 -0
  42. package/dist/test-format/tests.schema.generated.d.ts.map +1 -0
  43. package/dist/test-format/tests.schema.generated.js +6899 -0
  44. package/dist/test-format/tests.schema.generated.js.map +1 -0
  45. package/dist/test-format/validate.d.ts +20 -0
  46. package/dist/test-format/validate.d.ts.map +1 -0
  47. package/dist/test-format/validate.js +41 -0
  48. package/dist/test-format/validate.js.map +1 -0
  49. package/dist/tool-state-validator.d.ts +23 -0
  50. package/dist/tool-state-validator.d.ts.map +1 -0
  51. package/dist/tool-state-validator.js +59 -0
  52. package/dist/tool-state-validator.js.map +1 -0
  53. package/dist/workflow/clean.d.ts +29 -3
  54. package/dist/workflow/clean.d.ts.map +1 -1
  55. package/dist/workflow/clean.js +199 -28
  56. package/dist/workflow/clean.js.map +1 -1
  57. package/dist/workflow/index.d.ts +13 -5
  58. package/dist/workflow/index.d.ts.map +1 -1
  59. package/dist/workflow/index.js +13 -3
  60. package/dist/workflow/index.js.map +1 -1
  61. package/dist/workflow/lint-profiles.d.ts +27 -0
  62. package/dist/workflow/lint-profiles.d.ts.map +1 -0
  63. package/dist/workflow/lint-profiles.js +49 -0
  64. package/dist/workflow/lint-profiles.js.map +1 -0
  65. package/dist/workflow/lint-rules.d.ts +15 -0
  66. package/dist/workflow/lint-rules.d.ts.map +1 -0
  67. package/dist/workflow/lint-rules.js +15 -0
  68. package/dist/workflow/lint-rules.js.map +1 -0
  69. package/dist/workflow/lint.d.ts +4 -18
  70. package/dist/workflow/lint.d.ts.map +1 -1
  71. package/dist/workflow/lint.js +9 -30
  72. package/dist/workflow/lint.js.map +1 -1
  73. package/dist/workflow/lint_profiles.yml +41 -0
  74. package/dist/workflow/linting.d.ts +54 -0
  75. package/dist/workflow/linting.d.ts.map +1 -0
  76. package/dist/workflow/linting.js +71 -0
  77. package/dist/workflow/linting.js.map +1 -0
  78. package/dist/workflow/param-navigation.d.ts +26 -0
  79. package/dist/workflow/param-navigation.d.ts.map +1 -0
  80. package/dist/workflow/param-navigation.js +60 -0
  81. package/dist/workflow/param-navigation.js.map +1 -0
  82. package/dist/workflow/raw/gxformat2.effect.d.ts +341 -117
  83. package/dist/workflow/raw/gxformat2.effect.d.ts.map +1 -1
  84. package/dist/workflow/raw/gxformat2.effect.js +107 -109
  85. package/dist/workflow/raw/gxformat2.effect.js.map +1 -1
  86. package/dist/workflow/raw/native.d.ts +2 -2
  87. package/dist/workflow/raw/native.d.ts.map +1 -1
  88. package/dist/workflow/raw/native.effect.d.ts +150 -3
  89. package/dist/workflow/raw/native.effect.d.ts.map +1 -1
  90. package/dist/workflow/raw/native.effect.js +3 -5
  91. package/dist/workflow/raw/native.effect.js.map +1 -1
  92. package/dist/workflow/report-models.d.ts +412 -0
  93. package/dist/workflow/report-models.d.ts.map +1 -0
  94. package/dist/workflow/report-models.js +342 -0
  95. package/dist/workflow/report-models.js.map +1 -0
  96. package/dist/workflow/roundtrip.d.ts +31 -8
  97. package/dist/workflow/roundtrip.d.ts.map +1 -1
  98. package/dist/workflow/roundtrip.js +107 -26
  99. package/dist/workflow/roundtrip.js.map +1 -1
  100. package/dist/workflow/schema-rules.d.ts +38 -0
  101. package/dist/workflow/schema-rules.d.ts.map +1 -0
  102. package/dist/workflow/schema-rules.js +28 -0
  103. package/dist/workflow/schema-rules.js.map +1 -0
  104. package/dist/workflow/schema_rules.yml +69 -0
  105. package/dist/workflow/serialize.d.ts +30 -0
  106. package/dist/workflow/serialize.d.ts.map +1 -0
  107. package/dist/workflow/serialize.js +37 -0
  108. package/dist/workflow/serialize.js.map +1 -0
  109. package/dist/workflow/state-merge.d.ts +15 -32
  110. package/dist/workflow/state-merge.d.ts.map +1 -1
  111. package/dist/workflow/state-merge.js +30 -207
  112. package/dist/workflow/state-merge.js.map +1 -1
  113. package/dist/workflow/stateful-validate.d.ts +21 -0
  114. package/dist/workflow/stateful-validate.d.ts.map +1 -1
  115. package/dist/workflow/stateful-validate.js +27 -0
  116. package/dist/workflow/stateful-validate.js.map +1 -1
  117. package/dist/workflow/strict-checks.d.ts +22 -0
  118. package/dist/workflow/strict-checks.d.ts.map +1 -0
  119. package/dist/workflow/strict-checks.js +95 -0
  120. package/dist/workflow/strict-checks.js.map +1 -0
  121. package/dist/workflow/tool-state-io.d.ts +14 -0
  122. package/dist/workflow/tool-state-io.d.ts.map +1 -0
  123. package/dist/workflow/tool-state-io.js +33 -0
  124. package/dist/workflow/tool-state-io.js.map +1 -0
  125. package/dist/workflow/validators.d.ts +34 -0
  126. package/dist/workflow/validators.d.ts.map +1 -0
  127. package/dist/workflow/validators.js +83 -0
  128. package/dist/workflow/validators.js.map +1 -0
  129. package/dist/workflow/walk-helpers.d.ts +29 -0
  130. package/dist/workflow/walk-helpers.d.ts.map +1 -0
  131. package/dist/workflow/walk-helpers.js +89 -0
  132. package/dist/workflow/walk-helpers.js.map +1 -0
  133. package/dist/workflow/walker.d.ts +2 -0
  134. package/dist/workflow/walker.d.ts.map +1 -1
  135. package/dist/workflow/walker.js +16 -6
  136. package/dist/workflow/walker.js.map +1 -1
  137. package/package.json +7 -6
@@ -1,231 +1,54 @@
1
1
  /**
2
- * Inject ConnectedValue markers into workflow state dicts.
2
+ * ConnectedValue injection and stripping for workflow state dicts.
3
3
  *
4
- * Port of Python galaxy.tool_util.workflow_state._state_merge +
5
- * helper functions from galaxy.tool_util.parameters.visitor.
4
+ * Thin wrappers around walkNativeState that inject or strip
5
+ * ConnectedValue markers. Mutate state in-place for caller compat.
6
6
  *
7
- * Walks the parameter tree to match pipe-separated connection paths
8
- * (e.g. "queries_0|input2") to tool parameters. Handles conditionals,
9
- * repeats, and sections. Used by validate-workflow for both native
10
- * and format2 validation paths.
7
+ * Port of Python galaxy.tool_util.workflow_state._state_merge.
8
+ * Tree-walking helpers live in walk-helpers.ts; re-exported here
9
+ * for backward compatibility.
11
10
  */
12
- import { parseBool } from "./coercions.js";
13
11
  import { CONNECTED_VALUE, isConnectedValue } from "./runtime-markers.js";
14
- // --- Helpers (ported from Python visitor.py) ---
15
- /** Build flat pipe-separated state path: `name` or `prefix|name`. */
16
- export function flatStatePath(name, prefix) {
17
- return prefix != null ? `${prefix}|${name}` : name;
18
- }
19
- /** Filter a flat key→value map to keys starting with a given prefix. */
20
- export function keysStartingWith(map, prefix) {
21
- const result = {};
22
- for (const [key, value] of Object.entries(map)) {
23
- if (key.startsWith(prefix)) {
24
- result[key] = value;
25
- }
26
- }
27
- return result;
28
- }
29
- /**
30
- * Split flat connection keys for a repeat into per-instance arrays.
31
- *
32
- * Connection keys use the pattern `repeatName_N|paramName`.
33
- * Returns an array of per-instance connection dicts.
34
- */
35
- export function repeatInputsToArray(statePath, inputs) {
36
- const repeatInputs = keysStartingWith(inputs, statePath + "_");
37
- let highestCount = -1;
38
- for (const key of Object.keys(repeatInputs)) {
39
- const numStr = key.slice(statePath.length + 1).split("|")[0];
40
- const num = parseInt(numStr, 10);
41
- if (!isNaN(num) && num > highestCount) {
42
- highestCount = num;
43
- }
44
- }
45
- const params = [];
46
- for (let i = 0; i <= highestCount; i++) {
47
- params.push({});
48
- }
49
- for (const [key, value] of Object.entries(repeatInputs)) {
50
- const numStr = key.slice(statePath.length + 1).split("|")[0];
51
- const num = parseInt(numStr, 10);
52
- if (!isNaN(num)) {
53
- params[num][key] = value;
54
- }
55
- }
56
- return params;
57
- }
58
- /**
59
- * Select the matching ConditionalWhen for a conditional state dict.
60
- *
61
- * Matches the test parameter's value in state against each when's
62
- * discriminator. Falls back to the default when if no match found.
63
- * Returns null if no match at all (graceful degradation).
64
- */
65
- export function selectWhichWhen(conditional, state) {
66
- const testParam = conditional.test_parameter;
67
- const testValue = state[testParam.name];
68
- // Try exact match first
69
- for (const when of conditional.whens) {
70
- if (_testValueMatchesDiscriminator(testParam, testValue, when.discriminator)) {
71
- return when;
72
- }
73
- }
74
- // Fall back to default when
75
- for (const when of conditional.whens) {
76
- if (when.is_default_when) {
77
- return when;
78
- }
79
- }
80
- return null;
81
- }
82
- function _testValueMatchesDiscriminator(testParam, testValue, discriminator) {
83
- if (testParam.parameter_type === "gx_boolean") {
84
- // Boolean coercion: handle string "true"/"false"/"True"/"False" and actual booleans
85
- const boolValue = parseBool(testValue);
86
- const discBool = typeof discriminator === "boolean" ? discriminator : parseBool(discriminator);
87
- return boolValue === discBool;
88
- }
89
- // Select: string comparison
90
- return String(testValue) === String(discriminator);
91
- }
12
+ import { walkNativeState, SKIP_VALUE } from "./walker.js";
13
+ import { flatStatePath, keysStartingWith, repeatInputsToArray, selectWhichWhen, } from "./walk-helpers.js";
14
+ // Re-export helpers so existing importers don't break
15
+ export { flatStatePath, keysStartingWith, repeatInputsToArray, selectWhichWhen };
92
16
  // --- Main injection function ---
93
17
  /**
94
18
  * Inject ConnectedValue markers into a state dict for all connections.
95
19
  *
96
- * Walks the parameter tree to match connection paths to tool parameters,
97
- * setting matched leaves to `{"__class__": "ConnectedValue"}`.
98
- * Mutates `state` in-place.
20
+ * Uses walkNativeState with a leaf callback that replaces connected
21
+ * leaves with ConnectedValue markers, then reassigns the input state
22
+ * in-place to preserve the mutation contract callers expect.
99
23
  *
100
24
  * @returns remaining unmatched connection paths (empty if all consumed)
101
25
  */
102
26
  export function injectConnectionsIntoState(toolInputs, state, connections) {
103
27
  const remaining = { ...connections };
104
- for (const toolInput of toolInputs) {
105
- _mergeParam(remaining, toolInput, state);
106
- }
28
+ const result = walkNativeState(connections, toolInputs, state, (_input, value, statePath) => {
29
+ if (statePath in remaining) {
30
+ delete remaining[statePath];
31
+ return { ...CONNECTED_VALUE };
32
+ }
33
+ return value === undefined ? SKIP_VALUE : value;
34
+ }, { preserveUnknownKeys: true });
35
+ for (const key of Object.keys(state))
36
+ delete state[key];
37
+ Object.assign(state, result);
107
38
  return remaining;
108
39
  }
109
- function _mergeParam(connections, toolInput, state, prefix, branchConnections) {
110
- if (branchConnections == null) {
111
- branchConnections = connections;
112
- }
113
- const name = toolInput.name;
114
- const parameterType = toolInput.parameter_type;
115
- const statePath = flatStatePath(name, prefix);
116
- if (parameterType === "gx_conditional") {
117
- const conditional = toolInput;
118
- let conditionalState = state[name];
119
- if (conditionalState == null) {
120
- conditionalState = {};
121
- state[name] = conditionalState;
122
- }
123
- const when = selectWhichWhen(conditional, conditionalState);
124
- const conditionalConnections = keysStartingWith(branchConnections, statePath);
125
- _mergeParam(connections, conditional.test_parameter, conditionalState, statePath, conditionalConnections);
126
- if (when != null) {
127
- for (const whenParameter of when.parameters) {
128
- _mergeParam(connections, whenParameter, conditionalState, statePath, conditionalConnections);
129
- }
130
- }
131
- }
132
- else if (parameterType === "gx_repeat") {
133
- const repeat = toolInput;
134
- let repeatStateArray = state[name];
135
- if (repeatStateArray == null) {
136
- repeatStateArray = [];
137
- }
138
- const repeatInstanceConnects = repeatInputsToArray(statePath, connections);
139
- for (let i = 0; i < repeatInstanceConnects.length; i++) {
140
- while (repeatStateArray.length <= i) {
141
- repeatStateArray.push({});
142
- }
143
- const instancePrefix = `${statePath}_${i}`;
144
- for (const repeatParameter of repeat.parameters) {
145
- _mergeParam(connections, repeatParameter, repeatStateArray[i], instancePrefix, repeatInstanceConnects[i]);
146
- }
147
- }
148
- if (repeatStateArray.length > 0 && !(name in state)) {
149
- state[name] = repeatStateArray;
150
- }
151
- }
152
- else if (parameterType === "gx_section") {
153
- const section = toolInput;
154
- let sectionState = state[name];
155
- if (sectionState == null) {
156
- sectionState = {};
157
- state[name] = sectionState;
158
- }
159
- const sectionConnections = keysStartingWith(branchConnections, statePath);
160
- for (const sectionParameter of section.parameters) {
161
- _mergeParam(connections, sectionParameter, sectionState, statePath, sectionConnections);
162
- }
163
- }
164
- else {
165
- // Leaf parameter
166
- if (statePath in branchConnections) {
167
- state[name] = { ...CONNECTED_VALUE };
168
- delete connections[statePath];
169
- }
170
- }
171
- }
172
40
  // --- ConnectedValue stripping ---
173
41
  /**
174
42
  * Strip ConnectedValue markers from a state dict using the parameter tree.
175
43
  *
176
- * Walks conditionals, repeats, and sections so nested markers inside
177
- * container parameters are removed. Mutates `state` in-place.
44
+ * Uses walkNativeState with a leaf callback that omits ConnectedValue
45
+ * entries via SKIP_VALUE, then reassigns the input state in-place to
46
+ * preserve the mutation contract callers expect.
178
47
  */
179
48
  export function stripConnectedValues(toolInputs, state) {
180
- for (const toolInput of toolInputs) {
181
- _stripParam(toolInput, state);
182
- }
183
- }
184
- function _stripParam(toolInput, state, prefix) {
185
- const name = toolInput.name;
186
- const parameterType = toolInput.parameter_type;
187
- if (parameterType === "gx_conditional") {
188
- const conditional = toolInput;
189
- const conditionalState = state[name];
190
- if (conditionalState == null)
191
- return;
192
- const statePath = flatStatePath(name, prefix);
193
- _stripParam(conditional.test_parameter, conditionalState, statePath);
194
- const when = selectWhichWhen(conditional, conditionalState);
195
- if (when != null) {
196
- for (const whenParameter of when.parameters) {
197
- _stripParam(whenParameter, conditionalState, statePath);
198
- }
199
- }
200
- }
201
- else if (parameterType === "gx_repeat") {
202
- const repeat = toolInput;
203
- const repeatStateArray = state[name];
204
- if (!Array.isArray(repeatStateArray))
205
- return;
206
- const statePath = flatStatePath(name, prefix);
207
- for (let i = 0; i < repeatStateArray.length; i++) {
208
- const instancePrefix = `${statePath}_${i}`;
209
- for (const repeatParameter of repeat.parameters) {
210
- _stripParam(repeatParameter, repeatStateArray[i], instancePrefix);
211
- }
212
- }
213
- }
214
- else if (parameterType === "gx_section") {
215
- const section = toolInput;
216
- const sectionState = state[name];
217
- if (sectionState == null)
218
- return;
219
- const statePath = flatStatePath(name, prefix);
220
- for (const sectionParameter of section.parameters) {
221
- _stripParam(sectionParameter, sectionState, statePath);
222
- }
223
- }
224
- else {
225
- // Leaf parameter
226
- if (isConnectedValue(state[name])) {
227
- delete state[name];
228
- }
229
- }
49
+ const cleaned = walkNativeState({}, toolInputs, state, (_input, value) => isConnectedValue(value) ? SKIP_VALUE : value === undefined ? SKIP_VALUE : value, { preserveUnknownKeys: true });
50
+ for (const key of Object.keys(state))
51
+ delete state[key];
52
+ Object.assign(state, cleaned);
230
53
  }
231
54
  //# sourceMappingURL=state-merge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-merge.js","sourceRoot":"","sources":["../../src/workflow/state-merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-merge.js","sourceRoot":"","sources":["../../src/workflow/state-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,sDAAsD;AACtD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAEjF,kCAAkC;AAElC;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAgC,EAChC,KAA8B,EAC9B,WAAoC;IAEpC,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,CAC5B,WAAW,EACX,UAAU,EACV,KAAK,EACL,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC3B,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC,EACD,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAC9B,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mCAAmC;AAEnC;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAgC,EAChC,KAA8B;IAE9B,MAAM,OAAO,GAAG,eAAe,CAC7B,EAAE,EACF,UAAU,EACV,KAAK,EACL,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAChB,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EACjF,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAC9B,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC"}
@@ -43,4 +43,25 @@ export declare function validateNativeStepState(inputs: ToolParameterModel[], to
43
43
  * `ConversionValidationFailure` with phase="post" on validation failure.
44
44
  */
45
45
  export declare function validateFormat2StepState(inputs: ToolParameterModel[], format2State: Record<string, unknown>): void;
46
+ /**
47
+ * A single diagnostic produced by tool-state validation.
48
+ *
49
+ * Defined here (lower-level module) so both {@link validateFormat2StepStateStrict}
50
+ * and the higher-level {@link ToolStateValidator} share one canonical type.
51
+ */
52
+ export interface ToolStateDiagnostic {
53
+ /** Dot-separated parameter path, or "" for top-level / unlocated issues. */
54
+ path: string;
55
+ message: string;
56
+ severity: "error" | "warning";
57
+ }
58
+ /**
59
+ * Strict variant of {@link validateFormat2StepState}: reports unknown keys as
60
+ * diagnostics rather than silently ignoring them.
61
+ *
62
+ * Uses `onExcessProperty: "error"` so Effect Schema flags any key that has no
63
+ * corresponding parameter definition. Returns an empty array if the schema
64
+ * cannot be built or validation passes.
65
+ */
66
+ export declare function validateFormat2StepStateStrict(inputs: ToolParameterModel[], format2State: Record<string, unknown>): ToolStateDiagnostic[];
46
67
  //# sourceMappingURL=stateful-validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stateful-validate.d.ts","sourceRoot":"","sources":["../../src/workflow/stateful-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG9F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAGlC,KAAK,EAAE,eAAe;aACtB,MAAM,EAAE,MAAM,EAAE;IAHlC,QAAQ,CAAC,IAAI,EAAG,6BAA6B,CAAU;gBAErC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,EAAE;CAKnC;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC7C,IAAI,CAiBN;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,IAAI,CAaN"}
1
+ {"version":3,"file":"stateful-validate.d.ts","sourceRoot":"","sources":["../../src/workflow/stateful-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG9F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAGlC,KAAK,EAAE,eAAe;aACtB,MAAM,EAAE,MAAM,EAAE;IAHlC,QAAQ,CAAC,IAAI,EAAG,6BAA6B,CAAU;gBAErC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,EAAE;CAKnC;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC7C,IAAI,CAiBN;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,IAAI,CAaN;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,kBAAkB,EAAE,EAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,mBAAmB,EAAE,CAqBvB"}
@@ -93,4 +93,31 @@ export function validateFormat2StepState(inputs, format2State) {
93
93
  throw new ConversionValidationFailure("post", formatIssues(result.left));
94
94
  }
95
95
  }
96
+ /**
97
+ * Strict variant of {@link validateFormat2StepState}: reports unknown keys as
98
+ * diagnostics rather than silently ignoring them.
99
+ *
100
+ * Uses `onExcessProperty: "error"` so Effect Schema flags any key that has no
101
+ * corresponding parameter definition. Returns an empty array if the schema
102
+ * cannot be built or validation passes.
103
+ */
104
+ export function validateFormat2StepStateStrict(inputs, format2State) {
105
+ const bundle = buildBundle(inputs);
106
+ const model = createFieldModel(bundle, "workflow_step");
107
+ if (!model)
108
+ return [];
109
+ const state = deepClone(format2State);
110
+ stripConnectedValues(inputs, state);
111
+ const decode = S.decodeUnknownEither(model, { onExcessProperty: "error" });
112
+ const result = decode(state);
113
+ if (result._tag === "Left") {
114
+ const issues = ParseResult.ArrayFormatter.formatErrorSync(result.left);
115
+ return issues.map((i) => ({
116
+ path: i.path.map(String).join("."),
117
+ message: i.message,
118
+ severity: "error",
119
+ }));
120
+ }
121
+ return [];
122
+ }
96
123
  //# sourceMappingURL=stateful-validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stateful-validate.js","sourceRoot":"","sources":["../../src/workflow/stateful-validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stateful-validate.js","sourceRoot":"","sources":["../../src/workflow/stateful-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { WorkflowFormat } from "./detect-format.js";
2
+ /**
3
+ * Native: reject tool_state that is a JSON string instead of a parsed dict.
4
+ * Walks top-level steps only (matching Python `validate_encoding_native`).
5
+ */
6
+ export declare function validateEncodingNative(workflowDict: Record<string, unknown>): string[];
7
+ /**
8
+ * Format2: reject steps using `tool_state` field instead of `state`.
9
+ *
10
+ * No string-state check — format2 state comes from YAML parsing so
11
+ * it's always a dict. The Python side checks this defensively but
12
+ * it's not a real-world scenario.
13
+ */
14
+ export declare function validateEncodingFormat2(workflowDict: Record<string, unknown>): string[];
15
+ /** Dispatch encoding check based on format auto-detection. */
16
+ export declare function checkStrictEncoding(workflowDict: Record<string, unknown>, format?: WorkflowFormat): string[];
17
+ /**
18
+ * Strict structure check — decode with onExcessProperty: "error" to
19
+ * catch unknown keys at envelope and step level.
20
+ */
21
+ export declare function checkStrictStructure(workflowDict: Record<string, unknown>, format?: WorkflowFormat): string[];
22
+ //# sourceMappingURL=strict-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-checks.d.ts","sourceRoot":"","sources":["../../src/workflow/strict-checks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAqBtF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAiBvF;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,MAAM,CAAC,EAAE,cAAc,GACtB,MAAM,EAAE,CAKV;AASD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,MAAM,CAAC,EAAE,cAAc,GACtB,MAAM,EAAE,CAcV"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Pre-normalization strict validation checks for workflows.
3
+ *
4
+ * These run on raw workflow dicts before any schema normalization,
5
+ * matching the Python pattern of failing fast before decoding.
6
+ */
7
+ import { NativeGalaxyWorkflowSchema, GalaxyWorkflowSchema } from "./raw/index.js";
8
+ import { detectFormat } from "./detect-format.js";
9
+ import { withClass } from "./validators.js";
10
+ import * as ParseResult from "effect/ParseResult";
11
+ import * as S from "effect/Schema";
12
+ // ── Encoding checks ──────────────────────────────────────────────────
13
+ /**
14
+ * Native: reject tool_state that is a JSON string instead of a parsed dict.
15
+ * Walks top-level steps only (matching Python `validate_encoding_native`).
16
+ */
17
+ export function validateEncodingNative(workflowDict) {
18
+ const errors = [];
19
+ const steps = workflowDict.steps;
20
+ if (!steps || typeof steps !== "object")
21
+ return errors;
22
+ const entries = Array.isArray(steps)
23
+ ? steps.map((s, i) => [String(i), s])
24
+ : Object.entries(steps);
25
+ for (const [key, step] of entries) {
26
+ if (!step || typeof step !== "object")
27
+ continue;
28
+ const s = step;
29
+ if (s.type === "subworkflow")
30
+ continue;
31
+ if (!s.tool_id)
32
+ continue;
33
+ const toolState = s.tool_state;
34
+ if (typeof toolState === "string") {
35
+ errors.push(`step ${key}: tool_state is a JSON string (legacy encoding), expected a dict`);
36
+ }
37
+ }
38
+ return errors;
39
+ }
40
+ /**
41
+ * Format2: reject steps using `tool_state` field instead of `state`.
42
+ *
43
+ * No string-state check — format2 state comes from YAML parsing so
44
+ * it's always a dict. The Python side checks this defensively but
45
+ * it's not a real-world scenario.
46
+ */
47
+ export function validateEncodingFormat2(workflowDict) {
48
+ const errors = [];
49
+ const steps = workflowDict.steps;
50
+ if (!steps || !Array.isArray(steps))
51
+ return errors;
52
+ for (let i = 0; i < steps.length; i++) {
53
+ const step = steps[i];
54
+ if (!step || typeof step !== "object")
55
+ continue;
56
+ const s = step;
57
+ if (s.run && typeof s.run === "object")
58
+ continue; // subworkflow
59
+ if (!s.tool_id)
60
+ continue;
61
+ if ("tool_state" in s && !("state" in s)) {
62
+ errors.push(`step ${i}: uses "tool_state" instead of "state" (format2 should use "state")`);
63
+ }
64
+ }
65
+ return errors;
66
+ }
67
+ /** Dispatch encoding check based on format auto-detection. */
68
+ export function checkStrictEncoding(workflowDict, format) {
69
+ const fmt = format ?? detectFormat(workflowDict);
70
+ return fmt === "native"
71
+ ? validateEncodingNative(workflowDict)
72
+ : validateEncodingFormat2(workflowDict);
73
+ }
74
+ // ── Structure checks ─────────────────────────────────────────────────
75
+ function formatIssues(error) {
76
+ const issues = ParseResult.ArrayFormatter.formatErrorSync(error);
77
+ return issues.map((i) => `${i.path.join(".")}: ${i.message}`);
78
+ }
79
+ /**
80
+ * Strict structure check — decode with onExcessProperty: "error" to
81
+ * catch unknown keys at envelope and step level.
82
+ */
83
+ export function checkStrictStructure(workflowDict, format) {
84
+ const fmt = format ?? detectFormat(workflowDict);
85
+ const cls = fmt === "native" ? "NativeGalaxyWorkflow" : "GalaxyWorkflow";
86
+ const data = withClass(workflowDict, cls);
87
+ const schema = fmt === "native" ? NativeGalaxyWorkflowSchema : GalaxyWorkflowSchema;
88
+ const decode = S.decodeUnknownEither(schema, { onExcessProperty: "error" });
89
+ const result = decode(data);
90
+ if (result._tag === "Left") {
91
+ return formatIssues(result.left);
92
+ }
93
+ return [];
94
+ }
95
+ //# sourceMappingURL=strict-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-checks.js","sourceRoot":"","sources":["../../src/workflow/strict-checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,eAAe,CAAC;AAEnC,wEAAwE;AAExE;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAqC;IAC1E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAEvD,MAAM,OAAO,GAAwB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC;IAErD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;YAAE,SAAS;QACvC,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAS;QAEzB,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC;QAC/B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,kEAAkE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,YAAqC;IAC3E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACjC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,SAAS,CAAC,cAAc;QAChE,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAS;QAEzB,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CACjC,YAAqC,EACrC,MAAuB;IAEvB,MAAM,GAAG,GAAG,MAAM,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;IACjD,OAAO,GAAG,KAAK,QAAQ;QACrB,CAAC,CAAC,sBAAsB,CAAC,YAAY,CAAC;QACtC,CAAC,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,wEAAwE;AAExE,SAAS,YAAY,CAAC,KAA6B;IACjD,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAqC,EACrC,MAAuB;IAEvB,MAAM,GAAG,GAAG,MAAM,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACzE,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAE1C,MAAM,MAAM,GACV,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACvE,MAAM,MAAM,GAAG,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,14 @@
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 declare function parseToolState(raw: unknown): Record<string, unknown>;
14
+ //# sourceMappingURL=tool-state-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-state-io.d.ts","sourceRoot":"","sources":["../../src/workflow/tool-state-io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBpE"}
@@ -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"}