graphvault-studio 0.1.2

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 (42) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/CONTRIBUTING.md +27 -0
  3. package/LICENSE +21 -0
  4. package/README.md +119 -0
  5. package/assets/graphvault-logo.png +0 -0
  6. package/assets/studio-screenshot.png +0 -0
  7. package/dist/admin-cli.d.ts +12 -0
  8. package/dist/admin-cli.js +132 -0
  9. package/dist/admin-cli.js.map +1 -0
  10. package/dist/admin-client.d.ts +49 -0
  11. package/dist/admin-client.js +352 -0
  12. package/dist/admin-client.js.map +1 -0
  13. package/dist/admin-inspection.d.ts +4 -0
  14. package/dist/admin-inspection.js +70 -0
  15. package/dist/admin-inspection.js.map +1 -0
  16. package/dist/admin-mutation.d.ts +4 -0
  17. package/dist/admin-mutation.js +83 -0
  18. package/dist/admin-mutation.js.map +1 -0
  19. package/dist/admin-parent-index.d.ts +4 -0
  20. package/dist/admin-parent-index.js +72 -0
  21. package/dist/admin-parent-index.js.map +1 -0
  22. package/dist/admin-server.d.ts +14 -0
  23. package/dist/admin-server.js +132 -0
  24. package/dist/admin-server.js.map +1 -0
  25. package/dist/admin-types.d.ts +97 -0
  26. package/dist/admin-types.js +2 -0
  27. package/dist/admin-types.js.map +1 -0
  28. package/dist/admin-ui.d.ts +1 -0
  29. package/dist/admin-ui.js +886 -0
  30. package/dist/admin-ui.js.map +1 -0
  31. package/dist/admin.d.ts +4 -0
  32. package/dist/admin.js +3 -0
  33. package/dist/admin.js.map +1 -0
  34. package/dist/gvql-examples.d.ts +6 -0
  35. package/dist/gvql-examples.js +45 -0
  36. package/dist/gvql-examples.js.map +1 -0
  37. package/docs/GVQL.md +217 -0
  38. package/docs/PUBLISHING.md +46 -0
  39. package/docs/RELEASE_NOTES_0.1.0.md +41 -0
  40. package/docs/REMOTE_STORAGE.md +56 -0
  41. package/examples/create-demo-store.mjs +85 -0
  42. package/package.json +67 -0
@@ -0,0 +1,352 @@
1
+ import { join } from "node:path";
2
+ import { copyStorageTargetTree, LocalFilesystemTarget } from "@sprengmeister/graphvault/internal/storage/storage-target";
3
+ import { StorageLayout } from "@sprengmeister/graphvault/internal/storage/storage-layout";
4
+ import { StorageReader } from "@sprengmeister/graphvault/internal/storage/storage-reader";
5
+ import { StorageWriter } from "@sprengmeister/graphvault/internal/storage/storage-writer";
6
+ import { verifyStorage } from "@sprengmeister/graphvault/internal/storage/storage-verifier";
7
+ import { buildParentIndexRecord } from "@sprengmeister/graphvault/internal/storage/storage-parent-index";
8
+ import { executeGvqlStatement, parseGvql } from "@sprengmeister/graphvault/internal/gvql/gvql";
9
+ import { referencedChildren, summarizeNode, visitNode } from "./admin-inspection.js";
10
+ import { encodeAdminValue, getNodePath, setNodePath } from "./admin-mutation.js";
11
+ import { pathFromObjectToRoot } from "./admin-parent-index.js";
12
+ export class StorageAdminClient {
13
+ options;
14
+ target;
15
+ layout;
16
+ reader;
17
+ writer;
18
+ allowMutations;
19
+ parentIndex;
20
+ constructor(options) {
21
+ this.options = options;
22
+ this.target = options.storageTarget ?? new LocalFilesystemTarget();
23
+ this.layout = new StorageLayout(options.storageDirectory, options.channelCount ?? 1);
24
+ this.reader = new StorageReader(this.target, this.layout);
25
+ this.writer = new StorageWriter(this.target, this.layout);
26
+ this.allowMutations = options.allowMutations ?? false;
27
+ }
28
+ async summary(options = {}) {
29
+ const manifest = await this.requireManifest();
30
+ const [currentSnapshot, latestTransaction, typeDictionary] = await Promise.all([
31
+ this.reader.readCurrentPointer(),
32
+ this.reader.readLatestTransactionRecord(),
33
+ this.readTypeDictionary(),
34
+ ]);
35
+ const verification = options.verify === false ? undefined : await this.verify();
36
+ return {
37
+ storageDirectory: this.options.storageDirectory,
38
+ transactionId: manifest.transactionId,
39
+ ...(currentSnapshot ? { currentSnapshot } : {}),
40
+ objectCount: manifest.objectIds.length,
41
+ ...(latestTransaction ? { latestTransaction } : {}),
42
+ ...(typeDictionary ? { typeDictionary } : {}),
43
+ ...(verification ? { verification } : { verificationSkipped: true }),
44
+ };
45
+ }
46
+ async listObjects() {
47
+ return (await this.listObjectPage()).items;
48
+ }
49
+ async listObjectPage(options = {}) {
50
+ const manifest = await this.requireManifest();
51
+ const items = [];
52
+ const offset = Math.max(0, options.offset ?? 0);
53
+ const limit = Math.min(500, Math.max(1, options.limit ?? manifest.objectIds.length));
54
+ for (const objectId of manifest.objectIds.slice(offset, offset + limit)) {
55
+ const record = await this.reader.readObjectRecord(objectId);
56
+ items.push({
57
+ objectId,
58
+ kind: record.node.kind,
59
+ ...(record.node.kind === "object" && record.node.type ? { type: record.node.type } : {}),
60
+ transactionId: record.transactionId,
61
+ preview: summarizeNode(record.node),
62
+ });
63
+ }
64
+ return { offset, limit, total: manifest.objectIds.length, items };
65
+ }
66
+ async getObject(objectId) {
67
+ return this.reader.readObjectRecord(objectId);
68
+ }
69
+ async rootReference() {
70
+ const manifest = await this.requireManifest();
71
+ return {
72
+ root: manifest.root,
73
+ ...(manifest.root && typeof manifest.root === "object" && "$ref" in manifest.root ? { rootObjectId: manifest.root.$ref } : {}),
74
+ };
75
+ }
76
+ async listObjectChildren(objectId) {
77
+ const record = await this.reader.readObjectRecord(objectId);
78
+ const children = [];
79
+ for (const [path, to] of referencedChildren(record.node)) {
80
+ const child = await this.reader.readObjectRecord(to);
81
+ children.push({
82
+ from: objectId,
83
+ to,
84
+ path,
85
+ kind: child.node.kind,
86
+ ...(child.node.kind === "object" && child.node.type ? { type: child.node.type } : {}),
87
+ preview: summarizeNode(child.node),
88
+ });
89
+ }
90
+ return children;
91
+ }
92
+ async hierarchyPath(targetObjectId) {
93
+ const manifest = await this.requireManifest();
94
+ const index = await this.parentIndexFor(manifest);
95
+ return pathFromObjectToRoot(index, targetObjectId, (objectId) => this.reader.readObjectRecord(objectId));
96
+ }
97
+ async graph() {
98
+ const manifest = await this.requireManifest();
99
+ const envelope = await this.reader.envelopeFromManifest(manifest);
100
+ const nodes = [];
101
+ const edges = [];
102
+ for (const [objectId, node] of Object.entries(envelope.nodes)) {
103
+ nodes.push({
104
+ objectId,
105
+ kind: node.kind,
106
+ ...(node.kind === "object" && node.type ? { type: node.type } : {}),
107
+ });
108
+ visitNode(node, (path, value) => {
109
+ if (value && typeof value === "object" && "$ref" in value) {
110
+ edges.push({ from: objectId, to: value.$ref, path });
111
+ }
112
+ });
113
+ }
114
+ return { root: envelope.root, nodes, edges };
115
+ }
116
+ async search(query, options = {}) {
117
+ const manifest = await this.requireManifest();
118
+ const needle = query.trim().toLowerCase();
119
+ if (!needle) {
120
+ return [];
121
+ }
122
+ const limit = Math.min(500, Math.max(1, options.limit ?? 500));
123
+ const results = [];
124
+ for (const objectId of manifest.objectIds) {
125
+ const record = await this.reader.readObjectRecord(objectId);
126
+ visitNode(record.node, (path, value) => {
127
+ if (results.length >= limit) {
128
+ return;
129
+ }
130
+ const preview = JSON.stringify(value);
131
+ if (path.toLowerCase().includes(needle) || preview.toLowerCase().includes(needle)) {
132
+ results.push({ objectId, path, preview: preview.slice(0, 240) });
133
+ }
134
+ });
135
+ if (results.length >= limit) {
136
+ break;
137
+ }
138
+ }
139
+ return results;
140
+ }
141
+ async gvql(query, options = {}) {
142
+ const manifest = await this.requireManifest();
143
+ const envelope = await this.reader.envelopeFromManifest(manifest);
144
+ const statement = parseGvql(query);
145
+ const result = executeGvqlStatement(envelope, statement, {
146
+ ...options,
147
+ allowMutations: this.allowMutations && statement.kind === "update" && !options.dryRun,
148
+ });
149
+ if (result.kind === "update" && !result.dryRun) {
150
+ const transactionId = manifest.transactionId + 1;
151
+ const snapshotFile = `snapshot-${String(transactionId).padStart(12, "0")}.json`;
152
+ const changedObjectIds = Array.from(new Set(result.changes.map((change) => change.objectId))).sort((a, b) => Number(a) - Number(b));
153
+ await this.writer.writeObjectRecords(envelope, transactionId, changedObjectIds);
154
+ await this.writer.writeManifest(envelope, transactionId);
155
+ await this.writer.writeParentIndex(envelope, transactionId);
156
+ await this.writer.writeJson(join(this.layout.snapshotsDirectory, snapshotFile), envelope);
157
+ await this.target.writeTextAtomic(this.layout.currentFile, snapshotFile);
158
+ await this.writer.writeTransactionRecord({
159
+ format: "graphvault-transaction",
160
+ version: 1,
161
+ transactionId,
162
+ committedAt: new Date().toISOString(),
163
+ snapshotFile,
164
+ objectIds: Object.keys(envelope.nodes).sort((a, b) => Number(a) - Number(b)),
165
+ mode: "standard",
166
+ targetCount: changedObjectIds.length,
167
+ });
168
+ this.parentIndex = undefined;
169
+ }
170
+ return result;
171
+ }
172
+ async listTransactions() {
173
+ const records = [];
174
+ for (const file of await this.reader.readDirectoryIfExists(this.layout.transactionsDirectory)) {
175
+ if (!file.endsWith(".json")) {
176
+ continue;
177
+ }
178
+ try {
179
+ const record = JSON.parse(await this.target.readText(join(this.layout.transactionsDirectory, file)));
180
+ if (record.format === "graphvault-transaction") {
181
+ records.push(record);
182
+ }
183
+ }
184
+ catch {
185
+ // Ignore partial records in admin listing as the runtime recovery path does.
186
+ }
187
+ }
188
+ return records.sort((a, b) => b.transactionId - a.transactionId);
189
+ }
190
+ async readJournal() {
191
+ try {
192
+ return await this.target.readText(this.layout.journalFile);
193
+ }
194
+ catch {
195
+ return "";
196
+ }
197
+ }
198
+ async readTypeDictionary() {
199
+ try {
200
+ if (!(await this.target.exists(this.layout.typeDictionaryFile))) {
201
+ return undefined;
202
+ }
203
+ return JSON.parse(await this.target.readText(this.layout.typeDictionaryFile));
204
+ }
205
+ catch {
206
+ return undefined;
207
+ }
208
+ }
209
+ async verify() {
210
+ return verifyStorage({
211
+ target: this.target,
212
+ lazyDirectory: this.layout.lazyDirectory,
213
+ readManifest: () => this.reader.readManifest(),
214
+ readLatestTransactionRecord: () => this.reader.readLatestTransactionRecord(),
215
+ readObjectRecord: (objectId) => this.reader.readObjectRecord(objectId),
216
+ });
217
+ }
218
+ async maintain(options = {}) {
219
+ this.assertMutationsAllowed();
220
+ const garbageCollection = await this.collectGarbage();
221
+ const compaction = await this.compact(options.keepSnapshots ?? 2);
222
+ return { garbageCollection, compaction, verification: await this.verify() };
223
+ }
224
+ async backup(destination) {
225
+ const filesCopied = await copyStorageTargetTree(this.target, destination.storageTarget ?? new LocalFilesystemTarget(), this.options.storageDirectory, destination.storageDirectory);
226
+ const manifest = await this.requireManifest();
227
+ return { filesCopied, transactionId: manifest.transactionId };
228
+ }
229
+ async previewMutation(mutation) {
230
+ const manifest = await this.requireManifest();
231
+ const envelope = await this.reader.envelopeFromManifest(manifest);
232
+ const node = envelope.nodes[mutation.objectId];
233
+ if (!node) {
234
+ throw new Error(`Object ${mutation.objectId} does not exist.`);
235
+ }
236
+ return {
237
+ objectId: mutation.objectId,
238
+ path: mutation.path,
239
+ before: getNodePath(node, mutation.path),
240
+ after: encodeAdminValue(mutation.value),
241
+ };
242
+ }
243
+ async mutate(mutation) {
244
+ this.assertMutationsAllowed();
245
+ const manifest = await this.requireManifest();
246
+ const envelope = await this.reader.envelopeFromManifest(manifest);
247
+ const node = envelope.nodes[mutation.objectId];
248
+ if (!node) {
249
+ throw new Error(`Object ${mutation.objectId} does not exist.`);
250
+ }
251
+ setNodePath(node, mutation.path, encodeAdminValue(mutation.value));
252
+ const transactionId = manifest.transactionId + 1;
253
+ const snapshotFile = `snapshot-${String(transactionId).padStart(12, "0")}.json`;
254
+ await this.writer.writeObjectRecords(envelope, transactionId, Object.keys(envelope.nodes));
255
+ await this.writer.writeManifest(envelope, transactionId);
256
+ await this.writer.writeParentIndex(envelope, transactionId);
257
+ await this.writer.writeJson(join(this.layout.snapshotsDirectory, snapshotFile), envelope);
258
+ await this.target.writeTextAtomic(this.layout.currentFile, snapshotFile);
259
+ const record = {
260
+ format: "graphvault-transaction",
261
+ version: 1,
262
+ transactionId,
263
+ committedAt: new Date().toISOString(),
264
+ snapshotFile,
265
+ objectIds: Object.keys(envelope.nodes).sort((a, b) => Number(a) - Number(b)),
266
+ mode: "standard",
267
+ targetCount: 1,
268
+ };
269
+ await this.writer.writeTransactionRecord(record);
270
+ this.parentIndex = undefined;
271
+ return record;
272
+ }
273
+ async requireManifest() {
274
+ const manifest = await this.reader.readManifest();
275
+ if (!manifest) {
276
+ throw new Error("Storage manifest not found or unreadable.");
277
+ }
278
+ return manifest;
279
+ }
280
+ async compact(keepLatest) {
281
+ const current = await this.reader.readCurrentPointer();
282
+ if (!current) {
283
+ return { kept: 0, removed: 0 };
284
+ }
285
+ const snapshots = (await this.target.list(this.layout.snapshotsDirectory))
286
+ .filter((name) => name.startsWith("snapshot-") && name.endsWith(".json"))
287
+ .sort();
288
+ const keep = new Set(snapshots.slice(Math.max(0, snapshots.length - keepLatest)));
289
+ keep.add(current);
290
+ let removed = 0;
291
+ for (const snapshot of snapshots) {
292
+ if (!keep.has(snapshot)) {
293
+ await this.target.remove(join(this.layout.snapshotsDirectory, snapshot));
294
+ removed++;
295
+ }
296
+ }
297
+ return { kept: snapshots.length - removed, removed };
298
+ }
299
+ async collectGarbage() {
300
+ const manifest = await this.requireManifest();
301
+ const liveObjects = new Set(manifest.objectIds);
302
+ let keptObjects = 0;
303
+ let removedObjects = 0;
304
+ let keptBinaryObjects = 0;
305
+ let removedBinaryObjects = 0;
306
+ for (const directory of this.layout.objectRecordDirectories("json")) {
307
+ for (const file of await this.reader.readDirectoryIfExists(directory)) {
308
+ if (!file.endsWith(".json"))
309
+ continue;
310
+ const objectId = file.slice(0, -".json".length);
311
+ if (liveObjects.has(objectId))
312
+ keptObjects++;
313
+ else {
314
+ await this.target.remove(join(directory, file));
315
+ removedObjects++;
316
+ }
317
+ }
318
+ }
319
+ for (const directory of this.layout.objectRecordDirectories("binary")) {
320
+ for (const file of await this.reader.readDirectoryIfExists(directory)) {
321
+ if (!file.endsWith(".bin"))
322
+ continue;
323
+ const objectId = file.slice(0, -".bin".length);
324
+ if (liveObjects.has(objectId))
325
+ keptBinaryObjects++;
326
+ else {
327
+ await this.target.remove(join(directory, file));
328
+ removedBinaryObjects++;
329
+ }
330
+ }
331
+ }
332
+ return { keptObjects, removedObjects, keptBinaryObjects, removedBinaryObjects, keptLazyFiles: 0, removedLazyFiles: 0 };
333
+ }
334
+ assertMutationsAllowed() {
335
+ if (!this.allowMutations) {
336
+ throw new Error("Admin mutations are disabled. Construct StorageAdminClient with allowMutations: true.");
337
+ }
338
+ }
339
+ async parentIndexFor(manifest) {
340
+ if (!this.parentIndex || this.parentIndex.transactionId !== manifest.transactionId) {
341
+ const storedIndex = await this.reader.readParentIndex();
342
+ if (storedIndex?.transactionId === manifest.transactionId) {
343
+ this.parentIndex = storedIndex;
344
+ }
345
+ else {
346
+ this.parentIndex = buildParentIndexRecord(await this.reader.envelopeFromManifest(manifest), manifest.transactionId);
347
+ }
348
+ }
349
+ return this.parentIndex;
350
+ }
351
+ }
352
+ //# sourceMappingURL=admin-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-client.js","sourceRoot":"","sources":["../src/admin-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { EncodedNode, EncodedValue } from "@sprengmeister/graphvault/internal/core/types";
2
+ export declare function summarizeNode(node: EncodedNode): string;
3
+ export declare function referencedChildren(node: EncodedNode): Array<[string, string]>;
4
+ export declare function visitNode(node: EncodedNode, visit: (path: string, value: EncodedValue) => void): void;
@@ -0,0 +1,70 @@
1
+ export function summarizeNode(node) {
2
+ if (node.kind === "array" || node.kind === "set") {
3
+ return `${node.kind}(${node.items.length}) ${node.items.slice(0, 3).map(summarizeValue).join(", ")}`;
4
+ }
5
+ if (node.kind === "map") {
6
+ return `map(${node.entries.length}) ${node.entries
7
+ .slice(0, 3)
8
+ .map(([key, value]) => `${summarizeValue(key)} => ${summarizeValue(value)}`)
9
+ .join(", ")}`;
10
+ }
11
+ if (node.kind === "lazy") {
12
+ return `lazy ${node.key}`;
13
+ }
14
+ return Object.entries(node.props)
15
+ .slice(0, 5)
16
+ .map(([key, value]) => `${key}: ${summarizeValue(value)}`)
17
+ .join(", ");
18
+ }
19
+ export function referencedChildren(node) {
20
+ const children = [];
21
+ visitNode(node, (path, value) => {
22
+ if (value && typeof value === "object" && "$ref" in value) {
23
+ children.push([path, value.$ref]);
24
+ }
25
+ });
26
+ return children;
27
+ }
28
+ export function visitNode(node, visit) {
29
+ if (node.kind === "array" || node.kind === "set") {
30
+ node.items.forEach((value, index) => visit(`[${index}]`, value));
31
+ }
32
+ else if (node.kind === "map") {
33
+ node.entries.forEach(([key, value], index) => {
34
+ visit(`entries[${index}].key`, key);
35
+ visit(`entries[${index}].value`, value);
36
+ });
37
+ }
38
+ else if (node.kind === "object") {
39
+ for (const [key, value] of Object.entries(node.props)) {
40
+ visit(key, value);
41
+ }
42
+ node.symbolProps?.forEach(([key, value], index) => {
43
+ visit(`symbolProps[${index}].key`, key);
44
+ visit(`symbolProps[${index}].value`, value);
45
+ });
46
+ }
47
+ else {
48
+ visit("lazy.key", { $type: "undefined" });
49
+ }
50
+ }
51
+ function summarizeValue(value) {
52
+ if (value === null || typeof value === "number" || typeof value === "boolean") {
53
+ return String(value);
54
+ }
55
+ if (typeof value === "string") {
56
+ return value.length > 42 ? `${value.slice(0, 39)}...` : value;
57
+ }
58
+ if ("$ref" in value) {
59
+ return `#${value.$ref}`;
60
+ }
61
+ if ("$type" in value) {
62
+ if (value.$type === "date" || value.$type === "bigint")
63
+ return value.value;
64
+ if (value.$type === "undefined")
65
+ return "undefined";
66
+ return value.$type;
67
+ }
68
+ return JSON.stringify(value).slice(0, 80);
69
+ }
70
+ //# sourceMappingURL=admin-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-inspection.js","sourceRoot":"","sources":["../src/admin-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { EncodedNode, EncodedValue } from "@sprengmeister/graphvault/internal/core/types";
2
+ export declare function getNodePath(node: EncodedNode, path: string): EncodedValue;
3
+ export declare function setNodePath(node: EncodedNode, path: string, value: EncodedValue): void;
4
+ export declare function encodeAdminValue(value: unknown): EncodedValue;
@@ -0,0 +1,83 @@
1
+ export function getNodePath(node, path) {
2
+ return resolveNodePath(node, path).read();
3
+ }
4
+ export function setNodePath(node, path, value) {
5
+ resolveNodePath(node, path).write(value);
6
+ }
7
+ export function encodeAdminValue(value) {
8
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
9
+ return value;
10
+ }
11
+ if (typeof value === "undefined") {
12
+ return { $type: "undefined" };
13
+ }
14
+ if (typeof value === "bigint") {
15
+ return { $type: "bigint", value: value.toString() };
16
+ }
17
+ throw new Error("Admin mutation values must be JSON primitives, undefined, or bigint.");
18
+ }
19
+ function resolveNodePath(node, path) {
20
+ const arrayIndex = /^\[(\d+)\]$/.exec(path);
21
+ if ((node.kind === "array" || node.kind === "set") && arrayIndex?.[1]) {
22
+ const index = Number(arrayIndex[1]);
23
+ return {
24
+ read: () => requireValue(node.items[index], path),
25
+ write: (value) => {
26
+ if (index < 0 || index >= node.items.length) {
27
+ throw new Error(`Path ${path} is out of bounds.`);
28
+ }
29
+ node.items[index] = value;
30
+ },
31
+ };
32
+ }
33
+ const mapEntry = /^entries\[(\d+)\]\.(key|value)$/.exec(path);
34
+ if (node.kind === "map" && mapEntry?.[1] && mapEntry[2]) {
35
+ const index = Number(mapEntry[1]);
36
+ const side = mapEntry[2] === "key" ? 0 : 1;
37
+ return {
38
+ read: () => requireValue(node.entries[index]?.[side], path),
39
+ write: (value) => {
40
+ const entry = node.entries[index];
41
+ if (!entry) {
42
+ throw new Error(`Path ${path} is out of bounds.`);
43
+ }
44
+ entry[side] = value;
45
+ },
46
+ };
47
+ }
48
+ if (node.kind === "object") {
49
+ const symbolProp = /^symbolProps\[(\d+)\]\.(key|value)$/.exec(path);
50
+ if (symbolProp?.[1] && symbolProp[2]) {
51
+ const index = Number(symbolProp[1]);
52
+ const side = symbolProp[2] === "key" ? 0 : 1;
53
+ return {
54
+ read: () => requireValue(node.symbolProps?.[index]?.[side], path),
55
+ write: (value) => {
56
+ const entry = node.symbolProps?.[index];
57
+ if (!entry) {
58
+ throw new Error(`Path ${path} is out of bounds.`);
59
+ }
60
+ entry[side] = value;
61
+ },
62
+ };
63
+ }
64
+ const parts = path.split(".").filter(Boolean);
65
+ if (parts.length === 1) {
66
+ const key = parts[0];
67
+ return {
68
+ read: () => requireValue(node.props[key], path),
69
+ write: (value) => {
70
+ node.props[key] = value;
71
+ },
72
+ };
73
+ }
74
+ }
75
+ throw new Error(`Unsupported admin mutation path "${path}" for ${node.kind} node.`);
76
+ }
77
+ function requireValue(value, path) {
78
+ if (typeof value === "undefined") {
79
+ throw new Error(`Path ${path} does not exist.`);
80
+ }
81
+ return value;
82
+ }
83
+ //# sourceMappingURL=admin-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-mutation.js","sourceRoot":"","sources":["../src/admin-mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AdminHierarchyPath, AdminObjectParent } from "./admin-types.js";
2
+ import type { ObjectRecord, ParentIndexRecord } from "@sprengmeister/graphvault/internal/core/types";
3
+ export declare function directParentsFromIndex(index: ParentIndexRecord, objectId: string, readObjectRecord: (objectId: string) => Promise<ObjectRecord>): Promise<AdminObjectParent[]>;
4
+ export declare function pathFromObjectToRoot(index: ParentIndexRecord, targetObjectId: string, readObjectRecord: (objectId: string) => Promise<ObjectRecord>): Promise<AdminHierarchyPath>;
@@ -0,0 +1,72 @@
1
+ import { summarizeNode } from "./admin-inspection.js";
2
+ export async function directParentsFromIndex(index, objectId, readObjectRecord) {
3
+ const parents = [];
4
+ for (const parent of index.parents[objectId] ?? []) {
5
+ const record = await readObjectRecord(parent.parentObjectId);
6
+ parents.push({
7
+ objectId: record.objectId,
8
+ path: parent.path,
9
+ kind: record.node.kind,
10
+ ...(record.node.kind === "object" && record.node.type ? { type: record.node.type } : {}),
11
+ transactionId: record.transactionId,
12
+ preview: summarizeNode(record.node),
13
+ });
14
+ }
15
+ return parents;
16
+ }
17
+ export async function pathFromObjectToRoot(index, targetObjectId, readObjectRecord) {
18
+ const directParents = await directParentsFromIndex(index, targetObjectId, readObjectRecord);
19
+ if (!index.rootObjectId) {
20
+ return { targetObjectId, found: false, items: [], directParents };
21
+ }
22
+ const target = await readPathItem(targetObjectId, "object", readObjectRecord);
23
+ if (!target) {
24
+ return { targetObjectId, found: false, items: [], directParents };
25
+ }
26
+ if (targetObjectId === index.rootObjectId) {
27
+ return { targetObjectId, found: true, items: [{ ...target, label: "root" }], directParents };
28
+ }
29
+ const queue = [{ objectId: targetObjectId, reverseItems: [target] }];
30
+ const seen = new Set();
31
+ while (queue.length) {
32
+ const current = queue.shift();
33
+ if (seen.has(current.objectId)) {
34
+ continue;
35
+ }
36
+ seen.add(current.objectId);
37
+ for (const parent of index.parents[current.objectId] ?? []) {
38
+ const parentItem = await readPathItem(parent.parentObjectId, parent.parentObjectId === index.rootObjectId ? "root" : "object", readObjectRecord);
39
+ if (!parentItem) {
40
+ continue;
41
+ }
42
+ const [currentItem, ...remainingItems] = current.reverseItems;
43
+ if (!currentItem) {
44
+ continue;
45
+ }
46
+ const childItems = [{ ...currentItem, label: parent.path }, ...remainingItems];
47
+ const nextItems = [parentItem, ...childItems];
48
+ if (parent.parentObjectId === index.rootObjectId) {
49
+ return { targetObjectId, found: true, items: nextItems, directParents };
50
+ }
51
+ queue.push({ objectId: parent.parentObjectId, reverseItems: nextItems });
52
+ }
53
+ }
54
+ return { targetObjectId, found: false, items: [], directParents };
55
+ }
56
+ async function readPathItem(objectId, label, readObjectRecord) {
57
+ try {
58
+ const record = await readObjectRecord(objectId);
59
+ return {
60
+ objectId: record.objectId,
61
+ label,
62
+ kind: record.node.kind,
63
+ ...(record.node.kind === "object" && record.node.type ? { type: record.node.type } : {}),
64
+ transactionId: record.transactionId,
65
+ preview: summarizeNode(record.node),
66
+ };
67
+ }
68
+ catch {
69
+ return undefined;
70
+ }
71
+ }
72
+ //# sourceMappingURL=admin-parent-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-parent-index.js","sourceRoot":"","sources":["../src/admin-parent-index.ts"],"names":[],"mappings":"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"}