@ifc-lite/flow 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 (59) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +63 -0
  3. package/dist/availability.d.ts +28 -0
  4. package/dist/availability.d.ts.map +1 -0
  5. package/dist/availability.js +37 -0
  6. package/dist/availability.js.map +1 -0
  7. package/dist/digest.d.ts +14 -0
  8. package/dist/digest.d.ts.map +1 -0
  9. package/dist/digest.js +73 -0
  10. package/dist/digest.js.map +1 -0
  11. package/dist/document.d.ts +73 -0
  12. package/dist/document.d.ts.map +1 -0
  13. package/dist/document.js +158 -0
  14. package/dist/document.js.map +1 -0
  15. package/dist/index.d.ts +22 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +16 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/introspect.d.ts +61 -0
  20. package/dist/introspect.d.ts.map +1 -0
  21. package/dist/introspect.js +51 -0
  22. package/dist/introspect.js.map +1 -0
  23. package/dist/lift.d.ts +58 -0
  24. package/dist/lift.d.ts.map +1 -0
  25. package/dist/lift.js +213 -0
  26. package/dist/lift.js.map +1 -0
  27. package/dist/orphans.d.ts +32 -0
  28. package/dist/orphans.d.ts.map +1 -0
  29. package/dist/orphans.js +73 -0
  30. package/dist/orphans.js.map +1 -0
  31. package/dist/prepare.d.ts +13 -0
  32. package/dist/prepare.d.ts.map +1 -0
  33. package/dist/prepare.js +40 -0
  34. package/dist/prepare.js.map +1 -0
  35. package/dist/registry.d.ts +99 -0
  36. package/dist/registry.d.ts.map +1 -0
  37. package/dist/registry.js +44 -0
  38. package/dist/registry.js.map +1 -0
  39. package/dist/scheduler.d.ts +91 -0
  40. package/dist/scheduler.d.ts.map +1 -0
  41. package/dist/scheduler.js +341 -0
  42. package/dist/scheduler.js.map +1 -0
  43. package/dist/table.d.ts +64 -0
  44. package/dist/table.d.ts.map +1 -0
  45. package/dist/table.js +132 -0
  46. package/dist/table.js.map +1 -0
  47. package/dist/tracking.d.ts +86 -0
  48. package/dist/tracking.d.ts.map +1 -0
  49. package/dist/tracking.js +136 -0
  50. package/dist/tracking.js.map +1 -0
  51. package/dist/values.d.ts +102 -0
  52. package/dist/values.d.ts.map +1 -0
  53. package/dist/values.js +64 -0
  54. package/dist/values.js.map +1 -0
  55. package/dist/wiring.d.ts +20 -0
  56. package/dist/wiring.d.ts.map +1 -0
  57. package/dist/wiring.js +56 -0
  58. package/dist/wiring.js.map +1 -0
  59. package/package.json +53 -0
package/dist/lift.js ADDED
@@ -0,0 +1,213 @@
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 { asGroup, group, item, list, SINGLE_BRANCH } from './values.js';
5
+ export class CrossProductTooLarge extends Error {
6
+ size;
7
+ limit;
8
+ constructor(size, limit) {
9
+ super(`cross lacing would produce ${size} lanes, above the limit of ${limit}`);
10
+ this.size = size;
11
+ this.limit = limit;
12
+ this.name = 'CrossProductTooLarge';
13
+ }
14
+ }
15
+ function isEntityRef(v) {
16
+ return !!v && typeof v === 'object' && typeof v.globalId === 'string';
17
+ }
18
+ function accessOf(input) {
19
+ return input.port.type.access;
20
+ }
21
+ /** Lace `item` ports that hold lists inside one branch; returns lanes with `branchKey` unset. */
22
+ function laceBranch(fixed, laced, opts, warnings) {
23
+ if (laced.length === 0)
24
+ return [{ innerKey: SINGLE_BRANCH, args: fixed }];
25
+ const keyOf = (port, value, index) => {
26
+ if (isEntityRef(value) && (opts.laneKeyPort === undefined || opts.laneKeyPort === port.name))
27
+ return value.globalId;
28
+ return String(index);
29
+ };
30
+ if (opts.lacing === 'cross') {
31
+ const size = laced.reduce((n, l) => n * l.items.length, 1);
32
+ if (size > opts.maxCross)
33
+ throw new CrossProductTooLarge(size, opts.maxCross);
34
+ const lanes = [];
35
+ const idx = laced.map(() => 0);
36
+ if (size === 0)
37
+ return lanes;
38
+ for (;;) {
39
+ const args = { ...fixed };
40
+ const keys = [];
41
+ laced.forEach((l, p) => {
42
+ args[l.port.name] = l.items[idx[p]];
43
+ keys.push(keyOf(l.port, l.items[idx[p]], idx[p]));
44
+ });
45
+ lanes.push({ innerKey: keys.join('|'), args });
46
+ let p = laced.length - 1;
47
+ while (p >= 0) {
48
+ idx[p] += 1;
49
+ if (idx[p] < laced[p].items.length)
50
+ break;
51
+ idx[p] = 0;
52
+ p -= 1;
53
+ }
54
+ if (p < 0)
55
+ return lanes;
56
+ }
57
+ }
58
+ const lengths = laced.map((l) => l.items.length);
59
+ const n = opts.lacing === 'shortest' ? Math.min(...lengths) : Math.max(...lengths);
60
+ const driver = laced.find((l) => opts.laneKeyPort === l.port.name) ?? laced.find((l) => l.items.some(isEntityRef)) ?? laced[0];
61
+ let indexKeyed = false;
62
+ const lanes = [];
63
+ for (let i = 0; i < n; i += 1) {
64
+ const args = { ...fixed };
65
+ for (const l of laced) {
66
+ const j = Math.min(i, l.items.length - 1);
67
+ args[l.port.name] = l.items.length === 0 ? undefined : l.items[j];
68
+ }
69
+ const driverValue = driver.items[Math.min(i, driver.items.length - 1)];
70
+ const key = keyOf(driver.port, driverValue, i);
71
+ if (!isEntityRef(driverValue))
72
+ indexKeyed = true;
73
+ lanes.push({ innerKey: key, args });
74
+ }
75
+ if (indexKeyed && n > 0)
76
+ warnings.push(`lanes on "${driver.port.name}" are keyed by index; connect entities or set laneKeyPort for stable tracking`);
77
+ return lanes;
78
+ }
79
+ function isNullLane(inputs, args) {
80
+ return inputs.some((i) => accessOf(i) === 'item' && !i.port.nullable && i.data !== undefined && args[i.port.name] === null);
81
+ }
82
+ export function planLift(inputs, opts) {
83
+ const warnings = [];
84
+ const missing = {};
85
+ const fixed = {};
86
+ const groupCarriers = [];
87
+ for (const input of inputs) {
88
+ const access = accessOf(input);
89
+ if (input.data === undefined) {
90
+ fixed[input.port.name] = undefined;
91
+ continue;
92
+ }
93
+ if (access === 'group')
94
+ fixed[input.port.name] = asGroup(input.data);
95
+ else if (input.data.kind === 'group')
96
+ groupCarriers.push(input);
97
+ }
98
+ const buildLanes = (branchKey, branchOf) => {
99
+ const laneFixed = { ...fixed };
100
+ const laced = [];
101
+ for (const input of inputs) {
102
+ const access = accessOf(input);
103
+ if (access === 'group' || input.data === undefined)
104
+ continue;
105
+ const branch = branchOf(input);
106
+ if (branch === undefined)
107
+ continue;
108
+ if (access === 'list')
109
+ laneFixed[input.port.name] = branch;
110
+ else if (branch.length === 1 && input.data.kind === 'item')
111
+ laneFixed[input.port.name] = branch[0];
112
+ else
113
+ laced.push({ port: input.port, items: branch });
114
+ }
115
+ const lanes = laceBranch(laneFixed, laced, opts, warnings);
116
+ const lifted = laced.length > 0;
117
+ return lanes.map((l) => ({
118
+ laneKey: branchKey === null ? (lifted ? l.innerKey : null) : lifted ? `${branchKey}|${l.innerKey}` : branchKey,
119
+ branchKey,
120
+ args: l.args,
121
+ nullLane: isNullLane(inputs, l.args),
122
+ }));
123
+ };
124
+ if (groupCarriers.length === 0) {
125
+ const lanes = buildLanes(null, (input) => (input.data.kind === 'item' ? [input.data.value] : input.data.kind === 'list' ? input.data.items : undefined));
126
+ return { lifted: lanes.length !== 1 || lanes[0].laneKey !== null, overGroup: false, lanes, missing, warnings };
127
+ }
128
+ const keys = [];
129
+ const seen = new Set();
130
+ for (const c of groupCarriers) {
131
+ for (const k of c.data.branches.keys()) {
132
+ if (!seen.has(k)) {
133
+ seen.add(k);
134
+ keys.push(k);
135
+ }
136
+ }
137
+ }
138
+ const lanes = [];
139
+ for (const key of keys) {
140
+ let skip = false;
141
+ for (const c of groupCarriers) {
142
+ const branches = c.data.branches;
143
+ if (!branches.has(key)) {
144
+ (missing[c.port.name] ??= []).push(key);
145
+ if (!c.port.optional)
146
+ skip = true;
147
+ }
148
+ }
149
+ if (skip)
150
+ continue;
151
+ lanes.push(...buildLanes(key, (input) => {
152
+ if (input.data.kind === 'group')
153
+ return input.data.branches.get(key) ?? (input.port.optional ? undefined : []);
154
+ return input.data.kind === 'item' ? [input.data.value] : input.data.items;
155
+ }));
156
+ }
157
+ return { lifted: true, overGroup: true, lanes, missing, warnings };
158
+ }
159
+ /** Reassemble per-lane outputs into structured data, one entry per output port. */
160
+ export function assemble(plan, outputs, results) {
161
+ const out = new Map();
162
+ if (!plan.lifted) {
163
+ const r = results[0] ?? {};
164
+ for (const port of outputs) {
165
+ const v = r[port.name];
166
+ const access = port.type.access;
167
+ out.set(port.name, access === 'item' ? item(v ?? null) : access === 'list' ? list(asArray(v)) : group(asMap(v)));
168
+ }
169
+ return out;
170
+ }
171
+ for (const port of outputs) {
172
+ const access = port.type.access;
173
+ if (access === 'item' && !plan.overGroup) {
174
+ out.set(port.name, list(plan.lanes.map((_, i) => results[i]?.[port.name] ?? null)));
175
+ continue;
176
+ }
177
+ const branches = new Map();
178
+ // Two lanes can share a key when the driving list repeats an entity
179
+ // (`model.related` returning the same opening twice, a GlobalId column
180
+ // with repeats). Every access APPENDS into the branch; replacing would
181
+ // drop the earlier lane's output silently, and only for list/group
182
+ // ports — a loss that depends on the port's access is worse than either
183
+ // consistent answer.
184
+ const into = (k) => branches.get(k) ?? branches.set(k, []).get(k);
185
+ plan.lanes.forEach((lane, i) => {
186
+ const v = results[i]?.[port.name];
187
+ if (access === 'item')
188
+ into(lane.branchKey ?? SINGLE_BRANCH).push(v ?? null);
189
+ else if (access === 'list')
190
+ into(lane.laneKey ?? SINGLE_BRANCH).push(...asArray(v));
191
+ else
192
+ for (const [k, items] of asMap(v))
193
+ into(`${lane.laneKey ?? SINGLE_BRANCH}|${k}`).push(...items);
194
+ });
195
+ out.set(port.name, group(branches));
196
+ }
197
+ return out;
198
+ }
199
+ function asArray(v) {
200
+ if (v === undefined || v === null)
201
+ return [];
202
+ if (!Array.isArray(v))
203
+ throw new TypeError('a list output must return an array');
204
+ return v;
205
+ }
206
+ function asMap(v) {
207
+ if (v === undefined || v === null)
208
+ return new Map();
209
+ if (!(v instanceof Map))
210
+ throw new TypeError('a group output must return a Map');
211
+ return v;
212
+ }
213
+ //# sourceMappingURL=lift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lift.js","sourceRoot":"","sources":["../src/lift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { FlowDocument, FlowNode } from './document.js';
2
+ import type { NodeRegistry } from './registry.js';
3
+ import type { TrackedSet, TrackingStore } from './tracking.js';
4
+ import type { RunLogEntry } from './scheduler.js';
5
+ /** Log entries of the orphan sweep carry this in place of a node id. */
6
+ export declare const ORPHAN_NODE_ID = "(deleted node)";
7
+ export declare function trackingKeyOf(doc: FlowDocument, node: FlowNode): string;
8
+ /**
9
+ * Remove every element of a set through its recorded node type's `remove`.
10
+ * Entries that were removed are dropped from the set; a set with failures
11
+ * keeps only the failed entries, so the next run retries those and not the
12
+ * ones already gone. Returns the set left over (undefined when empty).
13
+ */
14
+ export declare function removeSet<H>(set: TrackedSet, registry: NodeRegistry<unknown>, host: H, signal: AbortSignal | undefined, log: RunLogEntry[], nodeId: string): Promise<{
15
+ removed: number;
16
+ errors: number;
17
+ rest: TrackedSet | undefined;
18
+ }>;
19
+ /**
20
+ * Sets no tracked node claims any more — the node was deleted, or its
21
+ * tracking key renamed — are removed from the model through the recorded
22
+ * node type's `remove`, then dropped from the store. Deleting a node in the
23
+ * editor and re-running otherwise left its elements in the model with a
24
+ * sidecar entry nothing would ever reconcile: exactly the orphan tracking
25
+ * exists to prevent. A set whose type is unknown here stays, with a warning,
26
+ * rather than being forgotten while its elements remain.
27
+ */
28
+ export declare function removeOrphanedSets<H>(doc: FlowDocument, host: H, store: TrackingStore | undefined, registry: NodeRegistry<unknown>, log: RunLogEntry[], signal?: AbortSignal): Promise<{
29
+ removed: number;
30
+ errors: number;
31
+ }>;
32
+ //# sourceMappingURL=orphans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../src/orphans.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAgB,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wEAAwE;AACxE,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEvE;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,EAC/B,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,GAAG,EAAE,WAAW,EAAE,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAoB5E;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,EAC/B,GAAG,EAAE,WAAW,EAAE,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsB9C"}
@@ -0,0 +1,73 @@
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
+ /** Log entries of the orphan sweep carry this in place of a node id. */
5
+ export const ORPHAN_NODE_ID = '(deleted node)';
6
+ export function trackingKeyOf(doc, node) {
7
+ return node.trackingKey ?? `${doc.name}/${node.label ?? node.id}`;
8
+ }
9
+ /**
10
+ * Remove every element of a set through its recorded node type's `remove`.
11
+ * Entries that were removed are dropped from the set; a set with failures
12
+ * keeps only the failed entries, so the next run retries those and not the
13
+ * ones already gone. Returns the set left over (undefined when empty).
14
+ */
15
+ export async function removeSet(set, registry, host, signal, log, nodeId) {
16
+ const say = (level, laneKey, message) => log.push({ nodeId, laneKey, level, message });
17
+ const def = set.nodeType ? registry.get(set.nodeType) : undefined;
18
+ if (!def?.remove) {
19
+ say('warn', null, `tracked set "${set.trackingKey}" has ${set.nodeType ? `type "${set.nodeType}", which cannot remove elements` : 'no recorded type'}; its ${Object.keys(set.entries).length} element(s) stay in the model`);
20
+ return { removed: 0, errors: 0, rest: set };
21
+ }
22
+ let removed = 0;
23
+ const failed = {};
24
+ for (const [laneKey, entry] of Object.entries(set.entries)) {
25
+ try {
26
+ await def.remove({ host, laneKey, tracking: undefined, signal, log: (level, message) => say(level, laneKey, message) }, entry.globalId);
27
+ removed += 1;
28
+ }
29
+ catch (err) {
30
+ failed[laneKey] = entry;
31
+ say('error', laneKey, `remove ${entry.globalId} of "${set.trackingKey}": ${err instanceof Error ? err.message : String(err)}`);
32
+ }
33
+ }
34
+ const errors = Object.keys(failed).length;
35
+ return { removed, errors, rest: errors > 0 ? { ...set, entries: failed } : undefined };
36
+ }
37
+ /**
38
+ * Sets no tracked node claims any more — the node was deleted, or its
39
+ * tracking key renamed — are removed from the model through the recorded
40
+ * node type's `remove`, then dropped from the store. Deleting a node in the
41
+ * editor and re-running otherwise left its elements in the model with a
42
+ * sidecar entry nothing would ever reconcile: exactly the orphan tracking
43
+ * exists to prevent. A set whose type is unknown here stays, with a warning,
44
+ * rather than being forgotten while its elements remain.
45
+ */
46
+ export async function removeOrphanedSets(doc, host, store, registry, log, signal) {
47
+ if (!store)
48
+ return { removed: 0, errors: 0 };
49
+ const live = new Set(doc.nodes.filter((n) => registry.get(n.type)?.tracked).map((n) => trackingKeyOf(doc, n)));
50
+ let errors = 0;
51
+ let removed = 0;
52
+ for (const key of store.keys()) {
53
+ if (live.has(key))
54
+ continue;
55
+ const set = store.load(key);
56
+ if (!set)
57
+ continue;
58
+ const r = await removeSet(set, registry, host, signal, log, ORPHAN_NODE_ID);
59
+ removed += r.removed;
60
+ errors += r.errors;
61
+ if (r.rest === undefined) {
62
+ store.delete(key);
63
+ log.push({ nodeId: ORPHAN_NODE_ID, laneKey: null, level: 'info', message: `removed ${r.removed} element(s) of deleted node "${key}"` });
64
+ }
65
+ else if (r.rest !== set) {
66
+ // Keep only what still needs removing, so a retry does not re-run the
67
+ // removals that already succeeded.
68
+ store.save(r.rest);
69
+ }
70
+ }
71
+ return { removed, errors };
72
+ }
73
+ //# sourceMappingURL=orphans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphans.js","sourceRoot":"","sources":["../src/orphans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Per-node input gathering for the scheduler: edges → lift inputs, wiring problems, and no-op pass-through outputs. */
2
+ import type { FlowDocument, FlowNode } from './document.js';
3
+ import type { LiftInput } from './lift.js';
4
+ import type { NodeDef, NodeRegistry } from './registry.js';
5
+ import { type FlowData } from './values.js';
6
+ export interface Prepared {
7
+ readonly inputs: LiftInput[];
8
+ readonly problems: string[];
9
+ readonly skipped: boolean;
10
+ }
11
+ export declare function prepareInputs(doc: FlowDocument, node: FlowNode, def: NodeDef<unknown>, registry: NodeRegistry<unknown>, outputs: Map<string, Map<string, FlowData>>, failed: Set<string>): Prepared;
12
+ export declare function noopOutputs(def: NodeDef<unknown>, inputs: readonly LiftInput[]): Map<string, FlowData>;
13
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../src/prepare.ts"],"names":[],"mappings":"AAIA,wHAAwH;AAExH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EACrB,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAC3C,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAClB,QAAQ,CAqBV;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAStG"}
@@ -0,0 +1,40 @@
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 { isAssignable, item } from './values.js';
5
+ export function prepareInputs(doc, node, def, registry, outputs, failed) {
6
+ const problems = [];
7
+ let skipped = false;
8
+ const inputs = def.inputs.map((port) => {
9
+ const edge = doc.edges.find((e) => e.to[0] === node.id && e.to[1] === port.name);
10
+ if (!edge) {
11
+ if (!port.optional)
12
+ problems.push(`required input "${port.name}" is not connected`);
13
+ return { port, data: undefined };
14
+ }
15
+ const [srcId, srcPort] = edge.from;
16
+ if (failed.has(srcId))
17
+ skipped = true;
18
+ const srcNode = doc.nodes.find((n) => n.id === srcId);
19
+ const srcDef = srcNode ? registry.get(srcNode.type) : undefined;
20
+ const srcPortDef = srcDef?.outputs.find((p) => p.name === srcPort);
21
+ if (!srcPortDef)
22
+ problems.push(`edge from ${srcId}.${srcPort}: no such output`);
23
+ else if (!isAssignable(srcPortDef.type, port.type)) {
24
+ problems.push(`edge from ${srcId}.${srcPort} (${srcPortDef.type.kind}) cannot feed "${port.name}" (${port.type.kind})`);
25
+ }
26
+ return { port, data: outputs.get(srcId)?.get(srcPort) };
27
+ });
28
+ return { inputs, problems, skipped };
29
+ }
30
+ export function noopOutputs(def, inputs) {
31
+ // A no-op node passes through any input whose name matches an output
32
+ // (so `viewer.colorize(entities) → entities` still chains), else empties.
33
+ const out = new Map();
34
+ for (const port of def.outputs) {
35
+ const same = inputs.find((i) => i.port.name === port.name)?.data;
36
+ out.set(port.name, same ?? (port.type.access === 'item' ? item(null) : port.type.access === 'list' ? { kind: 'list', items: [] } : { kind: 'group', branches: new Map() }));
37
+ }
38
+ return out;
39
+ }
40
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../src/prepare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Node definitions and the registry that resolves a document's node types.
3
+ *
4
+ * A node is a pure description plus a `run` function that receives plain
5
+ * values in the shape its ports declared (`item` → one value, `list` → an
6
+ * array, `group` → a Map). The scheduler does all lifting; a node never sees
7
+ * a `FlowData` container and never inspects the structure of its inputs.
8
+ *
9
+ * `H` is the host services type (in `@ifc-lite/flow-nodes`: `{ bim }`).
10
+ * This package knows nothing about the SDK.
11
+ */
12
+ import type { GroupKey, PortType } from './values.js';
13
+ export interface PortDef {
14
+ readonly name: string;
15
+ readonly type: PortType;
16
+ readonly doc?: string;
17
+ /** An unconnected optional input receives `undefined`; a required one is a validation error. */
18
+ readonly optional?: boolean;
19
+ /** An `item` port that accepts `null` lanes instead of short-circuiting them. */
20
+ readonly nullable?: boolean;
21
+ }
22
+ /**
23
+ * `code` is a `string` the editor must give a multi-line editor to: a
24
+ * one-line `<input>` is the only thing a script's source cannot be typed
25
+ * into. Values are plain strings, so a host that has no code editor can
26
+ * still fall back to the `string` field.
27
+ */
28
+ export type ParamKind = 'string' | 'number' | 'boolean' | 'enum' | 'json' | 'code';
29
+ export interface ParamDef {
30
+ readonly name: string;
31
+ readonly kind: ParamKind;
32
+ readonly default?: unknown;
33
+ readonly options?: readonly string[];
34
+ readonly doc?: string;
35
+ /** Syntax for a `code` param, e.g. `javascript`. */
36
+ readonly language?: string;
37
+ }
38
+ export type LogLevel = 'info' | 'warn' | 'error';
39
+ /** What a tracked write node must do for this lane (see `tracking.ts`). */
40
+ export interface LaneTracking {
41
+ readonly action: 'create' | 'update' | 'keep';
42
+ /** The element's GlobalId: stable across runs for the same tracking key + lane key. */
43
+ readonly globalId: string;
44
+ }
45
+ export interface NodeRunContext<H> {
46
+ readonly host: H;
47
+ /** The lane this invocation computes, or `null` when the node was not lifted. */
48
+ readonly laneKey: GroupKey | null;
49
+ /** Present on tracked nodes' `run` only; `remove` gets the GlobalId as its argument instead. */
50
+ readonly tracking?: LaneTracking;
51
+ readonly signal?: AbortSignal;
52
+ log(level: LogLevel, message: string): void;
53
+ }
54
+ /** Plain outputs keyed by port name, each in the shape the port's `access` declares. */
55
+ export type NodeOutputs = Readonly<Record<string, unknown>>;
56
+ export interface NodeDef<H = unknown, P = Readonly<Record<string, unknown>>> {
57
+ /** Stable id, e.g. `model.queryByType`. */
58
+ readonly type: string;
59
+ readonly title: string;
60
+ readonly category: string;
61
+ readonly doc?: string;
62
+ readonly inputs: readonly PortDef[];
63
+ readonly outputs: readonly PortDef[];
64
+ readonly params: readonly ParamDef[];
65
+ /** Capability strings in the extension grammar (`model.read`, `model.mutate:Pset_X`). */
66
+ readonly capabilities: readonly string[];
67
+ /** Memo key includes model revisions when set; write nodes are never memoised. */
68
+ readonly reads?: 'model';
69
+ readonly writes?: 'model';
70
+ /** Headless behaviour when a required backend feature is absent: `noop` runs as no-op. */
71
+ readonly headless?: 'run' | 'noop';
72
+ /** Host prerequisites the availability check tests for. */
73
+ readonly requires?: {
74
+ readonly backend?: readonly string[];
75
+ readonly network?: boolean;
76
+ readonly secrets?: readonly string[];
77
+ };
78
+ /** Name of the `item` input whose `EntityRef` value keys lanes (defaults to the first entity item port). */
79
+ readonly laneKeyPort?: string;
80
+ /**
81
+ * A tracked node owns the elements it creates: the scheduler plans each
82
+ * lane as create / update / keep against the node's tracked set and calls
83
+ * `remove` for lanes that vanished since the last run.
84
+ */
85
+ readonly tracked?: boolean;
86
+ remove?(ctx: NodeRunContext<H>, globalId: string): void | Promise<void>;
87
+ run(ctx: NodeRunContext<H>, inputs: Readonly<Record<string, unknown>>, params: P): NodeOutputs | Promise<NodeOutputs>;
88
+ }
89
+ export declare class NodeRegistry<H = unknown> {
90
+ private readonly defs;
91
+ register(def: NodeDef<H>): this;
92
+ registerAll(defs: Iterable<NodeDef<H>>): this;
93
+ get(type: string): NodeDef<H> | undefined;
94
+ has(type: string): boolean;
95
+ list(): readonly NodeDef<H>[];
96
+ }
97
+ /** Resolve declared params with defaults; unknown keys are dropped, not passed through. */
98
+ export declare function resolveParams(def: NodeDef<unknown>, given: Readonly<Record<string, unknown>> | undefined): Record<string, unknown>;
99
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
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
+ export class NodeRegistry {
5
+ defs = new Map();
6
+ register(def) {
7
+ if (this.defs.has(def.type))
8
+ throw new Error(`node type "${def.type}" is already registered`);
9
+ for (const p of [...def.inputs, ...def.outputs])
10
+ assertAccess(def.type, p);
11
+ this.defs.set(def.type, def);
12
+ return this;
13
+ }
14
+ registerAll(defs) {
15
+ for (const d of defs)
16
+ this.register(d);
17
+ return this;
18
+ }
19
+ get(type) {
20
+ return this.defs.get(type);
21
+ }
22
+ has(type) {
23
+ return this.defs.has(type);
24
+ }
25
+ list() {
26
+ return [...this.defs.values()];
27
+ }
28
+ }
29
+ const ACCESS = ['item', 'list', 'group'];
30
+ function assertAccess(type, port) {
31
+ if (!ACCESS.includes(port.type.access)) {
32
+ throw new Error(`node "${type}" port "${port.name}" has unknown access "${String(port.type.access)}"`);
33
+ }
34
+ }
35
+ /** Resolve declared params with defaults; unknown keys are dropped, not passed through. */
36
+ export function resolveParams(def, given) {
37
+ const out = {};
38
+ for (const p of def.params) {
39
+ const v = given?.[p.name];
40
+ out[p.name] = v === undefined ? p.default : v;
41
+ }
42
+ return out;
43
+ }
44
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAoG/D,MAAM,OAAO,YAAY;IACN,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEtD,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAC9F,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAA0B;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;CACF;AAED,MAAM,MAAM,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D,SAAS,YAAY,CAAC,IAAY,EAAE,IAAa;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC,IAAI,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,GAAqB,EAAE,KAAoD;IACvG,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}