@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/LICENSE +21 -0
- package/README.md +55 -0
- package/dist/element.d.ts +73 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +226 -0
- package/dist/element.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs.d.ts +48 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +254 -0
- package/dist/inputs.js.map +1 -0
- package/dist/loader.d.ts +8 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +15 -0
- package/dist/loader.js.map +1 -0
- package/dist/macros.d.ts +19 -0
- package/dist/macros.d.ts.map +1 -0
- package/dist/macros.js +239 -0
- package/dist/macros.js.map +1 -0
- package/dist/outputs.d.ts +15 -0
- package/dist/outputs.d.ts.map +1 -0
- package/dist/outputs.js +165 -0
- package/dist/outputs.js.map +1 -0
- package/dist/parse.d.ts +17 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +66 -0
- package/dist/parse.js.map +1 -0
- package/dist/tool-source.d.ts +42 -0
- package/dist/tool-source.d.ts.map +1 -0
- package/dist/tool-source.js +124 -0
- package/dist/tool-source.js.map +1 -0
- package/package.json +53 -0
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":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAW9D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;;;;;;;;;;;GAcG;AAEH,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,kBAAkB,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,0CAA0C;AAC1C,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF;AAED,2CAA2C;AAC3C,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,SAAqB;QAArB,cAAS,GAAT,SAAS,CAAY;IAAG,CAAC;IAEtD,GAAG,CAAC,GAAW,EAAE,YAAsB;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,YAAqB;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,cAAc;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAC/B,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,aAAa,CAAC;QAChD,IAAI,GAAG,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS;QACP,wEAAwE;QACxE,gDAAgD;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,UAAU;QACR,wEAAwE;QACxE,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;IAClD,CAAC;IAED,SAAS;QACP,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,aAAa,CAAC,YAAY,GAAG,KAAK;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,aAAa,EAAE,CAAC;YACvC,sDAAsD;YACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;gBAChD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,WAAW,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,eAAe;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAW,CAAC;QACjD,OAAO,GAAG;aACP,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,iBAAiB;QACf,2EAA2E;QAC3E,mEAAmE;QACnE,OAAO,CACL,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAC5F,CAAC;IACJ,CAAC;IAED,kBAAkB;QAChB,yEAAyE;QACzE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC9C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC;YAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,0BAA0B;QACxB,gEAAgE;QAChE,6EAA6E;QAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrD,CAAC;IAED,2BAA2B;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,WAAW,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,qBAAqB,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,eAAe;QACb,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,uBAAuB;QACrB,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,oBAAoB;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,qBAAqB;QACnB,OAAO,IAAI,CAAC,SAAS;aAClB,YAAY,CAAC,MAAM,CAAC;aACpB,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,YAAY;QACV,wEAAwE;QACxE,+DAA+D;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,WAAW,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YACtC,OAAO,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;YACrE,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI;YACjE,QAAQ,EAAE,mBAAmB,CAAC,WAAW,CAAC;SAC3C,CAAC;IACJ,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,IAAgB;IAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CAAC,cAA0B;IACrD,MAAM,GAAG,GAA8B,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QACrD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,YAAY;gBACnB,UAAU;gBACV,eAAe,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI;gBACnE,QAAQ,EAAE,mBAAmB,CAAC,aAAa,CAAC;aAC7C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAyB;IACtD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1C,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QACzE,OAAO,EAAE,qBAAqB,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACjE,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KACzD,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,SAAqB;IAC/C,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAc;IACvC,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAChD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC;gBAC1B,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC;gBAC1B,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACtD,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACtD,MAAM;gBACN,OAAO;aACR,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;QAC/D,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;gBACvB,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;gBACvB,MAAM;aACP,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;QACpE,KAAK,aAAa;YAChB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QACzC,KAAK,YAAY;YACf,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QACxC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAc,EAAE,GAAW;IAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,OAAO,CAAC,EAAc,EAAE,GAAW;IAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/loader.d.ts
ADDED
|
@@ -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"}
|
package/dist/macros.d.ts
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgB1C,6EAA6E;AAC7E,MAAM,OAAO,WAAW;IACtB,OAAO,CAAa;IACpB,UAAU,CAAS;IACnB,oEAAoE;IACpE,MAAM,CAA6B;IAEnC,YAAY,EAAc;QACxB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,CAAC;YACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrE,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,WAAW,CAAC,QAAoB;QAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,UAAU,CAAC;YACnF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,wDAAwD,GAAG,IAAI,CAAC,CAAC;YACnF,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7E,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,MAA2B;IACrD,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3C,KAAK,MAAM,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC;YAC9C,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,yBAAyB,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,CAAS,EAAE,MAA2B;IAC7D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAmB,EAAE,MAA2B;IACzE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ;QAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,QAA8B,EAAE,MAA2B;IAC/E,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,gBAAgB,CACvB,QAAsB,EACtB,MAAgC,EAChC,MAA2B,EAC3B,OAAiB;IAEjB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,SAAS,CAAC;YACR,MAAM,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,QAAQ,KAAK,IAAI;gBAAE,MAAM;YAC7B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,QAAoB,EACpB,MAAgC,EAChC,MAA2B,EAC3B,OAAiB;IAEjB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,iDAAiD;IACjD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,6CAA6C,QAAQ,mBAAmB,SAAS,SAAS,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,4BAA4B,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC;QAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEtE,uCAAuC;IACvC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,OAAmB,EAAE,QAAoB;IACtE,uBAAuB;IACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,kEAAkE;YAClE,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAC1F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,yBAAyB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC;IAC1E,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACtE,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,SAAS,WAAW,CAAC,MAAkB,EAAE,IAAY,EAAE,EAAc;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;QACnB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,aAAyB,EAAE,MAAkB;IACvE,0BAA0B;IAC1B,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7D,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,8EAA8E;IAC9E,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC;YACtB,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,aAAyB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,aAAyB,EACzB,MAAkB,EAClB,cAA8B;IAE9B,KAAK,MAAM,OAAO,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,aAAyB,EACzB,MAAkB,EAClB,cAA8B;IAE9B,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1D,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,cAA8B;IAC3E,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,MAAM,GAAe,IAAI,GAAG,EAAE,CAAC;IACrC,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,aAAa,CAAC,KAAK,EAAE,CAAC;IAEtB,kBAAkB;IAClB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,qBAAqB;IACrB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAClE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhD,yDAAyD;IACzD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC;QACzB,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -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"}
|