vfs-kit 1.0.1 → 1.0.3

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 (61) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +618 -35
  3. package/dist/VfsAdapter-BWjniD9Y.d.mts +57 -0
  4. package/dist/VfsAdapter-DOBt_TyL.d.ts +57 -0
  5. package/dist/VfsEngine-B6nhgyjQ.d.mts +152 -0
  6. package/dist/VfsEngine-DLx0iUpi.d.ts +152 -0
  7. package/dist/VfsNode-D10gxL5W.d.mts +48 -0
  8. package/dist/VfsNode-D10gxL5W.d.ts +48 -0
  9. package/dist/adapters/index.d.mts +201 -0
  10. package/dist/adapters/index.d.ts +201 -0
  11. package/dist/adapters/index.js +1159 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/index.mjs +1159 -0
  14. package/dist/adapters/index.mjs.map +1 -0
  15. package/dist/chunk-2FEJBM4N.js +60 -0
  16. package/dist/chunk-2FEJBM4N.js.map +1 -0
  17. package/dist/chunk-7OQI6PNM.mjs +60 -0
  18. package/dist/chunk-7OQI6PNM.mjs.map +1 -0
  19. package/dist/chunk-ALWOZGZI.mjs +23 -0
  20. package/dist/chunk-ALWOZGZI.mjs.map +1 -0
  21. package/dist/chunk-POSVS4C7.mjs +531 -0
  22. package/dist/chunk-POSVS4C7.mjs.map +1 -0
  23. package/dist/chunk-R3ROYAMW.js +23 -0
  24. package/dist/chunk-R3ROYAMW.js.map +1 -0
  25. package/dist/chunk-SWRBVSS6.mjs +16 -0
  26. package/dist/chunk-SWRBVSS6.mjs.map +1 -0
  27. package/dist/chunk-U2CKTXY7.js +16 -0
  28. package/dist/chunk-U2CKTXY7.js.map +1 -0
  29. package/dist/chunk-WZVVI3HX.js +531 -0
  30. package/dist/chunk-WZVVI3HX.js.map +1 -0
  31. package/dist/components/index.d.mts +193 -0
  32. package/dist/components/index.d.ts +193 -0
  33. package/dist/components/index.js +1197 -0
  34. package/dist/components/index.js.map +1 -0
  35. package/dist/components/index.mjs +1197 -0
  36. package/dist/components/index.mjs.map +1 -0
  37. package/dist/hooks/index.d.mts +120 -0
  38. package/dist/hooks/index.d.ts +120 -0
  39. package/dist/hooks/index.js +51 -0
  40. package/dist/hooks/index.js.map +1 -0
  41. package/dist/hooks/index.mjs +51 -0
  42. package/dist/hooks/index.mjs.map +1 -0
  43. package/dist/index.d.mts +42 -0
  44. package/dist/index.d.ts +38 -3
  45. package/dist/index.js +528 -13
  46. package/dist/index.js.map +1 -0
  47. package/dist/index.mjs +530 -0
  48. package/dist/index.mjs.map +1 -0
  49. package/dist/useVfsTabs-ZHDaLrM1.d.mts +39 -0
  50. package/dist/useVfsTabs-ZHDaLrM1.d.ts +39 -0
  51. package/package.json +59 -61
  52. package/dist/index.cjs +0 -43
  53. package/dist/index.d.cts +0 -7
  54. package/index.js +0 -7
  55. package/src/components/TreeView.tsx +0 -5
  56. package/src/components/index.ts +0 -1
  57. package/src/hooks/index.ts +0 -1
  58. package/src/hooks/useVfs.ts +0 -3
  59. package/src/index.ts +0 -2
  60. package/tsconfig.json +0 -44
  61. package/tsup.config.ts +0 -10
package/dist/index.js CHANGED
@@ -1,15 +1,530 @@
1
- // src/components/TreeView.tsx
2
- import "react";
3
- import { jsx } from "react/jsx-runtime";
4
- function TreeView() {
5
- return /* @__PURE__ */ jsx("div", { children: "Placeholder TreeView" });
6
- }
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
7
2
 
8
- // src/hooks/useVfs.ts
9
- function useVfs() {
10
- return {};
11
- }
12
- export {
13
- TreeView,
14
- useVfs
3
+
4
+ var _chunkR3ROYAMWjs = require('./chunk-R3ROYAMW.js');
5
+
6
+
7
+ var _chunkU2CKTXY7js = require('./chunk-U2CKTXY7.js');
8
+
9
+
10
+ var _chunk2FEJBM4Njs = require('./chunk-2FEJBM4N.js');
11
+
12
+ // src/core/VfsEngine.ts
13
+ var VfsEngine = class {
14
+ constructor(adapter, config) {
15
+ this.unsubscribeAdapter = null;
16
+ this.version = 0;
17
+ this.pending = false;
18
+ this.lastError = null;
19
+ var _a, _b, _c, _d, _e, _f, _g;
20
+ this.adapter = adapter;
21
+ this.config = {
22
+ sessionId: config.sessionId,
23
+ allowDuplicateNames: (_a = config.allowDuplicateNames) != null ? _a : false,
24
+ duplicateResolution: (_b = config.duplicateResolution) != null ? _b : "throw",
25
+ checkPermission: (_c = config.checkPermission) != null ? _c : (() => true),
26
+ history: {
27
+ maxSnapshots: (_e = (_d = config.history) == null ? void 0 : _d.maxSnapshots) != null ? _e : 50,
28
+ autosave: (_g = (_f = config.history) == null ? void 0 : _f.autosave) != null ? _g : { enabled: false, intervalMs: 3e4 }
29
+ }
30
+ };
31
+ this.cache = {
32
+ nodes: /* @__PURE__ */ new Map(),
33
+ childIndex: /* @__PURE__ */ new Map(),
34
+ loadedSets: /* @__PURE__ */ new Set()
35
+ };
36
+ this.listeners = {};
37
+ }
38
+ init(strategy = "hybrid") {
39
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
40
+ this.unsubscribeAdapter = this.adapter.onChanged((change) => {
41
+ this.handleAdapterChange(change);
42
+ });
43
+ if (strategy === "eager") {
44
+ const all = yield this.adapter.getNodes([]);
45
+ this.hydrateCache(all);
46
+ } else if (strategy === "hybrid") {
47
+ yield this.loadChildren(null);
48
+ }
49
+ });
50
+ }
51
+ destroy() {
52
+ var _a;
53
+ (_a = this.unsubscribeAdapter) == null ? void 0 : _a.call(this);
54
+ this.cache.nodes.clear();
55
+ this.cache.childIndex.clear();
56
+ this.cache.loadedSets.clear();
57
+ }
58
+ subscribe(onStoreChange) {
59
+ return this.on("change", onStoreChange);
60
+ }
61
+ // ── Command entry point ────────────────────────────────────────────────
62
+ execute(command) {
63
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
64
+ const targetIds = this.extractTargetIds(command);
65
+ for (const id of targetIds) {
66
+ const node = this.cache.nodes.get(id);
67
+ if (node && !this.config.checkPermission(node, command.op)) {
68
+ throw new Error(`Permission denied: ${command.op} on node ${id}`);
69
+ }
70
+ }
71
+ this.pending = true;
72
+ this.lastError = null;
73
+ this.emit("pending", { command });
74
+ try {
75
+ yield this.runCommand(command);
76
+ this.pending = false;
77
+ this.emit("settled", { command, success: true });
78
+ } catch (err) {
79
+ const error = err instanceof Error ? err : new Error(String(err));
80
+ this.lastError = error;
81
+ this.pending = false;
82
+ this.emit("error", { command, error });
83
+ this.emit("settled", { command, success: false });
84
+ throw error;
85
+ }
86
+ });
87
+ }
88
+ // ── Command router ─────────────────────────────────────────────────────
89
+ runCommand(command) {
90
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
91
+ switch (command.op) {
92
+ case "create":
93
+ return this.runCreate(command);
94
+ case "rename":
95
+ return this.runRename(command);
96
+ case "delete":
97
+ return this.runDelete(command);
98
+ case "restore":
99
+ return this.runRestore(command);
100
+ case "purge":
101
+ return this.runPurge(command);
102
+ case "move":
103
+ return this.runMove(command);
104
+ case "write":
105
+ return this.runWrite(command);
106
+ case "lock":
107
+ return this.runLock(command);
108
+ case "unlock":
109
+ return this.runUnlock(command);
110
+ case "reorder":
111
+ return this.runReorder(command);
112
+ case "snapshot":
113
+ return this.runSnapshot(command);
114
+ }
115
+ });
116
+ }
117
+ // ── Command implementations ────────────────────────────────────────────
118
+ runCreate(command) {
119
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
120
+ if (!this.config.allowDuplicateNames) {
121
+ yield this.assertNoDuplicate(command.parentId, command.name, command.kind);
122
+ }
123
+ const node = command.kind === "file" ? yield this.adapter.createFile({
124
+ parentId: command.parentId,
125
+ name: command.name,
126
+ mimeType: command.mimeType,
127
+ meta: command.meta
128
+ }) : yield this.adapter.createFolder({
129
+ parentId: command.parentId,
130
+ name: command.name,
131
+ meta: command.meta
132
+ });
133
+ this.cacheNode(node);
134
+ this.emit("created", node);
135
+ this.emitChange("create", [node.id]);
136
+ });
137
+ }
138
+ runRename(command) {
139
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
140
+ const existing = yield this.resolveNode(command.id);
141
+ if (!this.config.allowDuplicateNames) {
142
+ yield this.assertNoDuplicate(existing.parentId, command.newName, existing.kind, command.id);
143
+ }
144
+ const updated = yield this.adapter.updateNode(command.id, { name: command.newName });
145
+ this.cacheNode(updated);
146
+ this.emit("renamed", updated);
147
+ this.emitChange("rename", [command.id]);
148
+ });
149
+ }
150
+ runDelete(command) {
151
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
152
+ var _a;
153
+ yield this.adapter.deleteNodes(command.ids, command.permanent);
154
+ for (const id of command.ids) this.evictNode(id);
155
+ this.emit("deleted", { ids: command.ids, permanent: (_a = command.permanent) != null ? _a : false });
156
+ this.emitChange("delete", command.ids);
157
+ });
158
+ }
159
+ runRestore(command) {
160
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
161
+ const restored = yield Promise.all(command.ids.map((id) => this.adapter.restoreNode(id)));
162
+ for (const node of restored) this.cacheNode(node);
163
+ this.emit("restored", restored);
164
+ this.emitChange("restore", command.ids);
165
+ });
166
+ }
167
+ runPurge(command) {
168
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
169
+ yield Promise.all(command.ids.map((id) => this.adapter.purgeNode(id)));
170
+ for (const id of command.ids) this.evictNode(id);
171
+ this.emit("purged", { ids: command.ids });
172
+ this.emitChange("purge", command.ids);
173
+ });
174
+ }
175
+ runMove(command) {
176
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
177
+ var _a, _b, _c, _d;
178
+ const oldParentIds = new Map(
179
+ command.ids.map((id) => {
180
+ var _a2, _b2;
181
+ return [id, (_b2 = (_a2 = this.cache.nodes.get(id)) == null ? void 0 : _a2.parentId) != null ? _b2 : null];
182
+ })
183
+ );
184
+ yield this.adapter.moveNodes(command.ids, command.newParentId);
185
+ for (const id of command.ids) {
186
+ const oldParentKey = (_a = oldParentIds.get(id)) != null ? _a : null;
187
+ const oldSiblings = (_b = this.cache.childIndex.get(oldParentKey != null ? oldParentKey : "root")) != null ? _b : [];
188
+ this.cache.childIndex.set(
189
+ oldParentKey != null ? oldParentKey : "root",
190
+ oldSiblings.filter((s) => s !== id)
191
+ );
192
+ const updated = yield this.adapter.getNodeById(id);
193
+ if (!updated) continue;
194
+ this.cache.nodes.set(updated.id, updated);
195
+ const newParentKey = (_c = updated.parentId) != null ? _c : "root";
196
+ const newSiblings = (_d = this.cache.childIndex.get(newParentKey)) != null ? _d : [];
197
+ if (!newSiblings.includes(id)) {
198
+ this.cache.childIndex.set(newParentKey, [...newSiblings, id]);
199
+ }
200
+ }
201
+ const movedNodes = command.ids.map((id) => this.cache.nodes.get(id)).filter((n) => !!n);
202
+ this.emit("moved", movedNodes);
203
+ this.emitChange("move", command.ids);
204
+ });
205
+ }
206
+ runWrite(command) {
207
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
208
+ const node = yield this.resolveNode(command.id);
209
+ if (node.kind !== "file") throw new Error(`Cannot write to folder: ${command.id}`);
210
+ if (node.lockedBy && node.lockedBy !== this.config.sessionId) {
211
+ throw new Error(`File ${command.id} is locked by another session`);
212
+ }
213
+ yield this.adapter.writeFile(command.id, command.content);
214
+ const updated = yield this.adapter.updateNode(command.id, {
215
+ size: command.content.byteLength,
216
+ updatedAt: Date.now()
217
+ });
218
+ this.cacheNode(updated);
219
+ this.emit("written", { id: command.id });
220
+ this.emitChange("write", [command.id]);
221
+ });
222
+ }
223
+ runLock(command) {
224
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
225
+ const locked = yield Promise.all(
226
+ command.ids.map((id) => this.adapter.lockNode(id, this.config.sessionId))
227
+ );
228
+ for (const node of locked) this.cacheNode(node);
229
+ this.emit("locked", locked);
230
+ this.emitChange("lock", command.ids);
231
+ });
232
+ }
233
+ runUnlock(command) {
234
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
235
+ const unlocked = yield Promise.all(
236
+ command.ids.map((id) => this.adapter.unlockNode(id, this.config.sessionId))
237
+ );
238
+ for (const node of unlocked) this.cacheNode(node);
239
+ this.emit("unlocked", unlocked);
240
+ this.emitChange("unlock", command.ids);
241
+ });
242
+ }
243
+ runReorder(command) {
244
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
245
+ yield this.adapter.setOrder(command.parentId, command.orderedIds);
246
+ this.emit("reordered", { parentId: command.parentId, orderedIds: command.orderedIds });
247
+ this.emitChange("reorder", []);
248
+ });
249
+ }
250
+ runSnapshot(command) {
251
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
252
+ if (!this.adapter.supportsHistory) {
253
+ throw new Error("Adapter does not support history");
254
+ }
255
+ const content = yield this.adapter.readFile(command.fileId);
256
+ const snapshot = yield this.adapter.saveSnapshot(command.fileId, content, command.label);
257
+ this.emit("snapshot", snapshot);
258
+ this.emitChange("snapshot", [command.fileId]);
259
+ });
260
+ }
261
+ // ── Read API ───────────────────────────────────────────────────────────
262
+ getNode(id) {
263
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
264
+ if (this.cache.nodes.has(id)) return this.cache.nodes.get(id);
265
+ const node = yield this.adapter.getNodeById(id);
266
+ if (node) this.cacheNode(node);
267
+ return node;
268
+ });
269
+ }
270
+ getChildren(parentId, options) {
271
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
272
+ var _a;
273
+ if (!this.cache.loadedSets.has(parentId != null ? parentId : null)) {
274
+ yield this.loadChildren(parentId);
275
+ }
276
+ const ids = (_a = this.cache.childIndex.get(parentId != null ? parentId : "root")) != null ? _a : [];
277
+ const nodes = ids.map((id) => this.cache.nodes.get(id)).filter((n) => !!n).filter((n) => (options == null ? void 0 : options.includeTrashed) ? true : n.deletedAt === null);
278
+ return this.applySortOrder(nodes, parentId);
279
+ });
280
+ }
281
+ getPath(id) {
282
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
283
+ const parts = [];
284
+ let current = yield this.getNode(id);
285
+ while (current) {
286
+ parts.unshift(current.name);
287
+ current = current.parentId ? yield this.getNode(current.parentId) : null;
288
+ }
289
+ return "/" + parts.join("/");
290
+ });
291
+ }
292
+ readFile(id) {
293
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
294
+ return this.adapter.readFile(id);
295
+ });
296
+ }
297
+ search(query, options) {
298
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
299
+ return this.adapter.search(query, options);
300
+ });
301
+ }
302
+ getTrashed() {
303
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
304
+ return this.adapter.getTrashed();
305
+ });
306
+ }
307
+ getSnapshots(fileId) {
308
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
309
+ if (!this.adapter.supportsHistory) throw new Error("Adapter does not support history");
310
+ return this.adapter.getSnapshots(fileId);
311
+ });
312
+ }
313
+ // ── Sort resolution ────────────────────────────────────────────────────
314
+ applySortOrder(nodes, parentId) {
315
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
316
+ const order = yield this.adapter.getOrder(parentId);
317
+ if (!order) return this.autoSort(nodes);
318
+ const validIds = new Set(nodes.map((n) => n.id));
319
+ const orderedIds = order.orderedIds.filter((id) => validIds.has(id));
320
+ const orderedSet = new Set(orderedIds);
321
+ const unordered = nodes.filter((n) => !orderedSet.has(n.id));
322
+ const orderedNodes = orderedIds.map((id) => nodes.find((n) => n.id === id));
323
+ return [...orderedNodes, ...this.autoSort(unordered)];
324
+ });
325
+ }
326
+ autoSort(nodes) {
327
+ return [...nodes].sort((a, b) => {
328
+ if (a.kind !== b.kind) return a.kind === "folder" ? -1 : 1;
329
+ const nameCmp = a.name.localeCompare(b.name);
330
+ if (nameCmp !== 0) return nameCmp;
331
+ return b.updatedAt - a.updatedAt;
332
+ });
333
+ }
334
+ // ── Cache management ───────────────────────────────────────────────────
335
+ loadChildren(parentId) {
336
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
337
+ const nodes = yield this.adapter.getChildren(parentId, { includeTrashed: true });
338
+ this.hydrateCache(nodes);
339
+ this.cache.loadedSets.add(parentId != null ? parentId : null);
340
+ });
341
+ }
342
+ hydrateCache(nodes) {
343
+ for (const node of nodes) this.cacheNode(node);
344
+ }
345
+ cacheNode(node) {
346
+ var _a, _b, _c, _d, _e;
347
+ const existing = this.cache.nodes.get(node.id);
348
+ if (existing) {
349
+ const oldKey = (_a = existing.parentId) != null ? _a : "root";
350
+ const newKey = (_b = node.parentId) != null ? _b : "root";
351
+ if (oldKey !== newKey) {
352
+ const oldSiblings = (_c = this.cache.childIndex.get(oldKey)) != null ? _c : [];
353
+ this.cache.childIndex.set(oldKey, oldSiblings.filter((id) => id !== node.id));
354
+ }
355
+ }
356
+ this.cache.nodes.set(node.id, node);
357
+ const parentKey = (_d = node.parentId) != null ? _d : "root";
358
+ const siblings = (_e = this.cache.childIndex.get(parentKey)) != null ? _e : [];
359
+ if (!siblings.includes(node.id)) {
360
+ this.cache.childIndex.set(parentKey, [...siblings, node.id]);
361
+ }
362
+ }
363
+ evictNode(id) {
364
+ var _a, _b;
365
+ const node = this.cache.nodes.get(id);
366
+ if (!node) return;
367
+ this.cache.nodes.delete(id);
368
+ const parentKey = (_a = node.parentId) != null ? _a : "root";
369
+ const siblings = (_b = this.cache.childIndex.get(parentKey)) != null ? _b : [];
370
+ this.cache.childIndex.set(parentKey, siblings.filter((s) => s !== id));
371
+ }
372
+ handleAdapterChange(change) {
373
+ var _a, _b, _c;
374
+ for (const id of change.nodeIds) {
375
+ const node = this.cache.nodes.get(id);
376
+ if (node) {
377
+ const parentKey = (_a = node.parentId) != null ? _a : "root";
378
+ const siblings = (_b = this.cache.childIndex.get(parentKey)) != null ? _b : [];
379
+ this.cache.childIndex.set(parentKey, siblings.filter((s) => s !== id));
380
+ if (node.kind === "folder") {
381
+ this.cache.loadedSets.delete(id);
382
+ }
383
+ this.cache.loadedSets.delete((_c = node.parentId) != null ? _c : null);
384
+ }
385
+ this.cache.nodes.delete(id);
386
+ }
387
+ }
388
+ // ── Helpers ────────────────────────────────────────────────────────────
389
+ resolveNode(id) {
390
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
391
+ const node = yield this.getNode(id);
392
+ if (!node) throw new Error(`Node not found: ${id}`);
393
+ return node;
394
+ });
395
+ }
396
+ assertNoDuplicate(parentId, name, kind, excludeId) {
397
+ return _chunk2FEJBM4Njs.__async.call(void 0, this, null, function* () {
398
+ const children = yield this.getChildren(parentId);
399
+ const conflict = children.find(
400
+ (n) => n.name === name && n.kind === kind && n.id !== excludeId && n.deletedAt === null
401
+ );
402
+ if (!conflict) return;
403
+ if (this.config.duplicateResolution === "throw") {
404
+ throw new Error(`A ${kind} named "${name}" already exists`);
405
+ }
406
+ });
407
+ }
408
+ extractTargetIds(command) {
409
+ switch (command.op) {
410
+ case "create":
411
+ return [];
412
+ case "rename":
413
+ return [command.id];
414
+ case "delete":
415
+ case "restore":
416
+ case "purge":
417
+ case "lock":
418
+ case "unlock":
419
+ return command.ids;
420
+ case "move":
421
+ return command.ids;
422
+ case "write":
423
+ return [command.id];
424
+ case "reorder":
425
+ return [];
426
+ case "snapshot":
427
+ return [command.fileId];
428
+ }
429
+ }
430
+ // ── Event emitter ──────────────────────────────────────────────────────
431
+ on(event, listener) {
432
+ if (!this.listeners[event]) {
433
+ this.listeners[event] = /* @__PURE__ */ new Set();
434
+ }
435
+ this.listeners[event].add(listener);
436
+ return () => this.listeners[event].delete(listener);
437
+ }
438
+ emit(event, payload) {
439
+ var _a;
440
+ (_a = this.listeners[event]) == null ? void 0 : _a.forEach((l) => l(payload));
441
+ }
442
+ emitChange(op, nodeIds) {
443
+ this.version++;
444
+ this.emit("change", { op, nodeIds, timestamp: Date.now() });
445
+ }
15
446
  };
447
+
448
+ // src/react/context/VfsProvider.tsx
449
+ var _react = require('react');
450
+ var _jsxruntime = require('react/jsx-runtime');
451
+ function VfsProvider({
452
+ children,
453
+ workspaces: workspaceInputs,
454
+ config,
455
+ cacheStrategy = "hybrid",
456
+ tabPersistence = { strategy: "session" },
457
+ activeWorkspaceId,
458
+ fallback = null
459
+ }) {
460
+ var _a, _b;
461
+ const resolvedConfig = _react.useMemo.call(void 0, () => {
462
+ var _a2, _b2, _c, _d, _e, _f, _g;
463
+ return {
464
+ sessionId: config.sessionId,
465
+ allowDuplicateNames: (_a2 = config.allowDuplicateNames) != null ? _a2 : false,
466
+ duplicateResolution: (_b2 = config.duplicateResolution) != null ? _b2 : "throw",
467
+ checkPermission: (_c = config.checkPermission) != null ? _c : (() => true),
468
+ history: {
469
+ maxSnapshots: (_e = (_d = config.history) == null ? void 0 : _d.maxSnapshots) != null ? _e : 50,
470
+ autosave: (_g = (_f = config.history) == null ? void 0 : _f.autosave) != null ? _g : { enabled: false, intervalMs: 3e4 }
471
+ }
472
+ };
473
+ }, [config]);
474
+ const engineRegistry = _react.useRef.call(void 0, /* @__PURE__ */ new Map());
475
+ const [initialised, setInitialised] = _react.useState.call(void 0, /* @__PURE__ */ new Set());
476
+ const resolvedActiveId = (_b = activeWorkspaceId != null ? activeWorkspaceId : (_a = workspaceInputs[0]) == null ? void 0 : _a.id) != null ? _b : "";
477
+ _react.useEffect.call(void 0, () => {
478
+ const registry = engineRegistry.current;
479
+ const incomingIds = new Set(workspaceInputs.map((w) => w.id));
480
+ for (const [id, engine] of registry) {
481
+ if (!incomingIds.has(id)) {
482
+ engine.destroy();
483
+ registry.delete(id);
484
+ setInitialised((prev) => {
485
+ const next = new Set(prev);
486
+ next.delete(id);
487
+ return next;
488
+ });
489
+ }
490
+ }
491
+ const pending = [];
492
+ for (const workspace of workspaceInputs) {
493
+ if (registry.has(workspace.id)) continue;
494
+ const engine = new VfsEngine(workspace.adapter, resolvedConfig);
495
+ registry.set(workspace.id, engine);
496
+ const initPromise = engine.init(cacheStrategy).then(() => {
497
+ setInitialised((prev) => new Set(prev).add(workspace.id));
498
+ });
499
+ pending.push(initPromise);
500
+ }
501
+ Promise.allSettled(pending);
502
+ return () => {
503
+ for (const engine of registry.values()) engine.destroy();
504
+ registry.clear();
505
+ };
506
+ }, [workspaceInputs, cacheStrategy]);
507
+ const contextValue = _react.useMemo.call(void 0, () => {
508
+ const workspaces = /* @__PURE__ */ new Map();
509
+ for (const input of workspaceInputs) {
510
+ const engine = engineRegistry.current.get(input.id);
511
+ if (!engine) continue;
512
+ workspaces.set(input.id, { id: input.id, name: input.name, engine });
513
+ }
514
+ return {
515
+ workspaces,
516
+ activeWorkspaceId: resolvedActiveId,
517
+ config: resolvedConfig,
518
+ tabPersistence,
519
+ isReady: (id) => initialised.has(id)
520
+ };
521
+ }, [initialised, workspaceInputs, resolvedActiveId, resolvedConfig, tabPersistence]);
522
+ const allReady = workspaceInputs.every((w) => initialised.has(w.id));
523
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkU2CKTXY7js.VfsContext.Provider, { value: contextValue, children: allReady ? children : fallback });
524
+ }
525
+
526
+
527
+
528
+
529
+ exports.VfsAdapter = _chunkR3ROYAMWjs.VfsAdapter; exports.VfsEngine = VfsEngine; exports.VfsProvider = VfsProvider;
530
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/ben/Data/Projects/vfs/vfs-kit%20v2/dist/index.js"],"names":[],"mappings":"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AAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ben/Data/Projects/vfs/vfs-kit v2/dist/index.js","sourcesContent":[null]}