@bendyline/docblocks 1.1.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -11
- package/dist/chunk-6IYMTYMQ.js +1692 -0
- package/dist/chunk-6IYMTYMQ.js.map +1 -0
- package/dist/chunk-AEHCVWU5.js +25 -0
- package/dist/chunk-AEHCVWU5.js.map +1 -0
- package/dist/chunk-B56KWCSE.js +802 -0
- package/dist/chunk-B56KWCSE.js.map +1 -0
- package/dist/{chunk-ME76RUMR.js → chunk-BNKV7MTO.js} +15 -1
- package/dist/chunk-BNKV7MTO.js.map +1 -0
- package/dist/chunk-BXMF5YQJ.js +149 -0
- package/dist/chunk-BXMF5YQJ.js.map +1 -0
- package/dist/chunk-COYQXQK3.js +1071 -0
- package/dist/chunk-COYQXQK3.js.map +1 -0
- package/dist/chunk-DN7A33LL.js +780 -0
- package/dist/chunk-DN7A33LL.js.map +1 -0
- package/dist/chunk-EZKJZUNJ.js +13 -0
- package/dist/chunk-EZKJZUNJ.js.map +1 -0
- package/dist/chunk-FA7UNOXK.js +20 -0
- package/dist/chunk-FA7UNOXK.js.map +1 -0
- package/dist/chunk-FNW556FN.js +75 -0
- package/dist/chunk-FNW556FN.js.map +1 -0
- package/dist/chunk-GM5YXU4L.js +29 -0
- package/dist/chunk-GM5YXU4L.js.map +1 -0
- package/dist/chunk-JS6XFWQK.js +225 -0
- package/dist/chunk-JS6XFWQK.js.map +1 -0
- package/dist/chunk-MNSZ7EZN.js +111 -0
- package/dist/chunk-MNSZ7EZN.js.map +1 -0
- package/dist/chunk-P3DVZQ6S.js +228 -0
- package/dist/chunk-P3DVZQ6S.js.map +1 -0
- package/dist/chunk-P4WATND4.js +52 -0
- package/dist/chunk-P4WATND4.js.map +1 -0
- package/dist/chunk-RVPGQBWR.js +169 -0
- package/dist/chunk-RVPGQBWR.js.map +1 -0
- package/dist/chunk-U722UUFN.js +9 -0
- package/dist/chunk-U722UUFN.js.map +1 -0
- package/dist/chunk-VTCSF7VS.js +553 -0
- package/dist/chunk-VTCSF7VS.js.map +1 -0
- package/dist/chunk-WJKYY5QR.js +1350 -0
- package/dist/chunk-WJKYY5QR.js.map +1 -0
- package/dist/chunk-XUML3MKV.js +945 -0
- package/dist/chunk-XUML3MKV.js.map +1 -0
- package/dist/document/index.d.ts +358 -0
- package/dist/document/index.js +25 -0
- package/dist/document/index.js.map +1 -0
- package/dist/filesystem/electron.d.ts +73 -0
- package/dist/filesystem/electron.js +17 -0
- package/dist/filesystem/electron.js.map +1 -0
- package/dist/filesystem/index.d.ts +228 -8
- package/dist/filesystem/index.js +133 -6
- package/dist/filesystem/index.js.map +1 -1
- package/dist/filesystem/indexeddb.d.ts +284 -0
- package/dist/filesystem/indexeddb.js +23 -0
- package/dist/filesystem/indexeddb.js.map +1 -0
- package/dist/filesystem/memory.d.ts +152 -0
- package/dist/filesystem/memory.js +13 -0
- package/dist/filesystem/memory.js.map +1 -0
- package/dist/filesystem/native.d.ts +136 -0
- package/dist/filesystem/native.js +28 -0
- package/dist/filesystem/native.js.map +1 -0
- package/dist/host/index.d.ts +32 -6
- package/dist/host/index.js +26 -27
- package/dist/host/index.js.map +1 -1
- package/dist/index.d.ts +14 -9
- package/dist/index.js +204 -8
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +33 -0
- package/dist/mcp/index.js +32 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/zod.d.ts +5765 -0
- package/dist/mcp/zod.js +724 -0
- package/dist/mcp/zod.js.map +1 -0
- package/dist/share/index.d.ts +43 -0
- package/dist/share/index.js +13 -0
- package/dist/share/index.js.map +1 -0
- package/dist/types-BEg5SQ1_.d.ts +301 -0
- package/dist/types-CX893hgH.d.ts +468 -0
- package/dist/types-CueK0tvU.d.ts +501 -0
- package/dist/vscode/index.d.ts +220 -0
- package/dist/vscode/index.js +383 -0
- package/dist/vscode/index.js.map +1 -0
- package/dist/workspace/index.d.ts +141 -3
- package/dist/workspace/index.js +28 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace-path-CWVrcuPL.d.ts +21 -0
- package/package.json +50 -5
- package/dist/chunk-GUNM43XZ.js +0 -63
- package/dist/chunk-GUNM43XZ.js.map +0 -1
- package/dist/chunk-IM7LCQJ6.js +0 -850
- package/dist/chunk-IM7LCQJ6.js.map +0 -1
- package/dist/chunk-ME76RUMR.js.map +0 -1
- package/dist/filesystem/electron-provider.d.ts +0 -32
- package/dist/filesystem/electron-provider.d.ts.map +0 -1
- package/dist/filesystem/electron-provider.js +0 -64
- package/dist/filesystem/electron-provider.js.map +0 -1
- package/dist/filesystem/file-media-provider.d.ts +0 -23
- package/dist/filesystem/file-media-provider.d.ts.map +0 -1
- package/dist/filesystem/file-media-provider.js +0 -85
- package/dist/filesystem/file-media-provider.js.map +0 -1
- package/dist/filesystem/filesystem-content-container.d.ts +0 -24
- package/dist/filesystem/filesystem-content-container.d.ts.map +0 -1
- package/dist/filesystem/filesystem-content-container.js +0 -116
- package/dist/filesystem/filesystem-content-container.js.map +0 -1
- package/dist/filesystem/index.d.ts.map +0 -1
- package/dist/filesystem/indexeddb-content-container.d.ts +0 -20
- package/dist/filesystem/indexeddb-content-container.d.ts.map +0 -1
- package/dist/filesystem/indexeddb-content-container.js +0 -93
- package/dist/filesystem/indexeddb-content-container.js.map +0 -1
- package/dist/filesystem/indexeddb-provider.d.ts +0 -32
- package/dist/filesystem/indexeddb-provider.d.ts.map +0 -1
- package/dist/filesystem/indexeddb-provider.js +0 -295
- package/dist/filesystem/indexeddb-provider.js.map +0 -1
- package/dist/filesystem/native-provider.d.ts +0 -45
- package/dist/filesystem/native-provider.d.ts.map +0 -1
- package/dist/filesystem/native-provider.js +0 -336
- package/dist/filesystem/native-provider.js.map +0 -1
- package/dist/filesystem/types.d.ts +0 -50
- package/dist/filesystem/types.d.ts.map +0 -1
- package/dist/filesystem/types.js +0 -8
- package/dist/filesystem/types.js.map +0 -1
- package/dist/host/index.d.ts.map +0 -1
- package/dist/host/types.d.ts +0 -149
- package/dist/host/types.d.ts.map +0 -1
- package/dist/host/types.js +0 -10
- package/dist/host/types.js.map +0 -1
- package/dist/index-pgBHBQ9G.d.ts +0 -213
- package/dist/index.d.ts.map +0 -1
- package/dist/workspace/index.d.ts.map +0 -1
- package/dist/workspace/types.d.ts +0 -29
- package/dist/workspace/types.d.ts.map +0 -1
- package/dist/workspace/types.js +0 -6
- package/dist/workspace/types.js.map +0 -1
- package/dist/workspace/workspace-manager.d.ts +0 -35
- package/dist/workspace/workspace-manager.d.ts.map +0 -1
- package/dist/workspace/workspace-manager.js +0 -82
- package/dist/workspace/workspace-manager.js.map +0 -1
- package/src/filesystem/electron-provider.ts +0 -88
- package/src/filesystem/file-media-provider.ts +0 -103
- package/src/filesystem/filesystem-content-container.ts +0 -126
- package/src/filesystem/index.ts +0 -24
- package/src/filesystem/indexeddb-content-container.ts +0 -104
- package/src/filesystem/indexeddb-provider.ts +0 -345
- package/src/filesystem/native-provider.ts +0 -384
- package/src/filesystem/types.ts +0 -69
- package/src/host/index.ts +0 -47
- package/src/host/types.ts +0 -153
- package/src/index.ts +0 -9
- package/src/workspace/index.ts +0 -10
- package/src/workspace/types.ts +0 -29
- package/src/workspace/workspace-manager.ts +0 -90
package/dist/index-pgBHBQ9G.d.ts
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FileSystemProvider — abstract interface for a virtual filesystem.
|
|
3
|
-
*
|
|
4
|
-
* Implementations back onto IndexedDB (for browser-local storage) or
|
|
5
|
-
* the File System Access API (for native folder access).
|
|
6
|
-
*/
|
|
7
|
-
interface FileEntry {
|
|
8
|
-
kind: 'file';
|
|
9
|
-
name: string;
|
|
10
|
-
path: string;
|
|
11
|
-
}
|
|
12
|
-
interface FolderEntry {
|
|
13
|
-
kind: 'directory';
|
|
14
|
-
name: string;
|
|
15
|
-
path: string;
|
|
16
|
-
}
|
|
17
|
-
type FileSystemEntry = FileEntry | FolderEntry;
|
|
18
|
-
interface FileMeta {
|
|
19
|
-
name: string;
|
|
20
|
-
path: string;
|
|
21
|
-
size: number;
|
|
22
|
-
lastModified: string;
|
|
23
|
-
}
|
|
24
|
-
interface FileSystemProvider {
|
|
25
|
-
/** Unique identifier for this provider instance. */
|
|
26
|
-
readonly id: string;
|
|
27
|
-
/** Human-readable label (e.g., folder name or "Browser Storage"). */
|
|
28
|
-
readonly label: string;
|
|
29
|
-
/** Read the text content of a file. Returns null if the file doesn't exist. */
|
|
30
|
-
readFile(path: string): Promise<string | null>;
|
|
31
|
-
/** Write text content to a file, creating it (and parent dirs) if needed. */
|
|
32
|
-
writeFile(path: string, content: string): Promise<void>;
|
|
33
|
-
/** Delete a file or empty directory. */
|
|
34
|
-
delete(path: string): Promise<void>;
|
|
35
|
-
/** Rename or move an entry. */
|
|
36
|
-
rename(oldPath: string, newPath: string): Promise<void>;
|
|
37
|
-
/** List immediate children of a directory. */
|
|
38
|
-
readDirectory(path: string): Promise<FileSystemEntry[]>;
|
|
39
|
-
/** Check whether a path exists. */
|
|
40
|
-
exists(path: string): Promise<boolean>;
|
|
41
|
-
/** Create a directory (and parents if needed). */
|
|
42
|
-
createDirectory(path: string): Promise<void>;
|
|
43
|
-
/** Get metadata for a file. Returns null if not found. */
|
|
44
|
-
stat(path: string): Promise<FileMeta | null>;
|
|
45
|
-
/** Read raw binary content. Returns null if not found. */
|
|
46
|
-
readBinary(path: string): Promise<ArrayBuffer | null>;
|
|
47
|
-
/** Write raw binary content. */
|
|
48
|
-
writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void>;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* DocBlocksHostAPI — the contract exposed by the Electron desktop shell
|
|
53
|
-
* to its renderer process via contextBridge.
|
|
54
|
-
*
|
|
55
|
-
* This file is the single source of truth for the host ↔ renderer
|
|
56
|
-
* bridge. The Electron preload script exposes an implementation matching
|
|
57
|
-
* this shape; the React renderer calls it through `window.docBlocksHost`.
|
|
58
|
-
*/
|
|
59
|
-
|
|
60
|
-
/** Filesystem operations scoped to a registered absolute root path. */
|
|
61
|
-
interface DocBlocksHostFsAPI {
|
|
62
|
-
readFile(rootPath: string, path: string): Promise<string | null>;
|
|
63
|
-
writeFile(rootPath: string, path: string, content: string): Promise<void>;
|
|
64
|
-
delete(rootPath: string, path: string): Promise<void>;
|
|
65
|
-
rename(rootPath: string, oldPath: string, newPath: string): Promise<void>;
|
|
66
|
-
readDirectory(rootPath: string, path: string): Promise<FileSystemEntry[]>;
|
|
67
|
-
exists(rootPath: string, path: string): Promise<boolean>;
|
|
68
|
-
createDirectory(rootPath: string, path: string): Promise<void>;
|
|
69
|
-
stat(rootPath: string, path: string): Promise<FileMeta | null>;
|
|
70
|
-
readBinary(rootPath: string, path: string): Promise<ArrayBuffer | null>;
|
|
71
|
-
writeBinary(rootPath: string, path: string, data: ArrayBuffer | Uint8Array): Promise<void>;
|
|
72
|
-
/**
|
|
73
|
-
* Subscribe to change notifications for a watched root. Returns an
|
|
74
|
-
* unsubscribe function. The main process uses chokidar under the hood.
|
|
75
|
-
*/
|
|
76
|
-
watch(rootPath: string, onChange: (path: string) => void): () => void;
|
|
77
|
-
}
|
|
78
|
-
/** Descriptor returned for an Electron-managed workspace (backed by a folder). */
|
|
79
|
-
interface ElectronWorkspaceInfo {
|
|
80
|
-
id: string;
|
|
81
|
-
name: string;
|
|
82
|
-
rootPath: string;
|
|
83
|
-
}
|
|
84
|
-
/** Workspace-management operations exposed to the renderer. */
|
|
85
|
-
interface DocBlocksHostWorkspacesAPI {
|
|
86
|
-
/**
|
|
87
|
-
* Return the default workspace (creating ~/Documents/DocBlocks on first
|
|
88
|
-
* call, or the user's configured default).
|
|
89
|
-
*/
|
|
90
|
-
getDefault(): Promise<ElectronWorkspaceInfo>;
|
|
91
|
-
/**
|
|
92
|
-
* Open the native folder picker. Returns null if the user cancels.
|
|
93
|
-
* The selected folder is registered in the main process whitelist.
|
|
94
|
-
*/
|
|
95
|
-
pickFolder(): Promise<ElectronWorkspaceInfo | null>;
|
|
96
|
-
/**
|
|
97
|
-
* Re-register a previously known workspace so its rootPath is trusted
|
|
98
|
-
* for subsequent fs calls. Called on app startup for persisted
|
|
99
|
-
* electron-native workspaces before any fs operation.
|
|
100
|
-
*/
|
|
101
|
-
register(info: ElectronWorkspaceInfo): Promise<void>;
|
|
102
|
-
/** Remove a workspace from the trusted whitelist. */
|
|
103
|
-
unregister(id: string): Promise<void>;
|
|
104
|
-
}
|
|
105
|
-
/** Shell operations — reveal in Finder/Explorer, open external URLs. */
|
|
106
|
-
interface DocBlocksHostShellAPI {
|
|
107
|
-
/** Reveal a file (by absolute path) in the OS file manager. */
|
|
108
|
-
revealInFolder(absolutePath: string): Promise<void>;
|
|
109
|
-
/** Open a URL in the default browser. */
|
|
110
|
-
openExternal(url: string): Promise<void>;
|
|
111
|
-
}
|
|
112
|
-
/** System ffmpeg detection and invocation. */
|
|
113
|
-
interface DocBlocksHostFfmpegAPI {
|
|
114
|
-
/** True if `ffmpeg` is available on PATH (or bundled). */
|
|
115
|
-
available(): Promise<boolean>;
|
|
116
|
-
/** Version string from `ffmpeg -version`, or null if unavailable. */
|
|
117
|
-
version(): Promise<string | null>;
|
|
118
|
-
/**
|
|
119
|
-
* Render a markdown file at the given absolute path to MP4 using the
|
|
120
|
-
* existing squisq-video CLI pipeline. Returns the absolute path to the
|
|
121
|
-
* produced MP4 file, or throws on failure.
|
|
122
|
-
*/
|
|
123
|
-
renderVideo(markdownAbsolutePath: string, options: {
|
|
124
|
-
fps?: number;
|
|
125
|
-
quality?: 'draft' | 'normal' | 'high';
|
|
126
|
-
}): Promise<string>;
|
|
127
|
-
}
|
|
128
|
-
/** Auto-updater control. */
|
|
129
|
-
interface DocBlocksHostUpdaterAPI {
|
|
130
|
-
/** Kick off a check; resolves to true if an update is available. */
|
|
131
|
-
checkForUpdates(): Promise<boolean>;
|
|
132
|
-
/** Current app version string. */
|
|
133
|
-
getVersion(): Promise<string>;
|
|
134
|
-
/**
|
|
135
|
-
* Quit the app and apply a downloaded update. Should only be called
|
|
136
|
-
* after an `UpdaterStatus` of kind `'downloaded'` has been observed.
|
|
137
|
-
*/
|
|
138
|
-
quitAndInstall(): Promise<void>;
|
|
139
|
-
/**
|
|
140
|
-
* Subscribe to updater status events. Returns an unsubscribe function.
|
|
141
|
-
*/
|
|
142
|
-
onStatus(listener: (status: UpdaterStatus) => void): () => void;
|
|
143
|
-
}
|
|
144
|
-
type UpdaterStatus = {
|
|
145
|
-
kind: 'checking';
|
|
146
|
-
} | {
|
|
147
|
-
kind: 'available';
|
|
148
|
-
version: string;
|
|
149
|
-
releaseNotes?: string;
|
|
150
|
-
releaseUrl?: string;
|
|
151
|
-
} | {
|
|
152
|
-
kind: 'not-available';
|
|
153
|
-
} | {
|
|
154
|
-
kind: 'downloading';
|
|
155
|
-
percent: number;
|
|
156
|
-
} | {
|
|
157
|
-
kind: 'downloaded';
|
|
158
|
-
version: string;
|
|
159
|
-
releaseNotes?: string;
|
|
160
|
-
releaseUrl?: string;
|
|
161
|
-
} | {
|
|
162
|
-
kind: 'error';
|
|
163
|
-
message: string;
|
|
164
|
-
};
|
|
165
|
-
/** Menu-command events pushed from the main process to the renderer. */
|
|
166
|
-
type MenuCommand = 'file:new' | 'file:openFolder' | 'file:revealWorkspace' | 'file:settings' | 'help:about' | 'help:checkForUpdates' | 'help:viewOnGitHub';
|
|
167
|
-
/** Deep-link event resolved by the host into a trusted workspace file. */
|
|
168
|
-
interface OpenRequest {
|
|
169
|
-
kind: 'workspace-file';
|
|
170
|
-
workspaceId: string;
|
|
171
|
-
/** Slash-prefixed path relative to the workspace root. */
|
|
172
|
-
path: string;
|
|
173
|
-
}
|
|
174
|
-
/** Environment metadata provided by the host. */
|
|
175
|
-
interface HostEnvironment {
|
|
176
|
-
platform: 'darwin' | 'win32' | 'linux';
|
|
177
|
-
appVersion: string;
|
|
178
|
-
isDev: boolean;
|
|
179
|
-
}
|
|
180
|
-
/** The full DocBlocks desktop host API. */
|
|
181
|
-
interface DocBlocksHostAPI {
|
|
182
|
-
env: HostEnvironment;
|
|
183
|
-
fs: DocBlocksHostFsAPI;
|
|
184
|
-
workspaces: DocBlocksHostWorkspacesAPI;
|
|
185
|
-
shell: DocBlocksHostShellAPI;
|
|
186
|
-
ffmpeg: DocBlocksHostFfmpegAPI;
|
|
187
|
-
updater: DocBlocksHostUpdaterAPI;
|
|
188
|
-
/**
|
|
189
|
-
* Subscribe to menu commands dispatched by the native menu.
|
|
190
|
-
* Returns an unsubscribe function.
|
|
191
|
-
*/
|
|
192
|
-
onMenuCommand(listener: (cmd: MenuCommand) => void): () => void;
|
|
193
|
-
/**
|
|
194
|
-
* Subscribe to open-file / open-url requests from the OS.
|
|
195
|
-
* Returns an unsubscribe function.
|
|
196
|
-
*/
|
|
197
|
-
onOpenRequest(listener: (request: OpenRequest) => void): () => void;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Host bridge — shared types + runtime access for the Electron desktop
|
|
202
|
-
* host. The renderer calls `getDocBlocksHost()` to reach the preload
|
|
203
|
-
* contextBridge; `isElectronHost()` gates desktop-only UI branches.
|
|
204
|
-
*/
|
|
205
|
-
|
|
206
|
-
/** True when running inside the Electron desktop shell. */
|
|
207
|
-
declare function isElectronHost(): boolean;
|
|
208
|
-
/** Return the host API, or throw if not running under Electron. */
|
|
209
|
-
declare function getDocBlocksHost(): DocBlocksHostAPI;
|
|
210
|
-
/** Return the host API, or null if not running under Electron. */
|
|
211
|
-
declare function maybeGetDocBlocksHost(): DocBlocksHostAPI | null;
|
|
212
|
-
|
|
213
|
-
export { type DocBlocksHostAPI as D, type ElectronWorkspaceInfo as E, type FileEntry as F, type HostEnvironment as H, type MenuCommand as M, type OpenRequest as O, type UpdaterStatus as U, type DocBlocksHostFfmpegAPI as a, type DocBlocksHostFsAPI as b, type DocBlocksHostShellAPI as c, type DocBlocksHostUpdaterAPI as d, type DocBlocksHostWorkspacesAPI as e, type FileMeta as f, type FileSystemEntry as g, type FileSystemProvider as h, type FolderEntry as i, getDocBlocksHost as j, isElectronHost as k, maybeGetDocBlocksHost as m };
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace — a named binding to a FileSystemProvider, representing
|
|
3
|
-
* the user's current working context (a folder of markdown files).
|
|
4
|
-
*/
|
|
5
|
-
export interface WorkspaceDescriptor {
|
|
6
|
-
/** Unique stable identifier (persisted in IndexedDB). */
|
|
7
|
-
id: string;
|
|
8
|
-
/** User-visible label. */
|
|
9
|
-
name: string;
|
|
10
|
-
/**
|
|
11
|
-
* Provider kind:
|
|
12
|
-
* - 'indexeddb' — browser-local storage (web only)
|
|
13
|
-
* - 'native' — File System Access API (web Chrome/Edge only)
|
|
14
|
-
* - 'electron-native' — Electron main-process native filesystem
|
|
15
|
-
*/
|
|
16
|
-
type: 'indexeddb' | 'native' | 'electron-native';
|
|
17
|
-
/** ISO timestamp of last access. */
|
|
18
|
-
lastOpened: string;
|
|
19
|
-
/** Absolute filesystem path for 'electron-native' workspaces. */
|
|
20
|
-
rootPath?: string;
|
|
21
|
-
/**
|
|
22
|
-
* Per-workspace override for the global versioning preference. When
|
|
23
|
-
* `'inherit'` (or absent), the global preference applies. `'on'` /
|
|
24
|
-
* `'off'` force the corresponding behavior regardless of the global
|
|
25
|
-
* setting. See `resolveVersioningEnabled` in the preferences module.
|
|
26
|
-
*/
|
|
27
|
-
versioningOverride?: 'inherit' | 'on' | 'off';
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workspace/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,iBAAiB,CAAC;IACjD,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC;CAC/C"}
|
package/dist/workspace/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workspace/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WorkspaceManager — manages the list of known workspaces in IndexedDB
|
|
3
|
-
* and provides helpers for creating / switching / removing them.
|
|
4
|
-
*
|
|
5
|
-
* The actual FileSystemProvider instances are created by the caller
|
|
6
|
-
* (since native providers need a DirectoryHandle from user interaction).
|
|
7
|
-
*/
|
|
8
|
-
import type { WorkspaceDescriptor } from './types.js';
|
|
9
|
-
/**
|
|
10
|
-
* Get the list of all known workspace descriptors.
|
|
11
|
-
*/
|
|
12
|
-
export declare function listWorkspaces(): Promise<WorkspaceDescriptor[]>;
|
|
13
|
-
/**
|
|
14
|
-
* Get a specific workspace descriptor by id.
|
|
15
|
-
*/
|
|
16
|
-
export declare function getWorkspace(id: string): Promise<WorkspaceDescriptor | null>;
|
|
17
|
-
/**
|
|
18
|
-
* Add or update a workspace descriptor. If a workspace with the same id
|
|
19
|
-
* already exists, it is replaced.
|
|
20
|
-
*/
|
|
21
|
-
export declare function saveWorkspace(workspace: WorkspaceDescriptor): Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* Remove a workspace descriptor by id.
|
|
24
|
-
*/
|
|
25
|
-
export declare function removeWorkspace(id: string): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Touch the lastOpened timestamp on a workspace.
|
|
28
|
-
*/
|
|
29
|
-
export declare function touchWorkspace(id: string): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Ensure a default IndexedDB workspace exists. Called on app startup.
|
|
32
|
-
* Returns the descriptor.
|
|
33
|
-
*/
|
|
34
|
-
export declare function ensureDefaultWorkspace(): Promise<WorkspaceDescriptor>;
|
|
35
|
-
//# sourceMappingURL=workspace-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-manager.d.ts","sourceRoot":"","sources":["../../src/workspace/workspace-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAYtD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAGrE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAGlF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CASjF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAY3E"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WorkspaceManager — manages the list of known workspaces in IndexedDB
|
|
3
|
-
* and provides helpers for creating / switching / removing them.
|
|
4
|
-
*
|
|
5
|
-
* The actual FileSystemProvider instances are created by the caller
|
|
6
|
-
* (since native providers need a DirectoryHandle from user interaction).
|
|
7
|
-
*/
|
|
8
|
-
import { LocalForageAdapter } from '@bendyline/squisq/storage';
|
|
9
|
-
const DB_NAME = 'docblocks-workspaces';
|
|
10
|
-
const STORE_NAME = 'workspaces';
|
|
11
|
-
const LIST_KEY = 'workspace-list';
|
|
12
|
-
const DEFAULT_WORKSPACE_ID = 'default';
|
|
13
|
-
const store = new LocalForageAdapter({
|
|
14
|
-
name: DB_NAME,
|
|
15
|
-
storeName: STORE_NAME,
|
|
16
|
-
});
|
|
17
|
-
/**
|
|
18
|
-
* Get the list of all known workspace descriptors.
|
|
19
|
-
*/
|
|
20
|
-
export async function listWorkspaces() {
|
|
21
|
-
const list = await store.get(LIST_KEY);
|
|
22
|
-
return list ?? [];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get a specific workspace descriptor by id.
|
|
26
|
-
*/
|
|
27
|
-
export async function getWorkspace(id) {
|
|
28
|
-
const list = await listWorkspaces();
|
|
29
|
-
return list.find((w) => w.id === id) ?? null;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Add or update a workspace descriptor. If a workspace with the same id
|
|
33
|
-
* already exists, it is replaced.
|
|
34
|
-
*/
|
|
35
|
-
export async function saveWorkspace(workspace) {
|
|
36
|
-
const list = await listWorkspaces();
|
|
37
|
-
const idx = list.findIndex((w) => w.id === workspace.id);
|
|
38
|
-
if (idx >= 0) {
|
|
39
|
-
list[idx] = workspace;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
list.push(workspace);
|
|
43
|
-
}
|
|
44
|
-
await store.set(LIST_KEY, list);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Remove a workspace descriptor by id.
|
|
48
|
-
*/
|
|
49
|
-
export async function removeWorkspace(id) {
|
|
50
|
-
const list = await listWorkspaces();
|
|
51
|
-
const filtered = list.filter((w) => w.id !== id);
|
|
52
|
-
await store.set(LIST_KEY, filtered);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Touch the lastOpened timestamp on a workspace.
|
|
56
|
-
*/
|
|
57
|
-
export async function touchWorkspace(id) {
|
|
58
|
-
const list = await listWorkspaces();
|
|
59
|
-
const workspace = list.find((w) => w.id === id);
|
|
60
|
-
if (workspace) {
|
|
61
|
-
workspace.lastOpened = new Date().toISOString();
|
|
62
|
-
await store.set(LIST_KEY, list);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Ensure a default IndexedDB workspace exists. Called on app startup.
|
|
67
|
-
* Returns the descriptor.
|
|
68
|
-
*/
|
|
69
|
-
export async function ensureDefaultWorkspace() {
|
|
70
|
-
const existing = await getWorkspace(DEFAULT_WORKSPACE_ID);
|
|
71
|
-
if (existing)
|
|
72
|
-
return existing;
|
|
73
|
-
const descriptor = {
|
|
74
|
-
id: DEFAULT_WORKSPACE_ID,
|
|
75
|
-
name: 'My Documents',
|
|
76
|
-
type: 'indexeddb',
|
|
77
|
-
lastOpened: new Date().toISOString(),
|
|
78
|
-
};
|
|
79
|
-
await saveWorkspace(descriptor);
|
|
80
|
-
return descriptor;
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=workspace-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-manager.js","sourceRoot":"","sources":["../../src/workspace/workspace-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ElectronFileSystemProvider — implements FileSystemProvider by delegating
|
|
3
|
-
* to the Electron desktop host's fs IPC bridge. Every operation is scoped
|
|
4
|
-
* to an absolute root path that the main process validates against a
|
|
5
|
-
* whitelist of registered workspace roots.
|
|
6
|
-
*
|
|
7
|
-
* This file has no Electron dependency — it is a pure IPC client that
|
|
8
|
-
* relies on the `docBlocksHost` global installed by the preload script.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { FileSystemProvider, FileSystemEntry, FileMeta } from './types.js';
|
|
12
|
-
import { maybeGetDocBlocksHost } from '../host/index.js';
|
|
13
|
-
import type { DocBlocksHostFsAPI } from '../host/types.js';
|
|
14
|
-
|
|
15
|
-
export { isElectronHost } from '../host/index.js';
|
|
16
|
-
|
|
17
|
-
function getHostFs(): DocBlocksHostFsAPI {
|
|
18
|
-
const host = maybeGetDocBlocksHost();
|
|
19
|
-
if (!host) {
|
|
20
|
-
throw new Error(
|
|
21
|
-
'ElectronFileSystemProvider: docBlocksHost is not available — not running under Electron?',
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
return host.fs;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class ElectronFileSystemProvider implements FileSystemProvider {
|
|
28
|
-
readonly id: string;
|
|
29
|
-
readonly label: string;
|
|
30
|
-
|
|
31
|
-
private readonly rootPath: string;
|
|
32
|
-
|
|
33
|
-
constructor(id: string, label: string, rootPath: string) {
|
|
34
|
-
this.id = id;
|
|
35
|
-
this.label = label;
|
|
36
|
-
this.rootPath = rootPath;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Absolute path this provider is rooted at. */
|
|
40
|
-
getRootPath(): string {
|
|
41
|
-
return this.rootPath;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
readFile(path: string): Promise<string | null> {
|
|
45
|
-
return getHostFs().readFile(this.rootPath, path);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
writeFile(path: string, content: string): Promise<void> {
|
|
49
|
-
return getHostFs().writeFile(this.rootPath, path, content);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
delete(path: string): Promise<void> {
|
|
53
|
-
return getHostFs().delete(this.rootPath, path);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
rename(oldPath: string, newPath: string): Promise<void> {
|
|
57
|
-
return getHostFs().rename(this.rootPath, oldPath, newPath);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
readDirectory(path: string): Promise<FileSystemEntry[]> {
|
|
61
|
-
return getHostFs().readDirectory(this.rootPath, path);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
exists(path: string): Promise<boolean> {
|
|
65
|
-
return getHostFs().exists(this.rootPath, path);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
createDirectory(path: string): Promise<void> {
|
|
69
|
-
return getHostFs().createDirectory(this.rootPath, path);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
stat(path: string): Promise<FileMeta | null> {
|
|
73
|
-
return getHostFs().stat(this.rootPath, path);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
readBinary(path: string): Promise<ArrayBuffer | null> {
|
|
77
|
-
return getHostFs().readBinary(this.rootPath, path);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
writeBinary(path: string, data: ArrayBuffer | Uint8Array): Promise<void> {
|
|
81
|
-
return getHostFs().writeBinary(this.rootPath, path, data);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** Subscribe to external change notifications under this root. */
|
|
85
|
-
watch(onChange: (changedPath: string) => void): () => void {
|
|
86
|
-
return getHostFs().watch(this.rootPath, onChange);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* createFileMediaProvider — per-file media storage following the pandoc /
|
|
3
|
-
* Word convention: a markdown file `notes.md` gets a sibling folder
|
|
4
|
-
* `notes_files/` that holds its images, audio, and video.
|
|
5
|
-
*
|
|
6
|
-
* Given:
|
|
7
|
-
* • `container` — a ContentContainer scoped to the markdown file's
|
|
8
|
-
* parent directory (so `readFile('notes_files/image.png')` maps to the
|
|
9
|
-
* parent-relative path)
|
|
10
|
-
* • `markdownBasename` — e.g. `"notes.md"`
|
|
11
|
-
*
|
|
12
|
-
* Returns a MediaProvider that:
|
|
13
|
-
* • Writes new media under `{basename}_files/{name}` in the parent dir
|
|
14
|
-
* • Returns the folder-qualified path (`notes_files/image.png`) from
|
|
15
|
-
* addMedia so the markdown stays portable outside DocBlocks
|
|
16
|
-
* • Resolves both bare (`image.png`) and folder-qualified
|
|
17
|
-
* (`notes_files/image.png`) references — so legacy markdown and
|
|
18
|
-
* exports from other tools both work
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import type { MediaProvider, MediaEntry } from '@bendyline/squisq/schemas';
|
|
22
|
-
import type { ContentContainer } from '@bendyline/squisq/storage';
|
|
23
|
-
|
|
24
|
-
function stripExt(name: string): string {
|
|
25
|
-
return name.replace(/\.[^.]+$/, '');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function createFileMediaProvider(
|
|
29
|
-
container: ContentContainer,
|
|
30
|
-
markdownBasename: string,
|
|
31
|
-
): MediaProvider {
|
|
32
|
-
const folder = stripExt(markdownBasename) + '_files';
|
|
33
|
-
const prefix = folder + '/';
|
|
34
|
-
const blobUrlCache = new Map<string, string>();
|
|
35
|
-
|
|
36
|
-
function toKey(ref: string): string {
|
|
37
|
-
const clean = ref.replace(/^\/+/, '');
|
|
38
|
-
return clean.startsWith(prefix) ? clean : prefix + clean;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
async resolveUrl(ref: string): Promise<string> {
|
|
43
|
-
const key = toKey(ref);
|
|
44
|
-
const cached = blobUrlCache.get(key);
|
|
45
|
-
if (cached) return cached;
|
|
46
|
-
|
|
47
|
-
const data = await container.readFile(key);
|
|
48
|
-
if (!data) return ref;
|
|
49
|
-
|
|
50
|
-
const entries = await container.listFiles();
|
|
51
|
-
const entry = entries.find((e) => e.path === key);
|
|
52
|
-
const mimeType = entry?.mimeType ?? 'application/octet-stream';
|
|
53
|
-
|
|
54
|
-
const url = URL.createObjectURL(new Blob([data], { type: mimeType }));
|
|
55
|
-
blobUrlCache.set(key, url);
|
|
56
|
-
return url;
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
async listMedia(): Promise<MediaEntry[]> {
|
|
60
|
-
const entries = await container.listFiles(prefix);
|
|
61
|
-
return entries
|
|
62
|
-
.filter((e) => !e.path.toLowerCase().endsWith('.md'))
|
|
63
|
-
.map((e) => ({
|
|
64
|
-
name: e.path,
|
|
65
|
-
mimeType: e.mimeType,
|
|
66
|
-
size: e.size,
|
|
67
|
-
}));
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
async addMedia(
|
|
71
|
-
name: string,
|
|
72
|
-
data: ArrayBuffer | Blob | Uint8Array,
|
|
73
|
-
mimeType: string,
|
|
74
|
-
): Promise<string> {
|
|
75
|
-
const key = toKey(name);
|
|
76
|
-
const cached = blobUrlCache.get(key);
|
|
77
|
-
if (cached) {
|
|
78
|
-
URL.revokeObjectURL(cached);
|
|
79
|
-
blobUrlCache.delete(key);
|
|
80
|
-
}
|
|
81
|
-
const buffer = data instanceof Blob ? new Uint8Array(await data.arrayBuffer()) : data;
|
|
82
|
-
await container.writeFile(key, buffer, mimeType);
|
|
83
|
-
return key;
|
|
84
|
-
},
|
|
85
|
-
|
|
86
|
-
async removeMedia(ref: string): Promise<void> {
|
|
87
|
-
const key = toKey(ref);
|
|
88
|
-
const cached = blobUrlCache.get(key);
|
|
89
|
-
if (cached) {
|
|
90
|
-
URL.revokeObjectURL(cached);
|
|
91
|
-
blobUrlCache.delete(key);
|
|
92
|
-
}
|
|
93
|
-
await container.removeFile(key);
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
dispose(): void {
|
|
97
|
-
for (const url of blobUrlCache.values()) {
|
|
98
|
-
URL.revokeObjectURL(url);
|
|
99
|
-
}
|
|
100
|
-
blobUrlCache.clear();
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
}
|