@galaxy-tool-util/workflow-graph 1.2.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # @galaxy-tool-util/workflow-graph
2
2
 
3
- Pure collection-type algebra and datatype subtyping primitives extracted from Galaxy's workflow editor. No runtime dependencies.
3
+ Pure collection-type algebra, datatype subtyping primitives and the rule builder DSL, extracted from Galaxy. Its one runtime dependency, `pyre-to-regexp`, is the regex translator Galaxy's client uses.
4
4
 
5
5
  See the [workflow-graph package docs](https://jmchilton.github.io/galaxy-tool-util-ts/#/packages/workflow-graph) for the public API and TS-specific notes. The collection-type algebra itself is documented Galaxy-side in [`collection_semantics.yml`](https://github.com/galaxyproject/galaxy/blob/dev/lib/galaxy/model/dataset_collections/types/collection_semantics.yml).
package/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export { acceptsAny, effectiveMapOverAny } from "./collection-type-variants.js";
3
3
  export type { DatatypesCombinedMap } from "./datatypes-combined-map.js";
4
4
  export { DatatypesMapperModel } from "./datatypes-mapper.js";
5
5
  export { ConnectionAcceptable, producesAcceptableDatatype } from "./connection-acceptable.js";
6
+ export { RuleSet, RulesDSLError, SKIPPED_RULE_WARNING, applyRules, colHeadersFor, type ApplyRulesResult, type ClientRule, type Rule, type RuleMapping, type RuleRow, type RuleSetDict, type RuleSource, } from "./rules-dsl.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EACL,OAAO,EACP,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -2,4 +2,5 @@ export { ANY_COLLECTION_TYPE_DESCRIPTION, CollectionTypeDescription, NULL_COLLEC
2
2
  export { acceptsAny, effectiveMapOverAny } from "./collection-type-variants.js";
3
3
  export { DatatypesMapperModel } from "./datatypes-mapper.js";
4
4
  export { ConnectionAcceptable, producesAcceptableDatatype } from "./connection-acceptable.js";
5
+ export { RuleSet, RulesDSLError, SKIPPED_RULE_WARNING, applyRules, colHeadersFor, } from "./rules-dsl.js";
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EACL,OAAO,EACP,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,aAAa,GAQd,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Port of Galaxy's rule builder DSL: `galaxy.util.rules_dsl.RuleSet` and the
3
+ * client's `RuleBuilder/rule-definitions.js` `applyRules`.
4
+ *
5
+ * Conformance is checked against Galaxy's `rules_dsl_spec.yml`, synced via
6
+ * `make sync-rules-dsl-spec`. Python `re` expressions go through
7
+ * `pyre-to-regexp`, as in Galaxy's client.
8
+ */
9
+ export declare class RulesDSLError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ export interface Rule {
13
+ type: string;
14
+ [key: string]: unknown;
15
+ }
16
+ export interface RuleMapping {
17
+ type: string;
18
+ columns: number[];
19
+ [key: string]: unknown;
20
+ }
21
+ export interface RuleSetDict {
22
+ rules: Rule[];
23
+ mapping?: RuleMapping[];
24
+ }
25
+ /** Collection element metadata a rule set reads from; tests also pass bare scalars. */
26
+ export interface RuleSource {
27
+ identifiers?: string[];
28
+ indices?: number[];
29
+ tags?: string[];
30
+ columns?: unknown[];
31
+ hid?: unknown;
32
+ name?: unknown;
33
+ path?: unknown;
34
+ uri?: unknown;
35
+ }
36
+ export type RuleRow = unknown[];
37
+ export declare class RuleSet {
38
+ readonly rules: Rule[];
39
+ readonly mapping: RuleMapping[];
40
+ constructor(ruleSet: RuleSetDict);
41
+ apply(data: RuleRow[], sources: unknown[]): [RuleRow[], unknown[]];
42
+ get hasErrors(): boolean;
43
+ get mappingAsDict(): Record<string, RuleMapping>;
44
+ get identifierColumns(): number[];
45
+ /** Collection type the mapping builds, e.g. `list:paired`; `""` when nothing is mapped. */
46
+ get collectionType(): string;
47
+ }
48
+ /** A rule as Galaxy's rule builder holds it; `applyRules` sets `error` and `warn`. */
49
+ export interface ClientRule extends Rule {
50
+ error?: string | null;
51
+ warn?: string | null;
52
+ }
53
+ export interface ApplyRulesResult {
54
+ data: RuleRow[];
55
+ sources: unknown[];
56
+ columns: string[];
57
+ colHeadersPerRule: string[][];
58
+ }
59
+ export declare const SKIPPED_RULE_WARNING = "Skipped due to previous errors.";
60
+ /** Spreadsheet-style headers (`A`, `B`, …) for the current table width. */
61
+ export declare function colHeadersFor(data: RuleRow[], columns?: string[]): string[];
62
+ /**
63
+ * Galaxy client's `applyRules`: runs rules without validating them, records a
64
+ * failing rule's message on `rule.error` and skips the rest with `rule.warn`.
65
+ */
66
+ export declare function applyRules(data: RuleRow[], sources: unknown[], columns: string[], rules: ClientRule[], headersPerRule?: string[][]): ApplyRulesResult;
67
+ //# sourceMappingURL=rules-dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-dsl.d.ts","sourceRoot":"","sources":["../src/rules-dsl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,uFAAuF;AACvF,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;AA6ZhC,qBAAa,OAAO;IAClB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;gBAEpB,OAAO,EAAE,WAAW;IAQhC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC;IASlE,IAAI,SAAS,IAAI,OAAO,CASvB;IAED,IAAI,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAE/C;IAED,IAAI,iBAAiB,IAAI,MAAM,EAAE,CAShC;IAED,2FAA2F;IAC3F,IAAI,cAAc,IAAI,MAAM,CAU3B;CACF;AAED,sFAAsF;AACtF,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AAEtE,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAG3E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,OAAO,EAAE,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,GAAE,MAAM,EAAE,EAAO,GAC9B,gBAAgB,CAqBlB"}
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Port of Galaxy's rule builder DSL: `galaxy.util.rules_dsl.RuleSet` and the
3
+ * client's `RuleBuilder/rule-definitions.js` `applyRules`.
4
+ *
5
+ * Conformance is checked against Galaxy's `rules_dsl_spec.yml`, synced via
6
+ * `make sync-rules-dsl-spec`. Python `re` expressions go through
7
+ * `pyre-to-regexp`, as in Galaxy's client.
8
+ */
9
+ import pyre from "pyre-to-regexp";
10
+ export class RulesDSLError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = "RulesDSLError";
14
+ }
15
+ }
16
+ const NEW_COLUMN = "new";
17
+ const addsOneColumn = (_rule, columns) => [...columns, NEW_COLUMN];
18
+ const removeColumns = (columns, targets) => columns.filter((_, index) => !targets.includes(index));
19
+ const KEY_TYPE_CHECKS = {
20
+ int: (value) => Number.isInteger(value),
21
+ str: (value) => typeof value === "string",
22
+ bool: (value) => typeof value === "boolean",
23
+ list: (value) => Array.isArray(value),
24
+ };
25
+ function ensureRuleContainsKeys(rule, keys) {
26
+ for (const [key, keyType] of Object.entries(keys)) {
27
+ if (!(key in rule)) {
28
+ throw new RulesDSLError(`Rule of type [${rule.type}] does not contain key [${key}].`);
29
+ }
30
+ if (!KEY_TYPE_CHECKS[keyType](rule[key])) {
31
+ throw new RulesDSLError(`Rule of type [${rule.type}] does not contain correct value type for key [${key}].`);
32
+ }
33
+ }
34
+ }
35
+ function ensureKeyValueIn(rule, key, values) {
36
+ const value = rule[key];
37
+ if (!values.includes(value)) {
38
+ throw new RulesDSLError(`Invalid value [${String(value)}] for [${key}] encountered.`);
39
+ }
40
+ }
41
+ /** Compile a Python `re` pattern the way Galaxy's client does. */
42
+ function compilePattern(expression) {
43
+ try {
44
+ return pyre(String(expression));
45
+ }
46
+ catch {
47
+ throw new RulesDSLError("Invalid regular expression specified.");
48
+ }
49
+ }
50
+ function applyRegex(regex, target, data, replacement, groupCount, allowUnmatched = false) {
51
+ const pattern = compilePattern(regex);
52
+ const groups = groupCount ? Number(groupCount) : 0;
53
+ let failedCount = 0;
54
+ const newData = data.map((row) => {
55
+ const match = pattern.exec(String(row[target]));
56
+ if (!match) {
57
+ if (!allowUnmatched) {
58
+ failedCount++;
59
+ return row;
60
+ }
61
+ return [...row, ...Array(replacement == null && groups ? groups : 1).fill("")];
62
+ }
63
+ if (replacement != null) {
64
+ return [...row, pattern.pyreReplace(match[0], replacement)];
65
+ }
66
+ if (groups) {
67
+ if (match.length - 1 !== groups) {
68
+ failedCount++;
69
+ return row;
70
+ }
71
+ return [...row, ...match.slice(1)];
72
+ }
73
+ return [...row, match[0]];
74
+ });
75
+ if (failedCount > 0) {
76
+ throw new RulesDSLError(`${failedCount} row(s) failed to match specified regular expression.`);
77
+ }
78
+ return newData;
79
+ }
80
+ function filterIndex(keep, items) {
81
+ return items.filter((_, index) => keep(index));
82
+ }
83
+ /** Python `float()` on a cell; throws instead of producing NaN. */
84
+ function toFloat(value) {
85
+ const text = String(value).trim();
86
+ const result = Number(text);
87
+ if (text === "" || (Number.isNaN(result) && text.toLowerCase() !== "nan")) {
88
+ throw new RulesDSLError(`Could not convert [${text}] to a number.`);
89
+ }
90
+ return result;
91
+ }
92
+ function source(sources, index) {
93
+ return sources[index];
94
+ }
95
+ function metadataIndex(value, prefix) {
96
+ const index = Number(value.slice(prefix.length));
97
+ if (!Number.isInteger(index)) {
98
+ throw new RulesDSLError(`Invalid column metadata value [${value}].`);
99
+ }
100
+ return index;
101
+ }
102
+ /** Upload/history metadata only Galaxy's client reads; Python rejects these. */
103
+ const CLIENT_METADATA = ["hid", "name", "path", "uri"];
104
+ const RULES_DEFINITIONS = {
105
+ add_column_metadata: {
106
+ columns: addsOneColumn,
107
+ validate: (rule) => ensureRuleContainsKeys(rule, { value: "str" }),
108
+ apply: (rule, data, sources) => {
109
+ const value = rule.value;
110
+ let cell;
111
+ if (value.startsWith("identifier")) {
112
+ const identifierIndex = metadataIndex(value, "identifier");
113
+ cell = (index) => source(sources, index).identifiers[identifierIndex];
114
+ }
115
+ else if (value.startsWith("index")) {
116
+ const elementIndex = metadataIndex(value, "index");
117
+ cell = (index) => String(source(sources, index).indices[elementIndex]);
118
+ }
119
+ else if (value === "tags") {
120
+ cell = (index) => [...source(sources, index).tags].sort().join(",");
121
+ }
122
+ else if (CLIENT_METADATA.includes(value)) {
123
+ cell = (index) => source(sources, index)[value];
124
+ }
125
+ else {
126
+ throw new RulesDSLError(`Unknown metadata type [${value}]`);
127
+ }
128
+ return [data.map((row, index) => [...row, cell(index)]), sources];
129
+ },
130
+ },
131
+ add_column_group_tag_value: {
132
+ columns: addsOneColumn,
133
+ validate: (rule) => ensureRuleContainsKeys(rule, { value: "str" }),
134
+ apply: (rule, data, sources) => {
135
+ const tagPrefix = `group:${rule.value}:`;
136
+ const newRows = data.map((row, index) => {
137
+ const tag = [...source(sources, index).tags].sort().find((t) => t.startsWith(tagPrefix));
138
+ const value = tag === undefined ? (rule.default_value ?? "") : tag.slice(tagPrefix.length);
139
+ return [...row, value];
140
+ });
141
+ return [newRows, sources];
142
+ },
143
+ },
144
+ add_column_concatenate: {
145
+ columns: addsOneColumn,
146
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_column_0: "int", target_column_1: "int" }),
147
+ apply: (rule, data, sources) => {
148
+ const column0 = rule.target_column_0;
149
+ const column1 = rule.target_column_1;
150
+ return [
151
+ data.map((row) => [...row, row[column0] + row[column1]]),
152
+ sources,
153
+ ];
154
+ },
155
+ },
156
+ add_column_basename: {
157
+ columns: addsOneColumn,
158
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_column: "int" }),
159
+ apply: (rule, data, sources) => [
160
+ applyRegex("[^/]*$", rule.target_column, data),
161
+ sources,
162
+ ],
163
+ },
164
+ add_column_regex: {
165
+ columns: (rule, columns) => {
166
+ const added = rule.replacement == null && rule.group_count ? Number(rule.group_count) : 1;
167
+ return [...columns, ...Array(added).fill(NEW_COLUMN)];
168
+ },
169
+ validate: (rule) => {
170
+ ensureRuleContainsKeys(rule, { target_column: "int", expression: "str" });
171
+ compilePattern(rule.expression);
172
+ },
173
+ apply: (rule, data, sources) => {
174
+ let allowUnmatched = false;
175
+ if ("allow_unmatched" in rule) {
176
+ ensureRuleContainsKeys(rule, { allow_unmatched: "bool" });
177
+ allowUnmatched = rule.allow_unmatched;
178
+ }
179
+ const newData = applyRegex(rule.expression, rule.target_column, data, rule.replacement, rule.group_count, allowUnmatched);
180
+ return [newData, sources];
181
+ },
182
+ },
183
+ add_column_rownum: {
184
+ columns: addsOneColumn,
185
+ validate: (rule) => ensureRuleContainsKeys(rule, { start: "int" }),
186
+ apply: (rule, data, sources) => {
187
+ const start = rule.start;
188
+ return [data.map((row, index) => [...row, `${index + start}`]), sources];
189
+ },
190
+ },
191
+ add_column_value: {
192
+ columns: addsOneColumn,
193
+ validate: (rule) => ensureRuleContainsKeys(rule, { value: "str" }),
194
+ apply: (rule, data, sources) => [data.map((row) => [...row, String(rule.value)]), sources],
195
+ },
196
+ add_column_substr: {
197
+ columns: addsOneColumn,
198
+ validate: (rule) => {
199
+ ensureRuleContainsKeys(rule, { target_column: "int", length: "int", substr_type: "str" });
200
+ ensureKeyValueIn(rule, "substr_type", [
201
+ "keep_prefix",
202
+ "drop_prefix",
203
+ "keep_suffix",
204
+ "drop_suffix",
205
+ ]);
206
+ },
207
+ apply: (rule, data, sources) => {
208
+ const target = rule.target_column;
209
+ const length = rule.length;
210
+ const substrType = rule.substr_type;
211
+ const newRows = data.map((row) => {
212
+ const original = row[target];
213
+ let start = 0;
214
+ let end = original.length;
215
+ if (substrType === "keep_prefix") {
216
+ end = length;
217
+ }
218
+ else if (substrType === "drop_prefix") {
219
+ start = length;
220
+ }
221
+ else if (substrType === "keep_suffix") {
222
+ start = Math.max(end - length, 0);
223
+ }
224
+ else {
225
+ end = Math.max(end - length, 0);
226
+ }
227
+ return [...row, original.slice(start, end)];
228
+ });
229
+ return [newRows, sources];
230
+ },
231
+ },
232
+ add_column_from_sample_sheet_index: {
233
+ columns: addsOneColumn,
234
+ validate: (rule) => ensureRuleContainsKeys(rule, { value: "int" }),
235
+ apply: (rule, data, sources) => {
236
+ const columnIndex = rule.value;
237
+ return [
238
+ data.map((row, index) => [...row, source(sources, index).columns[columnIndex]]),
239
+ sources,
240
+ ];
241
+ },
242
+ },
243
+ remove_columns: {
244
+ columns: (rule, columns) => removeColumns(columns, rule.target_columns),
245
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_columns: "list" }),
246
+ apply: (rule, data, sources) => {
247
+ const targetColumns = rule.target_columns;
248
+ return [data.map((row) => row.filter((_, index) => !targetColumns.includes(index))), sources];
249
+ },
250
+ },
251
+ add_filter_regex: {
252
+ validate: (rule) => {
253
+ ensureRuleContainsKeys(rule, { target_column: "int", invert: "bool", expression: "str" });
254
+ compilePattern(rule.expression);
255
+ },
256
+ apply: (rule, data, sources) => {
257
+ const pattern = compilePattern(rule.expression);
258
+ const invert = rule.invert;
259
+ const keep = (index) => pattern.test(String(data[index][rule.target_column])) ? !invert : invert;
260
+ return [filterIndex(keep, data), filterIndex(keep, sources)];
261
+ },
262
+ },
263
+ add_filter_count: {
264
+ validate: (rule) => {
265
+ ensureRuleContainsKeys(rule, { count: "int", invert: "bool", which: "str" });
266
+ ensureKeyValueIn(rule, "which", ["first", "last"]);
267
+ },
268
+ apply: (rule, data, sources) => {
269
+ const numRows = data.length;
270
+ const n = rule.count;
271
+ const invert = rule.invert;
272
+ const keep = (index) => {
273
+ const matches = rule.which === "first" ? index >= n : index < numRows - n;
274
+ return matches ? !invert : invert;
275
+ };
276
+ return [filterIndex(keep, data), filterIndex(keep, sources)];
277
+ },
278
+ },
279
+ add_filter_empty: {
280
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_column: "int", invert: "bool" }),
281
+ apply: (rule, data, sources) => {
282
+ const invert = rule.invert;
283
+ const keep = (index) => data[index][rule.target_column].length !== 0 ? !invert : invert;
284
+ return [filterIndex(keep, data), filterIndex(keep, sources)];
285
+ },
286
+ },
287
+ add_filter_matches: {
288
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_column: "int", invert: "bool", value: "str" }),
289
+ apply: (rule, data, sources) => {
290
+ const invert = rule.invert;
291
+ const keep = (index) => data[index][rule.target_column] === rule.value ? !invert : invert;
292
+ return [filterIndex(keep, data), filterIndex(keep, sources)];
293
+ },
294
+ },
295
+ add_filter_compare: {
296
+ validate: (rule) => {
297
+ ensureRuleContainsKeys(rule, { target_column: "int", value: "int", compare_type: "str" });
298
+ ensureKeyValueIn(rule, "compare_type", [
299
+ "less_than",
300
+ "less_than_equal",
301
+ "greater_than",
302
+ "greater_than_equal",
303
+ ]);
304
+ },
305
+ apply: (rule, data, sources) => {
306
+ const value = rule.value;
307
+ const keep = (index) => {
308
+ const target = toFloat(data[index][rule.target_column]);
309
+ switch (rule.compare_type) {
310
+ case "less_than":
311
+ return target < value;
312
+ case "less_than_equal":
313
+ return target <= value;
314
+ case "greater_than":
315
+ return target > value;
316
+ default:
317
+ return target >= value;
318
+ }
319
+ };
320
+ return [filterIndex(keep, data), filterIndex(keep, sources)];
321
+ },
322
+ },
323
+ sort: {
324
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_column: "int", numeric: "bool" }),
325
+ apply: (rule, data, sources) => {
326
+ const target = rule.target_column;
327
+ const key = (row) => (rule.numeric ? toFloat(row[target]) : String(row[target]));
328
+ // Array.prototype.sort is stable, matching Python's sorted().
329
+ const sorted = data
330
+ .map((row, index) => ({ row, source: sources[index], key: key(row) }))
331
+ .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
332
+ return [sorted.map((item) => item.row), sorted.map((item) => item.source)];
333
+ },
334
+ },
335
+ swap_columns: {
336
+ columns: (rule, columns) => {
337
+ const swapped = [...columns];
338
+ swapped[rule.target_column_0] = columns[rule.target_column_1];
339
+ swapped[rule.target_column_1] = columns[rule.target_column_0];
340
+ return swapped;
341
+ },
342
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_column_0: "int", target_column_1: "int" }),
343
+ apply: (rule, data, sources) => {
344
+ const column0 = rule.target_column_0;
345
+ const column1 = rule.target_column_1;
346
+ const newRows = data.map((row) => {
347
+ const copy = [...row];
348
+ copy[column0] = row[column1];
349
+ copy[column1] = row[column0];
350
+ return copy;
351
+ });
352
+ return [newRows, sources];
353
+ },
354
+ },
355
+ split_columns: {
356
+ columns: (rule, columns) => removeColumns(columns, rule.target_columns_0),
357
+ validate: (rule) => ensureRuleContainsKeys(rule, { target_columns_0: "list", target_columns_1: "list" }),
358
+ apply: (rule, data, sources) => {
359
+ const columns0 = rule.target_columns_0;
360
+ const columns1 = rule.target_columns_1;
361
+ const newRows = data.flatMap((row) => {
362
+ const row0 = [];
363
+ const row1 = [];
364
+ row.forEach((cell, index) => {
365
+ if (columns0.includes(index)) {
366
+ row0.push(cell);
367
+ }
368
+ else if (columns1.includes(index)) {
369
+ row1.push(cell);
370
+ }
371
+ else {
372
+ row0.push(cell);
373
+ row1.push(cell);
374
+ }
375
+ });
376
+ return [row0, row1];
377
+ });
378
+ return [newRows, sources.flatMap((s) => [s, s])];
379
+ },
380
+ },
381
+ };
382
+ function ruleDefinition(rule) {
383
+ const definition = RULES_DEFINITIONS[rule.type];
384
+ if (!definition) {
385
+ throw new RulesDSLError(`Unknown rule type [${rule.type}].`);
386
+ }
387
+ return definition;
388
+ }
389
+ export class RuleSet {
390
+ rules;
391
+ mapping;
392
+ constructor(ruleSet) {
393
+ if (!Array.isArray(ruleSet.rules)) {
394
+ throw new RulesDSLError("Rule set does not contain [rules].");
395
+ }
396
+ this.rules = ruleSet.rules;
397
+ this.mapping = ruleSet.mapping ?? [];
398
+ }
399
+ apply(data, sources) {
400
+ for (const rule of this.rules) {
401
+ const definition = ruleDefinition(rule);
402
+ definition.validate(rule);
403
+ [data, sources] = definition.apply(rule, data, sources);
404
+ }
405
+ return [data, sources];
406
+ }
407
+ get hasErrors() {
408
+ try {
409
+ for (const rule of this.rules) {
410
+ ruleDefinition(rule).validate(rule);
411
+ }
412
+ }
413
+ catch {
414
+ return true;
415
+ }
416
+ return false;
417
+ }
418
+ get mappingAsDict() {
419
+ return Object.fromEntries(this.mapping.map((m) => [m.type, m]));
420
+ }
421
+ get identifierColumns() {
422
+ const mapping = this.mappingAsDict;
423
+ const columns = [...(mapping.list_identifiers?.columns ?? [])];
424
+ for (const type of ["paired_identifier", "paired_or_unpaired_identifier"]) {
425
+ if (mapping[type]) {
426
+ columns.push(mapping[type].columns[0]);
427
+ }
428
+ }
429
+ return columns;
430
+ }
431
+ /** Collection type the mapping builds, e.g. `list:paired`; `""` when nothing is mapped. */
432
+ get collectionType() {
433
+ const mapping = this.mappingAsDict;
434
+ const ranks = (mapping.list_identifiers?.columns ?? []).map(() => "list");
435
+ if (mapping.paired_identifier) {
436
+ ranks.push("paired");
437
+ }
438
+ if (mapping.paired_or_unpaired_identifier) {
439
+ ranks.push("paired_or_unpaired");
440
+ }
441
+ return ranks.join(":");
442
+ }
443
+ }
444
+ export const SKIPPED_RULE_WARNING = "Skipped due to previous errors.";
445
+ /** Spreadsheet-style headers (`A`, `B`, …) for the current table width. */
446
+ export function colHeadersFor(data, columns) {
447
+ const width = data.length === 0 ? (columns?.length ?? 0) : data[0].length;
448
+ return Array.from({ length: width }, (_, i) => String.fromCharCode(65 + i));
449
+ }
450
+ /**
451
+ * Galaxy client's `applyRules`: runs rules without validating them, records a
452
+ * failing rule's message on `rule.error` and skips the rest with `rule.warn`.
453
+ */
454
+ export function applyRules(data, sources, columns, rules, headersPerRule = []) {
455
+ const colHeadersPerRule = Array.from(headersPerRule);
456
+ let hasRuleError = false;
457
+ rules.forEach((rule, ruleIndex) => {
458
+ colHeadersPerRule[ruleIndex] = colHeadersFor(data, columns);
459
+ rule.error = null;
460
+ rule.warn = null;
461
+ if (hasRuleError) {
462
+ rule.warn = SKIPPED_RULE_WARNING;
463
+ return;
464
+ }
465
+ try {
466
+ const definition = ruleDefinition(rule);
467
+ [data, sources] = definition.apply(rule, data, sources);
468
+ columns = definition.columns ? definition.columns(rule, columns) : columns;
469
+ }
470
+ catch (e) {
471
+ hasRuleError = true;
472
+ rule.error = e instanceof Error ? e.message : String(e);
473
+ }
474
+ });
475
+ return { data, sources, columns, colHeadersPerRule };
476
+ }
477
+ //# sourceMappingURL=rules-dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-dsl.js","sourceRoot":"","sources":["../src/rules-dsl.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@galaxy-tool-util/workflow-graph",
3
- "version": "1.2.0",
4
- "description": "Pure collection-type algebra and datatype subtyping primitives extracted from Galaxy's workflow editor",
3
+ "version": "1.15.0",
4
+ "description": "Pure collection-type algebra, datatype subtyping primitives and rule builder DSL extracted from Galaxy",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "exports": {
@@ -35,6 +35,9 @@
35
35
  "devDependencies": {
36
36
  "yaml": "^2.8.3"
37
37
  },
38
+ "dependencies": {
39
+ "pyre-to-regexp": "0.0.6"
40
+ },
38
41
  "scripts": {
39
42
  "build": "tsc",
40
43
  "typecheck": "tsc --noEmit",