marcattacks 2.5.1 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +91 -2
  2. package/dist/attacker.d.ts +6 -0
  3. package/dist/attacker.d.ts.map +1 -1
  4. package/dist/attacker.js +38 -0
  5. package/dist/attacker.js.map +1 -1
  6. package/dist/command.js +1 -0
  7. package/dist/command.js.map +1 -1
  8. package/dist/fix/binds.d.ts +5 -0
  9. package/dist/fix/binds.d.ts.map +1 -0
  10. package/dist/fix/binds.js +82 -0
  11. package/dist/fix/binds.js.map +1 -0
  12. package/dist/fix/conditions.d.ts +5 -0
  13. package/dist/fix/conditions.d.ts.map +1 -0
  14. package/dist/fix/conditions.js +111 -0
  15. package/dist/fix/conditions.js.map +1 -0
  16. package/dist/fix/fixes.d.ts +7 -0
  17. package/dist/fix/fixes.d.ts.map +1 -0
  18. package/dist/fix/fixes.js +478 -0
  19. package/dist/fix/fixes.js.map +1 -0
  20. package/dist/fix/index.d.ts +12 -0
  21. package/dist/fix/index.d.ts.map +1 -0
  22. package/dist/fix/index.js +40 -0
  23. package/dist/fix/index.js.map +1 -0
  24. package/dist/fix/parser.d.ts +25 -0
  25. package/dist/fix/parser.d.ts.map +1 -0
  26. package/dist/fix/parser.js +156 -0
  27. package/dist/fix/parser.js.map +1 -0
  28. package/dist/fix/path.d.ts +23 -0
  29. package/dist/fix/path.d.ts.map +1 -0
  30. package/dist/fix/path.js +351 -0
  31. package/dist/fix/path.js.map +1 -0
  32. package/dist/fix/signal.d.ts +2 -0
  33. package/dist/fix/signal.d.ts.map +1 -0
  34. package/dist/fix/signal.js +5 -0
  35. package/dist/fix/signal.js.map +1 -0
  36. package/dist/fix/util.d.ts +6 -0
  37. package/dist/fix/util.d.ts.map +1 -0
  38. package/dist/fix/util.js +133 -0
  39. package/dist/fix/util.js.map +1 -0
  40. package/dist/input/alephseq.d.ts.map +1 -1
  41. package/dist/input/alephseq.js +18 -5
  42. package/dist/input/alephseq.js.map +1 -1
  43. package/dist/input/fastxml.d.ts +3 -0
  44. package/dist/input/fastxml.d.ts.map +1 -0
  45. package/dist/input/fastxml.js +134 -0
  46. package/dist/input/fastxml.js.map +1 -0
  47. package/dist/input/xml.d.ts.map +1 -1
  48. package/dist/input/xml.js +4 -2
  49. package/dist/input/xml.js.map +1 -1
  50. package/dist/marcmap.d.ts.map +1 -1
  51. package/dist/marcmap.js +15 -3
  52. package/dist/marcmap.js.map +1 -1
  53. package/dist/output/alephseq.d.ts.map +1 -1
  54. package/dist/output/alephseq.js +29 -5
  55. package/dist/output/alephseq.js.map +1 -1
  56. package/dist/output/null.d.ts +3 -0
  57. package/dist/output/null.d.ts.map +1 -0
  58. package/dist/output/null.js +13 -0
  59. package/dist/output/null.js.map +1 -0
  60. package/dist/output/xml.d.ts.map +1 -1
  61. package/dist/output/xml.js +27 -0
  62. package/dist/output/xml.js.map +1 -1
  63. package/dist/stream/framer.d.ts.map +1 -0
  64. package/dist/stream/framer.js.map +1 -0
  65. package/dist/stream/worker-pool-str.d.ts.map +1 -0
  66. package/dist/stream/worker-pool-str.js.map +1 -0
  67. package/dist/stream/worker-pool.d.ts +10 -0
  68. package/dist/stream/worker-pool.d.ts.map +1 -0
  69. package/dist/stream/worker-pool.js +217 -0
  70. package/dist/stream/worker-pool.js.map +1 -0
  71. package/dist/transform/fix.d.ts +16 -0
  72. package/dist/transform/fix.d.ts.map +1 -0
  73. package/dist/transform/fix.js +46 -0
  74. package/dist/transform/fix.js.map +1 -0
  75. package/dist/transform/jsonata.d.ts +5 -0
  76. package/dist/transform/jsonata.d.ts.map +1 -1
  77. package/dist/transform/jsonata.js +45 -44
  78. package/dist/transform/jsonata.js.map +1 -1
  79. package/dist/transform/marcids.d.ts.map +1 -1
  80. package/dist/transform/marcids.js +3 -0
  81. package/dist/transform/marcids.js.map +1 -1
  82. package/dist/util/marc_record.d.ts +19 -0
  83. package/dist/util/marc_record.d.ts.map +1 -0
  84. package/dist/util/marc_record.js +16 -0
  85. package/dist/util/marc_record.js.map +1 -0
  86. package/dist/worker-str.d.ts.map +1 -0
  87. package/dist/worker-str.js.map +1 -0
  88. package/dist/worker.d.ts +2 -0
  89. package/dist/worker.d.ts.map +1 -0
  90. package/dist/worker.js +33 -0
  91. package/dist/worker.js.map +1 -0
  92. package/package.json +5 -2
  93. package/dist/output/mulitipart.d.ts +0 -7
  94. package/dist/output/mulitipart.d.ts.map +0 -1
  95. package/dist/output/mulitipart.js +0 -53
  96. package/dist/output/mulitipart.js.map +0 -1
  97. package/dist/output/text.d.ts +0 -6
  98. package/dist/output/text.d.ts.map +0 -1
  99. package/dist/output/text.js +0 -34
  100. package/dist/output/text.js.map +0 -1
@@ -0,0 +1,478 @@
1
+ // A subset of Catmandu Fix functions, ported to JS on top of the Path engine.
2
+ // Each fix is `(args) => (data) => data`, mirroring how Catmandu builds a
3
+ // fixer from a path plus arguments. Semantics follow Catmandu::Fix::* exactly
4
+ // (see the conformance tests, which are ported from Catmandu's own t/).
5
+ import { Path, isArray, isHash, KEEP, DROP } from './path.js';
6
+ import { marcmap } from '../marcmap.js';
7
+ import { randomUUID } from 'node:crypto';
8
+ import { REJECT } from './signal.js';
9
+ import { sprintf, collapseHash, expandHash } from './util.js';
10
+ import fs from 'node:fs';
11
+ function clone(v) {
12
+ return v === undefined ? v : structuredClone(v);
13
+ }
14
+ // Catmandu is_value: a defined scalar (string or number), not a ref.
15
+ function isValue(v) {
16
+ return typeof v === 'string' || typeof v === 'number';
17
+ }
18
+ // Perl s/search/replace/g with $1 / ${1} interpolation -> JS replace.
19
+ function substituter(search, replace) {
20
+ const re = new RegExp(search, 'g');
21
+ const js = replace.replace(/\$\{(\d+)\}/g, '$$$1'); // ${1} -> $1
22
+ return (v) => String(v).replace(re, js);
23
+ }
24
+ export const FIXES = {
25
+ // --- field creation / movement ---
26
+ add_field: ([path, value]) => new Path(path).creator(value ?? null),
27
+ set_field: ([path, value]) => new Path(path).setter(value ?? null),
28
+ remove_field: ([path]) => new Path(path).deleter(),
29
+ copy_field: ([oldPath, newPath]) => {
30
+ const getter = new Path(oldPath).getter();
31
+ const creator = new Path(newPath).creator(undefined);
32
+ return (data) => {
33
+ for (const v of getter(data).map(clone))
34
+ data = creator(data, v);
35
+ return data;
36
+ };
37
+ },
38
+ move_field: ([oldPath, newPath]) => {
39
+ const getter = new Path(oldPath).getter();
40
+ const creator = new Path(newPath).creator(undefined);
41
+ const deleter = new Path(oldPath).deleter();
42
+ return (data) => {
43
+ for (const v of getter(data).map(clone))
44
+ data = creator(data, v);
45
+ return deleter(data);
46
+ };
47
+ },
48
+ // --- string transforms (only act on existing string values) ---
49
+ upcase: ([path]) => new Path(path).updater((v) => v.toUpperCase(), 'string'),
50
+ downcase: ([path]) => new Path(path).updater((v) => v.toLowerCase(), 'string'),
51
+ capitalize: ([path]) => new Path(path).updater((v) => {
52
+ const s = v.toLowerCase();
53
+ return s.charAt(0).toUpperCase() + s.slice(1);
54
+ }, 'string'),
55
+ trim: ([path, mode = 'whitespace']) => {
56
+ const cb = mode === 'nonword'
57
+ ? (v) => v.replace(/^\W+/u, '').replace(/\W+$/u, '')
58
+ : mode === 'diacritics'
59
+ ? (v) => v.normalize('NFKD').replace(/\p{Mn}/gu, '')
60
+ : (v) => v.replace(/^\s+/u, '').replace(/\s+$/u, '');
61
+ return new Path(path).updater(cb, 'string');
62
+ },
63
+ prepend: ([path, str = '']) => new Path(path).updater((v) => str + v, 'string'),
64
+ append: ([path, str = '']) => new Path(path).updater((v) => v + str, 'string'),
65
+ replace_all: ([path, search, replace = '']) => new Path(path).updater(substituter(search, replace), 'value'),
66
+ // --- array <-> string ---
67
+ join_field: ([path, sep = ' ']) => new Path(path).updater((v) => v.filter(isValue).join(sep), 'array'),
68
+ split_field: ([path, sep = ' ']) => {
69
+ const re = new RegExp(sep);
70
+ return new Path(path).updater((v) => String(v).split(re), 'value');
71
+ },
72
+ // --- paste: concatenate several fields/literals into one ---
73
+ paste: (args) => {
74
+ const target = args[0];
75
+ let joinChar = ' ';
76
+ const parts = [];
77
+ for (let i = 1; i < args.length; i++) {
78
+ const a = args[i];
79
+ if (a === 'join_char') {
80
+ joinChar = args[i + 1] ?? ' ';
81
+ break;
82
+ }
83
+ if (a.startsWith('~'))
84
+ parts.push({ literal: a.slice(1) });
85
+ else
86
+ parts.push({ getter: new Path(a).getter() });
87
+ }
88
+ const creator = new Path(target).creator(undefined);
89
+ return (data) => {
90
+ const vals = [];
91
+ for (const p of parts) {
92
+ if ('literal' in p)
93
+ vals.push(p.literal);
94
+ else
95
+ for (const v of p.getter(data))
96
+ if (isValue(v))
97
+ vals.push(v);
98
+ }
99
+ return creator(data, vals.join(joinChar));
100
+ };
101
+ },
102
+ // --- MARC: reuse marcattacks' existing marcmap() for field extraction ---
103
+ // marc_map(MARC_PATH, JSON_PATH, split:0|1, join:Str, value:Str)
104
+ // Mirrors Catmandu::Fix::marc_map's emit loop: the result is a list of
105
+ // values and each value is created at JSON_PATH (so a $append/numeric
106
+ // target appends one element per value). Supports a /from-to substring.
107
+ marc_map: (args) => {
108
+ const marcPath0 = args[0];
109
+ const jsonPath = args[1];
110
+ const opts = {};
111
+ for (let i = 2; i < args.length; i += 2)
112
+ opts[args[i]] = args[i + 1];
113
+ const split = opts.split === '1' || opts.split === 'true';
114
+ const joinChar = opts.join ?? ''; // Catmandu marc_map default join is empty
115
+ const value = opts.value;
116
+ // substring suffix, e.g. 008/35-37
117
+ let marcPath = marcPath0;
118
+ let from;
119
+ let len = 1;
120
+ const sub = /^(.*)\/(\d+)(?:-(\d+))?$/.exec(marcPath0);
121
+ if (sub) {
122
+ marcPath = sub[1];
123
+ from = Number(sub[2]);
124
+ if (sub[3] !== undefined)
125
+ len = Number(sub[3]) - from + 1;
126
+ }
127
+ const p = new Path(jsonPath);
128
+ const lastKey = p.keys.length ? p.keys[p.keys.length - 1] : '';
129
+ const forceArray = /^(\$.*|[0-9]+)$/.test(lastKey);
130
+ const creator = p.creator(undefined);
131
+ return (data) => {
132
+ const rec = data?.record;
133
+ if (!isArray(rec))
134
+ return data;
135
+ // marcmap() yields one entry per tag-matched field; an empty string
136
+ // means the field matched the tag but had no matching subfield.
137
+ // Catmandu drops those, so filter them out.
138
+ let vals = marcmap(rec, marcPath, { join_char: joinChar }).filter((v) => v !== '');
139
+ if (from !== undefined) {
140
+ vals = vals.map((v) => (v.length > from ? v.substr(from, len) : undefined))
141
+ .filter((v) => v !== undefined);
142
+ }
143
+ if (!vals.length)
144
+ return data;
145
+ let result;
146
+ if (value !== undefined)
147
+ result = [value]; // value:Str -> constant when field exists
148
+ else if (forceArray)
149
+ result = vals; // append/numeric target: one element per value
150
+ else if (split)
151
+ result = [vals]; // split: a single array value
152
+ else
153
+ result = [vals.join(joinChar)]; // default: one joined string
154
+ for (const v of result)
155
+ data = creator(data, v);
156
+ return data;
157
+ };
158
+ },
159
+ // genid(PATH): create / overwrite each terminal slot with a fresh id.
160
+ // A fresh id is generated per slot (so PATH.* yields a distinct id each).
161
+ genid: ([path]) => new Path(path).creator(() => `genid:${randomUUID()}`),
162
+ // marc_remove(TAG): drop all MARC fields with the given tag.
163
+ marc_remove: ([tag]) => (data) => {
164
+ if (data && isArray(data.record))
165
+ data.record = data.record.filter((r) => r[0] !== tag);
166
+ return data;
167
+ },
168
+ // reject(): drop the current record / field (used inside marc_each etc.)
169
+ reject: () => () => REJECT,
170
+ // lookup(PATH, FILE, default:X, delete:1, sep_char:C): map values through a
171
+ // 2-column CSV (key,val; no header). No match -> default / delete / keep.
172
+ lookup: (args) => {
173
+ const path = args[0];
174
+ const file = args[1];
175
+ const opts = {};
176
+ for (let i = 2; i < args.length; i += 2)
177
+ opts[args[i]] = args[i + 1];
178
+ const sep = opts.sep_char ?? ',';
179
+ const dict = new Map();
180
+ for (const line of fs.readFileSync(file, 'utf8').split(/\r?\n/)) {
181
+ if (!line)
182
+ continue;
183
+ const idx = line.indexOf(sep);
184
+ if (idx < 0)
185
+ continue;
186
+ dict.set(line.slice(0, idx), line.slice(idx + sep.length));
187
+ }
188
+ const del = opts.delete === '1' || opts.delete === 'true';
189
+ const hasDefault = 'default' in opts;
190
+ return new Path(path).rewrite((v) => {
191
+ if ((typeof v === 'string' || typeof v === 'number') && dict.has(String(v)))
192
+ return dict.get(String(v));
193
+ if (del)
194
+ return DROP;
195
+ if (hasDefault)
196
+ return opts.default;
197
+ return KEEP;
198
+ });
199
+ },
200
+ // retain(PATH, ...): keep only the listed paths, drop everything else.
201
+ retain: (paths) => {
202
+ const getters = paths.map((p) => new Path(p).getter());
203
+ const creators = paths.map((p) => new Path(p).creator(undefined));
204
+ return (data) => {
205
+ const temp = {};
206
+ for (let i = 0; i < paths.length; i++) {
207
+ for (const v of getters[i](data))
208
+ creators[i](temp, v);
209
+ }
210
+ if (isHash(data)) {
211
+ for (const k of Object.keys(data))
212
+ delete data[k];
213
+ Object.assign(data, temp);
214
+ }
215
+ return data;
216
+ };
217
+ },
218
+ // retain_field(PATH): delete every sibling of the final key under its parent.
219
+ retain_field: ([path]) => {
220
+ const p = new Path(path);
221
+ const key = p.keys.length ? p.keys[p.keys.length - 1] : '';
222
+ const keep = key.replace(/^['"]|['"]$/g, '');
223
+ const parentGet = new Path(p.keys.slice(0, -1).join('.')).getter();
224
+ return (data) => {
225
+ const parents = p.keys.length <= 1 ? [data] : parentGet(data);
226
+ for (const c of parents)
227
+ if (isHash(c))
228
+ for (const k of Object.keys(c))
229
+ if (k !== keep)
230
+ delete c[k];
231
+ return data;
232
+ };
233
+ },
234
+ // substring(PATH, offset, [length], [replacement])
235
+ substring: (args) => {
236
+ const path = args[0];
237
+ const off = Number(args[1]);
238
+ const a2 = args[2];
239
+ const a3 = args[3];
240
+ return new Path(path).updater((v) => {
241
+ const s = String(v);
242
+ if (a3 !== undefined) { // replacement form
243
+ const len = Number(a2);
244
+ return s.slice(0, off) + a3 + s.slice(off + len);
245
+ }
246
+ if (a2 !== undefined)
247
+ return s.substr(off, Number(a2));
248
+ return s.substr(off);
249
+ }, 'value');
250
+ },
251
+ // sort_field(PATH, uniq:1, reverse:1, numeric:1)
252
+ sort_field: (args) => {
253
+ const path = args[0];
254
+ const opts = {};
255
+ for (let i = 1; i < args.length; i += 2)
256
+ opts[args[i]] = args[i + 1];
257
+ const doUniq = opts.uniq === '1';
258
+ const rev = opts.reverse === '1';
259
+ const num = opts.numeric === '1';
260
+ return new Path(path).updater((arr) => {
261
+ let defined = arr.filter((x) => x !== undefined && x !== null);
262
+ const hadUndef = defined.length !== arr.length;
263
+ if (doUniq) {
264
+ const seen = new Set();
265
+ defined = defined.filter((x) => { const k = String(x); if (seen.has(k))
266
+ return false; seen.add(k); return true; });
267
+ }
268
+ defined.sort(num ? (a, b) => Number(a) - Number(b) : (a, b) => String(a) < String(b) ? -1 : String(a) > String(b) ? 1 : 0);
269
+ if (rev)
270
+ defined.reverse();
271
+ if (hadUndef)
272
+ defined.push(null); // undefs collapse to one at the end (undef_position default last)
273
+ return defined;
274
+ }, 'array');
275
+ },
276
+ // uniq(PATH): strip duplicate values from an array (keep first occurrence).
277
+ uniq: ([path]) => new Path(path).updater((arr) => {
278
+ const seen = new Set();
279
+ return arr.filter((x) => { const k = String(x); if (seen.has(k))
280
+ return false; seen.add(k); return true; });
281
+ }, 'array'),
282
+ // vacuum(): recursively delete empty fields (null, blank string, [], {}).
283
+ vacuum: () => (data) => { vacuum(data); return data; },
284
+ // format(PATH, SPEC): sprintf the value (string / array / hash) with SPEC.
285
+ format: ([path, spec]) => new Path(path).updater((v) => {
286
+ if (isArray(v))
287
+ return sprintf(spec, v);
288
+ if (isHash(v))
289
+ return sprintf(spec, Object.entries(v).flat());
290
+ return sprintf(spec, [v]);
291
+ }),
292
+ // count(PATH): replace an array/hash value with its size.
293
+ count: ([path]) => new Path(path).updater((v) => isArray(v) ? v.length : isHash(v) ? Object.keys(v).length : v),
294
+ // set_array(PATH, v...) / set_hash(PATH, k, v, ...): set to a fresh array/hash.
295
+ set_array: (args) => new Path(args[0]).setter(() => [...args.slice(1)]),
296
+ set_hash: (args) => new Path(args[0]).setter(() => {
297
+ const o = {};
298
+ const vs = args.slice(1);
299
+ for (let i = 0; i < vs.length; i += 2)
300
+ o[vs[i]] = vs[i + 1];
301
+ return o;
302
+ }),
303
+ // from_json(PATH) / to_json(PATH)
304
+ from_json: ([path]) => new Path(path).updater((v) => JSON.parse(v), 'string'),
305
+ to_json: ([path]) => new Path(path).updater((v) => JSON.stringify(v)),
306
+ // rename(PATH, SEARCH, REPLACE): regex-rename hash keys under PATH (recursive).
307
+ rename: ([path, search, replace]) => {
308
+ const re = new RegExp(search, 'g');
309
+ const renamer = (node) => {
310
+ if (isHash(node)) {
311
+ for (const old of Object.keys(node)) {
312
+ const val = node[old];
313
+ const nw = old.replace(re, replace);
314
+ if (nw !== old) {
315
+ delete node[old];
316
+ node[nw] = val;
317
+ }
318
+ renamer(val);
319
+ }
320
+ }
321
+ else if (isArray(node)) {
322
+ for (const el of node)
323
+ renamer(el);
324
+ }
325
+ return node;
326
+ };
327
+ return new Path(path).updater(renamer);
328
+ },
329
+ // filter(PATH, REGEX, invert:1): keep array values (not) matching REGEX.
330
+ filter: (args) => {
331
+ const opts = {};
332
+ for (let i = 2; i < args.length; i += 2)
333
+ opts[args[i]] = args[i + 1];
334
+ const re = new RegExp(args[1]);
335
+ const invert = opts.invert === '1' || opts.invert === 'true';
336
+ return new Path(args[0]).updater((arr) => arr.filter((x) => re.test(String(x)) !== invert), 'array');
337
+ },
338
+ // flatten(PATH): recursively flatten nested arrays into one flat array.
339
+ flatten: ([path]) => new Path(path).updater((arr) => {
340
+ let a = arr;
341
+ while (a.some((x) => isArray(x)))
342
+ a = a.flatMap((x) => (isArray(x) ? x : [x]));
343
+ return a;
344
+ }, 'array'),
345
+ // collapse([sep]) / expand([sep]): whole-record flatten / nest (dot convention)
346
+ collapse: (args) => {
347
+ const sep = parseDashOpt(args, 'sep');
348
+ return (data) => {
349
+ const c = collapseHash(data);
350
+ if (sep === undefined || sep === '.')
351
+ return c;
352
+ const o = {};
353
+ for (const k of Object.keys(c))
354
+ o[k.replaceAll('.', sep)] = c[k];
355
+ return o;
356
+ };
357
+ },
358
+ expand: (args) => {
359
+ const sep = parseDashOpt(args, 'sep');
360
+ return (data) => {
361
+ if (sep === undefined || sep === '.')
362
+ return expandHash(data);
363
+ const o = {};
364
+ for (const k of Object.keys(data))
365
+ o[k.replaceAll(sep, '.')] = data[k];
366
+ return expandHash(o);
367
+ };
368
+ },
369
+ // parse_text(PATH, PATTERN): parse a string via regex -> hash (named
370
+ // groups), array (numbered groups), or unchanged (no groups / no match).
371
+ parse_text: ([path, pattern]) => {
372
+ const re = new RegExp(pattern);
373
+ return new Path(path).updater((v) => {
374
+ const m = re.exec(String(v));
375
+ if (!m)
376
+ return v;
377
+ if (m.groups && Object.keys(m.groups).length)
378
+ return { ...m.groups };
379
+ if (m.length > 1)
380
+ return m.slice(1);
381
+ return v;
382
+ }, 'string');
383
+ },
384
+ // int(PATH): first integer in a string, else array/hash size, else 0.
385
+ int: ([path]) => new Path(path).updater((v) => {
386
+ if (typeof v === 'number')
387
+ return Math.trunc(v);
388
+ if (typeof v === 'string') {
389
+ const m = /([+-]?[0-9]+)/.exec(v);
390
+ return m ? Number(m[1]) : 0;
391
+ }
392
+ if (isArray(v))
393
+ return v.length;
394
+ if (isHash(v))
395
+ return Object.keys(v).length;
396
+ return 0;
397
+ }),
398
+ // string(PATH): stringify a value / join array / join hash values (sorted keys).
399
+ string: ([path]) => new Path(path).updater((v) => {
400
+ if (typeof v === 'string' || typeof v === 'number')
401
+ return String(v);
402
+ if (isArray(v) && v.every((x) => typeof x === 'string' || typeof x === 'number'))
403
+ return v.join('');
404
+ if (isHash(v) && Object.values(v).every((x) => typeof x === 'string' || typeof x === 'number')) {
405
+ return Object.keys(v).sort().map((k) => v[k]).join('');
406
+ }
407
+ return '';
408
+ }),
409
+ // uri_encode / uri_decode (percent encoding, like Perl URI::Escape)
410
+ uri_encode: ([path]) => new Path(path).updater((v) => encodeURIComponent(String(v)).replace(/[!*'()]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase()), 'string'),
411
+ uri_decode: ([path]) => new Path(path).updater((v) => decodeURIComponent(String(v)), 'string'),
412
+ // compact(PATH): drop null/undefined values from an array.
413
+ compact: ([path]) => new Path(path).updater((arr) => arr.filter((x) => x !== null && x !== undefined), 'array'),
414
+ // expand_date([FIELD=date]): split a date value into year/month/day at root.
415
+ expand_date: ([field]) => {
416
+ const get = new Path(field ?? 'date').getter();
417
+ return (data) => {
418
+ const v = get(data)[0];
419
+ if (typeof v !== 'string')
420
+ return data;
421
+ const parts = v.split(/\D+/).filter((p) => p !== '');
422
+ if (parts.length >= 1)
423
+ data.year = parts[0]; // string
424
+ if (parts.length >= 2)
425
+ data.month = Number(parts[1]); // number
426
+ if (parts.length >= 3)
427
+ data.day = Number(parts[2]); // number
428
+ return data;
429
+ };
430
+ },
431
+ // --- misc ---
432
+ nothing: () => (data) => data,
433
+ };
434
+ // parse a Catmandu-style "-sep => x" / "sep: x" option out of an arg list
435
+ function parseDashOpt(args, name) {
436
+ for (let i = 0; i < args.length; i++) {
437
+ if (args[i] === name || args[i] === `-${name}`)
438
+ return args[i + 1];
439
+ }
440
+ return undefined;
441
+ }
442
+ function isEmpty(v) {
443
+ return v === undefined || v === null
444
+ || (typeof v === 'string' && !/\S/.test(v))
445
+ || (isArray(v) && v.length === 0)
446
+ || (isHash(v) && Object.keys(v).length === 0);
447
+ }
448
+ function vacuum(node) {
449
+ if (isHash(node)) {
450
+ for (const k of Object.keys(node)) {
451
+ if (isEmpty(node[k]))
452
+ delete node[k];
453
+ else {
454
+ vacuum(node[k]);
455
+ if (isEmpty(node[k]))
456
+ delete node[k];
457
+ }
458
+ }
459
+ }
460
+ else if (isArray(node)) {
461
+ for (let i = node.length - 1; i >= 0; i--) {
462
+ if (isEmpty(node[i]))
463
+ node.splice(i, 1);
464
+ else {
465
+ vacuum(node[i]);
466
+ if (isEmpty(node[i]))
467
+ node.splice(i, 1);
468
+ }
469
+ }
470
+ }
471
+ }
472
+ export function buildFix(name, args) {
473
+ const builder = FIXES[name];
474
+ if (!builder)
475
+ throw new Error(`unknown fix: ${name}`);
476
+ return builder(args);
477
+ }
478
+ //# sourceMappingURL=fixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixes.js","sourceRoot":"","sources":["../../src/fix/fixes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { Path } from './path.js';
2
+ export { FIXES, buildFix } from './fixes.js';
3
+ export { parseFix } from './parser.js';
4
+ export { buildCondition } from './conditions.js';
5
+ export { buildBind } from './binds.js';
6
+ export { REJECT } from './signal.js';
7
+ /**
8
+ * Compile a Catmandu Fix script into a record -> record function.
9
+ * Parsed and built once; the returned function just runs the chain per record.
10
+ */
11
+ export declare function compileFix(src: string): (data: any) => any;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fix/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAuBrC;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAE1D"}
@@ -0,0 +1,40 @@
1
+ import { parseFix } from './parser.js';
2
+ import { buildFix } from './fixes.js';
3
+ import { buildCondition } from './conditions.js';
4
+ import { buildBind } from './binds.js';
5
+ import { REJECT } from './signal.js';
6
+ export { Path } from './path.js';
7
+ export { FIXES, buildFix } from './fixes.js';
8
+ export { parseFix } from './parser.js';
9
+ export { buildCondition } from './conditions.js';
10
+ export { buildBind } from './binds.js';
11
+ export { REJECT } from './signal.js';
12
+ function compileStatements(stmts) {
13
+ const runners = stmts.map((s) => {
14
+ if (s.type === 'fix')
15
+ return buildFix(s.name, s.args);
16
+ if (s.type === 'bind')
17
+ return buildBind(s.name, s.args, compileStatements(s.body), s.doset);
18
+ const cond = buildCondition(s.cond.name, s.cond.args);
19
+ const thenRun = compileStatements(s.then);
20
+ const elseRun = compileStatements(s.otherwise);
21
+ const wantTrue = s.kind === 'if';
22
+ return (data) => (cond(data) === wantTrue ? thenRun(data) : elseRun(data));
23
+ });
24
+ return (data) => {
25
+ for (const r of runners) {
26
+ data = r(data);
27
+ if (data === REJECT)
28
+ return REJECT; // stop the sequence on reject()
29
+ }
30
+ return data;
31
+ };
32
+ }
33
+ /**
34
+ * Compile a Catmandu Fix script into a record -> record function.
35
+ * Parsed and built once; the returned function just runs the chain per record.
36
+ */
37
+ export function compileFix(src) {
38
+ return compileStatements(parseFix(src));
39
+ }
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fix/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,SAAS,iBAAiB,CAAC,KAAkB;IACzC,MAAM,OAAO,GAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5F,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;QACjC,OAAO,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAS,EAAE,EAAE;QACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,MAAM,CAAC,CAAC,gCAAgC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IAClC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface FixCall {
2
+ type: 'fix';
3
+ name: string;
4
+ args: string[];
5
+ }
6
+ export interface CondBlock {
7
+ type: 'cond';
8
+ kind: 'if' | 'unless';
9
+ cond: {
10
+ name: string;
11
+ args: string[];
12
+ };
13
+ then: Statement[];
14
+ otherwise: Statement[];
15
+ }
16
+ export interface BindBlock {
17
+ type: 'bind';
18
+ name: string;
19
+ args: string[];
20
+ body: Statement[];
21
+ doset: boolean;
22
+ }
23
+ export type Statement = FixCall | CondBlock | BindBlock;
24
+ export declare function parseFix(src: string): Statement[];
25
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/fix/parser.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAAE;AACvE,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC;IACtB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACvC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,SAAS,EAAE,SAAS,EAAE,CAAC;CAC1B;AACD,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAExD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAkGjD"}