@bendyline/docblocks 1.1.1 → 1.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.
- package/README.md +38 -12
- package/dist/{chunk-LORJUBON.js → chunk-IM7LCQJ6.js} +8 -6
- package/dist/chunk-IM7LCQJ6.js.map +1 -0
- package/dist/filesystem/native-provider.d.ts.map +1 -1
- package/dist/filesystem/native-provider.js +8 -6
- package/dist/filesystem/native-provider.js.map +1 -1
- package/dist/host/types.d.ts +5 -5
- package/dist/host/types.d.ts.map +1 -1
- package/dist/{index-Bunj8Kb_.d.ts → index-pgBHBQ9G.d.ts} +5 -5
- package/package.json +2 -2
- package/src/filesystem/native-provider.ts +8 -5
- package/src/host/types.ts +5 -5
- package/dist/chunk-LORJUBON.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @bendyline/docblocks
|
|
2
2
|
|
|
3
|
-
Core
|
|
3
|
+
Core types and abstractions for DocBlocks — the single source of truth for everything that crosses a process or storage boundary (filesystem providers, workspace management, and the Electron host contract).
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -10,16 +10,18 @@ npm install @bendyline/docblocks
|
|
|
10
10
|
|
|
11
11
|
## Exports
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Three subpath modules (also re-exported from the package root):
|
|
14
14
|
|
|
15
15
|
### Filesystem (`@bendyline/docblocks/filesystem`)
|
|
16
16
|
|
|
17
|
-
Pluggable filesystem abstraction
|
|
17
|
+
Pluggable filesystem abstraction — **the single seam for user-document storage**. UI code never touches `indexedDB`, `node:fs`, or `electron` directly; it goes through a provider.
|
|
18
18
|
|
|
19
|
-
- **`FileSystemProvider`** —
|
|
20
|
-
- **`IndexedDBFileSystemProvider`** —
|
|
21
|
-
- **`NativeFileSystemProvider`** —
|
|
22
|
-
- **`
|
|
19
|
+
- **`FileSystemProvider`** — the interface (`readFile`, `writeFile`, `readDirectory`, `delete`, `rename`, `createDirectory`, `stat`)
|
|
20
|
+
- **`IndexedDBFileSystemProvider`** — browser-local persistent storage (site, VS Code webview fallback)
|
|
21
|
+
- **`NativeFileSystemProvider`** — real folders in the browser via the File System Access API
|
|
22
|
+
- **`ElectronFileSystemProvider`** — bridges to the desktop main process over the host API
|
|
23
|
+
- **`IndexedDBContentContainer`** / **`FileSystemContentContainer`** — content-container layer for media alongside documents
|
|
24
|
+
- **`createFileMediaProvider`** — media provider wired to a filesystem provider
|
|
23
25
|
|
|
24
26
|
```ts
|
|
25
27
|
import { IndexedDBFileSystemProvider } from '@bendyline/docblocks/filesystem';
|
|
@@ -29,14 +31,16 @@ await fs.writeFile('/doc.md', '# Hello');
|
|
|
29
31
|
const content = await fs.readFile('/doc.md');
|
|
30
32
|
```
|
|
31
33
|
|
|
34
|
+
Adding a new storage backend means adding a new provider implementation — the rest of the app shouldn't need to change.
|
|
35
|
+
|
|
32
36
|
### Workspace (`@bendyline/docblocks/workspace`)
|
|
33
37
|
|
|
34
|
-
Workspace
|
|
38
|
+
Workspace registry — how DocBlocks tracks the document collections a user has opened.
|
|
35
39
|
|
|
36
|
-
- **`
|
|
37
|
-
- **`getWorkspace`** / **`saveWorkspace`** / **`removeWorkspace`** — CRUD
|
|
38
|
-
- **`touchWorkspace`** —
|
|
39
|
-
- **`ensureDefaultWorkspace`** —
|
|
40
|
+
- **`WorkspaceDescriptor`** — the workspace record type
|
|
41
|
+
- **`listWorkspaces`** / **`getWorkspace`** / **`saveWorkspace`** / **`removeWorkspace`** — registry CRUD
|
|
42
|
+
- **`touchWorkspace`** — update the last-opened timestamp
|
|
43
|
+
- **`ensureDefaultWorkspace`** — create a default workspace if none exist
|
|
40
44
|
|
|
41
45
|
```ts
|
|
42
46
|
import { listWorkspaces, ensureDefaultWorkspace } from '@bendyline/docblocks/workspace';
|
|
@@ -44,6 +48,28 @@ import { listWorkspaces, ensureDefaultWorkspace } from '@bendyline/docblocks/wor
|
|
|
44
48
|
const workspaces = await listWorkspaces();
|
|
45
49
|
```
|
|
46
50
|
|
|
51
|
+
### Host (`@bendyline/docblocks/host`)
|
|
52
|
+
|
|
53
|
+
The canonical contract for what the Electron desktop shell exposes to its renderer (`fs`, `workspaces`, `shell`, `ffmpeg`, `updater`, `menu`, open-file requests).
|
|
54
|
+
|
|
55
|
+
- **`DocBlocksHostAPI`** — the contract type (implemented by `desktop/main/ipc-*.ts`, exposed by `desktop/preload/preload.ts`)
|
|
56
|
+
- **`isElectronHost()`** — feature-detect the desktop shell
|
|
57
|
+
- **`getDocBlocksHost()`** — get the host API (throws outside Electron)
|
|
58
|
+
- **`maybeGetDocBlocksHost()`** — get the host API or `null`, for code that degrades gracefully in the browser
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { isElectronHost, maybeGetDocBlocksHost } from '@bendyline/docblocks/host';
|
|
62
|
+
|
|
63
|
+
const host = maybeGetDocBlocksHost();
|
|
64
|
+
if (host) {
|
|
65
|
+
await host.shell.revealInFolder(path);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Conventions
|
|
70
|
+
|
|
71
|
+
Anything that crosses IPC, postMessage, HTTP, or MCP boundaries belongs in this package — surface packages must not define their own copies of wire types.
|
|
72
|
+
|
|
47
73
|
## License
|
|
48
74
|
|
|
49
75
|
MIT
|
|
@@ -593,6 +593,12 @@ function baseName2(p) {
|
|
|
593
593
|
const idx = p.lastIndexOf("/");
|
|
594
594
|
return idx === -1 ? p : p.slice(idx + 1);
|
|
595
595
|
}
|
|
596
|
+
function toWritableBinary(data) {
|
|
597
|
+
if (data instanceof ArrayBuffer) return data;
|
|
598
|
+
const copy = new Uint8Array(data.byteLength);
|
|
599
|
+
copy.set(data);
|
|
600
|
+
return copy.buffer;
|
|
601
|
+
}
|
|
596
602
|
var NativeFileSystemProvider = class {
|
|
597
603
|
constructor(id, root) {
|
|
598
604
|
this.id = id;
|
|
@@ -744,11 +750,7 @@ var NativeFileSystemProvider = class {
|
|
|
744
750
|
const dir = await resolveDirCreate(this.root, parentDir2(p));
|
|
745
751
|
const fileHandle = await dir.getFileHandle(baseName2(p), { create: true });
|
|
746
752
|
const writable = await fileHandle.createWritable();
|
|
747
|
-
|
|
748
|
-
await writable.write(data);
|
|
749
|
-
} else {
|
|
750
|
-
await writable.write(data.buffer);
|
|
751
|
-
}
|
|
753
|
+
await writable.write(toWritableBinary(data));
|
|
752
754
|
await writable.close();
|
|
753
755
|
}
|
|
754
756
|
};
|
|
@@ -845,4 +847,4 @@ export {
|
|
|
845
847
|
restoreNativeFolder,
|
|
846
848
|
ElectronFileSystemProvider
|
|
847
849
|
};
|
|
848
|
-
//# sourceMappingURL=chunk-
|
|
850
|
+
//# sourceMappingURL=chunk-IM7LCQJ6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/filesystem/indexeddb-provider.ts","../src/filesystem/indexeddb-content-container.ts","../src/filesystem/filesystem-content-container.ts","../src/filesystem/file-media-provider.ts","../src/filesystem/native-provider.ts","../src/filesystem/electron-provider.ts"],"sourcesContent":["/**\n * IndexedDBFileSystemProvider — virtualises a filesystem on top of IndexedDB\n * using the LocalForageAdapter from @bendyline/squisq/storage.\n *\n * Key schema:\n * fs:{path}:content → string (text file contents)\n * fs:{path}:binary → ArrayBuffer (binary file contents)\n * fs:{path}:meta → FileMeta object\n * fs:dirs → Set<string> of known directory paths\n */\n\nimport { LocalForageAdapter } from '@bendyline/squisq/storage';\nimport type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';\n\n// ── Helpers ────────────────────────────────────────────────────────\n\n/** Normalise a path: strip leading/trailing slashes, collapse doubles. */\nfunction normalisePath(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/^\\//, '').replace(/\\/$/, '');\n}\n\n/** Get the parent directory of a path, or empty string for root-level. */\nfunction parentDir(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? '' : p.slice(0, idx);\n}\n\n/** Get the filename component of a path. */\nfunction baseName(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? p : p.slice(idx + 1);\n}\n\n// ── Key helpers ────────────────────────────────────────────────────\n\nfunction contentKey(path: string): string {\n return `fs:${path}:content`;\n}\n\nfunction binaryKey(path: string): string {\n return `fs:${path}:binary`;\n}\n\nfunction metaKey(path: string): string {\n return `fs:${path}:meta`;\n}\n\nconst DIRS_KEY = 'fs:dirs';\n\n// ── Implementation ─────────────────────────────────────────────────\n\nexport class IndexedDBFileSystemProvider implements FileSystemProvider {\n readonly id: string;\n readonly label: string;\n\n private store: LocalForageAdapter;\n\n constructor(id: string, label: string) {\n this.id = id;\n this.label = label;\n this.store = new LocalForageAdapter({\n name: `docblocks-fs-${id}`,\n storeName: 'files',\n });\n }\n\n // ── Directory tracking ──────────────────────────────────────────\n\n private async getDirs(): Promise<Set<string>> {\n const raw = await this.store.get<string[]>(DIRS_KEY);\n return new Set(raw ?? []);\n }\n\n private async saveDirs(dirs: Set<string>): Promise<void> {\n await this.store.set(DIRS_KEY, [...dirs]);\n }\n\n /** Ensure a directory (and all ancestors) are tracked. */\n private async ensureDir(dirPath: string): Promise<void> {\n if (!dirPath) return;\n const dirs = await this.getDirs();\n const parts = dirPath.split('/');\n let current = '';\n let changed = false;\n for (const part of parts) {\n current = current ? `${current}/${part}` : part;\n if (!dirs.has(current)) {\n dirs.add(current);\n changed = true;\n }\n }\n if (changed) {\n await this.saveDirs(dirs);\n }\n }\n\n // ── FileSystemProvider implementation ───────────────────────────\n\n async readFile(path: string): Promise<string | null> {\n const p = normalisePath(path);\n return this.store.get<string>(contentKey(p));\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n if (parent) {\n await this.ensureDir(parent);\n }\n\n const meta: FileMeta = {\n name: baseName(p),\n path: p,\n size: new Blob([content]).size,\n lastModified: new Date().toISOString(),\n };\n\n await this.store.set(contentKey(p), content);\n await this.store.set(metaKey(p), meta);\n }\n\n async delete(path: string): Promise<void> {\n const p = normalisePath(path);\n\n // Remove file keys\n await this.store.remove(contentKey(p));\n await this.store.remove(binaryKey(p));\n await this.store.remove(metaKey(p));\n\n // If it was a directory, remove it and all children\n const dirs = await this.getDirs();\n if (dirs.has(p)) {\n const prefix = p + '/';\n const toRemove: string[] = [p];\n for (const d of dirs) {\n if (d.startsWith(prefix)) {\n toRemove.push(d);\n }\n }\n for (const d of toRemove) {\n dirs.delete(d);\n }\n await this.saveDirs(dirs);\n\n // Remove all file keys under this directory\n const allKeys = await this.store.keys();\n const filePrefix = `fs:${p}/`;\n const keysToRemove = allKeys.filter((k) => k.startsWith(filePrefix));\n await Promise.all(keysToRemove.map((k) => this.store.remove(k)));\n }\n }\n\n async rename(oldPath: string, newPath: string): Promise<void> {\n const op = normalisePath(oldPath);\n const np = normalisePath(newPath);\n if (op === np) return;\n if (!op || !np) {\n throw new Error('Cannot rename the filesystem root');\n }\n if (np.startsWith(op + '/')) {\n throw new Error('Cannot move a directory into itself');\n }\n\n const dirs = await this.getDirs();\n\n // Handle directory rename by moving every tracked child directory and\n // every file record keyed under the old directory prefix.\n if (dirs.has(op)) {\n const newParent = parentDir(np);\n if (newParent) {\n await this.ensureDir(newParent);\n }\n\n const allKeys = await this.store.keys();\n const oldKeyPrefix = `fs:${op}/`;\n const newKeyPrefix = `fs:${np}/`;\n const metaSuffix = ':meta';\n const keysToMove = allKeys.filter((k) => k.startsWith(oldKeyPrefix));\n\n await Promise.all(\n keysToMove.map(async (oldKey) => {\n const newKey = newKeyPrefix + oldKey.slice(oldKeyPrefix.length);\n if (oldKey.endsWith(metaSuffix)) {\n const meta = await this.store.get<FileMeta>(oldKey);\n if (meta) {\n const newFilePath = newKey.slice(3, -metaSuffix.length);\n await this.store.set(metaKey(newFilePath), {\n ...meta,\n name: baseName(newFilePath),\n path: newFilePath,\n });\n }\n } else {\n const value = await this.store.get<unknown>(oldKey);\n if (value !== null) {\n await this.store.set(newKey, value);\n }\n }\n await this.store.remove(oldKey);\n }),\n );\n\n dirs.delete(op);\n dirs.add(np);\n const oldPrefix = op + '/';\n const newPrefix = np + '/';\n for (const d of [...dirs]) {\n if (d.startsWith(oldPrefix)) {\n dirs.delete(d);\n dirs.add(newPrefix + d.slice(oldPrefix.length));\n }\n }\n await this.saveDirs(dirs);\n return;\n }\n\n // Read existing data\n const content = await this.store.get<string>(contentKey(op));\n const binary = await this.store.get<ArrayBuffer>(binaryKey(op));\n const meta = await this.store.get<FileMeta>(metaKey(op));\n\n // Write to new location\n if (content !== null) {\n await this.store.set(contentKey(np), content);\n }\n if (binary !== null) {\n await this.store.set(binaryKey(np), binary);\n }\n if (meta) {\n await this.store.set(metaKey(np), {\n ...meta,\n name: baseName(np),\n path: np,\n });\n }\n\n // Ensure parent dir of new path exists\n const newParent = parentDir(np);\n if (newParent) {\n await this.ensureDir(newParent);\n }\n\n // Delete old\n await this.store.remove(contentKey(op));\n await this.store.remove(binaryKey(op));\n await this.store.remove(metaKey(op));\n }\n\n async readDirectory(path: string): Promise<FileSystemEntry[]> {\n const p = normalisePath(path);\n const dirs = await this.getDirs();\n const entries: FileSystemEntry[] = [];\n const seen = new Set<string>();\n\n // Find child directories\n const prefix = p ? p + '/' : '';\n for (const d of dirs) {\n if (!p && !d.includes('/')) {\n // Root-level directory\n if (!seen.has(d)) {\n seen.add(d);\n entries.push({ kind: 'directory', name: d, path: d });\n }\n } else if (p && d.startsWith(prefix)) {\n const rest = d.slice(prefix.length);\n if (!rest.includes('/')) {\n // Direct child directory\n if (!seen.has(rest)) {\n seen.add(rest);\n entries.push({ kind: 'directory', name: rest, path: d });\n }\n }\n }\n }\n\n // Find child files by scanning meta keys\n const allKeys = await this.store.keys();\n const metaPrefix = p ? `fs:${p}/` : 'fs:';\n const metaSuffix = ':meta';\n\n for (const key of allKeys) {\n if (!key.startsWith(metaPrefix) || !key.endsWith(metaSuffix)) continue;\n\n const filePath = key.slice(3, -metaSuffix.length); // strip \"fs:\" and \":meta\"\n const rel = p ? filePath.slice(prefix.length) : filePath;\n\n // Only direct children (no further slashes)\n if (rel.includes('/')) continue;\n\n if (!seen.has(rel)) {\n seen.add(rel);\n entries.push({ kind: 'file', name: rel, path: filePath });\n }\n }\n\n // Sort: directories first, then alphabetical\n entries.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n const p = normalisePath(path);\n const dirs = await this.getDirs();\n if (dirs.has(p)) return true;\n const meta = await this.store.get(metaKey(p));\n return meta !== null;\n }\n\n async createDirectory(path: string): Promise<void> {\n const p = normalisePath(path);\n await this.ensureDir(p);\n }\n\n async stat(path: string): Promise<FileMeta | null> {\n const p = normalisePath(path);\n return this.store.get<FileMeta>(metaKey(p));\n }\n\n async readBinary(path: string): Promise<ArrayBuffer | null> {\n const p = normalisePath(path);\n return this.store.get<ArrayBuffer>(binaryKey(p));\n }\n\n async writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n if (parent) {\n await this.ensureDir(parent);\n }\n\n const meta: FileMeta = {\n name: baseName(p),\n path: p,\n size: data.byteLength,\n lastModified: new Date().toISOString(),\n };\n\n await this.store.set(binaryKey(p), data);\n await this.store.set(metaKey(p), meta);\n }\n}\n","/**\n * IndexedDBContentContainer — a ContentContainer backed by IndexedDB.\n *\n * Uses a dedicated IndexedDBFileSystemProvider instance (separate store)\n * to persist media files across page refreshes.\n */\n\nimport type { ContentContainer, ContentEntry } from '@bendyline/squisq/storage';\nimport { findDocumentPath } from '@bendyline/squisq/storage';\nimport { IndexedDBFileSystemProvider } from './indexeddb-provider.js';\n\n// ── MIME type guessing ─────────────────────────────────────────────\n\nconst EXTENSION_MIME_MAP: Record<string, string> = {\n '.md': 'text/markdown',\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n};\n\nfunction guessMimeType(path: string): string {\n const dot = path.lastIndexOf('.');\n if (dot === -1) return 'application/octet-stream';\n const ext = path.slice(dot).toLowerCase();\n return EXTENSION_MIME_MAP[ext] ?? 'application/octet-stream';\n}\n\n// ── Implementation ─────────────────────────────────────────────────\n\nexport class IndexedDBContentContainer implements ContentContainer {\n private provider: IndexedDBFileSystemProvider;\n\n constructor(workspaceId: string) {\n this.provider = new IndexedDBFileSystemProvider(`${workspaceId}-media`, 'Media Storage');\n }\n\n async readFile(path: string): Promise<ArrayBuffer | null> {\n return this.provider.readBinary(path);\n }\n\n async writeFile(path: string, data: ArrayBuffer | Uint8Array, _mimeType?: string): Promise<void> {\n await this.provider.writeBinary(path, data);\n }\n\n async removeFile(path: string): Promise<void> {\n await this.provider.delete(path);\n }\n\n async listFiles(prefix?: string): Promise<ContentEntry[]> {\n const entries: ContentEntry[] = [];\n const walk = async (dir: string) => {\n const children = await this.provider.readDirectory(dir);\n for (const child of children) {\n if (child.kind === 'directory') {\n await walk(child.path);\n } else {\n const filePath = child.path.replace(/^\\//, '');\n if (prefix && !filePath.startsWith(prefix)) continue;\n const meta = await this.provider.stat(child.path);\n entries.push({\n path: filePath,\n mimeType: guessMimeType(filePath),\n size: meta?.size ?? 0,\n });\n }\n }\n };\n await walk('/');\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n return this.provider.exists(path);\n }\n\n async getDocumentPath(): Promise<string | null> {\n return findDocumentPath(await this.listFiles());\n }\n\n async readDocument(): Promise<string | null> {\n const docPath = await this.getDocumentPath();\n if (!docPath) return null;\n const data = await this.readFile(docPath);\n if (!data) return null;\n return new TextDecoder().decode(data);\n }\n\n async writeDocument(markdown: string, filename?: string): Promise<void> {\n const name = filename ?? 'index.md';\n const data = new TextEncoder().encode(markdown);\n await this.writeFile(name, data, 'text/markdown');\n }\n}\n","/**\n * FileSystemContentContainer — a ContentContainer backed by any\n * FileSystemProvider, scoped to a sub-path (e.g., \".docblocks/media/\").\n *\n * Used by the Electron desktop app so media lives inside the workspace\n * folder (visible as regular files) rather than in a separate IndexedDB\n * origin that only the app can see.\n */\n\nimport type { ContentContainer, ContentEntry } from '@bendyline/squisq/storage';\nimport { findDocumentPath } from '@bendyline/squisq/storage';\nimport type { FileSystemProvider } from './types.js';\n\nconst EXTENSION_MIME_MAP: Record<string, string> = {\n '.md': 'text/markdown',\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n};\n\nfunction guessMimeType(path: string): string {\n const dot = path.lastIndexOf('.');\n if (dot === -1) return 'application/octet-stream';\n const ext = path.slice(dot).toLowerCase();\n return EXTENSION_MIME_MAP[ext] ?? 'application/octet-stream';\n}\n\nfunction joinPrefix(prefix: string, p: string): string {\n const clean = p.replace(/^\\/+/, '');\n return prefix.replace(/\\/+$/, '') + '/' + clean;\n}\n\nexport class FileSystemContentContainer implements ContentContainer {\n private readonly prefix: string;\n\n constructor(\n private readonly provider: FileSystemProvider,\n prefix = '.docblocks/media',\n ) {\n this.prefix = prefix.replace(/^\\/+/, '').replace(/\\/+$/, '');\n }\n\n async readFile(path: string): Promise<ArrayBuffer | null> {\n const full = joinPrefix(this.prefix, path);\n const binary = await this.provider.readBinary(full);\n if (binary) return binary;\n // IndexedDB-backed workspaces store text via `writeFile(string)` and\n // binary via `writeBinary(ArrayBuffer)` under separate keys, so a\n // markdown file written through the text API is invisible to\n // `readBinary`. Fall back to text-then-UTF-8 so consumers like the\n // recursive HTML export can resolve sibling `.md` links uniformly\n // across browser and native workspaces.\n const text = await this.provider.readFile(full);\n if (text === null) return null;\n return new TextEncoder().encode(text).buffer as ArrayBuffer;\n }\n\n async writeFile(path: string, data: ArrayBuffer | Uint8Array, _mimeType?: string): Promise<void> {\n await this.provider.writeBinary(joinPrefix(this.prefix, path), data);\n }\n\n async removeFile(path: string): Promise<void> {\n await this.provider.delete(joinPrefix(this.prefix, path));\n }\n\n async listFiles(prefix?: string): Promise<ContentEntry[]> {\n const entries: ContentEntry[] = [];\n const walk = async (dir: string) => {\n let children;\n try {\n children = await this.provider.readDirectory(dir);\n } catch {\n return;\n }\n for (const child of children) {\n if (child.kind === 'directory') {\n await walk(child.path);\n } else {\n const rel = child.path.replace(new RegExp('^/?' + this.prefix + '/?'), '');\n if (prefix && !rel.startsWith(prefix)) continue;\n const meta = await this.provider.stat(child.path);\n entries.push({\n path: rel,\n mimeType: guessMimeType(rel),\n size: meta?.size ?? 0,\n });\n }\n }\n };\n await walk('/' + this.prefix);\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n return this.provider.exists(joinPrefix(this.prefix, path));\n }\n\n async getDocumentPath(): Promise<string | null> {\n return findDocumentPath(await this.listFiles());\n }\n\n async readDocument(): Promise<string | null> {\n const docPath = await this.getDocumentPath();\n if (!docPath) return null;\n const data = await this.readFile(docPath);\n if (!data) return null;\n return new TextDecoder().decode(data);\n }\n\n async writeDocument(markdown: string, filename?: string): Promise<void> {\n const name = filename ?? 'index.md';\n const data = new TextEncoder().encode(markdown);\n await this.writeFile(name, data, 'text/markdown');\n }\n}\n","/**\n * createFileMediaProvider — per-file media storage following the pandoc /\n * Word convention: a markdown file `notes.md` gets a sibling folder\n * `notes_files/` that holds its images, audio, and video.\n *\n * Given:\n * • `container` — a ContentContainer scoped to the markdown file's\n * parent directory (so `readFile('notes_files/image.png')` maps to the\n * parent-relative path)\n * • `markdownBasename` — e.g. `\"notes.md\"`\n *\n * Returns a MediaProvider that:\n * • Writes new media under `{basename}_files/{name}` in the parent dir\n * • Returns the folder-qualified path (`notes_files/image.png`) from\n * addMedia so the markdown stays portable outside DocBlocks\n * • Resolves both bare (`image.png`) and folder-qualified\n * (`notes_files/image.png`) references — so legacy markdown and\n * exports from other tools both work\n */\n\nimport type { MediaProvider, MediaEntry } from '@bendyline/squisq/schemas';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\n\nfunction stripExt(name: string): string {\n return name.replace(/\\.[^.]+$/, '');\n}\n\nexport function createFileMediaProvider(\n container: ContentContainer,\n markdownBasename: string,\n): MediaProvider {\n const folder = stripExt(markdownBasename) + '_files';\n const prefix = folder + '/';\n const blobUrlCache = new Map<string, string>();\n\n function toKey(ref: string): string {\n const clean = ref.replace(/^\\/+/, '');\n return clean.startsWith(prefix) ? clean : prefix + clean;\n }\n\n return {\n async resolveUrl(ref: string): Promise<string> {\n const key = toKey(ref);\n const cached = blobUrlCache.get(key);\n if (cached) return cached;\n\n const data = await container.readFile(key);\n if (!data) return ref;\n\n const entries = await container.listFiles();\n const entry = entries.find((e) => e.path === key);\n const mimeType = entry?.mimeType ?? 'application/octet-stream';\n\n const url = URL.createObjectURL(new Blob([data], { type: mimeType }));\n blobUrlCache.set(key, url);\n return url;\n },\n\n async listMedia(): Promise<MediaEntry[]> {\n const entries = await container.listFiles(prefix);\n return entries\n .filter((e) => !e.path.toLowerCase().endsWith('.md'))\n .map((e) => ({\n name: e.path,\n mimeType: e.mimeType,\n size: e.size,\n }));\n },\n\n async addMedia(\n name: string,\n data: ArrayBuffer | Blob | Uint8Array,\n mimeType: string,\n ): Promise<string> {\n const key = toKey(name);\n const cached = blobUrlCache.get(key);\n if (cached) {\n URL.revokeObjectURL(cached);\n blobUrlCache.delete(key);\n }\n const buffer = data instanceof Blob ? new Uint8Array(await data.arrayBuffer()) : data;\n await container.writeFile(key, buffer, mimeType);\n return key;\n },\n\n async removeMedia(ref: string): Promise<void> {\n const key = toKey(ref);\n const cached = blobUrlCache.get(key);\n if (cached) {\n URL.revokeObjectURL(cached);\n blobUrlCache.delete(key);\n }\n await container.removeFile(key);\n },\n\n dispose(): void {\n for (const url of blobUrlCache.values()) {\n URL.revokeObjectURL(url);\n }\n blobUrlCache.clear();\n },\n };\n}\n","/**\n * NativeFileSystemProvider — wraps the File System Access API\n * (window.showDirectoryPicker / FileSystemDirectoryHandle).\n *\n * Progressive enhancement: only available in browsers that support\n * the API (Chrome, Edge). Feature-detect with `isNativeFileSystemSupported()`.\n */\n\nimport type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';\n\n// ── Feature detection ──────────────────────────────────────────────\n\nexport function isNativeFileSystemSupported(): boolean {\n return typeof globalThis !== 'undefined' && 'showDirectoryPicker' in globalThis;\n}\n\n// ── Handle persistence (IndexedDB, structured clone) ───────────────\n\nconst HANDLE_DB_NAME = 'docblocks-handles';\nconst HANDLE_STORE_NAME = 'directory-handles';\n\nfunction openHandleDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(HANDLE_DB_NAME, 1);\n req.onupgradeneeded = () => {\n req.result.createObjectStore(HANDLE_STORE_NAME);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/** Persist a FileSystemDirectoryHandle so it survives page reloads. */\nexport async function storeDirectoryHandle(\n workspaceId: string,\n handle: FileSystemDirectoryHandle,\n): Promise<void> {\n const db = await openHandleDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(HANDLE_STORE_NAME, 'readwrite');\n tx.objectStore(HANDLE_STORE_NAME).put(handle, workspaceId);\n tx.oncomplete = () => {\n db.close();\n resolve();\n };\n tx.onerror = () => {\n db.close();\n reject(tx.error);\n };\n });\n}\n\n/** Retrieve a previously stored handle. Returns null if not found. */\nexport async function loadDirectoryHandle(\n workspaceId: string,\n): Promise<FileSystemDirectoryHandle | null> {\n const db = await openHandleDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(HANDLE_STORE_NAME, 'readonly');\n const req = tx.objectStore(HANDLE_STORE_NAME).get(workspaceId);\n req.onsuccess = () => {\n db.close();\n resolve(req.result ?? null);\n };\n req.onerror = () => {\n db.close();\n reject(req.error);\n };\n });\n}\n\n/** Remove a stored handle (e.g. when deleting a workspace). */\nexport async function removeDirectoryHandle(workspaceId: string): Promise<void> {\n const db = await openHandleDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(HANDLE_STORE_NAME, 'readwrite');\n tx.objectStore(HANDLE_STORE_NAME).delete(workspaceId);\n tx.oncomplete = () => {\n db.close();\n resolve();\n };\n tx.onerror = () => {\n db.close();\n reject(tx.error);\n };\n });\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction normalisePath(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/^\\//, '').replace(/\\/$/, '');\n}\n\n/**\n * Walk a chain of path segments to reach a FileSystemDirectoryHandle.\n * Returns null if any segment is missing.\n */\nasync function resolveDir(\n root: FileSystemDirectoryHandle,\n dirPath: string,\n): Promise<FileSystemDirectoryHandle | null> {\n if (!dirPath) return root;\n const parts = dirPath.split('/');\n let current = root;\n for (const part of parts) {\n try {\n current = await current.getDirectoryHandle(part);\n } catch {\n return null;\n }\n }\n return current;\n}\n\n/**\n * Walk path segments, creating directories as needed.\n */\nasync function resolveDirCreate(\n root: FileSystemDirectoryHandle,\n dirPath: string,\n): Promise<FileSystemDirectoryHandle> {\n if (!dirPath) return root;\n const parts = dirPath.split('/');\n let current = root;\n for (const part of parts) {\n current = await current.getDirectoryHandle(part, { create: true });\n }\n return current;\n}\n\nfunction parentDir(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? '' : p.slice(0, idx);\n}\n\nfunction baseName(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? p : p.slice(idx + 1);\n}\n\nfunction toWritableBinary(data: ArrayBuffer | Uint8Array): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data;\n const copy = new Uint8Array(data.byteLength);\n copy.set(data);\n return copy.buffer;\n}\n\n// ── Implementation ─────────────────────────────────────────────────\n\nexport class NativeFileSystemProvider implements FileSystemProvider {\n readonly id: string;\n readonly label: string;\n\n private root: FileSystemDirectoryHandle;\n\n constructor(id: string, root: FileSystemDirectoryHandle) {\n this.id = id;\n this.label = root.name;\n this.root = root;\n }\n\n private async copyDirectory(oldDirPath: string, newDirPath: string): Promise<boolean> {\n const source = await resolveDir(this.root, oldDirPath);\n if (!source) return false;\n await resolveDirCreate(this.root, newDirPath);\n\n for await (const [name, handle] of source as unknown as AsyncIterable<\n [string, FileSystemHandle]\n >) {\n const oldChild = oldDirPath ? `${oldDirPath}/${name}` : name;\n const newChild = newDirPath ? `${newDirPath}/${name}` : name;\n if (handle.kind === 'directory') {\n await this.copyDirectory(oldChild, newChild);\n } else {\n const fileHandle = await source.getFileHandle(name);\n const file = await fileHandle.getFile();\n await this.writeBinary(newChild, await file.arrayBuffer());\n }\n }\n\n return true;\n }\n\n async readFile(path: string): Promise<string | null> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, parentDir(p));\n if (!dir) return null;\n try {\n const fileHandle = await dir.getFileHandle(baseName(p));\n const file = await fileHandle.getFile();\n return file.text();\n } catch {\n return null;\n }\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const p = normalisePath(path);\n const dir = await resolveDirCreate(this.root, parentDir(p));\n const fileHandle = await dir.getFileHandle(baseName(p), { create: true });\n const writable = await fileHandle.createWritable();\n await writable.write(content);\n await writable.close();\n }\n\n async delete(path: string): Promise<void> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n const name = baseName(p);\n const dir = await resolveDir(this.root, parent);\n if (!dir) return;\n await dir.removeEntry(name, { recursive: true });\n }\n\n async rename(oldPath: string, newPath: string): Promise<void> {\n const op = normalisePath(oldPath);\n const np = normalisePath(newPath);\n if (op === np) return;\n if (!op || !np) {\n throw new Error('Cannot rename the filesystem root');\n }\n if (np.startsWith(op + '/')) {\n throw new Error('Cannot move a directory into itself');\n }\n\n // The File System Access API doesn't have a native rename.\n // Copy → delete.\n const oldParent = await resolveDir(this.root, parentDir(op));\n if (!oldParent) return;\n\n try {\n const fileHandle = await oldParent.getFileHandle(baseName(op));\n const file = await fileHandle.getFile();\n await this.writeBinary(np, await file.arrayBuffer());\n await this.delete(op);\n return;\n } catch {\n // Not a file; try directory below.\n }\n\n const copied = await this.copyDirectory(op, np);\n if (copied) {\n await this.delete(op);\n }\n }\n\n async readDirectory(path: string): Promise<FileSystemEntry[]> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, p);\n if (!dir) return [];\n\n const entries: FileSystemEntry[] = [];\n for await (const [name, handle] of dir as unknown as AsyncIterable<\n [string, FileSystemHandle]\n >) {\n const entryPath = p ? `${p}/${name}` : name;\n if (handle.kind === 'directory') {\n entries.push({ kind: 'directory', name, path: entryPath });\n } else {\n entries.push({ kind: 'file', name, path: entryPath });\n }\n }\n\n // Sort: directories first, then alphabetical\n entries.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n const name = baseName(p);\n const dir = await resolveDir(this.root, parent);\n if (!dir) return false;\n\n try {\n await dir.getFileHandle(name);\n return true;\n } catch {\n try {\n await dir.getDirectoryHandle(name);\n return true;\n } catch {\n return false;\n }\n }\n }\n\n async createDirectory(path: string): Promise<void> {\n const p = normalisePath(path);\n await resolveDirCreate(this.root, p);\n }\n\n async stat(path: string): Promise<FileMeta | null> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, parentDir(p));\n if (!dir) return null;\n\n try {\n const fileHandle = await dir.getFileHandle(baseName(p));\n const file = await fileHandle.getFile();\n return {\n name: file.name,\n path: p,\n size: file.size,\n lastModified: new Date(file.lastModified).toISOString(),\n };\n } catch {\n return null;\n }\n }\n\n async readBinary(path: string): Promise<ArrayBuffer | null> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, parentDir(p));\n if (!dir) return null;\n try {\n const fileHandle = await dir.getFileHandle(baseName(p));\n const file = await fileHandle.getFile();\n return file.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n async writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {\n const p = normalisePath(path);\n const dir = await resolveDirCreate(this.root, parentDir(p));\n const fileHandle = await dir.getFileHandle(baseName(p), { create: true });\n const writable = await fileHandle.createWritable();\n await writable.write(toWritableBinary(data));\n await writable.close();\n }\n}\n\n/**\n * Prompt the user to pick a local folder and return a NativeFileSystemProvider.\n * The directory handle is persisted in IndexedDB so it can be restored later.\n * Throws if the user cancels or the API is unsupported.\n */\nexport async function openNativeFolder(): Promise<NativeFileSystemProvider> {\n if (!isNativeFileSystemSupported()) {\n throw new Error('File System Access API is not supported in this browser');\n }\n\n const handle = await (\n globalThis as unknown as { showDirectoryPicker: () => Promise<FileSystemDirectoryHandle> }\n ).showDirectoryPicker();\n const id = `native-${handle.name}-${Date.now()}`;\n await storeDirectoryHandle(id, handle);\n return new NativeFileSystemProvider(id, handle);\n}\n\n/**\n * Restore a previously opened native folder from a persisted handle.\n * Re-requests read/write permission (browser will show a prompt).\n * Returns null if the handle is not found or permission is denied.\n */\nexport async function restoreNativeFolder(\n workspaceId: string,\n): Promise<NativeFileSystemProvider | null> {\n const handle = await loadDirectoryHandle(workspaceId);\n if (!handle) return null;\n\n // Verify/request permission\n const opts = { mode: 'readwrite' as const };\n const h = handle as FileSystemDirectoryHandle & {\n queryPermission(desc: { mode: string }): Promise<string>;\n requestPermission(desc: { mode: string }): Promise<string>;\n };\n if ((await h.queryPermission(opts)) === 'granted') {\n return new NativeFileSystemProvider(workspaceId, handle);\n }\n if ((await h.requestPermission(opts)) === 'granted') {\n return new NativeFileSystemProvider(workspaceId, handle);\n }\n\n return null;\n}\n","/**\n * ElectronFileSystemProvider — implements FileSystemProvider by delegating\n * to the Electron desktop host's fs IPC bridge. Every operation is scoped\n * to an absolute root path that the main process validates against a\n * whitelist of registered workspace roots.\n *\n * This file has no Electron dependency — it is a pure IPC client that\n * relies on the `docBlocksHost` global installed by the preload script.\n */\n\nimport type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';\nimport { maybeGetDocBlocksHost } from '../host/index.js';\nimport type { DocBlocksHostFsAPI } from '../host/types.js';\n\nexport { isElectronHost } from '../host/index.js';\n\nfunction getHostFs(): DocBlocksHostFsAPI {\n const host = maybeGetDocBlocksHost();\n if (!host) {\n throw new Error(\n 'ElectronFileSystemProvider: docBlocksHost is not available — not running under Electron?',\n );\n }\n return host.fs;\n}\n\nexport class ElectronFileSystemProvider implements FileSystemProvider {\n readonly id: string;\n readonly label: string;\n\n private readonly rootPath: string;\n\n constructor(id: string, label: string, rootPath: string) {\n this.id = id;\n this.label = label;\n this.rootPath = rootPath;\n }\n\n /** Absolute path this provider is rooted at. */\n getRootPath(): string {\n return this.rootPath;\n }\n\n readFile(path: string): Promise<string | null> {\n return getHostFs().readFile(this.rootPath, path);\n }\n\n writeFile(path: string, content: string): Promise<void> {\n return getHostFs().writeFile(this.rootPath, path, content);\n }\n\n delete(path: string): Promise<void> {\n return getHostFs().delete(this.rootPath, path);\n }\n\n rename(oldPath: string, newPath: string): Promise<void> {\n return getHostFs().rename(this.rootPath, oldPath, newPath);\n }\n\n readDirectory(path: string): Promise<FileSystemEntry[]> {\n return getHostFs().readDirectory(this.rootPath, path);\n }\n\n exists(path: string): Promise<boolean> {\n return getHostFs().exists(this.rootPath, path);\n }\n\n createDirectory(path: string): Promise<void> {\n return getHostFs().createDirectory(this.rootPath, path);\n }\n\n stat(path: string): Promise<FileMeta | null> {\n return getHostFs().stat(this.rootPath, path);\n }\n\n readBinary(path: string): Promise<ArrayBuffer | null> {\n return getHostFs().readBinary(this.rootPath, path);\n }\n\n writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {\n return getHostFs().writeBinary(this.rootPath, path, data);\n }\n\n /** Subscribe to external change notifications under this root. */\n watch(onChange: (changedPath: string) => void): () => void {\n return getHostFs().watch(this.rootPath, onChange);\n }\n}\n"],"mappings":"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","names":["newParent","meta","findDocumentPath","EXTENSION_MIME_MAP","guessMimeType","normalisePath","parentDir","baseName"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-provider.d.ts","sourceRoot":"","sources":["../../src/filesystem/native-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIhF,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAkBD,uEAAuE;AACvE,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,sEAAsE;AACtE,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAc3C;AAED,+DAA+D;AAC/D,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E;
|
|
1
|
+
{"version":3,"file":"native-provider.d.ts","sourceRoot":"","sources":["../../src/filesystem/native-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIhF,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAkBD,uEAAuE;AACvE,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,sEAAsE;AACtE,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAc3C;AAED,+DAA+D;AAC/D,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E;AAgED,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,IAAI,CAA4B;gBAE5B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB;YAMzC,aAAa;IAsBrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAa9C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCvD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA0BvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBtC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAmB5C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAarD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ/E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAW1E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAkB1C"}
|
|
@@ -114,6 +114,13 @@ function baseName(p) {
|
|
|
114
114
|
const idx = p.lastIndexOf('/');
|
|
115
115
|
return idx === -1 ? p : p.slice(idx + 1);
|
|
116
116
|
}
|
|
117
|
+
function toWritableBinary(data) {
|
|
118
|
+
if (data instanceof ArrayBuffer)
|
|
119
|
+
return data;
|
|
120
|
+
const copy = new Uint8Array(data.byteLength);
|
|
121
|
+
copy.set(data);
|
|
122
|
+
return copy.buffer;
|
|
123
|
+
}
|
|
117
124
|
// ── Implementation ─────────────────────────────────────────────────
|
|
118
125
|
export class NativeFileSystemProvider {
|
|
119
126
|
constructor(id, root) {
|
|
@@ -288,12 +295,7 @@ export class NativeFileSystemProvider {
|
|
|
288
295
|
const dir = await resolveDirCreate(this.root, parentDir(p));
|
|
289
296
|
const fileHandle = await dir.getFileHandle(baseName(p), { create: true });
|
|
290
297
|
const writable = await fileHandle.createWritable();
|
|
291
|
-
|
|
292
|
-
await writable.write(data);
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
await writable.write(data.buffer);
|
|
296
|
-
}
|
|
298
|
+
await writable.write(toWritableBinary(data));
|
|
297
299
|
await writable.close();
|
|
298
300
|
}
|
|
299
301
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-provider.js","sourceRoot":"","sources":["../../src/filesystem/native-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,sEAAsE;AAEtE,MAAM,UAAU,2BAA2B;IACzC,OAAO,OAAO,UAAU,KAAK,WAAW,IAAI,qBAAqB,IAAI,UAAU,CAAC;AAClF,CAAC;AAED,sEAAsE;AAEtE,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAC3C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C,SAAS,YAAY;IACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,eAAe,GAAG,GAAG,EAAE;YACzB,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC;QACF,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,MAAiC;IAEjC,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAC1D,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3D,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;YAChB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/D,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC;QACF,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;YACjB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAC1D,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtD,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;YAChB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AAEtE,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CACvB,IAA+B,EAC/B,OAAe;IAEf,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,IAA+B,EAC/B,OAAe;IAEf,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,sEAAsE;AAEtE,MAAM,OAAO,wBAAwB;IAMnC,YAAY,EAAU,EAAE,IAA+B;QACrD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,UAAkB,EAAE,UAAkB;QAChE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAE9C,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAElC,EAAE,CAAC;YACF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAe;QAC3C,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;QACnD,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,OAAe;QAC3C,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO;QACtB,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,2DAA2D;QAC3D,iBAAiB;QACjB,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAElC,EAAE,CAAC;YACF,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,YAAY,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;aACxD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAA8B;QAC5D,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;QACnD,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;YAChC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAqB,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,MACb,UACD,CAAC,mBAAmB,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,UAAU,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACjD,MAAM,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,IAAI,wBAAwB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,4BAA4B;IAC5B,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,WAAoB,EAAE,CAAC;IAC5C,MAAM,CAAC,GAAG,MAGT,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAClD,OAAO,IAAI,wBAAwB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACpD,OAAO,IAAI,wBAAwB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"native-provider.js","sourceRoot":"","sources":["../../src/filesystem/native-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/host/types.d.ts
CHANGED
|
@@ -114,12 +114,12 @@ export type UpdaterStatus = {
|
|
|
114
114
|
};
|
|
115
115
|
/** Menu-command events pushed from the main process to the renderer. */
|
|
116
116
|
export type MenuCommand = 'file:new' | 'file:openFolder' | 'file:revealWorkspace' | 'file:settings' | 'help:about' | 'help:checkForUpdates' | 'help:viewOnGitHub';
|
|
117
|
-
/** Deep-link event
|
|
117
|
+
/** Deep-link event resolved by the host into a trusted workspace file. */
|
|
118
118
|
export interface OpenRequest {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
|
|
119
|
+
kind: 'workspace-file';
|
|
120
|
+
workspaceId: string;
|
|
121
|
+
/** Slash-prefixed path relative to the workspace root. */
|
|
122
|
+
path: string;
|
|
123
123
|
}
|
|
124
124
|
/** Environment metadata provided by the host. */
|
|
125
125
|
export interface HostEnvironment {
|
package/dist/host/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/host/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/host/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAExE,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC/D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACxE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACvE;AAED,kFAAkF;AAClF,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7C;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IACpD;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,qDAAqD;IACrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,yCAAyC;IACzC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,qEAAqE;IACrE,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClC;;;;OAIG;IACH,WAAW,CACT,oBAAoB,EAAE,MAAM,EAC5B,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;KAAE,GAC/D,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAED,4BAA4B;AAC5B,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,kCAAkC;IAClC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACjE;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,wEAAwE;AACxE,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,iBAAiB,GACjB,sBAAsB,GACtB,eAAe,GACf,YAAY,GACZ,sBAAsB,GACtB,mBAAmB,CAAC;AAExB,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,eAAe,CAAC;IACrB,EAAE,EAAE,kBAAkB,CAAC;IACvB,UAAU,EAAE,0BAA0B,CAAC;IACvC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,OAAO,EAAE,uBAAuB,CAAC;IACjC;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChE;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACrE"}
|
|
@@ -164,12 +164,12 @@ type UpdaterStatus = {
|
|
|
164
164
|
};
|
|
165
165
|
/** Menu-command events pushed from the main process to the renderer. */
|
|
166
166
|
type MenuCommand = 'file:new' | 'file:openFolder' | 'file:revealWorkspace' | 'file:settings' | 'help:about' | 'help:checkForUpdates' | 'help:viewOnGitHub';
|
|
167
|
-
/** Deep-link event
|
|
167
|
+
/** Deep-link event resolved by the host into a trusted workspace file. */
|
|
168
168
|
interface OpenRequest {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
|
|
169
|
+
kind: 'workspace-file';
|
|
170
|
+
workspaceId: string;
|
|
171
|
+
/** Slash-prefixed path relative to the workspace root. */
|
|
172
|
+
path: string;
|
|
173
173
|
}
|
|
174
174
|
/** Environment metadata provided by the host. */
|
|
175
175
|
interface HostEnvironment {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bendyline/docblocks",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Core data structures and filesystem abstractions for DocBlocks",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Bendyline",
|
|
@@ -54,6 +54,6 @@
|
|
|
54
54
|
"typecheck": "tsc --noEmit"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@bendyline/squisq": "1.
|
|
57
|
+
"@bendyline/squisq": "1.5.1"
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -139,6 +139,13 @@ function baseName(p: string): string {
|
|
|
139
139
|
return idx === -1 ? p : p.slice(idx + 1);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
function toWritableBinary(data: ArrayBuffer | Uint8Array): ArrayBuffer {
|
|
143
|
+
if (data instanceof ArrayBuffer) return data;
|
|
144
|
+
const copy = new Uint8Array(data.byteLength);
|
|
145
|
+
copy.set(data);
|
|
146
|
+
return copy.buffer;
|
|
147
|
+
}
|
|
148
|
+
|
|
142
149
|
// ── Implementation ─────────────────────────────────────────────────
|
|
143
150
|
|
|
144
151
|
export class NativeFileSystemProvider implements FileSystemProvider {
|
|
@@ -326,11 +333,7 @@ export class NativeFileSystemProvider implements FileSystemProvider {
|
|
|
326
333
|
const dir = await resolveDirCreate(this.root, parentDir(p));
|
|
327
334
|
const fileHandle = await dir.getFileHandle(baseName(p), { create: true });
|
|
328
335
|
const writable = await fileHandle.createWritable();
|
|
329
|
-
|
|
330
|
-
await writable.write(data);
|
|
331
|
-
} else {
|
|
332
|
-
await writable.write(data.buffer as ArrayBuffer);
|
|
333
|
-
}
|
|
336
|
+
await writable.write(toWritableBinary(data));
|
|
334
337
|
await writable.close();
|
|
335
338
|
}
|
|
336
339
|
}
|
package/src/host/types.ts
CHANGED
|
@@ -117,12 +117,12 @@ export type MenuCommand =
|
|
|
117
117
|
| 'help:checkForUpdates'
|
|
118
118
|
| 'help:viewOnGitHub';
|
|
119
119
|
|
|
120
|
-
/** Deep-link event
|
|
120
|
+
/** Deep-link event resolved by the host into a trusted workspace file. */
|
|
121
121
|
export interface OpenRequest {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
|
|
122
|
+
kind: 'workspace-file';
|
|
123
|
+
workspaceId: string;
|
|
124
|
+
/** Slash-prefixed path relative to the workspace root. */
|
|
125
|
+
path: string;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
/** Environment metadata provided by the host. */
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filesystem/indexeddb-provider.ts","../src/filesystem/indexeddb-content-container.ts","../src/filesystem/filesystem-content-container.ts","../src/filesystem/file-media-provider.ts","../src/filesystem/native-provider.ts","../src/filesystem/electron-provider.ts"],"sourcesContent":["/**\n * IndexedDBFileSystemProvider — virtualises a filesystem on top of IndexedDB\n * using the LocalForageAdapter from @bendyline/squisq/storage.\n *\n * Key schema:\n * fs:{path}:content → string (text file contents)\n * fs:{path}:binary → ArrayBuffer (binary file contents)\n * fs:{path}:meta → FileMeta object\n * fs:dirs → Set<string> of known directory paths\n */\n\nimport { LocalForageAdapter } from '@bendyline/squisq/storage';\nimport type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';\n\n// ── Helpers ────────────────────────────────────────────────────────\n\n/** Normalise a path: strip leading/trailing slashes, collapse doubles. */\nfunction normalisePath(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/^\\//, '').replace(/\\/$/, '');\n}\n\n/** Get the parent directory of a path, or empty string for root-level. */\nfunction parentDir(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? '' : p.slice(0, idx);\n}\n\n/** Get the filename component of a path. */\nfunction baseName(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? p : p.slice(idx + 1);\n}\n\n// ── Key helpers ────────────────────────────────────────────────────\n\nfunction contentKey(path: string): string {\n return `fs:${path}:content`;\n}\n\nfunction binaryKey(path: string): string {\n return `fs:${path}:binary`;\n}\n\nfunction metaKey(path: string): string {\n return `fs:${path}:meta`;\n}\n\nconst DIRS_KEY = 'fs:dirs';\n\n// ── Implementation ─────────────────────────────────────────────────\n\nexport class IndexedDBFileSystemProvider implements FileSystemProvider {\n readonly id: string;\n readonly label: string;\n\n private store: LocalForageAdapter;\n\n constructor(id: string, label: string) {\n this.id = id;\n this.label = label;\n this.store = new LocalForageAdapter({\n name: `docblocks-fs-${id}`,\n storeName: 'files',\n });\n }\n\n // ── Directory tracking ──────────────────────────────────────────\n\n private async getDirs(): Promise<Set<string>> {\n const raw = await this.store.get<string[]>(DIRS_KEY);\n return new Set(raw ?? []);\n }\n\n private async saveDirs(dirs: Set<string>): Promise<void> {\n await this.store.set(DIRS_KEY, [...dirs]);\n }\n\n /** Ensure a directory (and all ancestors) are tracked. */\n private async ensureDir(dirPath: string): Promise<void> {\n if (!dirPath) return;\n const dirs = await this.getDirs();\n const parts = dirPath.split('/');\n let current = '';\n let changed = false;\n for (const part of parts) {\n current = current ? `${current}/${part}` : part;\n if (!dirs.has(current)) {\n dirs.add(current);\n changed = true;\n }\n }\n if (changed) {\n await this.saveDirs(dirs);\n }\n }\n\n // ── FileSystemProvider implementation ───────────────────────────\n\n async readFile(path: string): Promise<string | null> {\n const p = normalisePath(path);\n return this.store.get<string>(contentKey(p));\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n if (parent) {\n await this.ensureDir(parent);\n }\n\n const meta: FileMeta = {\n name: baseName(p),\n path: p,\n size: new Blob([content]).size,\n lastModified: new Date().toISOString(),\n };\n\n await this.store.set(contentKey(p), content);\n await this.store.set(metaKey(p), meta);\n }\n\n async delete(path: string): Promise<void> {\n const p = normalisePath(path);\n\n // Remove file keys\n await this.store.remove(contentKey(p));\n await this.store.remove(binaryKey(p));\n await this.store.remove(metaKey(p));\n\n // If it was a directory, remove it and all children\n const dirs = await this.getDirs();\n if (dirs.has(p)) {\n const prefix = p + '/';\n const toRemove: string[] = [p];\n for (const d of dirs) {\n if (d.startsWith(prefix)) {\n toRemove.push(d);\n }\n }\n for (const d of toRemove) {\n dirs.delete(d);\n }\n await this.saveDirs(dirs);\n\n // Remove all file keys under this directory\n const allKeys = await this.store.keys();\n const filePrefix = `fs:${p}/`;\n const keysToRemove = allKeys.filter((k) => k.startsWith(filePrefix));\n await Promise.all(keysToRemove.map((k) => this.store.remove(k)));\n }\n }\n\n async rename(oldPath: string, newPath: string): Promise<void> {\n const op = normalisePath(oldPath);\n const np = normalisePath(newPath);\n if (op === np) return;\n if (!op || !np) {\n throw new Error('Cannot rename the filesystem root');\n }\n if (np.startsWith(op + '/')) {\n throw new Error('Cannot move a directory into itself');\n }\n\n const dirs = await this.getDirs();\n\n // Handle directory rename by moving every tracked child directory and\n // every file record keyed under the old directory prefix.\n if (dirs.has(op)) {\n const newParent = parentDir(np);\n if (newParent) {\n await this.ensureDir(newParent);\n }\n\n const allKeys = await this.store.keys();\n const oldKeyPrefix = `fs:${op}/`;\n const newKeyPrefix = `fs:${np}/`;\n const metaSuffix = ':meta';\n const keysToMove = allKeys.filter((k) => k.startsWith(oldKeyPrefix));\n\n await Promise.all(\n keysToMove.map(async (oldKey) => {\n const newKey = newKeyPrefix + oldKey.slice(oldKeyPrefix.length);\n if (oldKey.endsWith(metaSuffix)) {\n const meta = await this.store.get<FileMeta>(oldKey);\n if (meta) {\n const newFilePath = newKey.slice(3, -metaSuffix.length);\n await this.store.set(metaKey(newFilePath), {\n ...meta,\n name: baseName(newFilePath),\n path: newFilePath,\n });\n }\n } else {\n const value = await this.store.get<unknown>(oldKey);\n if (value !== null) {\n await this.store.set(newKey, value);\n }\n }\n await this.store.remove(oldKey);\n }),\n );\n\n dirs.delete(op);\n dirs.add(np);\n const oldPrefix = op + '/';\n const newPrefix = np + '/';\n for (const d of [...dirs]) {\n if (d.startsWith(oldPrefix)) {\n dirs.delete(d);\n dirs.add(newPrefix + d.slice(oldPrefix.length));\n }\n }\n await this.saveDirs(dirs);\n return;\n }\n\n // Read existing data\n const content = await this.store.get<string>(contentKey(op));\n const binary = await this.store.get<ArrayBuffer>(binaryKey(op));\n const meta = await this.store.get<FileMeta>(metaKey(op));\n\n // Write to new location\n if (content !== null) {\n await this.store.set(contentKey(np), content);\n }\n if (binary !== null) {\n await this.store.set(binaryKey(np), binary);\n }\n if (meta) {\n await this.store.set(metaKey(np), {\n ...meta,\n name: baseName(np),\n path: np,\n });\n }\n\n // Ensure parent dir of new path exists\n const newParent = parentDir(np);\n if (newParent) {\n await this.ensureDir(newParent);\n }\n\n // Delete old\n await this.store.remove(contentKey(op));\n await this.store.remove(binaryKey(op));\n await this.store.remove(metaKey(op));\n }\n\n async readDirectory(path: string): Promise<FileSystemEntry[]> {\n const p = normalisePath(path);\n const dirs = await this.getDirs();\n const entries: FileSystemEntry[] = [];\n const seen = new Set<string>();\n\n // Find child directories\n const prefix = p ? p + '/' : '';\n for (const d of dirs) {\n if (!p && !d.includes('/')) {\n // Root-level directory\n if (!seen.has(d)) {\n seen.add(d);\n entries.push({ kind: 'directory', name: d, path: d });\n }\n } else if (p && d.startsWith(prefix)) {\n const rest = d.slice(prefix.length);\n if (!rest.includes('/')) {\n // Direct child directory\n if (!seen.has(rest)) {\n seen.add(rest);\n entries.push({ kind: 'directory', name: rest, path: d });\n }\n }\n }\n }\n\n // Find child files by scanning meta keys\n const allKeys = await this.store.keys();\n const metaPrefix = p ? `fs:${p}/` : 'fs:';\n const metaSuffix = ':meta';\n\n for (const key of allKeys) {\n if (!key.startsWith(metaPrefix) || !key.endsWith(metaSuffix)) continue;\n\n const filePath = key.slice(3, -metaSuffix.length); // strip \"fs:\" and \":meta\"\n const rel = p ? filePath.slice(prefix.length) : filePath;\n\n // Only direct children (no further slashes)\n if (rel.includes('/')) continue;\n\n if (!seen.has(rel)) {\n seen.add(rel);\n entries.push({ kind: 'file', name: rel, path: filePath });\n }\n }\n\n // Sort: directories first, then alphabetical\n entries.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n const p = normalisePath(path);\n const dirs = await this.getDirs();\n if (dirs.has(p)) return true;\n const meta = await this.store.get(metaKey(p));\n return meta !== null;\n }\n\n async createDirectory(path: string): Promise<void> {\n const p = normalisePath(path);\n await this.ensureDir(p);\n }\n\n async stat(path: string): Promise<FileMeta | null> {\n const p = normalisePath(path);\n return this.store.get<FileMeta>(metaKey(p));\n }\n\n async readBinary(path: string): Promise<ArrayBuffer | null> {\n const p = normalisePath(path);\n return this.store.get<ArrayBuffer>(binaryKey(p));\n }\n\n async writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n if (parent) {\n await this.ensureDir(parent);\n }\n\n const meta: FileMeta = {\n name: baseName(p),\n path: p,\n size: data.byteLength,\n lastModified: new Date().toISOString(),\n };\n\n await this.store.set(binaryKey(p), data);\n await this.store.set(metaKey(p), meta);\n }\n}\n","/**\n * IndexedDBContentContainer — a ContentContainer backed by IndexedDB.\n *\n * Uses a dedicated IndexedDBFileSystemProvider instance (separate store)\n * to persist media files across page refreshes.\n */\n\nimport type { ContentContainer, ContentEntry } from '@bendyline/squisq/storage';\nimport { findDocumentPath } from '@bendyline/squisq/storage';\nimport { IndexedDBFileSystemProvider } from './indexeddb-provider.js';\n\n// ── MIME type guessing ─────────────────────────────────────────────\n\nconst EXTENSION_MIME_MAP: Record<string, string> = {\n '.md': 'text/markdown',\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n};\n\nfunction guessMimeType(path: string): string {\n const dot = path.lastIndexOf('.');\n if (dot === -1) return 'application/octet-stream';\n const ext = path.slice(dot).toLowerCase();\n return EXTENSION_MIME_MAP[ext] ?? 'application/octet-stream';\n}\n\n// ── Implementation ─────────────────────────────────────────────────\n\nexport class IndexedDBContentContainer implements ContentContainer {\n private provider: IndexedDBFileSystemProvider;\n\n constructor(workspaceId: string) {\n this.provider = new IndexedDBFileSystemProvider(`${workspaceId}-media`, 'Media Storage');\n }\n\n async readFile(path: string): Promise<ArrayBuffer | null> {\n return this.provider.readBinary(path);\n }\n\n async writeFile(path: string, data: ArrayBuffer | Uint8Array, _mimeType?: string): Promise<void> {\n await this.provider.writeBinary(path, data);\n }\n\n async removeFile(path: string): Promise<void> {\n await this.provider.delete(path);\n }\n\n async listFiles(prefix?: string): Promise<ContentEntry[]> {\n const entries: ContentEntry[] = [];\n const walk = async (dir: string) => {\n const children = await this.provider.readDirectory(dir);\n for (const child of children) {\n if (child.kind === 'directory') {\n await walk(child.path);\n } else {\n const filePath = child.path.replace(/^\\//, '');\n if (prefix && !filePath.startsWith(prefix)) continue;\n const meta = await this.provider.stat(child.path);\n entries.push({\n path: filePath,\n mimeType: guessMimeType(filePath),\n size: meta?.size ?? 0,\n });\n }\n }\n };\n await walk('/');\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n return this.provider.exists(path);\n }\n\n async getDocumentPath(): Promise<string | null> {\n return findDocumentPath(await this.listFiles());\n }\n\n async readDocument(): Promise<string | null> {\n const docPath = await this.getDocumentPath();\n if (!docPath) return null;\n const data = await this.readFile(docPath);\n if (!data) return null;\n return new TextDecoder().decode(data);\n }\n\n async writeDocument(markdown: string, filename?: string): Promise<void> {\n const name = filename ?? 'index.md';\n const data = new TextEncoder().encode(markdown);\n await this.writeFile(name, data, 'text/markdown');\n }\n}\n","/**\n * FileSystemContentContainer — a ContentContainer backed by any\n * FileSystemProvider, scoped to a sub-path (e.g., \".docblocks/media/\").\n *\n * Used by the Electron desktop app so media lives inside the workspace\n * folder (visible as regular files) rather than in a separate IndexedDB\n * origin that only the app can see.\n */\n\nimport type { ContentContainer, ContentEntry } from '@bendyline/squisq/storage';\nimport { findDocumentPath } from '@bendyline/squisq/storage';\nimport type { FileSystemProvider } from './types.js';\n\nconst EXTENSION_MIME_MAP: Record<string, string> = {\n '.md': 'text/markdown',\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n};\n\nfunction guessMimeType(path: string): string {\n const dot = path.lastIndexOf('.');\n if (dot === -1) return 'application/octet-stream';\n const ext = path.slice(dot).toLowerCase();\n return EXTENSION_MIME_MAP[ext] ?? 'application/octet-stream';\n}\n\nfunction joinPrefix(prefix: string, p: string): string {\n const clean = p.replace(/^\\/+/, '');\n return prefix.replace(/\\/+$/, '') + '/' + clean;\n}\n\nexport class FileSystemContentContainer implements ContentContainer {\n private readonly prefix: string;\n\n constructor(\n private readonly provider: FileSystemProvider,\n prefix = '.docblocks/media',\n ) {\n this.prefix = prefix.replace(/^\\/+/, '').replace(/\\/+$/, '');\n }\n\n async readFile(path: string): Promise<ArrayBuffer | null> {\n const full = joinPrefix(this.prefix, path);\n const binary = await this.provider.readBinary(full);\n if (binary) return binary;\n // IndexedDB-backed workspaces store text via `writeFile(string)` and\n // binary via `writeBinary(ArrayBuffer)` under separate keys, so a\n // markdown file written through the text API is invisible to\n // `readBinary`. Fall back to text-then-UTF-8 so consumers like the\n // recursive HTML export can resolve sibling `.md` links uniformly\n // across browser and native workspaces.\n const text = await this.provider.readFile(full);\n if (text === null) return null;\n return new TextEncoder().encode(text).buffer as ArrayBuffer;\n }\n\n async writeFile(path: string, data: ArrayBuffer | Uint8Array, _mimeType?: string): Promise<void> {\n await this.provider.writeBinary(joinPrefix(this.prefix, path), data);\n }\n\n async removeFile(path: string): Promise<void> {\n await this.provider.delete(joinPrefix(this.prefix, path));\n }\n\n async listFiles(prefix?: string): Promise<ContentEntry[]> {\n const entries: ContentEntry[] = [];\n const walk = async (dir: string) => {\n let children;\n try {\n children = await this.provider.readDirectory(dir);\n } catch {\n return;\n }\n for (const child of children) {\n if (child.kind === 'directory') {\n await walk(child.path);\n } else {\n const rel = child.path.replace(new RegExp('^/?' + this.prefix + '/?'), '');\n if (prefix && !rel.startsWith(prefix)) continue;\n const meta = await this.provider.stat(child.path);\n entries.push({\n path: rel,\n mimeType: guessMimeType(rel),\n size: meta?.size ?? 0,\n });\n }\n }\n };\n await walk('/' + this.prefix);\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n return this.provider.exists(joinPrefix(this.prefix, path));\n }\n\n async getDocumentPath(): Promise<string | null> {\n return findDocumentPath(await this.listFiles());\n }\n\n async readDocument(): Promise<string | null> {\n const docPath = await this.getDocumentPath();\n if (!docPath) return null;\n const data = await this.readFile(docPath);\n if (!data) return null;\n return new TextDecoder().decode(data);\n }\n\n async writeDocument(markdown: string, filename?: string): Promise<void> {\n const name = filename ?? 'index.md';\n const data = new TextEncoder().encode(markdown);\n await this.writeFile(name, data, 'text/markdown');\n }\n}\n","/**\n * createFileMediaProvider — per-file media storage following the pandoc /\n * Word convention: a markdown file `notes.md` gets a sibling folder\n * `notes_files/` that holds its images, audio, and video.\n *\n * Given:\n * • `container` — a ContentContainer scoped to the markdown file's\n * parent directory (so `readFile('notes_files/image.png')` maps to the\n * parent-relative path)\n * • `markdownBasename` — e.g. `\"notes.md\"`\n *\n * Returns a MediaProvider that:\n * • Writes new media under `{basename}_files/{name}` in the parent dir\n * • Returns the folder-qualified path (`notes_files/image.png`) from\n * addMedia so the markdown stays portable outside DocBlocks\n * • Resolves both bare (`image.png`) and folder-qualified\n * (`notes_files/image.png`) references — so legacy markdown and\n * exports from other tools both work\n */\n\nimport type { MediaProvider, MediaEntry } from '@bendyline/squisq/schemas';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\n\nfunction stripExt(name: string): string {\n return name.replace(/\\.[^.]+$/, '');\n}\n\nexport function createFileMediaProvider(\n container: ContentContainer,\n markdownBasename: string,\n): MediaProvider {\n const folder = stripExt(markdownBasename) + '_files';\n const prefix = folder + '/';\n const blobUrlCache = new Map<string, string>();\n\n function toKey(ref: string): string {\n const clean = ref.replace(/^\\/+/, '');\n return clean.startsWith(prefix) ? clean : prefix + clean;\n }\n\n return {\n async resolveUrl(ref: string): Promise<string> {\n const key = toKey(ref);\n const cached = blobUrlCache.get(key);\n if (cached) return cached;\n\n const data = await container.readFile(key);\n if (!data) return ref;\n\n const entries = await container.listFiles();\n const entry = entries.find((e) => e.path === key);\n const mimeType = entry?.mimeType ?? 'application/octet-stream';\n\n const url = URL.createObjectURL(new Blob([data], { type: mimeType }));\n blobUrlCache.set(key, url);\n return url;\n },\n\n async listMedia(): Promise<MediaEntry[]> {\n const entries = await container.listFiles(prefix);\n return entries\n .filter((e) => !e.path.toLowerCase().endsWith('.md'))\n .map((e) => ({\n name: e.path,\n mimeType: e.mimeType,\n size: e.size,\n }));\n },\n\n async addMedia(\n name: string,\n data: ArrayBuffer | Blob | Uint8Array,\n mimeType: string,\n ): Promise<string> {\n const key = toKey(name);\n const cached = blobUrlCache.get(key);\n if (cached) {\n URL.revokeObjectURL(cached);\n blobUrlCache.delete(key);\n }\n const buffer = data instanceof Blob ? new Uint8Array(await data.arrayBuffer()) : data;\n await container.writeFile(key, buffer, mimeType);\n return key;\n },\n\n async removeMedia(ref: string): Promise<void> {\n const key = toKey(ref);\n const cached = blobUrlCache.get(key);\n if (cached) {\n URL.revokeObjectURL(cached);\n blobUrlCache.delete(key);\n }\n await container.removeFile(key);\n },\n\n dispose(): void {\n for (const url of blobUrlCache.values()) {\n URL.revokeObjectURL(url);\n }\n blobUrlCache.clear();\n },\n };\n}\n","/**\n * NativeFileSystemProvider — wraps the File System Access API\n * (window.showDirectoryPicker / FileSystemDirectoryHandle).\n *\n * Progressive enhancement: only available in browsers that support\n * the API (Chrome, Edge). Feature-detect with `isNativeFileSystemSupported()`.\n */\n\nimport type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';\n\n// ── Feature detection ──────────────────────────────────────────────\n\nexport function isNativeFileSystemSupported(): boolean {\n return typeof globalThis !== 'undefined' && 'showDirectoryPicker' in globalThis;\n}\n\n// ── Handle persistence (IndexedDB, structured clone) ───────────────\n\nconst HANDLE_DB_NAME = 'docblocks-handles';\nconst HANDLE_STORE_NAME = 'directory-handles';\n\nfunction openHandleDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(HANDLE_DB_NAME, 1);\n req.onupgradeneeded = () => {\n req.result.createObjectStore(HANDLE_STORE_NAME);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/** Persist a FileSystemDirectoryHandle so it survives page reloads. */\nexport async function storeDirectoryHandle(\n workspaceId: string,\n handle: FileSystemDirectoryHandle,\n): Promise<void> {\n const db = await openHandleDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(HANDLE_STORE_NAME, 'readwrite');\n tx.objectStore(HANDLE_STORE_NAME).put(handle, workspaceId);\n tx.oncomplete = () => {\n db.close();\n resolve();\n };\n tx.onerror = () => {\n db.close();\n reject(tx.error);\n };\n });\n}\n\n/** Retrieve a previously stored handle. Returns null if not found. */\nexport async function loadDirectoryHandle(\n workspaceId: string,\n): Promise<FileSystemDirectoryHandle | null> {\n const db = await openHandleDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(HANDLE_STORE_NAME, 'readonly');\n const req = tx.objectStore(HANDLE_STORE_NAME).get(workspaceId);\n req.onsuccess = () => {\n db.close();\n resolve(req.result ?? null);\n };\n req.onerror = () => {\n db.close();\n reject(req.error);\n };\n });\n}\n\n/** Remove a stored handle (e.g. when deleting a workspace). */\nexport async function removeDirectoryHandle(workspaceId: string): Promise<void> {\n const db = await openHandleDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(HANDLE_STORE_NAME, 'readwrite');\n tx.objectStore(HANDLE_STORE_NAME).delete(workspaceId);\n tx.oncomplete = () => {\n db.close();\n resolve();\n };\n tx.onerror = () => {\n db.close();\n reject(tx.error);\n };\n });\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction normalisePath(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/^\\//, '').replace(/\\/$/, '');\n}\n\n/**\n * Walk a chain of path segments to reach a FileSystemDirectoryHandle.\n * Returns null if any segment is missing.\n */\nasync function resolveDir(\n root: FileSystemDirectoryHandle,\n dirPath: string,\n): Promise<FileSystemDirectoryHandle | null> {\n if (!dirPath) return root;\n const parts = dirPath.split('/');\n let current = root;\n for (const part of parts) {\n try {\n current = await current.getDirectoryHandle(part);\n } catch {\n return null;\n }\n }\n return current;\n}\n\n/**\n * Walk path segments, creating directories as needed.\n */\nasync function resolveDirCreate(\n root: FileSystemDirectoryHandle,\n dirPath: string,\n): Promise<FileSystemDirectoryHandle> {\n if (!dirPath) return root;\n const parts = dirPath.split('/');\n let current = root;\n for (const part of parts) {\n current = await current.getDirectoryHandle(part, { create: true });\n }\n return current;\n}\n\nfunction parentDir(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? '' : p.slice(0, idx);\n}\n\nfunction baseName(p: string): string {\n const idx = p.lastIndexOf('/');\n return idx === -1 ? p : p.slice(idx + 1);\n}\n\n// ── Implementation ─────────────────────────────────────────────────\n\nexport class NativeFileSystemProvider implements FileSystemProvider {\n readonly id: string;\n readonly label: string;\n\n private root: FileSystemDirectoryHandle;\n\n constructor(id: string, root: FileSystemDirectoryHandle) {\n this.id = id;\n this.label = root.name;\n this.root = root;\n }\n\n private async copyDirectory(oldDirPath: string, newDirPath: string): Promise<boolean> {\n const source = await resolveDir(this.root, oldDirPath);\n if (!source) return false;\n await resolveDirCreate(this.root, newDirPath);\n\n for await (const [name, handle] of source as unknown as AsyncIterable<\n [string, FileSystemHandle]\n >) {\n const oldChild = oldDirPath ? `${oldDirPath}/${name}` : name;\n const newChild = newDirPath ? `${newDirPath}/${name}` : name;\n if (handle.kind === 'directory') {\n await this.copyDirectory(oldChild, newChild);\n } else {\n const fileHandle = await source.getFileHandle(name);\n const file = await fileHandle.getFile();\n await this.writeBinary(newChild, await file.arrayBuffer());\n }\n }\n\n return true;\n }\n\n async readFile(path: string): Promise<string | null> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, parentDir(p));\n if (!dir) return null;\n try {\n const fileHandle = await dir.getFileHandle(baseName(p));\n const file = await fileHandle.getFile();\n return file.text();\n } catch {\n return null;\n }\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const p = normalisePath(path);\n const dir = await resolveDirCreate(this.root, parentDir(p));\n const fileHandle = await dir.getFileHandle(baseName(p), { create: true });\n const writable = await fileHandle.createWritable();\n await writable.write(content);\n await writable.close();\n }\n\n async delete(path: string): Promise<void> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n const name = baseName(p);\n const dir = await resolveDir(this.root, parent);\n if (!dir) return;\n await dir.removeEntry(name, { recursive: true });\n }\n\n async rename(oldPath: string, newPath: string): Promise<void> {\n const op = normalisePath(oldPath);\n const np = normalisePath(newPath);\n if (op === np) return;\n if (!op || !np) {\n throw new Error('Cannot rename the filesystem root');\n }\n if (np.startsWith(op + '/')) {\n throw new Error('Cannot move a directory into itself');\n }\n\n // The File System Access API doesn't have a native rename.\n // Copy → delete.\n const oldParent = await resolveDir(this.root, parentDir(op));\n if (!oldParent) return;\n\n try {\n const fileHandle = await oldParent.getFileHandle(baseName(op));\n const file = await fileHandle.getFile();\n await this.writeBinary(np, await file.arrayBuffer());\n await this.delete(op);\n return;\n } catch {\n // Not a file; try directory below.\n }\n\n const copied = await this.copyDirectory(op, np);\n if (copied) {\n await this.delete(op);\n }\n }\n\n async readDirectory(path: string): Promise<FileSystemEntry[]> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, p);\n if (!dir) return [];\n\n const entries: FileSystemEntry[] = [];\n for await (const [name, handle] of dir as unknown as AsyncIterable<\n [string, FileSystemHandle]\n >) {\n const entryPath = p ? `${p}/${name}` : name;\n if (handle.kind === 'directory') {\n entries.push({ kind: 'directory', name, path: entryPath });\n } else {\n entries.push({ kind: 'file', name, path: entryPath });\n }\n }\n\n // Sort: directories first, then alphabetical\n entries.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n return entries;\n }\n\n async exists(path: string): Promise<boolean> {\n const p = normalisePath(path);\n const parent = parentDir(p);\n const name = baseName(p);\n const dir = await resolveDir(this.root, parent);\n if (!dir) return false;\n\n try {\n await dir.getFileHandle(name);\n return true;\n } catch {\n try {\n await dir.getDirectoryHandle(name);\n return true;\n } catch {\n return false;\n }\n }\n }\n\n async createDirectory(path: string): Promise<void> {\n const p = normalisePath(path);\n await resolveDirCreate(this.root, p);\n }\n\n async stat(path: string): Promise<FileMeta | null> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, parentDir(p));\n if (!dir) return null;\n\n try {\n const fileHandle = await dir.getFileHandle(baseName(p));\n const file = await fileHandle.getFile();\n return {\n name: file.name,\n path: p,\n size: file.size,\n lastModified: new Date(file.lastModified).toISOString(),\n };\n } catch {\n return null;\n }\n }\n\n async readBinary(path: string): Promise<ArrayBuffer | null> {\n const p = normalisePath(path);\n const dir = await resolveDir(this.root, parentDir(p));\n if (!dir) return null;\n try {\n const fileHandle = await dir.getFileHandle(baseName(p));\n const file = await fileHandle.getFile();\n return file.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n async writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {\n const p = normalisePath(path);\n const dir = await resolveDirCreate(this.root, parentDir(p));\n const fileHandle = await dir.getFileHandle(baseName(p), { create: true });\n const writable = await fileHandle.createWritable();\n if (data instanceof ArrayBuffer) {\n await writable.write(data);\n } else {\n await writable.write(data.buffer as ArrayBuffer);\n }\n await writable.close();\n }\n}\n\n/**\n * Prompt the user to pick a local folder and return a NativeFileSystemProvider.\n * The directory handle is persisted in IndexedDB so it can be restored later.\n * Throws if the user cancels or the API is unsupported.\n */\nexport async function openNativeFolder(): Promise<NativeFileSystemProvider> {\n if (!isNativeFileSystemSupported()) {\n throw new Error('File System Access API is not supported in this browser');\n }\n\n const handle = await (\n globalThis as unknown as { showDirectoryPicker: () => Promise<FileSystemDirectoryHandle> }\n ).showDirectoryPicker();\n const id = `native-${handle.name}-${Date.now()}`;\n await storeDirectoryHandle(id, handle);\n return new NativeFileSystemProvider(id, handle);\n}\n\n/**\n * Restore a previously opened native folder from a persisted handle.\n * Re-requests read/write permission (browser will show a prompt).\n * Returns null if the handle is not found or permission is denied.\n */\nexport async function restoreNativeFolder(\n workspaceId: string,\n): Promise<NativeFileSystemProvider | null> {\n const handle = await loadDirectoryHandle(workspaceId);\n if (!handle) return null;\n\n // Verify/request permission\n const opts = { mode: 'readwrite' as const };\n const h = handle as FileSystemDirectoryHandle & {\n queryPermission(desc: { mode: string }): Promise<string>;\n requestPermission(desc: { mode: string }): Promise<string>;\n };\n if ((await h.queryPermission(opts)) === 'granted') {\n return new NativeFileSystemProvider(workspaceId, handle);\n }\n if ((await h.requestPermission(opts)) === 'granted') {\n return new NativeFileSystemProvider(workspaceId, handle);\n }\n\n return null;\n}\n","/**\n * ElectronFileSystemProvider — implements FileSystemProvider by delegating\n * to the Electron desktop host's fs IPC bridge. Every operation is scoped\n * to an absolute root path that the main process validates against a\n * whitelist of registered workspace roots.\n *\n * This file has no Electron dependency — it is a pure IPC client that\n * relies on the `docBlocksHost` global installed by the preload script.\n */\n\nimport type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';\nimport { maybeGetDocBlocksHost } from '../host/index.js';\nimport type { DocBlocksHostFsAPI } from '../host/types.js';\n\nexport { isElectronHost } from '../host/index.js';\n\nfunction getHostFs(): DocBlocksHostFsAPI {\n const host = maybeGetDocBlocksHost();\n if (!host) {\n throw new Error(\n 'ElectronFileSystemProvider: docBlocksHost is not available — not running under Electron?',\n );\n }\n return host.fs;\n}\n\nexport class ElectronFileSystemProvider implements FileSystemProvider {\n readonly id: string;\n readonly label: string;\n\n private readonly rootPath: string;\n\n constructor(id: string, label: string, rootPath: string) {\n this.id = id;\n this.label = label;\n this.rootPath = rootPath;\n }\n\n /** Absolute path this provider is rooted at. */\n getRootPath(): string {\n return this.rootPath;\n }\n\n readFile(path: string): Promise<string | null> {\n return getHostFs().readFile(this.rootPath, path);\n }\n\n writeFile(path: string, content: string): Promise<void> {\n return getHostFs().writeFile(this.rootPath, path, content);\n }\n\n delete(path: string): Promise<void> {\n return getHostFs().delete(this.rootPath, path);\n }\n\n rename(oldPath: string, newPath: string): Promise<void> {\n return getHostFs().rename(this.rootPath, oldPath, newPath);\n }\n\n readDirectory(path: string): Promise<FileSystemEntry[]> {\n return getHostFs().readDirectory(this.rootPath, path);\n }\n\n exists(path: string): Promise<boolean> {\n return getHostFs().exists(this.rootPath, path);\n }\n\n createDirectory(path: string): Promise<void> {\n return getHostFs().createDirectory(this.rootPath, path);\n }\n\n stat(path: string): Promise<FileMeta | null> {\n return getHostFs().stat(this.rootPath, path);\n }\n\n readBinary(path: string): Promise<ArrayBuffer | null> {\n return getHostFs().readBinary(this.rootPath, path);\n }\n\n writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {\n return getHostFs().writeBinary(this.rootPath, path, data);\n }\n\n /** Subscribe to external change notifications under this root. */\n watch(onChange: (changedPath: string) => void): () => void {\n return getHostFs().watch(this.rootPath, onChange);\n }\n}\n"],"mappings":"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","names":["newParent","meta","findDocumentPath","EXTENSION_MIME_MAP","guessMimeType","normalisePath","parentDir","baseName"]}
|