@nodes-dev/core 0.0.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 +21 -0
- package/README.md +33 -0
- package/dist/corpus.d.ts +61 -0
- package/dist/corpus.d.ts.map +1 -0
- package/dist/corpus.js +383 -0
- package/dist/corpus.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/frontmatter.d.ts +5 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +103 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/ids.d.ts +11 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +36 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +106 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +66 -0
- package/dist/node.js.map +1 -0
- package/dist/ranking.d.ts +7 -0
- package/dist/ranking.d.ts.map +1 -0
- package/dist/ranking.js +9 -0
- package/dist/ranking.js.map +1 -0
- package/dist/registry.d.ts +36 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +123 -0
- package/dist/registry.js.map +1 -0
- package/dist/relations.d.ts +30 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +44 -0
- package/dist/relations.js.map +1 -0
- package/dist/search.d.ts +46 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +280 -0
- package/dist/search.js.map +1 -0
- package/dist/shapes.d.ts +86 -0
- package/dist/shapes.d.ts.map +1 -0
- package/dist/shapes.js +138 -0
- package/dist/shapes.js.map +1 -0
- package/dist/similarity.d.ts +68 -0
- package/dist/similarity.d.ts.map +1 -0
- package/dist/similarity.js +305 -0
- package/dist/similarity.js.map +1 -0
- package/dist/snapshot.d.ts +56 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +252 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/store.d.ts +15 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +44 -0
- package/dist/store.js.map +1 -0
- package/dist/structural-index.d.ts +72 -0
- package/dist/structural-index.d.ts.map +1 -0
- package/dist/structural-index.js +434 -0
- package/dist/structural-index.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { CollisionError, IdError, RefError } from "./errors.js";
|
|
2
|
+
import { NodeId } from "./ids.js";
|
|
3
|
+
import { RelationSchema } from "./relations.js";
|
|
4
|
+
import { EDGES, KEYS, MEMBERSHIP, ORDER } from "./shapes.js";
|
|
5
|
+
const STRUCTURAL_ENTRY_KEYS = ["uid", "id", "kind", "deprecatedIds", "relations", "structuralRefs"];
|
|
6
|
+
const STRUCTURAL_REF_ROLES = new Set([
|
|
7
|
+
"membership_member",
|
|
8
|
+
"edges_source",
|
|
9
|
+
"edges_target",
|
|
10
|
+
"order_member",
|
|
11
|
+
"keys_value",
|
|
12
|
+
]);
|
|
13
|
+
function relationOutRefs(relations) {
|
|
14
|
+
const refs = [];
|
|
15
|
+
for (const rel of relations) {
|
|
16
|
+
refs.push({ ref: rel.source, role: "relation_source", relation: rel });
|
|
17
|
+
refs.push({ ref: rel.target, role: "relation_target", relation: rel });
|
|
18
|
+
}
|
|
19
|
+
return refs;
|
|
20
|
+
}
|
|
21
|
+
// Refs from the built-in structural facets. Read directly from `node.facets`
|
|
22
|
+
// (registry-independent); they populate `inRefs` for rename + dangling integrity but
|
|
23
|
+
// are never relation-graph edges (their `relation` stays undefined).
|
|
24
|
+
function structuralOutRefs(node) {
|
|
25
|
+
const refs = [];
|
|
26
|
+
const mem = node.facets[MEMBERSHIP];
|
|
27
|
+
if (mem !== null && typeof mem === "object") {
|
|
28
|
+
const members = mem.members;
|
|
29
|
+
if (Array.isArray(members)) {
|
|
30
|
+
for (const m of members)
|
|
31
|
+
if (typeof m === "string")
|
|
32
|
+
refs.push({ ref: m, role: "membership_member" });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const eg = node.facets[EDGES];
|
|
36
|
+
if (eg !== null && typeof eg === "object") {
|
|
37
|
+
const edges = eg.edges;
|
|
38
|
+
if (Array.isArray(edges)) {
|
|
39
|
+
for (const edge of edges) {
|
|
40
|
+
if (edge !== null && typeof edge === "object") {
|
|
41
|
+
const e = edge;
|
|
42
|
+
if (typeof e.source === "string")
|
|
43
|
+
refs.push({ ref: e.source, role: "edges_source" });
|
|
44
|
+
if (typeof e.target === "string")
|
|
45
|
+
refs.push({ ref: e.target, role: "edges_target" });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const od = node.facets[ORDER];
|
|
51
|
+
if (od !== null && typeof od === "object") {
|
|
52
|
+
const order = od.order;
|
|
53
|
+
if (Array.isArray(order)) {
|
|
54
|
+
for (const m of order)
|
|
55
|
+
if (typeof m === "string")
|
|
56
|
+
refs.push({ ref: m, role: "order_member" });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const ky = node.facets[KEYS];
|
|
60
|
+
if (ky !== null && typeof ky === "object") {
|
|
61
|
+
const keys = ky.keys;
|
|
62
|
+
if (keys !== null && typeof keys === "object") {
|
|
63
|
+
for (const v of Object.values(keys)) {
|
|
64
|
+
if (typeof v === "string")
|
|
65
|
+
refs.push({ ref: v, role: "keys_value" });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return refs;
|
|
70
|
+
}
|
|
71
|
+
function extractOutRefs(node) {
|
|
72
|
+
return [...relationOutRefs(node.relations), ...structuralOutRefs(node)];
|
|
73
|
+
}
|
|
74
|
+
function validatedDeprecatedIds(raw, entryId) {
|
|
75
|
+
if (!Array.isArray(raw))
|
|
76
|
+
throw new Error("structural snapshot: deprecatedIds must be an array of strings");
|
|
77
|
+
const out = [];
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
for (const dep of raw) {
|
|
80
|
+
if (typeof dep !== "string")
|
|
81
|
+
throw new Error("structural snapshot: deprecatedIds must be an array of strings");
|
|
82
|
+
if (dep === entryId)
|
|
83
|
+
throw new Error(`structural snapshot: identity claim ${JSON.stringify(dep)} is both live and deprecated in one entry`);
|
|
84
|
+
if (seen.has(dep))
|
|
85
|
+
throw new Error(`structural snapshot: duplicate deprecated identity claim ${JSON.stringify(dep)} in one entry`);
|
|
86
|
+
seen.add(dep);
|
|
87
|
+
out.push(dep);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
function validateSnapshotWeight(raw, label) {
|
|
92
|
+
if (!("weight" in raw))
|
|
93
|
+
return;
|
|
94
|
+
const weight = raw.weight;
|
|
95
|
+
if (typeof weight !== "number" || !Number.isFinite(weight)) {
|
|
96
|
+
throw new Error(`structural snapshot: ${label} weight must be a finite number`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function validateSnapshotDirected(raw, label) {
|
|
100
|
+
if ("directed" in raw && typeof raw.directed !== "boolean") {
|
|
101
|
+
throw new Error(`structural snapshot: ${label} directed must be a boolean`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function validatedStructuralRefs(raw) {
|
|
105
|
+
if (!Array.isArray(raw))
|
|
106
|
+
throw new Error("structural snapshot: structuralRefs must be an array");
|
|
107
|
+
const out = [];
|
|
108
|
+
for (const item of raw) {
|
|
109
|
+
if (item === null || typeof item !== "object")
|
|
110
|
+
throw new Error("structural snapshot: structuralRef must be an object");
|
|
111
|
+
const { ref, role } = item;
|
|
112
|
+
if (typeof ref !== "string")
|
|
113
|
+
throw new Error("structural snapshot: structuralRef ref must be a string");
|
|
114
|
+
if (typeof role !== "string" || !STRUCTURAL_REF_ROLES.has(role))
|
|
115
|
+
throw new Error("structural snapshot: structuralRef role is invalid");
|
|
116
|
+
out.push({ ref, role: role });
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
/** In-memory structural index. Pure data; no file I/O. */
|
|
121
|
+
export class Index {
|
|
122
|
+
byUid = new Map();
|
|
123
|
+
idToUid = new Map();
|
|
124
|
+
deprecatedToUid = new Map();
|
|
125
|
+
inRefs = new Map();
|
|
126
|
+
static build(nodes) {
|
|
127
|
+
const idx = new Index();
|
|
128
|
+
for (const node of nodes) {
|
|
129
|
+
if (idx.byUid.has(node.uid)) {
|
|
130
|
+
throw new CollisionError(`duplicate uid ${JSON.stringify(node.uid)} in corpus`);
|
|
131
|
+
}
|
|
132
|
+
idx.assertAddable(node); // fail-early on a corrupt corpus (collision contract)
|
|
133
|
+
idx.upsert(node);
|
|
134
|
+
}
|
|
135
|
+
return idx;
|
|
136
|
+
}
|
|
137
|
+
resolveUid(ref) {
|
|
138
|
+
return this.idToUid.get(ref) ?? this.deprecatedToUid.get(ref) ?? null;
|
|
139
|
+
}
|
|
140
|
+
// The collision gate. `upsert` is mechanical and never raises; this is what `build`
|
|
141
|
+
// and `Corpus.add` call before `upsert`. `Corpus.rename` does NOT call it (rename
|
|
142
|
+
// changes a uid's live id, which the second clause would reject mid-commit).
|
|
143
|
+
assertAddable(node) {
|
|
144
|
+
const existing = this.byUid.get(node.uid);
|
|
145
|
+
if (existing !== undefined && existing.id !== node.id) {
|
|
146
|
+
throw new CollisionError(`uid ${JSON.stringify(node.uid)} already belongs to live id ${JSON.stringify(existing.id)}; use rename()`);
|
|
147
|
+
}
|
|
148
|
+
for (const claim of [node.id, ...node.deprecatedIds]) {
|
|
149
|
+
const owner = this.resolveUid(claim);
|
|
150
|
+
if (owner !== null && owner !== node.uid) {
|
|
151
|
+
throw new CollisionError(`identity claim ${JSON.stringify(claim)} already in use by uid ${JSON.stringify(owner)}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
upsert(node) {
|
|
156
|
+
if (this.byUid.has(node.uid))
|
|
157
|
+
this.drop(node.uid);
|
|
158
|
+
const entry = {
|
|
159
|
+
uid: node.uid,
|
|
160
|
+
id: node.id,
|
|
161
|
+
kind: node.kind,
|
|
162
|
+
deprecatedIds: new Set(node.deprecatedIds),
|
|
163
|
+
outRefs: extractOutRefs(node),
|
|
164
|
+
};
|
|
165
|
+
this.byUid.set(node.uid, entry);
|
|
166
|
+
this.idToUid.set(node.id, node.uid);
|
|
167
|
+
for (const dep of node.deprecatedIds)
|
|
168
|
+
this.deprecatedToUid.set(dep, node.uid);
|
|
169
|
+
for (const oref of entry.outRefs) {
|
|
170
|
+
const rows = this.inRefs.get(oref.ref) ?? [];
|
|
171
|
+
rows.push({ sourceUid: node.uid, outRef: oref });
|
|
172
|
+
this.inRefs.set(oref.ref, rows);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
toDict() {
|
|
176
|
+
const entries = [];
|
|
177
|
+
for (const entry of this.byUid.values()) {
|
|
178
|
+
const relations = [];
|
|
179
|
+
for (const o of entry.outRefs) {
|
|
180
|
+
if (o.role !== "relation_source" || o.relation === undefined)
|
|
181
|
+
continue;
|
|
182
|
+
const rel = o.relation;
|
|
183
|
+
const row = {
|
|
184
|
+
source: rel.source,
|
|
185
|
+
predicate: rel.predicate,
|
|
186
|
+
target: rel.target,
|
|
187
|
+
directed: rel.directed,
|
|
188
|
+
attrs: structuredClone(rel.attrs),
|
|
189
|
+
};
|
|
190
|
+
if (rel.weight !== null)
|
|
191
|
+
row.weight = rel.weight;
|
|
192
|
+
relations.push(row);
|
|
193
|
+
}
|
|
194
|
+
entries.push({
|
|
195
|
+
uid: entry.uid,
|
|
196
|
+
id: entry.id,
|
|
197
|
+
kind: entry.kind,
|
|
198
|
+
deprecatedIds: [...entry.deprecatedIds].sort(),
|
|
199
|
+
relations,
|
|
200
|
+
structuralRefs: entry.outRefs
|
|
201
|
+
.filter((o) => !o.role.startsWith("relation_"))
|
|
202
|
+
.map((o) => ({ ref: o.ref, role: o.role })),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return { entries };
|
|
206
|
+
}
|
|
207
|
+
static fromDict(d) {
|
|
208
|
+
if (typeof d !== "object" || d === null)
|
|
209
|
+
throw new Error("structural snapshot: document must be an object");
|
|
210
|
+
const raw = d;
|
|
211
|
+
if (!("entries" in raw))
|
|
212
|
+
throw new Error("structural snapshot: missing entries");
|
|
213
|
+
if (!Array.isArray(raw.entries))
|
|
214
|
+
throw new Error("structural snapshot: entries must be an array");
|
|
215
|
+
const idx = new Index();
|
|
216
|
+
for (const rawEntry of raw.entries) {
|
|
217
|
+
if (typeof rawEntry !== "object" || rawEntry === null)
|
|
218
|
+
throw new Error("structural snapshot: entry must be an object");
|
|
219
|
+
const e = rawEntry;
|
|
220
|
+
for (const key of STRUCTURAL_ENTRY_KEYS) {
|
|
221
|
+
if (!(key in e))
|
|
222
|
+
throw new Error(`structural snapshot: entry missing ${key}`);
|
|
223
|
+
}
|
|
224
|
+
const { uid, id: entryId, kind } = e;
|
|
225
|
+
if (typeof uid !== "string")
|
|
226
|
+
throw new Error("structural snapshot: entry uid must be a string");
|
|
227
|
+
if (typeof entryId !== "string")
|
|
228
|
+
throw new Error("structural snapshot: entry id must be a string");
|
|
229
|
+
if (typeof kind !== "string")
|
|
230
|
+
throw new Error("structural snapshot: entry kind must be a string");
|
|
231
|
+
let parsed;
|
|
232
|
+
try {
|
|
233
|
+
parsed = NodeId.parse(entryId);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
if (err instanceof IdError)
|
|
237
|
+
throw new Error("structural snapshot: entry id must be a valid node id");
|
|
238
|
+
throw err;
|
|
239
|
+
}
|
|
240
|
+
if (parsed.kind !== kind)
|
|
241
|
+
throw new Error("structural snapshot: entry id kind must match entry kind");
|
|
242
|
+
if (!Array.isArray(e.relations))
|
|
243
|
+
throw new Error("structural snapshot: entry relations must be an array");
|
|
244
|
+
if (idx.byUid.has(uid))
|
|
245
|
+
throw new Error(`structural snapshot: duplicate uid ${JSON.stringify(uid)}`);
|
|
246
|
+
const deprecatedIds = validatedDeprecatedIds(e.deprecatedIds, entryId);
|
|
247
|
+
const relations = [];
|
|
248
|
+
for (const rawRel of e.relations) {
|
|
249
|
+
if (typeof rawRel !== "object" || rawRel === null)
|
|
250
|
+
throw new Error("structural snapshot: relation row must be an object");
|
|
251
|
+
const rr = rawRel;
|
|
252
|
+
validateSnapshotDirected(rr, "relation row");
|
|
253
|
+
validateSnapshotWeight(rr, "relation row");
|
|
254
|
+
const relData = { ...rr, attrs: structuredClone(rr.attrs ?? {}) };
|
|
255
|
+
const result = RelationSchema.safeParse(relData);
|
|
256
|
+
if (!result.success)
|
|
257
|
+
throw new Error("structural snapshot: invalid relation row");
|
|
258
|
+
relations.push(result.data);
|
|
259
|
+
}
|
|
260
|
+
const structuralRefs = validatedStructuralRefs(e.structuralRefs);
|
|
261
|
+
const outRefs = [...relationOutRefs(relations), ...structuralRefs];
|
|
262
|
+
const entry = {
|
|
263
|
+
uid,
|
|
264
|
+
id: entryId,
|
|
265
|
+
kind,
|
|
266
|
+
deprecatedIds: new Set(deprecatedIds),
|
|
267
|
+
outRefs,
|
|
268
|
+
};
|
|
269
|
+
for (const claim of [entry.id, ...entry.deprecatedIds]) {
|
|
270
|
+
const owner = idx.resolveUid(claim);
|
|
271
|
+
if (owner !== null) {
|
|
272
|
+
throw new Error(`structural snapshot: identity claim ${JSON.stringify(claim)} already in use by uid ${JSON.stringify(owner)}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
idx.byUid.set(uid, entry);
|
|
276
|
+
idx.idToUid.set(entry.id, uid);
|
|
277
|
+
for (const dep of entry.deprecatedIds)
|
|
278
|
+
idx.deprecatedToUid.set(dep, uid);
|
|
279
|
+
for (const oref of outRefs) {
|
|
280
|
+
const rows = idx.inRefs.get(oref.ref) ?? [];
|
|
281
|
+
rows.push({ sourceUid: uid, outRef: oref });
|
|
282
|
+
idx.inRefs.set(oref.ref, rows);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return idx;
|
|
286
|
+
}
|
|
287
|
+
remove(uid) {
|
|
288
|
+
this.drop(uid);
|
|
289
|
+
}
|
|
290
|
+
drop(uid) {
|
|
291
|
+
const entry = this.byUid.get(uid);
|
|
292
|
+
if (entry === undefined)
|
|
293
|
+
return;
|
|
294
|
+
this.byUid.delete(uid);
|
|
295
|
+
if (this.idToUid.get(entry.id) === uid)
|
|
296
|
+
this.idToUid.delete(entry.id);
|
|
297
|
+
for (const dep of entry.deprecatedIds) {
|
|
298
|
+
if (this.deprecatedToUid.get(dep) === uid)
|
|
299
|
+
this.deprecatedToUid.delete(dep);
|
|
300
|
+
}
|
|
301
|
+
// Drop only the refs THIS node contributed as a source. Inbound refs that other
|
|
302
|
+
// (surviving) nodes contributed pointing at this node's ids must persist — they
|
|
303
|
+
// are still on disk and become dangling.
|
|
304
|
+
for (const [ref, rows] of [...this.inRefs.entries()]) {
|
|
305
|
+
const kept = rows.filter((r) => r.sourceUid !== uid);
|
|
306
|
+
if (kept.length > 0)
|
|
307
|
+
this.inRefs.set(ref, kept);
|
|
308
|
+
else
|
|
309
|
+
this.inRefs.delete(ref);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
refsForUid(uid) {
|
|
313
|
+
const entry = this.byUid.get(uid);
|
|
314
|
+
if (entry === undefined)
|
|
315
|
+
throw new RefError(`uid ${JSON.stringify(uid)} not in index`);
|
|
316
|
+
return [entry.id, ...[...entry.deprecatedIds].sort()];
|
|
317
|
+
}
|
|
318
|
+
resolveEdge(rel) {
|
|
319
|
+
return { relation: rel, sourceUid: this.resolveUid(rel.source), targetUid: this.resolveUid(rel.target) };
|
|
320
|
+
}
|
|
321
|
+
// Public graph queries are defined over distinct `Relation` OBJECTS (reference identity —
|
|
322
|
+
// the TS analog of Python's `id(relation)` dedup), relations-only. A relation never
|
|
323
|
+
// appears twice, and a relation whose source is a non-container node still attributes
|
|
324
|
+
// correctly because we key on `relation_source` / `relation_target` roles.
|
|
325
|
+
relationsByRole(uid, role) {
|
|
326
|
+
const seen = new Set();
|
|
327
|
+
const edges = [];
|
|
328
|
+
for (const ref of this.refsForUid(uid)) {
|
|
329
|
+
for (const inref of this.inRefs.get(ref) ?? []) {
|
|
330
|
+
const oref = inref.outRef;
|
|
331
|
+
if (oref.role !== role || oref.relation === undefined)
|
|
332
|
+
continue;
|
|
333
|
+
if (seen.has(oref.relation))
|
|
334
|
+
continue;
|
|
335
|
+
seen.add(oref.relation);
|
|
336
|
+
edges.push(this.resolveEdge(oref.relation));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return edges;
|
|
340
|
+
}
|
|
341
|
+
outboundEdges(uid) {
|
|
342
|
+
return this.relationsByRole(uid, "relation_source");
|
|
343
|
+
}
|
|
344
|
+
inboundEdges(uid) {
|
|
345
|
+
return this.relationsByRole(uid, "relation_target");
|
|
346
|
+
}
|
|
347
|
+
danglingEdges() {
|
|
348
|
+
const seen = new Set();
|
|
349
|
+
const edges = [];
|
|
350
|
+
for (const entry of this.byUid.values()) {
|
|
351
|
+
for (const oref of entry.outRefs) {
|
|
352
|
+
// Only the target side can dangle: a relation is dangling when its TARGET ref resolves
|
|
353
|
+
// to no live uid. (Source-side refs are the node's own outbound edges, always resolvable.)
|
|
354
|
+
if (oref.role !== "relation_target" || oref.relation === undefined)
|
|
355
|
+
continue;
|
|
356
|
+
if (seen.has(oref.relation))
|
|
357
|
+
continue;
|
|
358
|
+
if (this.resolveUid(oref.ref) === null) {
|
|
359
|
+
seen.add(oref.relation);
|
|
360
|
+
edges.push(this.resolveEdge(oref.relation));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return edges;
|
|
365
|
+
}
|
|
366
|
+
/** Uids of this node's resolvable direct members. Dangling member refs are skipped
|
|
367
|
+
* (check reports them); duplicate entries and live+deprecated refs dedupe by uid. */
|
|
368
|
+
membersOf(uid) {
|
|
369
|
+
const entry = this.byUid.get(uid);
|
|
370
|
+
if (entry === undefined)
|
|
371
|
+
throw new RefError(`uid ${JSON.stringify(uid)} not in index`);
|
|
372
|
+
const members = new Set();
|
|
373
|
+
for (const oref of entry.outRefs) {
|
|
374
|
+
if (oref.role !== "membership_member")
|
|
375
|
+
continue;
|
|
376
|
+
const memberUid = this.resolveUid(oref.ref);
|
|
377
|
+
if (memberUid !== null)
|
|
378
|
+
members.add(memberUid);
|
|
379
|
+
}
|
|
380
|
+
return members;
|
|
381
|
+
}
|
|
382
|
+
/** Uids of the nodes whose membership facet lists any of this node's identity claims
|
|
383
|
+
* (live id or deprecated ids — the same attribution rule as relationsByRole). */
|
|
384
|
+
containersOf(uid) {
|
|
385
|
+
const containers = new Set();
|
|
386
|
+
for (const ref of this.refsForUid(uid)) {
|
|
387
|
+
for (const inref of this.inRefs.get(ref) ?? []) {
|
|
388
|
+
if (inref.outRef.role !== "membership_member")
|
|
389
|
+
continue;
|
|
390
|
+
containers.add(inref.sourceUid);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return containers;
|
|
394
|
+
}
|
|
395
|
+
/** Transitive membership closure (BFS). The visited set is seeded with the start uid,
|
|
396
|
+
* which is excluded from the result even when a membership cycle reaches it. */
|
|
397
|
+
membershipClosure(uid, direction) {
|
|
398
|
+
const step = direction === "members" ? this.membersOf.bind(this) : this.containersOf.bind(this);
|
|
399
|
+
const visited = new Set([uid]);
|
|
400
|
+
const queue = [uid];
|
|
401
|
+
let head = 0;
|
|
402
|
+
while (head < queue.length) {
|
|
403
|
+
const current = queue[head++];
|
|
404
|
+
for (const next of step(current)) {
|
|
405
|
+
if (visited.has(next))
|
|
406
|
+
continue;
|
|
407
|
+
visited.add(next);
|
|
408
|
+
queue.push(next);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
visited.delete(uid);
|
|
412
|
+
return visited;
|
|
413
|
+
}
|
|
414
|
+
/** Every unresolved membership ref, deduped by (container uid, ref). */
|
|
415
|
+
danglingMembers() {
|
|
416
|
+
const out = [];
|
|
417
|
+
const seen = new Set();
|
|
418
|
+
for (const entry of this.byUid.values()) {
|
|
419
|
+
for (const oref of entry.outRefs) {
|
|
420
|
+
if (oref.role !== "membership_member")
|
|
421
|
+
continue;
|
|
422
|
+
if (this.resolveUid(oref.ref) !== null)
|
|
423
|
+
continue;
|
|
424
|
+
const key = `${entry.uid}\u0000${oref.ref}`;
|
|
425
|
+
if (seen.has(key))
|
|
426
|
+
continue;
|
|
427
|
+
seen.add(key);
|
|
428
|
+
out.push({ sourceUid: entry.uid, ref: oref.ref });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return out;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=structural-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-index.js","sourceRoot":"","sources":["../src/structural-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAiB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAW7D,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,CAAU,CAAC;AAC7G,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAO;IACzC,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,cAAc;IACd,YAAY;CACb,CAAC,CAAC;AA2BH,SAAS,eAAe,CAAC,SAAqB;IAC5C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,qFAAqF;AACrF,qEAAqE;AACrE,SAAS,iBAAiB,CAAC,IAAU;IACnC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAI,GAA+B,CAAC,OAAO,CAAC;QACzD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAI,EAA8B,CAAC,KAAK,CAAC;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC9C,MAAM,CAAC,GAAG,IAA+B,CAAC;oBAC1C,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;wBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;oBACrF,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;wBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAI,EAA8B,CAAC,KAAK,CAAC;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAI,EAA8B,CAAC,IAAI,CAAC;QAClD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAA+B,CAAC,EAAE,CAAC;gBAC/D,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAU;IAChC,OAAO,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAY,EAAE,OAAe;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC3G,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAC/G,IAAI,GAAG,KAAK,OAAO;YACjB,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,2CAA2C,CACtG,CAAC;QACJ,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4DAA4D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAClH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,sBAAsB,CAAC,GAA4B,EAAE,KAAa;IACzE,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;QAAE,OAAO;IAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,iCAAiC,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,GAA4B,EAAE,KAAa;IAC3E,IAAI,UAAU,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,6BAA6B,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACjG,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAC3C,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAA+B,CAAC;QACtD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACxG,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAY,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAY,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0DAA0D;AAC1D,MAAM,OAAO,KAAK;IAChB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEpC,MAAM,CAAC,KAAK,CAAC,KAAqB;QAChC,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,cAAc,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAClF,CAAC;YACD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,sDAAsD;YAC/E,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACxE,CAAC;IAED,oFAAoF;IACpF,kFAAkF;IAClF,6EAA6E;IAC7E,aAAa,CAAC,IAAU;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,cAAc,CACtB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,CAC1G,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzC,MAAM,IAAI,cAAc,CACtB,kBAAkB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAU;QACf,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,KAAK,GAAe;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;SAC9B,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM;QAUJ,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,MAAM,SAAS,GAAmC,EAAE,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;oBAAE,SAAS;gBACvE,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACvB,MAAM,GAAG,GAA4B;oBACnC,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;iBAClC,CAAC;gBACF,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;oBAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBACjD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,aAAa,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE;gBAC9C,SAAS;gBACT,cAAc,EAAE,KAAK,CAAC,OAAO;qBAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;qBAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,CAAU;QACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC5G,MAAM,GAAG,GAAG,CAA4B,CAAC;QACzC,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAClG,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;gBACnD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,MAAM,CAAC,GAAG,QAAmC,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;gBACxC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAChG,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACnG,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClG,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACrG,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACtG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC1G,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrG,MAAM,aAAa,GAAG,sBAAsB,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,SAAS,GAAe,EAAE,CAAC;YACjC,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBACjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;oBAC/C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACzE,MAAM,EAAE,GAAG,MAAiC,CAAC;gBAC7C,wBAAwB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC7C,sBAAsB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAClF,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,cAAc,GAAG,uBAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC;YACnE,MAAM,KAAK,GAAe;gBACxB,GAAG;gBACH,EAAE,EAAE,OAAO;gBACX,IAAI;gBACJ,aAAa,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC;gBACrC,OAAO;aACR,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC9G,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa;gBAAE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACzE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAEO,IAAI,CAAC,GAAW;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,gFAAgF;QAChF,gFAAgF;QAChF,yCAAyC;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;gBAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,GAAW;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,WAAW,CAAC,GAAa;QAC/B,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3G,CAAC;IAED,0FAA0F;IAC1F,oFAAoF;IACpF,sFAAsF;IACtF,2EAA2E;IACnE,eAAe,CAAC,GAAW,EAAE,IAAU;QAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAC;QACjC,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;oBAAE,SAAS;gBAChE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAED,aAAa;QACX,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAC;QACjC,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjC,uFAAuF;gBACvF,2FAA2F;gBAC3F,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;oBAAE,SAAS;gBAC7E,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACtC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;oBACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;yFACqF;IACrF,SAAS,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB;gBAAE,SAAS;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,SAAS,KAAK,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;qFACiF;IACjF,YAAY,CAAC,GAAW;QACtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC/C,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,mBAAmB;oBAAE,SAAS;gBACxD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;oFACgF;IAChF,iBAAiB,CAAC,GAAW,EAAE,SAAmC;QAChE,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,KAAK,GAAa,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wEAAwE;IACxE,eAAe;QACb,MAAM,GAAG,GAA8C,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB;oBAAE,SAAS;gBAChD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;oBAAE,SAAS;gBACjD,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nodes-dev/core",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Nodes core: a problem-agnostic knowledge substrate (TypeScript)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/nodes-dev/core.git",
|
|
9
|
+
"directory": "ts"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/nodes-dev/core",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/nodes-dev/core/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=20"
|
|
18
|
+
},
|
|
19
|
+
"packageManager": "npm@11.11.0",
|
|
20
|
+
"main": "dist/index.js",
|
|
21
|
+
"types": "dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"default": "./dist/index.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -p tsconfig.build.json",
|
|
36
|
+
"test": "vitest run",
|
|
37
|
+
"typecheck": "tsc --noEmit",
|
|
38
|
+
"check": "biome check ."
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"yaml": "^2.5.0",
|
|
42
|
+
"zod": "^3.23.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@biomejs/biome": "^1.9.0",
|
|
46
|
+
"@types/node": "^20.0.0",
|
|
47
|
+
"typescript": "^5.5.0",
|
|
48
|
+
"vitest": "^2.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|