@ifc-lite/flow-nodes 0.2.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 (67) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +34 -0
  3. package/dist/apply-table-node.d.ts +3 -0
  4. package/dist/apply-table-node.d.ts.map +1 -0
  5. package/dist/apply-table-node.js +119 -0
  6. package/dist/apply-table-node.js.map +1 -0
  7. package/dist/connector-nodes.d.ts +3 -0
  8. package/dist/connector-nodes.d.ts.map +1 -0
  9. package/dist/connector-nodes.js +192 -0
  10. package/dist/connector-nodes.js.map +1 -0
  11. package/dist/core-nodes.d.ts +3 -0
  12. package/dist/core-nodes.d.ts.map +1 -0
  13. package/dist/core-nodes.js +277 -0
  14. package/dist/core-nodes.js.map +1 -0
  15. package/dist/csv-nodes.d.ts +3 -0
  16. package/dist/csv-nodes.d.ts.map +1 -0
  17. package/dist/csv-nodes.js +111 -0
  18. package/dist/csv-nodes.js.map +1 -0
  19. package/dist/csv-parse.d.ts +26 -0
  20. package/dist/csv-parse.d.ts.map +1 -0
  21. package/dist/csv-parse.js +83 -0
  22. package/dist/csv-parse.js.map +1 -0
  23. package/dist/element-nodes.d.ts +36 -0
  24. package/dist/element-nodes.d.ts.map +1 -0
  25. package/dist/element-nodes.js +224 -0
  26. package/dist/element-nodes.js.map +1 -0
  27. package/dist/host.d.ts +107 -0
  28. package/dist/host.d.ts.map +1 -0
  29. package/dist/host.js +94 -0
  30. package/dist/host.js.map +1 -0
  31. package/dist/index.d.ts +19 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +50 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/model-nodes.d.ts +3 -0
  36. package/dist/model-nodes.d.ts.map +1 -0
  37. package/dist/model-nodes.js +200 -0
  38. package/dist/model-nodes.js.map +1 -0
  39. package/dist/script-node.d.ts +4 -0
  40. package/dist/script-node.d.ts.map +1 -0
  41. package/dist/script-node.js +140 -0
  42. package/dist/script-node.js.map +1 -0
  43. package/dist/strict-cell.d.ts +20 -0
  44. package/dist/strict-cell.d.ts.map +1 -0
  45. package/dist/strict-cell.js +33 -0
  46. package/dist/strict-cell.js.map +1 -0
  47. package/dist/table-nodes.d.ts +17 -0
  48. package/dist/table-nodes.d.ts.map +1 -0
  49. package/dist/table-nodes.js +200 -0
  50. package/dist/table-nodes.js.map +1 -0
  51. package/dist/viewer-nodes.d.ts +3 -0
  52. package/dist/viewer-nodes.d.ts.map +1 -0
  53. package/dist/viewer-nodes.js +93 -0
  54. package/dist/viewer-nodes.js.map +1 -0
  55. package/dist/write-nodes.d.ts +3 -0
  56. package/dist/write-nodes.d.ts.map +1 -0
  57. package/dist/write-nodes.js +63 -0
  58. package/dist/write-nodes.js.map +1 -0
  59. package/dist/xlsx-io.d.ts +24 -0
  60. package/dist/xlsx-io.d.ts.map +1 -0
  61. package/dist/xlsx-io.js +160 -0
  62. package/dist/xlsx-io.js.map +1 -0
  63. package/dist/xlsx-nodes.d.ts +3 -0
  64. package/dist/xlsx-nodes.d.ts.map +1 -0
  65. package/dist/xlsx-nodes.js +99 -0
  66. package/dist/xlsx-nodes.js.map +1 -0
  67. package/package.json +60 -0
@@ -0,0 +1,192 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * `table.joinByKey` — join spreadsheet rows to model entities by a key
6
+ * (issue #5167 phase 3.2, the pilot workflow's second step). `tag` and
7
+ * `property` reuse `@ifc-lite/mutations`' `csv-match.ts` index builder
8
+ * (`buildMatchContext`/`matchRowAgainstContext`, merged in #5230) rather
9
+ * than re-implementing matching — see `host.ts`'s `TableAccess` for why that
10
+ * needs a bulk entity-table accessor most hosts do not have to provide.
11
+ * `globalId`/`name` are matched directly over the candidate `entities` list,
12
+ * which is already small (whatever an upstream selector narrowed it to) and
13
+ * does not need the whole-model index.
14
+ *
15
+ * Ambiguity is reported in BOTH directions, never resolved to the first
16
+ * match: a row naming a value several candidate entities carry, and an
17
+ * entity two different rows both uniquely claim.
18
+ */
19
+ import { buildMatchContext, matchRowAgainstContext } from '@ifc-lite/mutations';
20
+ import { ENTITY_LIST, TABLE_ITEM, entityOf, requireCapability, toSdkRef } from './host.js';
21
+ import { tableOf } from './table-nodes.js';
22
+ const JOIN_STRATEGIES = ['globalId', 'tag', 'name', 'property'];
23
+ function isJoinStrategy(v) {
24
+ return typeof v === 'string' && JOIN_STRATEGIES.includes(v);
25
+ }
26
+ /** globalId/name candidate index, built once over the (small) input pool. */
27
+ function directIndex(ctx, candidates, strategy) {
28
+ const index = new Map();
29
+ for (const c of candidates) {
30
+ const key = strategy === 'globalId' ? c.ref.globalId : entityOf(ctx, c.ref).name.toLowerCase();
31
+ if (!key)
32
+ continue;
33
+ const list = index.get(key);
34
+ if (list)
35
+ list.push(c.ref.globalId);
36
+ else
37
+ index.set(key, [c.ref.globalId]);
38
+ }
39
+ return index;
40
+ }
41
+ /** The GlobalId of every distinct entity a row matches, restricted to the candidate pool. */
42
+ function matchedGlobalIdsFor(ctx, t, candidates, strategy, column, pset, prop) {
43
+ const problems = [];
44
+ if (strategy === 'globalId' || strategy === 'name') {
45
+ const index = directIndex(ctx, candidates, strategy);
46
+ const perRow = t.rows.map((row, i) => {
47
+ const raw = row[column];
48
+ if (raw === null || raw === undefined || raw === '') {
49
+ problems.push(`row ${i}: empty match value in column "${column}"`);
50
+ return [];
51
+ }
52
+ const key = strategy === 'name' ? String(raw).toLowerCase() : String(raw);
53
+ return index.get(key) ?? [];
54
+ });
55
+ return { perRow, problems };
56
+ }
57
+ // tag / property: reuse csv-match.ts's whole-model index, then restrict the
58
+ // result to the candidate pool by express id. Express ids are PER MODEL, so
59
+ // each model's candidates are matched against that model's own table: one
60
+ // shared table would let a local id in the active model resolve to a
61
+ // same-numbered candidate in another model and write to the wrong entity.
62
+ const byModel = new Map();
63
+ for (const candidate of candidates) {
64
+ let pool = byModel.get(candidate.modelId);
65
+ if (!pool)
66
+ byModel.set(candidate.modelId, (pool = new Map()));
67
+ pool.set(candidate.expressId, candidate.ref.globalId);
68
+ }
69
+ const csvRows = t.rows.map((row) => ({ [column]: row[column] === null || row[column] === undefined ? '' : String(row[column]) }));
70
+ const matchStrategy = strategy === 'tag' ? { type: 'tag', column } : { type: 'property', psetName: pset, propName: prop, column };
71
+ // Keyed by the entity (model + express id), not its GlobalId: two models
72
+ // can hold distinct entities under one GlobalId, and collapsing them to one
73
+ // string reported a row matching both as a unique match (#5377 review).
74
+ const perRow = csvRows.map(() => new Map());
75
+ const firstModelId = [...byModel.keys()][0];
76
+ for (const [modelId, pool] of byModel) {
77
+ const access = ctx.host.tables?.(modelId);
78
+ if (!access) {
79
+ throw new Error(`table.joinByKey: strategy "${strategy}" needs a host that provides bulk entity access (host.tables) for model "${modelId}"; this host does not`);
80
+ }
81
+ const matchContext = buildMatchContext(access.entities, access.mutationView, access.strings, matchStrategy, csvRows);
82
+ csvRows.forEach((row, i) => {
83
+ const result = matchRowAgainstContext(row, i, matchStrategy, matchContext);
84
+ // A warning is about the row, not the model: report it once.
85
+ if (modelId === firstModelId)
86
+ problems.push(...(result.warnings ?? []).map((w) => `row ${i}: ${w}`));
87
+ for (const expressId of result.matchedEntityIds) {
88
+ const gid = pool.get(expressId);
89
+ if (gid)
90
+ perRow[i].set(`${modelId}#${expressId}`, gid);
91
+ }
92
+ });
93
+ }
94
+ return { perRow: perRow.map((ids) => [...ids.values()]), problems };
95
+ }
96
+ function withColumn(columns, col) {
97
+ const idx = columns.findIndex((c) => c.name === col.name);
98
+ if (idx === -1)
99
+ return [...columns, col];
100
+ const out = [...columns];
101
+ out[idx] = col;
102
+ return out;
103
+ }
104
+ export const connectorNodes = [
105
+ {
106
+ type: 'table.joinByKey',
107
+ title: 'Join by key',
108
+ category: 'table',
109
+ doc: 'Joins table rows to entities by GlobalId, Tag, Name, or an indexed property. Ambiguous rows (matching several entities) and ambiguous entities (claimed by several rows) are reported separately, never resolved to the first match.',
110
+ inputs: [
111
+ { name: 'entities', type: ENTITY_LIST },
112
+ { name: 'table', type: TABLE_ITEM },
113
+ ],
114
+ outputs: [
115
+ { name: 'matched', type: TABLE_ITEM },
116
+ { name: 'unmatched', type: TABLE_ITEM },
117
+ { name: 'ambiguous', type: TABLE_ITEM },
118
+ ],
119
+ params: [
120
+ { name: 'strategy', kind: 'enum', default: 'globalId', options: [...JOIN_STRATEGIES] },
121
+ { name: 'column', kind: 'string', default: 'GlobalId' },
122
+ { name: 'pset', kind: 'string', default: '' },
123
+ { name: 'prop', kind: 'string', default: '' },
124
+ ],
125
+ capabilities: ['model.read'],
126
+ reads: 'model',
127
+ run: (ctx, i, p) => {
128
+ requireCapability(ctx, 'model.read');
129
+ const t = tableOf(i.table);
130
+ const strategy = isJoinStrategy(p.strategy) ? p.strategy : 'globalId';
131
+ const column = typeof p.column === 'string' && p.column.length > 0 ? p.column : 'GlobalId';
132
+ if (!t.columns.some((c) => c.name === column))
133
+ throw new Error(`table.joinByKey: no column "${column}"`);
134
+ if (strategy === 'property' && (!p.pset || !p.prop))
135
+ throw new Error('table.joinByKey: strategy "property" needs both "pset" and "prop" params');
136
+ // One candidate per entity: the same entity listed twice is not two
137
+ // matches, so it must not make a row ambiguous.
138
+ const seen = new Set();
139
+ const candidates = [];
140
+ for (const ref of i.entities) {
141
+ const address = toSdkRef(ctx, ref);
142
+ const identity = `${address.modelId}#${address.expressId}`;
143
+ if (seen.has(identity))
144
+ continue;
145
+ seen.add(identity);
146
+ candidates.push({ ref, modelId: address.modelId, expressId: address.expressId });
147
+ }
148
+ const { perRow, problems } = matchedGlobalIdsFor(ctx, t, candidates, strategy, column, String(p.pset ?? ''), String(p.prop ?? ''));
149
+ for (const msg of problems)
150
+ ctx.log('warn', msg);
151
+ // Entity-side ambiguity: an entity two DIFFERENT rows both uniquely claim.
152
+ const byEntity = new Map();
153
+ perRow.forEach((globalIds, rowIdx) => {
154
+ if (globalIds.length === 1) {
155
+ const list = byEntity.get(globalIds[0]);
156
+ if (list)
157
+ list.push(rowIdx);
158
+ else
159
+ byEntity.set(globalIds[0], [rowIdx]);
160
+ }
161
+ });
162
+ const entityAmbiguous = new Set();
163
+ for (const rowIdxs of byEntity.values()) {
164
+ if (rowIdxs.length > 1)
165
+ for (const idx of rowIdxs)
166
+ entityAmbiguous.add(idx);
167
+ }
168
+ const matchedRows = [];
169
+ const unmatchedRows = [];
170
+ const ambiguousRows = [];
171
+ t.rows.forEach((row, idx) => {
172
+ const globalIds = perRow[idx];
173
+ if (globalIds.length === 0) {
174
+ unmatchedRows.push(row);
175
+ }
176
+ else if (globalIds.length > 1 || entityAmbiguous.has(idx)) {
177
+ ambiguousRows.push({ ...row, MatchedGlobalIds: globalIds.join(';') });
178
+ }
179
+ else {
180
+ matchedRows.push({ ...row, GlobalId: globalIds[0] });
181
+ }
182
+ });
183
+ const matchedColumns = withColumn(t.columns, { name: 'GlobalId', type: 'identifier' });
184
+ const matched = { columns: matchedColumns, rows: matchedRows, key: 'GlobalId' };
185
+ const unmatched = { columns: t.columns, rows: unmatchedRows, key: t.key };
186
+ const ambiguousColumns = withColumn(t.columns, { name: 'MatchedGlobalIds', type: 'string' });
187
+ const ambiguous = { columns: ambiguousColumns, rows: ambiguousRows, key: t.key };
188
+ return { matched, unmatched, ambiguous };
189
+ },
190
+ },
191
+ ];
192
+ //# sourceMappingURL=connector-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-nodes.js","sourceRoot":"","sources":["../src/connector-nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type FlowNodeDef } from './host.js';
2
+ export declare const coreNodes: FlowNodeDef[];
3
+ //# sourceMappingURL=core-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-nodes.d.ts","sourceRoot":"","sources":["../src/core-nodes.ts"],"names":[],"mappings":"AAaA,OAAO,EAA2D,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAatG,eAAO,MAAM,SAAS,EAAE,WAAW,EA+PlC,CAAC"}
@@ -0,0 +1,277 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { ANY_GROUP, ANY_ITEM, ANY_LIST, SCALAR_ITEM, SCALAR_LIST } from './host.js';
5
+ const num = (v, name) => {
6
+ if (typeof v !== 'number' || !Number.isFinite(v))
7
+ throw new Error(`"${name}" must be a finite number, got ${JSON.stringify(v)}`);
8
+ return v;
9
+ };
10
+ const scalarKey = (v) => {
11
+ if (v === null || v === undefined)
12
+ return '';
13
+ if (typeof v === 'object')
14
+ return v.globalId ?? JSON.stringify(v);
15
+ return String(v);
16
+ };
17
+ export const coreNodes = [
18
+ {
19
+ type: 'core.number',
20
+ title: 'Number',
21
+ category: 'core',
22
+ inputs: [],
23
+ outputs: [{ name: 'value', type: SCALAR_ITEM }],
24
+ params: [{ name: 'value', kind: 'number', default: 0 }],
25
+ capabilities: [],
26
+ run: (_c, _i, p) => ({ value: num(p.value, 'value') }),
27
+ },
28
+ {
29
+ type: 'core.string',
30
+ title: 'Text',
31
+ category: 'core',
32
+ inputs: [],
33
+ outputs: [{ name: 'value', type: SCALAR_ITEM }],
34
+ params: [{ name: 'value', kind: 'string', default: '' }],
35
+ capabilities: [],
36
+ run: (_c, _i, p) => ({ value: String(p.value ?? '') }),
37
+ },
38
+ {
39
+ type: 'core.boolean',
40
+ title: 'Boolean',
41
+ category: 'core',
42
+ inputs: [],
43
+ outputs: [{ name: 'value', type: SCALAR_ITEM }],
44
+ params: [{ name: 'value', kind: 'boolean', default: false }],
45
+ capabilities: [],
46
+ run: (_c, _i, p) => ({ value: p.value === true }),
47
+ },
48
+ {
49
+ type: 'core.list',
50
+ title: 'List',
51
+ category: 'core',
52
+ doc: 'A literal list of scalars (JSON array).',
53
+ inputs: [],
54
+ outputs: [{ name: 'items', type: SCALAR_LIST }],
55
+ params: [{ name: 'items', kind: 'json', default: [] }],
56
+ capabilities: [],
57
+ run: (_c, _i, p) => {
58
+ if (!Array.isArray(p.items))
59
+ throw new Error('"items" must be a JSON array');
60
+ return { items: p.items };
61
+ },
62
+ },
63
+ {
64
+ type: 'core.math',
65
+ title: 'Math',
66
+ category: 'core',
67
+ inputs: [
68
+ { name: 'a', type: SCALAR_ITEM },
69
+ { name: 'b', type: SCALAR_ITEM },
70
+ ],
71
+ outputs: [{ name: 'result', type: SCALAR_ITEM }],
72
+ params: [{ name: 'op', kind: 'enum', default: 'add', options: ['add', 'subtract', 'multiply', 'divide', 'min', 'max', 'pow'] }],
73
+ capabilities: [],
74
+ run: (_c, i, p) => {
75
+ const a = num(i.a, 'a');
76
+ const b = num(i.b, 'b');
77
+ switch (p.op) {
78
+ case 'add': return { result: a + b };
79
+ case 'subtract': return { result: a - b };
80
+ case 'multiply': return { result: a * b };
81
+ case 'divide':
82
+ if (b === 0)
83
+ throw new Error('division by zero');
84
+ return { result: a / b };
85
+ case 'min': return { result: Math.min(a, b) };
86
+ case 'max': return { result: Math.max(a, b) };
87
+ case 'pow': return { result: a ** b };
88
+ default: throw new Error(`unknown op "${String(p.op)}"`);
89
+ }
90
+ },
91
+ },
92
+ {
93
+ type: 'core.compare',
94
+ title: 'Compare',
95
+ category: 'core',
96
+ doc: 'Compares a with b; an unconnected b is null, so `= (nothing)` tests for a missing value.',
97
+ inputs: [
98
+ { name: 'a', type: SCALAR_ITEM, nullable: true },
99
+ { name: 'b', type: SCALAR_ITEM, nullable: true, optional: true },
100
+ ],
101
+ outputs: [{ name: 'result', type: SCALAR_ITEM }],
102
+ params: [{ name: 'op', kind: 'enum', default: '=', options: ['=', '!=', '<', '<=', '>', '>=', 'contains'] }],
103
+ capabilities: [],
104
+ run: (_c, i, p) => {
105
+ const a = (i.a ?? null);
106
+ const b = (i.b ?? null);
107
+ switch (p.op) {
108
+ case '=': return { result: a === b };
109
+ case '!=': return { result: a !== b };
110
+ case '<': return { result: num(a, 'a') < num(b, 'b') };
111
+ case '<=': return { result: num(a, 'a') <= num(b, 'b') };
112
+ case '>': return { result: num(a, 'a') > num(b, 'b') };
113
+ case '>=': return { result: num(a, 'a') >= num(b, 'b') };
114
+ case 'contains': return { result: String(a ?? '').includes(String(b ?? '')) };
115
+ default: throw new Error(`unknown op "${String(p.op)}"`);
116
+ }
117
+ },
118
+ },
119
+ {
120
+ type: 'core.concat',
121
+ title: 'Join text',
122
+ category: 'core',
123
+ inputs: [{ name: 'parts', type: SCALAR_LIST }],
124
+ outputs: [{ name: 'text', type: SCALAR_ITEM }],
125
+ params: [{ name: 'separator', kind: 'string', default: '' }],
126
+ capabilities: [],
127
+ run: (_c, i, p) => ({ text: i.parts.map((v) => (v === null ? '' : String(v))).join(String(p.separator ?? '')) }),
128
+ },
129
+ {
130
+ type: 'core.count',
131
+ title: 'Count',
132
+ category: 'core',
133
+ inputs: [{ name: 'items', type: ANY_LIST }],
134
+ outputs: [{ name: 'count', type: SCALAR_ITEM }],
135
+ params: [],
136
+ capabilities: [],
137
+ run: (_c, i) => ({ count: i.items.length }),
138
+ },
139
+ {
140
+ type: 'core.sum',
141
+ title: 'Sum',
142
+ category: 'core',
143
+ inputs: [{ name: 'values', type: SCALAR_LIST }],
144
+ outputs: [{ name: 'total', type: SCALAR_ITEM }],
145
+ params: [],
146
+ capabilities: [],
147
+ run: (_c, i) => ({ total: i.values.reduce((s, v) => s + (typeof v === 'number' ? v : 0), 0) }),
148
+ },
149
+ {
150
+ type: 'core.filter',
151
+ title: 'Filter',
152
+ category: 'core',
153
+ doc: 'Keep the items whose mask entry is true (shortest of the two lists).',
154
+ inputs: [
155
+ { name: 'items', type: ANY_LIST },
156
+ { name: 'mask', type: SCALAR_LIST },
157
+ ],
158
+ outputs: [
159
+ { name: 'kept', type: ANY_LIST },
160
+ { name: 'dropped', type: ANY_LIST },
161
+ ],
162
+ params: [],
163
+ capabilities: [],
164
+ run: (_c, i) => {
165
+ const items = i.items;
166
+ const mask = i.mask;
167
+ const n = Math.min(items.length, mask.length);
168
+ const kept = [];
169
+ const dropped = [];
170
+ for (let k = 0; k < n; k += 1)
171
+ (mask[k] === true ? kept : dropped).push(items[k]);
172
+ return { kept, dropped };
173
+ },
174
+ },
175
+ {
176
+ type: 'core.first',
177
+ title: 'First',
178
+ category: 'core',
179
+ doc: 'The first item of a list, or null when the list is empty.',
180
+ inputs: [{ name: 'items', type: ANY_LIST }],
181
+ outputs: [{ name: 'item', type: ANY_ITEM }],
182
+ params: [],
183
+ capabilities: [],
184
+ run: (_c, i) => ({ item: i.items[0] ?? null }),
185
+ },
186
+ {
187
+ type: 'core.item',
188
+ title: 'Item at',
189
+ category: 'core',
190
+ doc: 'The item at an index (negative counts from the end), or null when out of range.',
191
+ inputs: [{ name: 'items', type: ANY_LIST }],
192
+ outputs: [{ name: 'item', type: ANY_ITEM }],
193
+ params: [{ name: 'index', kind: 'number', default: 0 }],
194
+ capabilities: [],
195
+ run: (_c, i, p) => {
196
+ const items = i.items;
197
+ const idx = num(p.index, 'index');
198
+ return { item: items.at(idx) ?? null };
199
+ },
200
+ },
201
+ {
202
+ type: 'core.wrap',
203
+ title: 'Wrap',
204
+ category: 'core',
205
+ doc: 'One item as a one-element list.',
206
+ inputs: [{ name: 'item', type: ANY_ITEM, nullable: true }],
207
+ outputs: [{ name: 'list', type: ANY_LIST }],
208
+ params: [],
209
+ capabilities: [],
210
+ run: (_c, i) => ({ list: [i.item] }),
211
+ },
212
+ {
213
+ type: 'core.flatten',
214
+ title: 'Flatten',
215
+ category: 'core',
216
+ doc: 'Every branch concatenated into one list, branch order preserved.',
217
+ inputs: [{ name: 'group', type: ANY_GROUP }],
218
+ outputs: [{ name: 'items', type: ANY_LIST }],
219
+ params: [],
220
+ capabilities: [],
221
+ run: (_c, i) => {
222
+ const out = [];
223
+ for (const branch of i.group.values())
224
+ out.push(...branch);
225
+ return { items: out };
226
+ },
227
+ },
228
+ {
229
+ type: 'core.groupBy',
230
+ title: 'Group by',
231
+ category: 'core',
232
+ doc: 'Items grouped under the matching key (shortest of the two lists). Entities key by GlobalId.',
233
+ inputs: [
234
+ { name: 'items', type: ANY_LIST },
235
+ { name: 'keys', type: ANY_LIST },
236
+ ],
237
+ outputs: [{ name: 'group', type: ANY_GROUP }],
238
+ params: [],
239
+ capabilities: [],
240
+ run: (_c, i) => {
241
+ const items = i.items;
242
+ const keys = i.keys;
243
+ const group = new Map();
244
+ const n = Math.min(items.length, keys.length);
245
+ for (let k = 0; k < n; k += 1) {
246
+ const key = scalarKey(keys[k]);
247
+ (group.get(key) ?? group.set(key, []).get(key)).push(items[k]);
248
+ }
249
+ return { group };
250
+ },
251
+ },
252
+ {
253
+ type: 'core.keys',
254
+ title: 'Keys',
255
+ category: 'core',
256
+ inputs: [{ name: 'group', type: ANY_GROUP }],
257
+ outputs: [{ name: 'keys', type: SCALAR_LIST }],
258
+ params: [],
259
+ capabilities: [],
260
+ run: (_c, i) => ({ keys: [...i.group.keys()] }),
261
+ },
262
+ {
263
+ type: 'core.lookup',
264
+ title: 'Lookup',
265
+ category: 'core',
266
+ doc: 'The branch under a key; empty when absent.',
267
+ inputs: [
268
+ { name: 'group', type: ANY_GROUP },
269
+ { name: 'key', type: SCALAR_ITEM },
270
+ ],
271
+ outputs: [{ name: 'items', type: ANY_LIST }],
272
+ params: [],
273
+ capabilities: [],
274
+ run: (_c, i) => ({ items: i.group.get(scalarKey(i.key)) ?? [] }),
275
+ },
276
+ ];
277
+ //# sourceMappingURL=core-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-nodes.js","sourceRoot":"","sources":["../src/core-nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type FlowNodeDef } from './host.js';
2
+ export declare const csvNodes: FlowNodeDef[];
3
+ //# sourceMappingURL=csv-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-nodes.d.ts","sourceRoot":"","sources":["../src/csv-nodes.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA0BnF,eAAO,MAAM,QAAQ,EAAE,WAAW,EA0EjC,CAAC"}
@@ -0,0 +1,111 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * `table.readCsv` / `table.writeCsv` — the pilot workflow's spreadsheet
6
+ * connector (issue #5167 phase 3.2): a mapping spreadsheet in, typed
7
+ * `Table` rows out, and back.
8
+ *
9
+ * Reading is `csv-parse.ts`'s own RFC 4180 parser (there is no existing
10
+ * reusable one — `CsvConnector`'s is private). Writing goes through
11
+ * `@ifc-lite/export`'s `tableToCsv`, which is itself built on the ONE
12
+ * canonical CWE-1236 escaper (`escapeCsvCell`) — this module never touches
13
+ * formula-injection guarding directly, so `scripts/check-csv-escaper-copies.mjs`
14
+ * has nothing new to find here.
15
+ */
16
+ import { tableToCsv } from '@ifc-lite/export';
17
+ import { PARSE_INVALID } from '@ifc-lite/mutations';
18
+ import { parseStrictCell } from './strict-cell.js';
19
+ import { COLUMN_TYPES } from '@ifc-lite/flow';
20
+ import { SCALAR_ITEM, SCALAR_LIST, TABLE_ITEM } from './host.js';
21
+ import { tableOf } from './table-nodes.js';
22
+ import { parseCsvText } from './csv-parse.js';
23
+ function isColumnSpec(v) {
24
+ return !!v && typeof v === 'object' && typeof v.name === 'string';
25
+ }
26
+ /** Declared columns from the `columns` param, or `undefined` to infer
27
+ * (every header cell becomes a `string` column). */
28
+ function specColumns(raw) {
29
+ if (!Array.isArray(raw) || raw.length === 0)
30
+ return undefined;
31
+ const specs = raw.filter(isColumnSpec);
32
+ return specs.length > 0 ? specs : undefined;
33
+ }
34
+ function columnType(spec) {
35
+ const t = spec?.type;
36
+ return typeof t === 'string' && COLUMN_TYPES.includes(t) ? t : 'string';
37
+ }
38
+ export const csvNodes = [
39
+ {
40
+ type: 'table.readCsv',
41
+ title: 'Read CSV',
42
+ category: 'table',
43
+ doc: 'Parses CSV text into a typed table. A malformed row (wrong field count, an unparseable typed cell) is reported in `problems` and kept, never dropped.',
44
+ inputs: [{ name: 'text', type: SCALAR_ITEM }],
45
+ outputs: [
46
+ { name: 'table', type: TABLE_ITEM },
47
+ { name: 'problems', type: SCALAR_LIST },
48
+ ],
49
+ params: [
50
+ { name: 'columns', kind: 'json', doc: 'Optional [{ name, type }]; defaults to the header row, all columns typed `string`.' },
51
+ { name: 'delimiter', kind: 'string', default: ',' },
52
+ { name: 'key', kind: 'string', doc: 'Key column name; defaults to `GlobalId` when present, else the first column.' },
53
+ ],
54
+ capabilities: [],
55
+ run: (_ctx, i, p) => {
56
+ const text = String(i.text ?? '');
57
+ const delimiter = typeof p.delimiter === 'string' && p.delimiter.length > 0 ? p.delimiter : ',';
58
+ const parsed = parseCsvText(text, delimiter);
59
+ const declared = specColumns(p.columns);
60
+ const header = declared ? declared.map((c) => c.name) : parsed.header;
61
+ const columns = header.map((name, idx) => ({ name, type: columnType(declared?.[idx]) }));
62
+ const problems = [];
63
+ const rows = parsed.rows.map((r, rowIdx) => {
64
+ if (r.fieldCountMismatch) {
65
+ problems.push(`row ${rowIdx + 2}: expected ${header.length} field(s), got ${r.fields.length}`);
66
+ }
67
+ const row = {};
68
+ columns.forEach((col, colIdx) => {
69
+ const raw = r.fields[colIdx];
70
+ if (raw === undefined) {
71
+ row[col.name] = null;
72
+ return;
73
+ }
74
+ if (col.type === 'string' || col.type === 'label' || col.type === 'identifier' || col.type === 'text' || col.type === 'enum' || col.type === 'reference') {
75
+ row[col.name] = raw;
76
+ return;
77
+ }
78
+ const parsedCell = parseStrictCell(raw, col.type);
79
+ if (parsedCell === PARSE_INVALID) {
80
+ problems.push(`row ${rowIdx + 2}: column "${col.name}": cannot parse "${raw}" as ${col.type}`);
81
+ row[col.name] = null;
82
+ return;
83
+ }
84
+ row[col.name] = Array.isArray(parsedCell) ? parsedCell.join(';') : parsedCell;
85
+ });
86
+ return row;
87
+ });
88
+ const key = typeof p.key === 'string' && p.key.length > 0 ? p.key : columns.some((c) => c.name === 'GlobalId') ? 'GlobalId' : (columns[0]?.name ?? 'GlobalId');
89
+ const table = { columns, rows, key: columns.some((c) => c.name === key) ? key : (columns[0]?.name ?? key) };
90
+ return { table, problems };
91
+ },
92
+ },
93
+ {
94
+ type: 'table.writeCsv',
95
+ title: 'Write CSV',
96
+ category: 'table',
97
+ doc: 'Serialises a table to RFC 4180 CSV text, guarding every cell against spreadsheet formula injection (CWE-1236).',
98
+ inputs: [{ name: 'table', type: TABLE_ITEM }],
99
+ outputs: [{ name: 'text', type: SCALAR_ITEM }],
100
+ params: [{ name: 'delimiter', kind: 'string', default: ',' }],
101
+ capabilities: [],
102
+ run: (_ctx, i, p) => {
103
+ const t = tableOf(i.table);
104
+ const delimiter = typeof p.delimiter === 'string' && p.delimiter.length > 0 ? p.delimiter : ',';
105
+ const names = t.columns.map((c) => c.name);
106
+ const text = tableToCsv(names, t.rows, { delimiter });
107
+ return { text };
108
+ },
109
+ },
110
+ ];
111
+ //# sourceMappingURL=csv-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-nodes.js","sourceRoot":"","sources":["../src/csv-nodes.ts"],"names":[],"mappings":"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"}