@galaxy-tool-util/tool-xml 1.11.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/inputs.js ADDED
@@ -0,0 +1,254 @@
1
+ import { inputModelsForPage } from "@galaxy-tool-util/schema";
2
+ import { stringAsBool, xmlText } from "./element.js";
3
+ /**
4
+ * XML-backed `InputSource` / `PageSource` — the TS port of Galaxy's
5
+ * `parser.xml.XmlInputSource` / `XmlPageSource`. It adapts an `<inputs>` tree
6
+ * (already macro-expanded) onto the seam consumed by the shared parameter-model
7
+ * factory in `@galaxy-tool-util/schema`, so XML and the inline/YAML dict path
8
+ * build the same `ToolParameterModel` union.
9
+ *
10
+ * Coercion here is XML-native: attribute reads default to string, booleans go
11
+ * through `string_as_bool`, and `parse_static_options` deduplicates `<option>`
12
+ * children by `value` (mirroring the Python source). Dynamic-option detection
13
+ * nulls a select's / drill-down's options but the option source itself is not
14
+ * modeled. Accessors the factory does not consume yet (conversion tuples,
15
+ * sanitizers) are stubbed to their empty forms and grow with the feature slices
16
+ * that need them.
17
+ */
18
+ /** Port of `XmlToolSource.parse_inputs` entry — `<inputs>` tree → models. */
19
+ export function parseInputs(root) {
20
+ const inputsElem = root.findChild("inputs");
21
+ if (inputsElem === null)
22
+ return [];
23
+ return inputModelsForPage(new XmlPageSource(inputsElem));
24
+ }
25
+ /** Port of `parser.xml.XmlPageSource`. */
26
+ export class XmlPageSource {
27
+ parentElem;
28
+ constructor(parentElem) {
29
+ this.parentElem = parentElem;
30
+ }
31
+ parseInputSources() {
32
+ return this.parentElem.children.map((child) => new XmlInputSource(child));
33
+ }
34
+ }
35
+ /** Port of `parser.xml.XmlInputSource`. */
36
+ export class XmlInputSource {
37
+ inputElem;
38
+ constructor(inputElem) {
39
+ this.inputElem = inputElem;
40
+ }
41
+ get(key, defaultValue) {
42
+ const v = this.inputElem.attrs.get(key);
43
+ return v === undefined ? defaultValue : v;
44
+ }
45
+ getBool(key, defaultValue) {
46
+ const v = this.inputElem.attrs.get(key);
47
+ return v === undefined ? defaultValue : stringAsBool(v);
48
+ }
49
+ parseInputType() {
50
+ const tag = this.inputElem.tag;
51
+ if (tag === "conditional")
52
+ return "conditional";
53
+ if (tag === "repeat")
54
+ return "repeat";
55
+ if (tag === "section")
56
+ return "section";
57
+ if (tag === "display")
58
+ return "display";
59
+ return "param";
60
+ }
61
+ parseName() {
62
+ // Mirror `util._parse_name`: prefer `name`, else derive from `argument`
63
+ // (strip leading dashes, dashes → underscores).
64
+ const name = this.inputElem.attrs.get("name");
65
+ if (name !== undefined)
66
+ return name;
67
+ const argument = this.inputElem.attrs.get("argument");
68
+ if (argument === undefined) {
69
+ throw new Error("parameter must specify a 'name' or 'argument'.");
70
+ }
71
+ return argument.replace(/^-+/, "").replace(/-/g, "_");
72
+ }
73
+ parseLabel() {
74
+ // `_common_param_kwargs` drops a falsy label, so empty ≡ absent ≡ null.
75
+ return xmlText(this.inputElem, "label") || null;
76
+ }
77
+ parseHelp() {
78
+ return xmlText(this.inputElem, "help") || null;
79
+ }
80
+ parseOptional(defaultValue = false) {
81
+ const elem = this.inputElem;
82
+ if (this.get("type") === "data_column") {
83
+ // `force_select` is the legacy inverse of `optional`.
84
+ const forceSelect = elem.attrs.has("force_select")
85
+ ? stringAsBool(elem.attrs.get("force_select"))
86
+ : !this.getBool("optional", false);
87
+ return !forceSelect;
88
+ }
89
+ return this.getBool("optional", defaultValue);
90
+ }
91
+ parseExtensions() {
92
+ const raw = this.get("format", "data");
93
+ return raw
94
+ .split(",")
95
+ .map((e) => e.trim().toLowerCase())
96
+ .filter((e) => e !== "");
97
+ }
98
+ hasDynamicOptions() {
99
+ // Mirror `XmlInputSource.parse_dynamic_options`: dynamic when an <options>
100
+ // element is present or a `dynamic_options` code attribute is set.
101
+ return (this.inputElem.findChild("options") !== null || this.inputElem.attrs.has("dynamic_options"));
102
+ }
103
+ parseStaticOptions() {
104
+ // Deduplicate by `value` in document order (last wins) — matches Python.
105
+ const deduped = new Map();
106
+ for (const option of this.inputElem.findChildren("option")) {
107
+ const value = option.attrs.get("value") ?? "";
108
+ const label = option.text.trim() || value;
109
+ const selected = stringAsBool(option.attrs.get("selected"));
110
+ deduped.set(value, { label, value, selected });
111
+ }
112
+ return [...deduped.values()];
113
+ }
114
+ hasDrillDownDynamicOptions() {
115
+ // Mirror `parse_drill_down_dynamic_options`: dynamic only via a
116
+ // `dynamic_options` code attribute (a static <options> tree is not dynamic).
117
+ return this.inputElem.attrs.has("dynamic_options");
118
+ }
119
+ parseDrillDownStaticOptions() {
120
+ const optionsElem = this.inputElem.findChild("options");
121
+ if (optionsElem === null)
122
+ return null;
123
+ return recurseDrillDownElems(optionsElem.findChildren("option"));
124
+ }
125
+ parseValidators() {
126
+ return parseXmlValidators(this.inputElem);
127
+ }
128
+ parseNestedInputsSource() {
129
+ return new XmlPageSource(this.inputElem);
130
+ }
131
+ parseTestInputSource() {
132
+ const paramElem = this.inputElem.findChild("param");
133
+ if (paramElem === null) {
134
+ throw new Error("<conditional> must have a child <param>");
135
+ }
136
+ return new XmlInputSource(paramElem);
137
+ }
138
+ parseWhenInputSources() {
139
+ return this.inputElem
140
+ .findChildren("when")
141
+ .map((caseElem) => [caseElem.attrs.get("value"), new XmlPageSource(caseElem)]);
142
+ }
143
+ parseDefault() {
144
+ // Port of `XmlInputSource.parse_default`: a `<default>` child becomes a
145
+ // File dict for `data`, or a nested Collection dict otherwise.
146
+ const elem = this.inputElem;
147
+ const defaultElem = elem.findChild("default");
148
+ if (defaultElem === null)
149
+ return null;
150
+ if (elem.attrs.get("type") === "data") {
151
+ return fileDefaultFromElem(defaultElem);
152
+ }
153
+ return {
154
+ class: "Collection",
155
+ name: defaultElem.attrs.get("name") ?? elem.attrs.get("name") ?? null,
156
+ collection_type: defaultElem.attrs.get("collection_type") ?? null,
157
+ elements: readDefaultElements(defaultElem),
158
+ };
159
+ }
160
+ }
161
+ function fileDefaultFromElem(elem) {
162
+ return { class: "File", location: elem.attrs.get("location") ?? null };
163
+ }
164
+ function readDefaultElements(collectionElem) {
165
+ const out = [];
166
+ for (const element of collectionElem.findChildren("element")) {
167
+ const identifier = element.attrs.get("name") ?? null;
168
+ const subcollection = element.findChild("collection");
169
+ if (subcollection !== null) {
170
+ out.push({
171
+ class: "Collection",
172
+ identifier,
173
+ collection_type: subcollection.attrs.get("collection_type") ?? null,
174
+ elements: readDefaultElements(subcollection),
175
+ });
176
+ }
177
+ else {
178
+ out.push({ ...fileDefaultFromElem(element), identifier });
179
+ }
180
+ }
181
+ return out;
182
+ }
183
+ function recurseDrillDownElems(optionElems) {
184
+ return optionElems.map((optionElem) => ({
185
+ value: optionElem.attrs.get("value") ?? "",
186
+ name: optionElem.attrs.get("name") ?? optionElem.attrs.get("value") ?? "",
187
+ options: recurseDrillDownElems(optionElem.findChildren("option")),
188
+ selected: stringAsBool(optionElem.attrs.get("selected")),
189
+ }));
190
+ }
191
+ /**
192
+ * Port of `parse_xml_validators` restricted to the validator kinds the factory
193
+ * keeps (`filter_validators`): `in_range`, `regex`, `length`, `expression`,
194
+ * `empty_field`, `no_options`. Other kinds parse in Python only to be dropped
195
+ * downstream, so they are skipped here rather than modeled.
196
+ */
197
+ function parseXmlValidators(inputElem) {
198
+ const models = [];
199
+ for (const el of inputElem.findChildren("validator")) {
200
+ const model = parseXmlValidator(el);
201
+ if (model)
202
+ models.push(model);
203
+ }
204
+ return models;
205
+ }
206
+ function parseXmlValidator(el) {
207
+ const type = el.attrs.get("type");
208
+ const negate = stringAsBool(el.attrs.get("negate"));
209
+ const message = el.attrs.get("message") ?? null;
210
+ switch (type) {
211
+ case "in_range":
212
+ return {
213
+ type: "in_range",
214
+ min: numberAttr(el, "min"),
215
+ max: numberAttr(el, "max"),
216
+ exclude_min: stringAsBool(el.attrs.get("exclude_min")),
217
+ exclude_max: stringAsBool(el.attrs.get("exclude_max")),
218
+ negate,
219
+ message,
220
+ };
221
+ case "regex":
222
+ return { type: "regex", expression: el.text.trim(), negate };
223
+ case "length":
224
+ return {
225
+ type: "length",
226
+ min: intAttr(el, "min"),
227
+ max: intAttr(el, "max"),
228
+ negate,
229
+ };
230
+ case "expression":
231
+ return { type: "expression", expression: el.text.trim(), negate };
232
+ case "empty_field":
233
+ return { type: "empty_field", negate };
234
+ case "no_options":
235
+ return { type: "no_options", negate };
236
+ default:
237
+ return null;
238
+ }
239
+ }
240
+ function numberAttr(el, key) {
241
+ const raw = el.attrs.get(key);
242
+ if (raw === undefined || raw === "")
243
+ return null;
244
+ const n = Number(raw);
245
+ return Number.isNaN(n) ? null : n;
246
+ }
247
+ function intAttr(el, key) {
248
+ const raw = el.attrs.get(key);
249
+ if (raw === undefined || raw === "")
250
+ return null;
251
+ const n = parseInt(raw, 10);
252
+ return Number.isNaN(n) ? null : n;
253
+ }
254
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { XmlElement } from "./element.js";
2
+ /**
3
+ * Load a tool XML file from disk and expand its macros — the filesystem-backed
4
+ * equivalent of ``xml_macros.load(path)``. ``<import>`` paths resolve relative
5
+ * to the tool file's directory (matching Galaxy's ``xml_base_dir``).
6
+ */
7
+ export declare function loadTool(path: string): XmlElement;
8
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAKjD"}
package/dist/loader.js ADDED
@@ -0,0 +1,15 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { parseXmlToTree } from "./element.js";
4
+ import { expandMacros } from "./macros.js";
5
+ /**
6
+ * Load a tool XML file from disk and expand its macros — the filesystem-backed
7
+ * equivalent of ``xml_macros.load(path)``. ``<import>`` paths resolve relative
8
+ * to the tool file's directory (matching Galaxy's ``xml_base_dir``).
9
+ */
10
+ export function loadTool(path) {
11
+ const baseDir = dirname(path);
12
+ const importResolver = (relPath) => parseXmlToTree(readFileSync(join(baseDir, relPath), "utf-8"));
13
+ return expandMacros(parseXmlToTree(readFileSync(path, "utf-8")), importResolver);
14
+ }
15
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAuB,MAAM,aAAa,CAAC;AAEhE;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,cAAc,GAAmB,CAAC,OAAO,EAAE,EAAE,CACjD,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,OAAO,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { XmlElement } from "./element.js";
2
+ /** Resolve an ``<import>`` path to the parsed root of that macros file. */
3
+ export type ImportResolver = (relativePath: string) => XmlElement;
4
+ /** Representation of a (Galaxy) ``<xml>`` macro and its parameter tokens. */
5
+ export declare class XmlMacroDef {
6
+ element: XmlElement;
7
+ tokenQuote: string;
8
+ /** param name → default value (null marks a required parameter). */
9
+ tokens: Map<string, string | null>;
10
+ constructor(el: XmlElement);
11
+ /** Map macro-parameter token names (quoted, upper-cased) to their values. */
12
+ macroTokens(expandEl: XmlElement): Map<string, string>;
13
+ }
14
+ /**
15
+ * Expand macros in an XML tool tree in place and return its root — port of
16
+ * ``xml_macros.load_with_references`` (without returning the import path list).
17
+ */
18
+ export declare function expandMacros(root: XmlElement, importResolver: ImportResolver): XmlElement;
19
+ //# sourceMappingURL=macros.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macros.d.ts","sourceRoot":"","sources":["../src/macros.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAY/C,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,UAAU,CAAC;AAElE,6EAA6E;AAC7E,qBAAa,WAAW;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;gBAEvB,EAAE,EAAE,UAAU;IAgB1B,6EAA6E;IAC7E,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAYvD;AAkMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,GAAG,UAAU,CAiCzF"}
package/dist/macros.js ADDED
@@ -0,0 +1,239 @@
1
+ import { xmlReplace } from "./element.js";
2
+ /** Representation of a (Galaxy) ``<xml>`` macro and its parameter tokens. */
3
+ export class XmlMacroDef {
4
+ element;
5
+ tokenQuote;
6
+ /** param name → default value (null marks a required parameter). */
7
+ tokens;
8
+ constructor(el) {
9
+ this.element = el;
10
+ this.tokenQuote = "@";
11
+ this.tokens = new Map();
12
+ for (const [key, value] of el.attrs) {
13
+ if (key === "token_quote") {
14
+ this.tokenQuote = value;
15
+ }
16
+ if (key === "tokens") {
17
+ for (const token of value.split(","))
18
+ this.tokens.set(token, null);
19
+ }
20
+ else if (key.startsWith("token_")) {
21
+ this.tokens.set(key.slice("token_".length), value);
22
+ }
23
+ }
24
+ }
25
+ /** Map macro-parameter token names (quoted, upper-cased) to their values. */
26
+ macroTokens(expandEl) {
27
+ const tokens = new Map();
28
+ for (const [key, defaultVal] of this.tokens) {
29
+ const tokenValue = expandEl.attrs.has(key) ? expandEl.attrs.get(key) : defaultVal;
30
+ if (tokenValue === null) {
31
+ throw new Error(`Failed to expand macro - missing required parameter [${key}].`);
32
+ }
33
+ const tokenName = `${this.tokenQuote}${key.toUpperCase()}${this.tokenQuote}`;
34
+ tokens.set(tokenName, tokenValue);
35
+ }
36
+ return tokens;
37
+ }
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // Tokens
41
+ // ---------------------------------------------------------------------------
42
+ function expandNestedTokens(tokens) {
43
+ for (const tokenName of [...tokens.keys()]) {
44
+ for (const currentName of [...tokens.keys()]) {
45
+ const currentValue = tokens.get(currentName);
46
+ if (currentValue.includes(tokenName)) {
47
+ if (tokenName === currentName) {
48
+ throw new Error(`Token '${tokenName}' cannot contain itself`);
49
+ }
50
+ tokens.set(currentName, currentValue.split(tokenName).join(tokens.get(tokenName)));
51
+ }
52
+ }
53
+ }
54
+ return tokens;
55
+ }
56
+ function expandTokensStr(s, tokens) {
57
+ for (const [key, value] of tokens) {
58
+ if (s.includes(key))
59
+ s = s.split(key).join(value);
60
+ }
61
+ return s;
62
+ }
63
+ /**
64
+ * Expand tokens in an element's text, attribute values and attribute names,
65
+ * then recurse into children.
66
+ */
67
+ function expandTokensForEl(element, tokens) {
68
+ if (element.text) {
69
+ element.text = expandTokensStr(element.text, tokens);
70
+ }
71
+ const newAttrs = new Map();
72
+ for (const [key, value] of element.attrs) {
73
+ newAttrs.set(expandTokensStr(key, tokens), expandTokensStr(value, tokens));
74
+ }
75
+ element.attrs = newAttrs;
76
+ for (const child of element.children)
77
+ expandTokensForEl(child, tokens);
78
+ }
79
+ function expandTokens(elements, tokens) {
80
+ if (tokens.size === 0)
81
+ return;
82
+ for (const element of elements)
83
+ expandTokensForEl(element, tokens);
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Macro (<expand>) expansion
87
+ // ---------------------------------------------------------------------------
88
+ function expandMacrosList(elements, macros, tokens, visited) {
89
+ if (macros.size === 0 && tokens.size === 0)
90
+ return;
91
+ for (const element of elements) {
92
+ for (;;) {
93
+ const expandEl = element.findFirstDescendant("expand");
94
+ if (expandEl === null)
95
+ break;
96
+ expandMacro(expandEl, macros, tokens, visited);
97
+ }
98
+ }
99
+ }
100
+ function expandMacro(expandEl, macros, tokens, visited) {
101
+ const macroName = expandEl.attrs.get("macro");
102
+ if (macroName === undefined) {
103
+ throw new Error("Attempted to expand macro with no 'macro' attribute defined.");
104
+ }
105
+ // check for cycles in the nested macro expansion
106
+ if (visited.includes(macroName)) {
107
+ const expanded = visited.map((v) => `'${v}'`).join(", ");
108
+ throw new Error(`Cycle in nested macros: already expanded [${expanded}] can't expand '${macroName}' again`);
109
+ }
110
+ visited.push(macroName);
111
+ const macroDef = macros.get(macroName);
112
+ if (macroDef === undefined) {
113
+ throw new Error(`No macro named ${macroName} found, known macros are ${[...macros.keys()].join(", ")}.`);
114
+ }
115
+ const macroEl = macroDef.element.clone();
116
+ expandYieldStatements(macroEl, expandEl);
117
+ const macroTokens = macroDef.macroTokens(expandEl);
118
+ if (macroTokens.size > 0)
119
+ expandTokens(macroEl.children, macroTokens);
120
+ // Recursively expand contained macros.
121
+ expandMacrosList(macroEl.children, macros, tokens, visited);
122
+ xmlReplace(expandEl, macroEl.children);
123
+ visited.pop();
124
+ }
125
+ /**
126
+ * Replace, in ``macroEl``, (1) named ``<yield name=X>`` tags by the children of
127
+ * the matching ``<token name=X>`` direct child of ``expandEl`` (in definition
128
+ * order), then (2) all remaining ``<yield>`` tags by ``expandEl``'s non-token
129
+ * children.
130
+ */
131
+ function expandYieldStatements(macroEl, expandEl) {
132
+ // replace named yields
133
+ for (const tokenEl of expandEl.findChildren("token")) {
134
+ const name = tokenEl.attrs.get("name");
135
+ if (name === undefined) {
136
+ // Mirror Python's `str(token_el.attrib)` single-quoted dict repr.
137
+ const attrs = [...tokenEl.attrs].map(([k, v]) => `'${k}': '${v}'`).join(", ");
138
+ throw new Error(`Found unnamed token{${attrs}}`);
139
+ }
140
+ const yieldEls = macroEl.findAllDescendants("yield", (y) => y.attrs.get("name") === name);
141
+ if (yieldEls.length === 0) {
142
+ throw new Error(`No named yield found for named token ${name}`);
143
+ }
144
+ for (const yieldEl of yieldEls)
145
+ xmlReplace(yieldEl, tokenEl.children);
146
+ }
147
+ // replace unnamed yields
148
+ const yieldEls = macroEl.findAllDescendants("yield");
149
+ const expandChildren = expandEl.children.filter((c) => c.tag !== "token");
150
+ for (const yieldEl of yieldEls)
151
+ xmlReplace(yieldEl, expandChildren);
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // Macro loading (embedded + imported)
155
+ // ---------------------------------------------------------------------------
156
+ function appendMacro(macros, type, el) {
157
+ const list = macros.get(type);
158
+ if (list)
159
+ list.push(el);
160
+ else
161
+ macros.set(type, [el]);
162
+ }
163
+ function loadEmbeddedMacros(macrosElement, macros) {
164
+ // attribute-typed <macro>
165
+ for (const macro of macrosElement.findChildren("macro")) {
166
+ if (!macro.attrs.has("type"))
167
+ macro.attrs.set("type", "xml");
168
+ appendMacro(macros, macro.attrs.get("type"), macro);
169
+ }
170
+ // type shortcuts: <template>/<xml>/<token> are shorthand for <macro type=...>
171
+ for (const tag of ["template", "xml", "token"]) {
172
+ for (const macroEl of macrosElement.findChildren(tag)) {
173
+ macroEl.attrs.set("type", tag);
174
+ macroEl.tag = "macro";
175
+ appendMacro(macros, tag, macroEl);
176
+ }
177
+ }
178
+ }
179
+ function importedMacroPaths(macrosElement) {
180
+ const paths = [];
181
+ for (const importEl of macrosElement.findChildren("import")) {
182
+ const raw = importEl.text;
183
+ if (!raw)
184
+ throw new Error("Empty <import> element in <macros>.");
185
+ paths.push(raw);
186
+ }
187
+ return paths;
188
+ }
189
+ function loadImportedMacros(macrosElement, macros, importResolver) {
190
+ for (const relPath of importedMacroPaths(macrosElement)) {
191
+ const importedRoot = importResolver(relPath);
192
+ loadMacros(importedRoot, macros, importResolver);
193
+ }
194
+ }
195
+ function loadMacros(macrosElement, macros, importResolver) {
196
+ loadImportedMacros(macrosElement, macros, importResolver);
197
+ loadEmbeddedMacros(macrosElement, macros);
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // Entry point
201
+ // ---------------------------------------------------------------------------
202
+ /**
203
+ * Expand macros in an XML tool tree in place and return its root — port of
204
+ * ``xml_macros.load_with_references`` (without returning the import path list).
205
+ */
206
+ export function expandMacros(root, importResolver) {
207
+ const macrosElement = root.findChild("macros");
208
+ if (macrosElement === null)
209
+ return root;
210
+ const macros = new Map();
211
+ loadMacros(macrosElement, macros, importResolver);
212
+ macrosElement.clear();
213
+ // Collect tokens.
214
+ const tokens = new Map();
215
+ for (const m of macros.get("token") ?? []) {
216
+ const tokenName = m.attrs.get("name");
217
+ if (!tokenName)
218
+ throw new Error("<token> macro is missing a name.");
219
+ tokens.set(tokenName, m.text || "");
220
+ }
221
+ expandNestedTokens(tokens);
222
+ // Expand xml macros.
223
+ const macroDict = new Map();
224
+ for (const m of macros.get("xml") ?? []) {
225
+ const macroName = m.attrs.get("name");
226
+ if (!macroName)
227
+ throw new Error("<xml> macro is missing a name.");
228
+ macroDict.set(macroName, new XmlMacroDef(m));
229
+ }
230
+ expandMacrosList([root], macroDict, tokens, []);
231
+ // Reinsert template macros (used during tool execution).
232
+ for (const m of macros.get("template") ?? []) {
233
+ m.parent = macrosElement;
234
+ macrosElement.children.push(m);
235
+ }
236
+ expandTokensForEl(root, tokens);
237
+ return root;
238
+ }
239
+ //# sourceMappingURL=macros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macros.js","sourceRoot":"","sources":["../src/macros.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolOutput } from "@galaxy-tool-util/schema";
2
+ import type { XmlElement } from "./element.js";
3
+ /**
4
+ * Port of ``XmlToolSource.parse_outputs`` + ``output_objects.from_tool_source``
5
+ * — turns an expanded ``<outputs>`` tree into the `ToolOutput` union from
6
+ * `@galaxy-tool-util/schema`. The `discover_datasets` translation reuses that
7
+ * package's shared descriptor parser (Galaxy shares `dataset_collection_description`
8
+ * across the XML and YAML paths too).
9
+ *
10
+ * Raw extraction: the collection-structure invariants Python's
11
+ * `ToolOutputCollectionStructure.__init__` raises on (e.g. both `type` and
12
+ * `type_source`) are not enforced here; those land with `ParsedTool` assembly.
13
+ */
14
+ export declare function parseOutputs(root: XmlElement, profile: string): ToolOutput[];
15
+ //# sourceMappingURL=outputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputs.d.ts","sourceRoot":"","sources":["../src/outputs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,UAAU,EAIX,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAuD5E"}