@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.
- package/LICENSE +373 -0
- package/README.md +34 -0
- package/dist/apply-table-node.d.ts +3 -0
- package/dist/apply-table-node.d.ts.map +1 -0
- package/dist/apply-table-node.js +119 -0
- package/dist/apply-table-node.js.map +1 -0
- package/dist/connector-nodes.d.ts +3 -0
- package/dist/connector-nodes.d.ts.map +1 -0
- package/dist/connector-nodes.js +192 -0
- package/dist/connector-nodes.js.map +1 -0
- package/dist/core-nodes.d.ts +3 -0
- package/dist/core-nodes.d.ts.map +1 -0
- package/dist/core-nodes.js +277 -0
- package/dist/core-nodes.js.map +1 -0
- package/dist/csv-nodes.d.ts +3 -0
- package/dist/csv-nodes.d.ts.map +1 -0
- package/dist/csv-nodes.js +111 -0
- package/dist/csv-nodes.js.map +1 -0
- package/dist/csv-parse.d.ts +26 -0
- package/dist/csv-parse.d.ts.map +1 -0
- package/dist/csv-parse.js +83 -0
- package/dist/csv-parse.js.map +1 -0
- package/dist/element-nodes.d.ts +36 -0
- package/dist/element-nodes.d.ts.map +1 -0
- package/dist/element-nodes.js +224 -0
- package/dist/element-nodes.js.map +1 -0
- package/dist/host.d.ts +107 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +94 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/model-nodes.d.ts +3 -0
- package/dist/model-nodes.d.ts.map +1 -0
- package/dist/model-nodes.js +200 -0
- package/dist/model-nodes.js.map +1 -0
- package/dist/script-node.d.ts +4 -0
- package/dist/script-node.d.ts.map +1 -0
- package/dist/script-node.js +140 -0
- package/dist/script-node.js.map +1 -0
- package/dist/strict-cell.d.ts +20 -0
- package/dist/strict-cell.d.ts.map +1 -0
- package/dist/strict-cell.js +33 -0
- package/dist/strict-cell.js.map +1 -0
- package/dist/table-nodes.d.ts +17 -0
- package/dist/table-nodes.d.ts.map +1 -0
- package/dist/table-nodes.js +200 -0
- package/dist/table-nodes.js.map +1 -0
- package/dist/viewer-nodes.d.ts +3 -0
- package/dist/viewer-nodes.d.ts.map +1 -0
- package/dist/viewer-nodes.js +93 -0
- package/dist/viewer-nodes.js.map +1 -0
- package/dist/write-nodes.d.ts +3 -0
- package/dist/write-nodes.d.ts.map +1 -0
- package/dist/write-nodes.js +63 -0
- package/dist/write-nodes.js.map +1 -0
- package/dist/xlsx-io.d.ts +24 -0
- package/dist/xlsx-io.d.ts.map +1 -0
- package/dist/xlsx-io.js +160 -0
- package/dist/xlsx-io.js.map +1 -0
- package/dist/xlsx-nodes.d.ts +3 -0
- package/dist/xlsx-nodes.d.ts.map +1 -0
- package/dist/xlsx-nodes.js +99 -0
- package/dist/xlsx-nodes.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|