vfs-kit 1.0.0 → 1.0.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.
- package/LICENSE +21 -21
- package/README.md +145 -2
- package/dist/VfsAdapter-BWjniD9Y.d.mts +57 -0
- package/dist/VfsAdapter-DOBt_TyL.d.ts +57 -0
- package/dist/VfsEngine-B6nhgyjQ.d.mts +152 -0
- package/dist/VfsEngine-DLx0iUpi.d.ts +152 -0
- package/dist/VfsNode-D10gxL5W.d.mts +48 -0
- package/dist/VfsNode-D10gxL5W.d.ts +48 -0
- package/dist/adapters/index.d.mts +201 -0
- package/dist/adapters/index.d.ts +201 -0
- package/dist/adapters/index.js +1159 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +1159 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/chunk-2FEJBM4N.js +60 -0
- package/dist/chunk-2FEJBM4N.js.map +1 -0
- package/dist/chunk-7OQI6PNM.mjs +60 -0
- package/dist/chunk-7OQI6PNM.mjs.map +1 -0
- package/dist/chunk-ALWOZGZI.mjs +23 -0
- package/dist/chunk-ALWOZGZI.mjs.map +1 -0
- package/dist/chunk-POSVS4C7.mjs +531 -0
- package/dist/chunk-POSVS4C7.mjs.map +1 -0
- package/dist/chunk-R3ROYAMW.js +23 -0
- package/dist/chunk-R3ROYAMW.js.map +1 -0
- package/dist/chunk-SWRBVSS6.mjs +16 -0
- package/dist/chunk-SWRBVSS6.mjs.map +1 -0
- package/dist/chunk-U2CKTXY7.js +16 -0
- package/dist/chunk-U2CKTXY7.js.map +1 -0
- package/dist/chunk-WZVVI3HX.js +531 -0
- package/dist/chunk-WZVVI3HX.js.map +1 -0
- package/dist/components/index.d.mts +193 -0
- package/dist/components/index.d.ts +193 -0
- package/dist/components/index.js +1197 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +1197 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +120 -0
- package/dist/hooks/index.d.ts +120 -0
- package/dist/hooks/index.js +51 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +51 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +42 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +530 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +530 -0
- package/dist/index.mjs.map +1 -0
- package/dist/useVfsTabs-ZHDaLrM1.d.mts +39 -0
- package/dist/useVfsTabs-ZHDaLrM1.d.ts +39 -0
- package/package.json +63 -30
- package/index.js +0 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/InMemoryAdapter.ts","../../src/adapters/IndexedDBAdapter.ts","../../src/adapters/RestAdapter.ts"],"sourcesContent":["import { VfsAdapter, VfsChange, VfsSearchOptions } from \"../core/VfsAdapter\";\nimport {\n VfsNode, VfsFileNode, VfsFolderNode,\n VfsNodeOrder, VfsFileSnapshot,\n VfsOperation,\n} from \"../core/VfsNode\";\nimport { VfsCreateFileParams, VfsCreateFolderParams } from \"../core/VfsAdapter\";\nimport { nanoid } from \"nanoid\";\n\ninterface StoredFile<TMeta> {\n node: VfsFileNode<TMeta>;\n content: Uint8Array;\n}\n\ninterface StoredFolder<TMeta> {\n node: VfsFolderNode<TMeta>;\n}\n\ntype StoredEntry<TMeta> = StoredFile<TMeta> | StoredFolder<TMeta>;\n\nexport class InMemoryAdapter<TMeta = Record<string, unknown>>\n extends VfsAdapter<TMeta>\n{\n readonly supportsHistory = true;\n\n private store: Map<string, StoredEntry<TMeta>> = new Map();\n private orders: Map<string, VfsNodeOrder> = new Map();\n private snapshots: Map<string, VfsFileSnapshot[]> = new Map();\n private listeners: Set<(change: VfsChange) => void> = new Set();\n\n generateId(): string {\n return nanoid();\n }\n\n private mutate<T>(\n op: VfsOperation,\n nodeIds: string[],\n fn: () => T,\n ): T {\n const result = fn();\n this.notifyChanged({ op, nodeIds, timestamp: Date.now() });\n return result;\n }\n\n private notifyChanged(change: VfsChange): void {\n for (const listener of this.listeners) listener(change);\n }\n\n private makeFileNode(\n params: VfsCreateFileParams,\n id: string,\n ): VfsFileNode<TMeta> {\n const now = Date.now();\n return {\n id,\n name: params.name,\n kind: \"file\",\n parentId: params.parentId,\n mimeType: params.mimeType ?? \"application/octet-stream\",\n size: 0,\n sortIndex: null,\n lockedBy: null,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n meta: (params.meta ?? {}) as TMeta,\n };\n }\n\n private makeFolderNode(\n params: VfsCreateFolderParams,\n id: string,\n ): VfsFolderNode<TMeta> {\n const now = Date.now();\n return {\n id,\n name: params.name,\n kind: \"folder\",\n parentId: params.parentId,\n sortIndex: null,\n lockedBy: null,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n meta: (params.meta ?? {}) as TMeta,\n };\n }\n\n async getNodes(ids: string[]): Promise<VfsNode<TMeta>[]> {\n if (ids.length === 0) {\n return [...this.store.values()]\n .map(e => e.node)\n .filter(n => n.deletedAt === null);\n }\n return ids\n .map(id => this.store.get(id)?.node)\n .filter((n): n is VfsNode<TMeta> => !!n);\n }\n\n async getNodeById(id: string): Promise<VfsNode<TMeta> | null> {\n return this.store.get(id)?.node ?? null;\n }\n\n async getNodeByPath(path: string): Promise<VfsNode<TMeta> | null> {\n const parts = path.replace(/^\\//, \"\").split(\"/\").filter(Boolean);\n if (parts.length === 0) return null;\n\n let parentId: string | null = null;\n\n for (const part of parts) {\n const match = [...this.store.values()].find(\n e => e.node.name === part &&\n e.node.parentId === parentId &&\n e.node.deletedAt === null\n );\n if (!match) return null;\n parentId = match.node.id;\n }\n\n return parentId ? (this.store.get(parentId)?.node ?? null) : null;\n }\n\n async getChildren(\n parentId: string | null,\n options?: { includeTrashed?: boolean },\n ): Promise<VfsNode<TMeta>[]> {\n return [...this.store.values()]\n .map(e => e.node)\n .filter(n =>\n n.parentId === parentId &&\n (options?.includeTrashed ? true : n.deletedAt === null)\n );\n }\n\n async getTrashed(): Promise<VfsNode<TMeta>[]> {\n return [...this.store.values()]\n .map(e => e.node)\n .filter(n => n.deletedAt !== null);\n }\n\n async search(\n query: string,\n options?: VfsSearchOptions,\n ): Promise<VfsNode<TMeta>[]> {\n const lower = query.toLowerCase();\n return [...this.store.values()]\n .map(e => e.node)\n .filter(n => {\n if (!options?.includeTrashed && n.deletedAt !== null) return false;\n if (options?.kind && n.kind !== options.kind) return false;\n if (options?.scope && !this.isDescendantOf(n.id, options.scope)) return false;\n return n.name.toLowerCase().includes(lower);\n });\n }\n\n async readFile(id: string): Promise<Uint8Array> {\n const entry = this.store.get(id);\n if (!entry || entry.node.kind !== \"file\") {\n throw new Error(`File not found: ${id}`);\n }\n return (entry as StoredFile<TMeta>).content;\n }\n\n async writeFile(id: string, content: Uint8Array): Promise<void> {\n const entry = this.store.get(id);\n if (!entry || entry.node.kind !== \"file\") {\n throw new Error(`File not found: ${id}`);\n }\n this.mutate(\"write\", [id], () => {\n (entry as StoredFile<TMeta>).content = content;\n (entry.node as VfsFileNode<TMeta>).size = content.byteLength;\n entry.node.updatedAt = Date.now();\n });\n }\n\n async createFile(params: VfsCreateFileParams): Promise<VfsFileNode<TMeta>> {\n const id = this.generateId();\n const node = this.makeFileNode(params, id);\n return this.mutate(\"create\", [id], () => {\n this.store.set(id, { node, content: new Uint8Array() });\n return node;\n });\n }\n\n async createFolder(params: VfsCreateFolderParams): Promise<VfsFolderNode<TMeta>> {\n const id = this.generateId();\n const node = this.makeFolderNode(params, id);\n return this.mutate(\"create\", [id], () => {\n this.store.set(id, { node });\n return node;\n });\n }\n\n async updateNode(\n id: string,\n updates: Partial<VfsNode<TMeta>>,\n ): Promise<VfsNode<TMeta>> {\n const entry = this.store.get(id);\n if (!entry) throw new Error(`Node not found: ${id}`);\n return this.mutate(\"rename\", [id], () => {\n Object.assign(entry.node, { ...updates, updatedAt: Date.now() });\n return entry.node;\n });\n }\n\n async deleteNode(id: string, permanent = false): Promise<void> {\n const entry = this.store.get(id);\n if (!entry) throw new Error(`Node not found: ${id}`);\n this.mutate(\"delete\", [id], () => {\n if (permanent) {\n this.deleteRecursive(id);\n } else {\n entry.node.deletedAt = Date.now();\n }\n });\n }\n\n async deleteNodes(ids: string[], permanent = false): Promise<void> {\n this.mutate(\"delete\", ids, () => {\n for (const id of ids) {\n const entry = this.store.get(id);\n if (!entry) continue;\n if (permanent) {\n this.deleteRecursive(id);\n } else {\n entry.node.deletedAt = Date.now();\n }\n }\n });\n }\n\n async restoreNode(id: string): Promise<VfsNode<TMeta>> {\n const entry = this.store.get(id);\n if (!entry) throw new Error(`Node not found: ${id}`);\n return this.mutate(\"restore\", [id], () => {\n entry.node.deletedAt = null;\n entry.node.updatedAt = Date.now();\n return entry.node;\n });\n }\n\n async purgeNode(id: string): Promise<void> {\n this.mutate(\"purge\", [id], () => this.deleteRecursive(id));\n }\n\n async moveNode(\n id: string,\n newParentId: string | null,\n ): Promise<VfsNode<TMeta>> {\n const entry = this.store.get(id);\n if (!entry) throw new Error(`Node not found: ${id}`);\n return this.mutate(\"move\", [id], () => {\n entry.node.parentId = newParentId;\n entry.node.updatedAt = Date.now();\n return entry.node;\n });\n }\n\n async moveNodes(\n ids: string[],\n newParentId: string | null,\n ): Promise<VfsNode<TMeta>[]> {\n return this.mutate(\"move\", ids, () => {\n const moved: VfsNode<TMeta>[] = [];\n for (const id of ids) {\n const entry = this.store.get(id);\n if (!entry) continue;\n const before = { ...entry.node };\n entry.node.parentId = newParentId;\n entry.node.updatedAt = Date.now();\n moved.push(before);\n }\n return moved;\n });\n }\n \n\n async lockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>> {\n const entry = this.store.get(id);\n if (!entry) throw new Error(`Node not found: ${id}`);\n if (entry.node.lockedBy && entry.node.lockedBy !== sessionId) {\n throw new Error(`Node ${id} is locked by another session`);\n }\n return this.mutate(\"lock\", [id], () => {\n entry.node.lockedBy = sessionId;\n entry.node.updatedAt = Date.now();\n return entry.node;\n });\n }\n\n async unlockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>> {\n const entry = this.store.get(id);\n if (!entry) throw new Error(`Node not found: ${id}`);\n if (entry.node.lockedBy !== sessionId) {\n throw new Error(`Cannot unlock node ${id} — session mismatch`);\n }\n return this.mutate(\"unlock\", [id], () => {\n entry.node.lockedBy = null;\n entry.node.updatedAt = Date.now();\n return entry.node;\n });\n }\n\n async getOrder(parentId: string | null): Promise<VfsNodeOrder | null> {\n return this.orders.get(parentId ?? \"root\") ?? null;\n }\n\n async setOrder(\n parentId: string | null,\n orderedIds: string[],\n ): Promise<void> {\n this.mutate(\"reorder\", [], () => {\n this.orders.set(parentId ?? \"root\", { parentId, orderedIds });\n });\n }\n\n async getSnapshots(fileId: string): Promise<VfsFileSnapshot[]> {\n return this.snapshots.get(fileId) ?? [];\n }\n\n async saveSnapshot(\n fileId: string,\n content: Uint8Array,\n label?: string,\n ): Promise<VfsFileSnapshot> {\n const existing = this.snapshots.get(fileId) ?? [];\n const snapshot: VfsFileSnapshot = {\n id: this.generateId(),\n fileId,\n index: existing.length,\n content,\n createdAt: Date.now(),\n label,\n };\n return this.mutate(\"snapshot\", [fileId], () => {\n const updated = [...existing, snapshot];\n this.snapshots.set(fileId, updated);\n return snapshot;\n });\n }\n\n async restoreSnapshot(fileId: string, index: number): Promise<void> {\n const snaps = this.snapshots.get(fileId);\n if (!snaps) throw new Error(`No snapshots for file: ${fileId}`);\n const snap = snaps.find(s => s.index === index);\n if (!snap) throw new Error(`Snapshot ${index} not found for file: ${fileId}`);\n await this.writeFile(fileId, snap.content);\n }\n\n async deleteSnapshot(fileId: string, index: number): Promise<void> {\n const snaps = this.snapshots.get(fileId);\n if (!snaps) throw new Error(`No snapshots for file: ${fileId}`);\n this.mutate(\"snapshot\", [fileId], () => {\n this.snapshots.set(\n fileId,\n snaps.filter(s => s.index !== index)\n );\n });\n }\n\n onChanged(callback: (change: VfsChange) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private deleteRecursive(id: string): void {\n for (const entry of this.store.values()) {\n if (entry.node.parentId === id) {\n this.deleteRecursive(entry.node.id);\n }\n }\n this.store.delete(id);\n this.snapshots.delete(id);\n }\n\n private isDescendantOf(id: string, ancestorId: string): boolean {\n let current = this.store.get(id)?.node;\n while (current?.parentId) {\n if (current.parentId === ancestorId) return true;\n current = this.store.get(current.parentId)?.node;\n }\n return false;\n }\n\n seed(nodes: Array<{ node: VfsNode<TMeta>; content?: Uint8Array }>): void {\n for (const { node, content } of nodes) {\n if (node.kind === \"file\") {\n this.store.set(node.id, {\n node,\n content: content ?? new Uint8Array(),\n });\n } else {\n this.store.set(node.id, { node });\n }\n }\n }\n\n clear(): void {\n this.store.clear();\n this.orders.clear();\n this.snapshots.clear();\n }\n\n snapshot(): Map<string, StoredEntry<TMeta>> {\n return new Map(this.store);\n }\n}","import { openDB, IDBPDatabase } from \"idb\";\nimport { VfsAdapter, VfsChange, VfsSearchOptions, VfsCreateFileParams, VfsCreateFolderParams } from \"../core/VfsAdapter\";\nimport {\n VfsNode, VfsFileNode, VfsFolderNode,\n VfsNodeOrder, VfsFileSnapshot,\n VfsOperation,\n} from \"../core/VfsNode\";\nimport { nanoid } from \"nanoid\";\n\nconst DB_VERSION = 1;\ninterface VfsDBSchema {\n nodes: {\n key: string;\n value: VfsNode<any>;\n indexes: {\n by_parent: string | null;\n by_deleted: number | null;\n by_name: string;\n };\n };\n content: {\n key: string;\n value: { id: string; data: Uint8Array };\n };\n orders: {\n key: string;\n value: VfsNodeOrder & { key: string };\n };\n snapshots: {\n key: string;\n value: VfsFileSnapshot;\n indexes: { by_file: string };\n };\n meta: {\n key: string;\n value: { key: string; data: unknown };\n };\n}\n\nexport type IsolationMode = \"private\" | \"shared\";\nexport interface IndexedDBAdapterOptions {\n dbName: string;\n dbVersion?: number;\n isolation?: IsolationMode;\n}\n\nexport class IndexedDBAdapter<TMeta = Record<string, unknown>>\n extends VfsAdapter<TMeta>\n{\n readonly supportsHistory = true;\n\n private db: IDBPDatabase<VfsDBSchema> | null = null;\n private options: Required<IndexedDBAdapterOptions>;\n private listeners: Set<(change: VfsChange) => void> = new Set();\n private channel: BroadcastChannel | null = null;\n\n constructor(options: IndexedDBAdapterOptions) {\n super();\n this.options = {\n dbName: options.dbName,\n dbVersion: options.dbVersion ?? DB_VERSION,\n isolation: options.isolation ?? \"private\",\n };\n }\n\n async open(): Promise<void> {\n this.db = await openDB<VfsDBSchema>(\n this.options.dbName,\n this.options.dbVersion,\n {\n upgrade(db) {\n if (!db.objectStoreNames.contains(\"nodes\")) {\n const nodeStore = db.createObjectStore(\"nodes\", { keyPath: \"id\" });\n nodeStore.createIndex(\"by_parent\", \"parentId\", { unique: false });\n nodeStore.createIndex(\"by_deleted\", \"deletedAt\", { unique: false });\n nodeStore.createIndex(\"by_name\", \"name\", { unique: false });\n }\n\n if (!db.objectStoreNames.contains(\"content\")) {\n db.createObjectStore(\"content\", { keyPath: \"id\" });\n }\n\n if (!db.objectStoreNames.contains(\"orders\")) {\n db.createObjectStore(\"orders\", { keyPath: \"key\" });\n }\n\n if (!db.objectStoreNames.contains(\"snapshots\")) {\n const snapStore = db.createObjectStore(\"snapshots\", { keyPath: \"id\" });\n snapStore.createIndex(\"by_file\", \"fileId\", { unique: false });\n }\n\n if (!db.objectStoreNames.contains(\"meta\")) {\n db.createObjectStore(\"meta\", { keyPath: \"key\" });\n }\n },\n }\n );\n\n if (this.options.isolation === \"shared\") {\n this.channel = new BroadcastChannel(`vfs-kit:${this.options.dbName}`);\n this.channel.onmessage = (e: MessageEvent<VfsChange>) => {\n this.notifyListeners(e.data);\n };\n }\n }\n\n close(): void {\n this.db?.close();\n this.channel?.close();\n this.db = null;\n this.channel = null;\n }\n\n private get idb(): IDBPDatabase<VfsDBSchema> {\n if (!this.db) throw new Error(\n `IndexedDBAdapter: call open() before using the adapter`\n );\n return this.db;\n }\n\n generateId(): string {\n return nanoid();\n }\n\n private async mutate<T>(\n op: VfsOperation,\n nodeIds: string[],\n fn: () => Promise<T>,\n ): Promise<T> {\n const result = await fn();\n const change: VfsChange = { op, nodeIds, timestamp: Date.now() };\n this.notifyListeners(change);\n this.channel?.postMessage(change);\n return result;\n }\n\n private notifyListeners(change: VfsChange): void {\n for (const listener of this.listeners) listener(change);\n }\n\n private makeFileNode(\n params: VfsCreateFileParams,\n id: string,\n ): VfsFileNode<TMeta> {\n const now = Date.now();\n return {\n id,\n name: params.name,\n kind: \"file\",\n parentId: params.parentId,\n mimeType: params.mimeType ?? \"application/octet-stream\",\n size: 0,\n sortIndex: null,\n lockedBy: null,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n meta: (params.meta ?? {}) as TMeta,\n };\n }\n\n private makeFolderNode(\n params: VfsCreateFolderParams,\n id: string,\n ): VfsFolderNode<TMeta> {\n const now = Date.now();\n return {\n id,\n name: params.name,\n kind: \"folder\",\n parentId: params.parentId,\n sortIndex: null,\n lockedBy: null,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n meta: (params.meta ?? {}) as TMeta,\n };\n }\n\n async getNodes(ids: string[]): Promise<VfsNode<TMeta>[]> {\n if (ids.length === 0) {\n return this.idb.getAll(\"nodes\") as Promise<VfsNode<TMeta>[]>;\n }\n const tx = this.idb.transaction(\"nodes\", \"readonly\");\n const results = await Promise.all(ids.map(id => tx.store.get(id)));\n return results.filter((n): n is VfsNode<TMeta> => !!n);\n }\n\n async getNodeById(id: string): Promise<VfsNode<TMeta> | null> {\n return (await this.idb.get(\"nodes\", id)) ?? null;\n }\n\n async getNodeByPath(path: string): Promise<VfsNode<TMeta> | null> {\n const parts = path.replace(/^\\//, \"\").split(\"/\").filter(Boolean);\n if (parts.length === 0) return null;\n\n let parentId: string | null = null;\n\n for (const part of parts) {\n const all = await this.idb.getAllFromIndex(\n \"nodes\", \"by_parent\", parentId\n ) as VfsNode<TMeta>[];\n const match = all.find(\n n => n.name === part && n.deletedAt === null\n );\n if (!match) return null;\n parentId = match.id;\n }\n\n return parentId ? this.getNodeById(parentId) : null;\n }\n\n async getChildren(\n parentId: string | null,\n options?: { includeTrashed?: boolean },\n ): Promise<VfsNode<TMeta>[]> {\n const nodes = await this.idb.getAllFromIndex(\n \"nodes\", \"by_parent\", parentId\n ) as VfsNode<TMeta>[];\n return options?.includeTrashed\n ? nodes\n : nodes.filter(n => n.deletedAt === null);\n }\n\n async getTrashed(): Promise<VfsNode<TMeta>[]> {\n const all = await this.idb.getAll(\"nodes\") as VfsNode<TMeta>[];\n return all.filter(n => n.deletedAt !== null);\n }\n\n async search(\n query: string,\n options?: VfsSearchOptions,\n ): Promise<VfsNode<TMeta>[]> {\n const lower = query.toLowerCase();\n const all = await this.idb.getAllFromIndex(\n \"nodes\", \"by_name\"\n ) as VfsNode<TMeta>[];\n\n return all.filter(n => {\n if (!options?.includeTrashed && n.deletedAt !== null) return false;\n if (options?.kind && n.kind !== options.kind) return false;\n if (!n.name.toLowerCase().includes(lower)) return false;\n if (options?.scope) {\n return this.isDescendantOf(n, options.scope, all);\n }\n return true;\n });\n }\n\n async readFile(id: string): Promise<Uint8Array> {\n const entry = await this.idb.get(\"content\", id);\n if (!entry) throw new Error(`Content not found for file: ${id}`);\n return entry.data;\n }\n\n async writeFile(id: string, content: Uint8Array): Promise<void> {\n await this.mutate(\"write\", [id], async () => {\n const tx = this.idb.transaction([\"content\", \"nodes\"], \"readwrite\");\n const node = await tx.objectStore(\"nodes\").get(id);\n if (!node || node.kind !== \"file\") {\n throw new Error(`File not found: ${id}`);\n }\n node.size = content.byteLength;\n node.updatedAt = Date.now();\n await tx.objectStore(\"content\").put({ id, data: content });\n await tx.objectStore(\"nodes\").put(node);\n await tx.done;\n });\n }\n\n async createFile(params: VfsCreateFileParams): Promise<VfsFileNode<TMeta>> {\n const id = this.generateId();\n const node = this.makeFileNode(params, id);\n return this.mutate(\"create\", [id], async () => {\n const tx = this.idb.transaction([\"nodes\", \"content\"], \"readwrite\");\n await tx.objectStore(\"nodes\").put(node);\n await tx.objectStore(\"content\").put({ id, data: new Uint8Array() });\n await tx.done;\n return node;\n });\n }\n\n async createFolder(params: VfsCreateFolderParams): Promise<VfsFolderNode<TMeta>> {\n const id = this.generateId();\n const node = this.makeFolderNode(params, id);\n return this.mutate(\"create\", [id], async () => {\n await this.idb.put(\"nodes\", node);\n return node;\n });\n }\n\n async updateNode(\n id: string,\n updates: Partial<VfsNode<TMeta>>,\n ): Promise<VfsNode<TMeta>> {\n return this.mutate(\"rename\", [id], async () => {\n const node = await this.idb.get(\"nodes\", id);\n if (!node) throw new Error(`Node not found: ${id}`);\n const updated = { ...node, ...updates, updatedAt: Date.now() };\n await this.idb.put(\"nodes\", updated);\n return updated as VfsNode<TMeta>;\n });\n }\n\n async deleteNode(id: string, permanent = false): Promise<void> {\n await this.mutate(\"delete\", [id], async () => {\n if (permanent) {\n await this.deleteRecursive(id);\n } else {\n const node = await this.idb.get(\"nodes\", id);\n if (!node) throw new Error(`Node not found: ${id}`);\n await this.idb.put(\"nodes\", {\n ...node,\n deletedAt: Date.now(),\n });\n }\n });\n }\n\n async deleteNodes(ids: string[], permanent = false): Promise<void> {\n await this.mutate(\"delete\", ids, async () => {\n const tx = this.idb.transaction(\"nodes\", \"readwrite\");\n for (const id of ids) {\n if (permanent) {\n await this.deleteRecursive(id);\n } else {\n const node = await tx.store.get(id);\n if (!node) continue;\n await tx.store.put({ ...node, deletedAt: Date.now() });\n }\n }\n await tx.done;\n });\n }\n\n async restoreNode(id: string): Promise<VfsNode<TMeta>> {\n return this.mutate(\"restore\", [id], async () => {\n const node = await this.idb.get(\"nodes\", id);\n if (!node) throw new Error(`Node not found: ${id}`);\n const restored = { ...node, deletedAt: null, updatedAt: Date.now() };\n await this.idb.put(\"nodes\", restored);\n return restored as VfsNode<TMeta>;\n });\n }\n\n async purgeNode(id: string): Promise<void> {\n await this.mutate(\"purge\", [id], () => this.deleteRecursive(id));\n }\n\n async moveNode(\n id: string,\n newParentId: string | null,\n ): Promise<VfsNode<TMeta>> {\n return this.mutate(\"move\", [id], async () => {\n const node = await this.idb.get(\"nodes\", id);\n if (!node) throw new Error(`Node not found: ${id}`);\n const moved = { ...node, parentId: newParentId, updatedAt: Date.now() };\n await this.idb.put(\"nodes\", moved);\n return moved as VfsNode<TMeta>;\n });\n }\n\n async moveNodes(\n ids: string[],\n newParentId: string | null,\n ): Promise<VfsNode<TMeta>[]> {\n return this.mutate(\"move\", ids, async () => {\n const tx = this.idb.transaction(\"nodes\", \"readwrite\");\n const moved: VfsNode<TMeta>[] = [];\n for (const id of ids) {\n const node = await tx.store.get(id);\n if (!node) continue;\n const updated = { ...node, parentId: newParentId, updatedAt: Date.now() };\n await tx.store.put(updated);\n moved.push(updated as VfsNode<TMeta>);\n }\n await tx.done;\n return moved;\n });\n }\n\n async lockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>> {\n return this.mutate(\"lock\", [id], async () => {\n const node = await this.idb.get(\"nodes\", id);\n if (!node) throw new Error(`Node not found: ${id}`);\n if (node.lockedBy && node.lockedBy !== sessionId) {\n throw new Error(`Node ${id} is locked by another session`);\n }\n const locked = { ...node, lockedBy: sessionId, updatedAt: Date.now() };\n await this.idb.put(\"nodes\", locked);\n return locked as VfsNode<TMeta>;\n });\n }\n\n async unlockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>> {\n return this.mutate(\"unlock\", [id], async () => {\n const node = await this.idb.get(\"nodes\", id);\n if (!node) throw new Error(`Node not found: ${id}`);\n if (node.lockedBy !== sessionId) {\n throw new Error(`Cannot unlock node ${id} — session mismatch`);\n }\n const unlocked = { ...node, lockedBy: null, updatedAt: Date.now() };\n await this.idb.put(\"nodes\", unlocked);\n return unlocked as VfsNode<TMeta>;\n });\n }\n\n async getOrder(parentId: string | null): Promise<VfsNodeOrder | null> {\n const key = parentId ?? \"root\";\n const record = await this.idb.get(\"orders\", key);\n return record ? { parentId: record.parentId, orderedIds: record.orderedIds } : null;\n }\n\n async setOrder(\n parentId: string | null,\n orderedIds: string[],\n ): Promise<void> {\n await this.mutate(\"reorder\", [], async () => {\n const key = parentId ?? \"root\";\n await this.idb.put(\"orders\", { key, parentId, orderedIds });\n });\n }\n\n async getSnapshots(fileId: string): Promise<VfsFileSnapshot[]> {\n return this.idb.getAllFromIndex(\"snapshots\", \"by_file\", fileId);\n }\n\n async saveSnapshot(\n fileId: string,\n content: Uint8Array,\n label?: string,\n ): Promise<VfsFileSnapshot> {\n return this.mutate(\"snapshot\", [fileId], async () => {\n const existing = await this.idb.getAllFromIndex(\n \"snapshots\", \"by_file\", fileId\n );\n\n if (existing.length >= 50) {\n const oldest = existing.sort((a, b) => a.index - b.index)[0];\n await this.idb.delete(\"snapshots\", oldest.id);\n }\n\n const snapshot: VfsFileSnapshot = {\n id: this.generateId(),\n fileId,\n index: existing.length,\n content,\n createdAt: Date.now(),\n label,\n };\n\n await this.idb.put(\"snapshots\", snapshot);\n return snapshot;\n });\n }\n\n async restoreSnapshot(fileId: string, index: number): Promise<void> {\n const all = await this.idb.getAllFromIndex(\"snapshots\", \"by_file\", fileId);\n const snap = all.find(s => s.index === index);\n if (!snap) throw new Error(`Snapshot ${index} not found for file: ${fileId}`);\n await this.writeFile(fileId, snap.content);\n }\n\n async deleteSnapshot(fileId: string, index: number): Promise<void> {\n await this.mutate(\"snapshot\", [fileId], async () => {\n const all = await this.idb.getAllFromIndex(\"snapshots\", \"by_file\", fileId);\n const snap = all.find(s => s.index === index);\n if (!snap) throw new Error(`Snapshot ${index} not found`);\n await this.idb.delete(\"snapshots\", snap.id);\n });\n }\n\n onChanged(callback: (change: VfsChange) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n // ── Private helpers ────────────────────────────────────────────────────\n\n private async deleteRecursive(id: string): Promise<void> {\n const children = await this.idb.getAllFromIndex(\n \"nodes\", \"by_parent\", id\n );\n for (const child of children) {\n await this.deleteRecursive(child.id);\n }\n await this.idb.delete(\"nodes\", id);\n await this.idb.delete(\"content\", id);\n await this.idb.delete(\"snapshots\", id);\n }\n\n private isDescendantOf(\n node: VfsNode<TMeta>,\n ancestorId: string,\n allNodes: VfsNode<TMeta>[],\n ): boolean {\n const index = new Map(allNodes.map(n => [n.id, n]));\n let current: VfsNode<TMeta> | undefined = node;\n while (current?.parentId) {\n if (current.parentId === ancestorId) return true;\n current = index.get(current.parentId);\n }\n return false;\n }\n}","import { VfsAdapter, VfsChange, VfsSearchOptions, VfsCreateFileParams, VfsCreateFolderParams } from \"../core/VfsAdapter\";\nimport {\n VfsNode, VfsFileNode, VfsFolderNode,\n VfsNodeOrder, VfsFileSnapshot,\n VfsOperation,\n} from \"../core/VfsNode\";\nimport { nanoid } from \"nanoid\";\n\nexport type VfsFetch = (url: string, init?: RequestInit) => Promise<Response>;\n\nexport interface VfsEndpointMap {\n // Queries\n getNode: (id: string) => string;\n getNodes: (ids: string[]) => string;\n getNodeByPath: (path: string) => string;\n getChildren: (parentId: string | null) => string;\n getTrashed: () => string;\n search: (query: string) => string;\n\n // Content\n readFile: (id: string) => string;\n writeFile: (id: string) => string;\n\n // Mutations\n createFile: () => string;\n createFolder: () => string;\n updateNode: (id: string) => string;\n deleteNode: (id: string) => string;\n deleteNodes: () => string;\n restoreNode: (id: string) => string;\n purgeNode: (id: string) => string;\n moveNode: (id: string) => string;\n moveNodes: () => string;\n lockNode: (id: string) => string;\n unlockNode: (id: string) => string;\n\n // Ordering\n getOrder: (parentId: string | null) => string;\n setOrder: (parentId: string | null) => string;\n\n // History\n getSnapshots: (fileId: string) => string;\n saveSnapshot: (fileId: string) => string;\n restoreSnapshot:(fileId: string, index: number) => string;\n deleteSnapshot: (fileId: string, index: number) => string;\n\n // Real-time\n subscribe: () => string;\n}\n\nconst defaultEndpoints = (base: string): VfsEndpointMap => ({\n getNode: (id) => `${base}/nodes/${id}`,\n getNodes: (ids) => `${base}/nodes?ids=${ids.join(\",\")}`,\n getNodeByPath: (path) => `${base}/nodes/by-path?path=${encodeURIComponent(path)}`,\n getChildren: (parentId) => `${base}/nodes/${parentId ?? \"root\"}/children`,\n getTrashed: () => `${base}/nodes/trashed`,\n search: (query) => `${base}/nodes/search?q=${encodeURIComponent(query)}`,\n\n readFile: (id) => `${base}/content/${id}`,\n writeFile: (id) => `${base}/content/${id}`,\n\n createFile: () => `${base}/nodes/file`,\n createFolder: () => `${base}/nodes/folder`,\n updateNode: (id) => `${base}/nodes/${id}`,\n deleteNode: (id) => `${base}/nodes/${id}`,\n deleteNodes: () => `${base}/nodes/batch/delete`,\n restoreNode: (id) => `${base}/nodes/${id}/restore`,\n purgeNode: (id) => `${base}/nodes/${id}/purge`,\n moveNode: (id) => `${base}/nodes/${id}/move`,\n moveNodes: () => `${base}/nodes/batch/move`,\n lockNode: (id) => `${base}/nodes/${id}/lock`,\n unlockNode: (id) => `${base}/nodes/${id}/unlock`,\n\n getOrder: (parentId) => `${base}/orders/${parentId ?? \"root\"}`,\n setOrder: (parentId) => `${base}/orders/${parentId ?? \"root\"}`,\n\n getSnapshots: (fileId) => `${base}/snapshots/${fileId}`,\n saveSnapshot: (fileId) => `${base}/snapshots/${fileId}`,\n restoreSnapshot: (fileId, index) => `${base}/snapshots/${fileId}/${index}/restore`,\n deleteSnapshot: (fileId, index) => `${base}/snapshots/${fileId}/${index}`,\n\n subscribe: () => `${base}/events`,\n});\n\nexport type RealtimeFallback = (\n onMessage: (change: VfsChange) => void,\n onError: (err: Error) => void,\n) => () => void;\n\nexport interface RestAdapterOptions {\n baseUrl: string;\n fetch?: VfsFetch;\n endpoints?: Partial<VfsEndpointMap>;\n realtimeFallback?: RealtimeFallback;\n supportsHistory?: boolean;\n}\n\n// ── Adapter ────────────────────────────────────────────────────────────────\n\nexport class RestAdapter<TMeta = Record<string, unknown>>\n extends VfsAdapter<TMeta>\n{\n readonly supportsHistory: boolean;\n\n private fetch: VfsFetch;\n private endpoints: VfsEndpointMap;\n private options: RestAdapterOptions;\n private listeners: Set<(change: VfsChange) => void> = new Set();\n private eventSource: EventSource | null = null;\n\n constructor(options: RestAdapterOptions) {\n super();\n this.options = options;\n this.supportsHistory = options.supportsHistory ?? true;\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.endpoints = {\n ...defaultEndpoints(options.baseUrl),\n ...options.endpoints,\n };\n }\n\n async open(): Promise<void> {\n await this.connectRealtime();\n }\n\n close(): void {\n this.eventSource?.close();\n this.eventSource = null;\n }\n\n private async connectRealtime(): Promise<void> {\n try {\n const url = this.endpoints.subscribe();\n const es = new EventSource(url);\n\n es.onmessage = (e) => {\n try {\n const change: VfsChange = JSON.parse(e.data);\n this.notifyListeners(change);\n } catch { /* malformed message, ignore */ }\n };\n\n es.onerror = () => {\n es.close();\n this.eventSource = null;\n this.fallbackRealtime();\n };\n\n this.eventSource = es;\n } catch {\n this.fallbackRealtime();\n }\n }\n\n private fallbackRealtime(): void {\n if (!this.options.realtimeFallback) return;\n this.options.realtimeFallback(\n (change) => this.notifyListeners(change),\n (err) => console.error(\"[RestAdapter] realtime fallback error:\", err),\n );\n }\n\n private notifyListeners(change: VfsChange): void {\n for (const listener of this.listeners) listener(change);\n }\n\n generateId(): string {\n return nanoid();\n }\n\n private async get<T>(url: string): Promise<T> {\n const res = await this.fetch(url, { method: \"GET\" });\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`);\n return res.json();\n }\n\n private async post<T>(url: string, body?: unknown): Promise<T> {\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(`POST ${url} failed: ${res.status}`);\n return res.json();\n }\n\n private async patch<T>(url: string, body: unknown): Promise<T> {\n const res = await this.fetch(url, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`PATCH ${url} failed: ${res.status}`);\n return res.json();\n }\n\n private async delete(url: string, body?: unknown): Promise<void> {\n const res = await this.fetch(url, {\n method: \"DELETE\",\n headers: body ? { \"Content-Type\": \"application/json\" } : {},\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(`DELETE ${url} failed: ${res.status}`);\n }\n\n private async postBinary(url: string, content: Uint8Array): Promise<void> {\n const res = await this.fetch(url, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/octet-stream\" },\n body: content.buffer as ArrayBuffer,\n });\n if (!res.ok) throw new Error(`PUT ${url} failed: ${res.status}`);\n }\n\n private async mutate<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n return fn();\n }\n\n async getNodes(ids: string[]): Promise<VfsNode<TMeta>[]> {\n if (ids.length === 0) return this.get(this.endpoints.getNodes([]));\n return this.get(this.endpoints.getNodes(ids));\n }\n\n async getNodeById(id: string): Promise<VfsNode<TMeta> | null> {\n try {\n return await this.get<VfsNode<TMeta>>(this.endpoints.getNode(id));\n } catch { return null; }\n }\n\n async getNodeByPath(path: string): Promise<VfsNode<TMeta> | null> {\n try {\n return await this.get<VfsNode<TMeta>>(this.endpoints.getNodeByPath(path));\n } catch { return null; }\n }\n\n async getChildren(\n parentId: string | null,\n options?: { includeTrashed?: boolean },\n ): Promise<VfsNode<TMeta>[]> {\n const url = this.endpoints.getChildren(parentId);\n const fullUrl = options?.includeTrashed ? `${url}?includeTrashed=true` : url;\n return this.get(fullUrl);\n }\n\n async getTrashed(): Promise<VfsNode<TMeta>[]> {\n return this.get(this.endpoints.getTrashed());\n }\n\n async search(\n query: string,\n options?: VfsSearchOptions,\n ): Promise<VfsNode<TMeta>[]> {\n const params = new URLSearchParams({ q: query });\n if (options?.kind) params.set(\"kind\", options.kind);\n if (options?.scope) params.set(\"scope\", options.scope);\n if (options?.includeTrashed) params.set(\"includeTrashed\", \"true\");\n return this.get(`${this.endpoints.search(query)}?${params}`);\n }\n\n async readFile(id: string): Promise<Uint8Array> {\n const res = await this.fetch(\n this.endpoints.readFile(id),\n { method: \"GET\" }\n );\n if (!res.ok) throw new Error(`readFile ${id} failed: ${res.status}`);\n return new Uint8Array(await res.arrayBuffer());\n }\n\n async writeFile(id: string, content: Uint8Array): Promise<void> {\n await this.mutate(() =>\n this.postBinary(this.endpoints.writeFile(id), content)\n );\n }\n\n async createFile(params: VfsCreateFileParams): Promise<VfsFileNode<TMeta>> {\n return this.mutate(() =>\n this.post<VfsFileNode<TMeta>>(this.endpoints.createFile(), params)\n );\n }\n\n async createFolder(params: VfsCreateFolderParams): Promise<VfsFolderNode<TMeta>> {\n return this.mutate(() =>\n this.post<VfsFolderNode<TMeta>>(this.endpoints.createFolder(), params)\n );\n }\n\n async updateNode(\n id: string,\n updates: Partial<VfsNode<TMeta>>,\n ): Promise<VfsNode<TMeta>> {\n return this.mutate(() =>\n this.patch<VfsNode<TMeta>>(this.endpoints.updateNode(id), updates)\n );\n }\n\n async deleteNode(id: string, permanent = false): Promise<void> {\n return this.mutate(() =>\n this.delete(this.endpoints.deleteNode(id), { permanent })\n );\n }\n\n async deleteNodes(ids: string[], permanent = false): Promise<void> {\n return this.mutate(() =>\n this.delete(this.endpoints.deleteNodes(), { ids, permanent })\n );\n }\n\n async restoreNode(id: string): Promise<VfsNode<TMeta>> {\n return this.mutate(() =>\n this.post<VfsNode<TMeta>>(this.endpoints.restoreNode(id))\n );\n }\n\n async purgeNode(id: string): Promise<void> {\n return this.mutate(() =>\n this.delete(this.endpoints.purgeNode(id))\n );\n }\n\n async moveNode(\n id: string,\n newParentId: string | null,\n ): Promise<VfsNode<TMeta>> {\n return this.mutate(() =>\n this.post<VfsNode<TMeta>>(this.endpoints.moveNode(id), { newParentId })\n );\n }\n\n async moveNodes(\n ids: string[],\n newParentId: string | null,\n ): Promise<VfsNode<TMeta>[]> {\n return this.mutate(() =>\n this.post<VfsNode<TMeta>[]>(this.endpoints.moveNodes(), { ids, newParentId })\n );\n }\n\n async lockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>> {\n return this.mutate(() =>\n this.post<VfsNode<TMeta>>(this.endpoints.lockNode(id), { sessionId })\n );\n }\n\n async unlockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>> {\n return this.mutate(() =>\n this.post<VfsNode<TMeta>>(this.endpoints.unlockNode(id), { sessionId })\n );\n }\n\n async getOrder(parentId: string | null): Promise<VfsNodeOrder | null> {\n try {\n return await this.get<VfsNodeOrder>(this.endpoints.getOrder(parentId));\n } catch { return null; }\n }\n\n async setOrder(\n parentId: string | null,\n orderedIds: string[],\n ): Promise<void> {\n await this.mutate(() =>\n this.post(this.endpoints.setOrder(parentId), { orderedIds })\n );\n }\n\n async getSnapshots(fileId: string): Promise<VfsFileSnapshot[]> {\n return this.get(this.endpoints.getSnapshots(fileId));\n }\n\n async saveSnapshot(\n fileId: string,\n content: Uint8Array,\n label?: string,\n ): Promise<VfsFileSnapshot> {\n const res = await this.fetch(\n this.endpoints.saveSnapshot(fileId),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/octet-stream\", ...(label ? { \"x-snapshot-label\": label } : {}) },\n body: content.buffer as ArrayBuffer,\n }\n );\n if (!res.ok) throw new Error(`saveSnapshot failed: ${res.status}`);\n return res.json();\n }\n\n async restoreSnapshot(fileId: string, index: number): Promise<void> {\n await this.mutate(() =>\n this.post(this.endpoints.restoreSnapshot(fileId, index))\n );\n }\n\n async deleteSnapshot(fileId: string, index: number): Promise<void> {\n await this.mutate(() =>\n this.delete(this.endpoints.deleteSnapshot(fileId, index))\n );\n }\n\n onChanged(callback: (change: VfsChange) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n}"],"mappings":"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","names":["nanoid","nanoid","nanoid","e","nanoid"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
var __async = (__this, __arguments, generator) => {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
var fulfilled = (value) => {
|
|
36
|
+
try {
|
|
37
|
+
step(generator.next(value));
|
|
38
|
+
} catch (e) {
|
|
39
|
+
reject(e);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var rejected = (value) => {
|
|
43
|
+
try {
|
|
44
|
+
step(generator.throw(value));
|
|
45
|
+
} catch (e) {
|
|
46
|
+
reject(e);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
50
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
exports.__spreadValues = __spreadValues; exports.__spreadProps = __spreadProps; exports.__objRest = __objRest; exports.__async = __async;
|
|
60
|
+
//# sourceMappingURL=chunk-2FEJBM4N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/ben/Data/Projects/vfs/vfs-kit%20v2/dist/chunk-2FEJBM4N.js"],"names":[],"mappings":"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","file":"/Users/ben/Data/Projects/vfs/vfs-kit v2/dist/chunk-2FEJBM4N.js"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
var __async = (__this, __arguments, generator) => {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
var fulfilled = (value) => {
|
|
36
|
+
try {
|
|
37
|
+
step(generator.next(value));
|
|
38
|
+
} catch (e) {
|
|
39
|
+
reject(e);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var rejected = (value) => {
|
|
43
|
+
try {
|
|
44
|
+
step(generator.throw(value));
|
|
45
|
+
} catch (e) {
|
|
46
|
+
reject(e);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
50
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export {
|
|
55
|
+
__spreadValues,
|
|
56
|
+
__spreadProps,
|
|
57
|
+
__objRest,
|
|
58
|
+
__async
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=chunk-7OQI6PNM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/core/VfsAdapter.ts
|
|
4
|
+
var VfsAdapter = class {
|
|
5
|
+
// ── History ───────────────────────────────────────────────────
|
|
6
|
+
getSnapshots(fileId) {
|
|
7
|
+
throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);
|
|
8
|
+
}
|
|
9
|
+
saveSnapshot(fileId, content, label) {
|
|
10
|
+
throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);
|
|
11
|
+
}
|
|
12
|
+
restoreSnapshot(fileId, index) {
|
|
13
|
+
throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);
|
|
14
|
+
}
|
|
15
|
+
deleteSnapshot(fileId, index) {
|
|
16
|
+
throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
VfsAdapter
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=chunk-ALWOZGZI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/VfsAdapter.ts"],"sourcesContent":["import { VfsNode, VfsFileNode, VfsFolderNode, VfsNodeOrder, VfsFileSnapshot, VfsOperation } from \"./VfsNode\";\n\nexport interface VfsChange {\n op: VfsOperation;\n nodeIds: string[];\n timestamp: number;\n}\n\nexport interface VfsSearchOptions {\n scope?: string | null;\n kind?: \"file\" | \"folder\";\n includeTrashed?: boolean;\n}\n\nexport interface VfsCreateFileParams {\n parentId: string | null;\n name: string;\n mimeType?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface VfsCreateFolderParams {\n parentId: string | null;\n name: string;\n meta?: Record<string, unknown>;\n}\n\nexport abstract class VfsAdapter<TMeta = Record<string, unknown>> {\n abstract readonly supportsHistory: boolean;\n\n abstract generateId(): string;\n\n // ── Node queries ──────────────────────────────────────────────\n abstract getNodes(ids: string[]): Promise<VfsNode<TMeta>[]>;\n abstract getNodeById(id: string): Promise<VfsNode<TMeta> | null>;\n abstract getNodeByPath(path: string): Promise<VfsNode<TMeta> | null>;\n abstract getChildren(\n parentId: string | null,\n options?: { includeTrashed?: boolean }\n ): Promise<VfsNode<TMeta>[]>;\n abstract getTrashed(): Promise<VfsNode<TMeta>[]>;\n abstract search(\n query: string,\n options?: VfsSearchOptions\n ): Promise<VfsNode<TMeta>[]>;\n\n // ── File content ──────────────────────────────────────────────\n abstract readFile(id: string): Promise<Uint8Array>;\n abstract writeFile(id: string, content: Uint8Array): Promise<void>;\n\n // ── Mutations ─────────────────────────────────────────────────\n abstract createFile(params: VfsCreateFileParams): Promise<VfsFileNode<TMeta>>;\n abstract createFolder(params: VfsCreateFolderParams): Promise<VfsFolderNode<TMeta>>;\n abstract updateNode(id: string, updates: Partial<VfsNode<TMeta>>): Promise<VfsNode<TMeta>>;\n abstract deleteNode(id: string, permanent?: boolean): Promise<void>;\n abstract deleteNodes(ids: string[], permanent?: boolean): Promise<void>;\n abstract restoreNode(id: string): Promise<VfsNode<TMeta>>;\n abstract purgeNode(id: string): Promise<void>;\n abstract moveNode(id: string, newParentId: string | null): Promise<VfsNode<TMeta>>;\n abstract moveNodes(ids: string[], newParentId: string | null): Promise<VfsNode<TMeta>[]>;\n abstract lockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>>;\n abstract unlockNode(id: string, sessionId: string): Promise<VfsNode<TMeta>>;\n\n // ── Ordering ──────────────────────────────────────────────────\n abstract getOrder(parentId: string | null): Promise<VfsNodeOrder | null>;\n abstract setOrder(parentId: string | null, orderedIds: string[]): Promise<void>;\n\n // ── History ───────────────────────────────────────────────────\n getSnapshots(fileId: string): Promise<VfsFileSnapshot[]> {\n throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);\n }\n saveSnapshot(fileId: string, content: Uint8Array, label?: string): Promise<VfsFileSnapshot> {\n throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);\n }\n restoreSnapshot(fileId: string, index: number): Promise<void> {\n throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);\n }\n deleteSnapshot(fileId: string, index: number): Promise<void> {\n throw new Error(`Adapter does not support history. Check supportsHistory before calling.`);\n }\n\n // ── Events ────────────────────────────────────────────────────\n abstract onChanged(callback: (change: VfsChange) => void): () => void;\n}"],"mappings":";;;AA2BO,IAAe,aAAf,MAA2D;AAAA;AAAA,EAyC9D,aAAa,QAA4C;AACrD,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC7F;AAAA,EACA,aAAa,QAAgB,SAAqB,OAA0C;AACxF,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC7F;AAAA,EACA,gBAAgB,QAAgB,OAA8B;AAC1D,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC7F;AAAA,EACA,eAAe,QAAgB,OAA8B;AACzD,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC7F;AAIJ;","names":[]}
|