pushwork 1.0.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.
Files changed (184) hide show
  1. package/README.md +460 -0
  2. package/dist/browser/browser-sync-engine.d.ts +64 -0
  3. package/dist/browser/browser-sync-engine.d.ts.map +1 -0
  4. package/dist/browser/browser-sync-engine.js +303 -0
  5. package/dist/browser/browser-sync-engine.js.map +1 -0
  6. package/dist/browser/filesystem-adapter.d.ts +84 -0
  7. package/dist/browser/filesystem-adapter.d.ts.map +1 -0
  8. package/dist/browser/filesystem-adapter.js +413 -0
  9. package/dist/browser/filesystem-adapter.js.map +1 -0
  10. package/dist/browser/index.d.ts +36 -0
  11. package/dist/browser/index.d.ts.map +1 -0
  12. package/dist/browser/index.js +90 -0
  13. package/dist/browser/index.js.map +1 -0
  14. package/dist/browser/types.d.ts +70 -0
  15. package/dist/browser/types.d.ts.map +1 -0
  16. package/dist/browser/types.js +6 -0
  17. package/dist/browser/types.js.map +1 -0
  18. package/dist/cli/commands.d.ts +71 -0
  19. package/dist/cli/commands.d.ts.map +1 -0
  20. package/dist/cli/commands.js +794 -0
  21. package/dist/cli/commands.js.map +1 -0
  22. package/dist/cli/index.d.ts +2 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +19 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +199 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/config/index.d.ts +71 -0
  31. package/dist/config/index.d.ts.map +1 -0
  32. package/dist/config/index.js +314 -0
  33. package/dist/config/index.js.map +1 -0
  34. package/dist/core/change-detection.d.ts +78 -0
  35. package/dist/core/change-detection.d.ts.map +1 -0
  36. package/dist/core/change-detection.js +370 -0
  37. package/dist/core/change-detection.js.map +1 -0
  38. package/dist/core/index.d.ts +5 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +22 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/core/isomorphic-snapshot.d.ts +58 -0
  43. package/dist/core/isomorphic-snapshot.d.ts.map +1 -0
  44. package/dist/core/isomorphic-snapshot.js +204 -0
  45. package/dist/core/isomorphic-snapshot.js.map +1 -0
  46. package/dist/core/move-detection.d.ts +72 -0
  47. package/dist/core/move-detection.d.ts.map +1 -0
  48. package/dist/core/move-detection.js +200 -0
  49. package/dist/core/move-detection.js.map +1 -0
  50. package/dist/core/snapshot.d.ts +109 -0
  51. package/dist/core/snapshot.d.ts.map +1 -0
  52. package/dist/core/snapshot.js +263 -0
  53. package/dist/core/snapshot.js.map +1 -0
  54. package/dist/core/sync-engine.d.ts +110 -0
  55. package/dist/core/sync-engine.d.ts.map +1 -0
  56. package/dist/core/sync-engine.js +817 -0
  57. package/dist/core/sync-engine.js.map +1 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +27 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/platform/browser-filesystem.d.ts +26 -0
  63. package/dist/platform/browser-filesystem.d.ts.map +1 -0
  64. package/dist/platform/browser-filesystem.js +91 -0
  65. package/dist/platform/browser-filesystem.js.map +1 -0
  66. package/dist/platform/filesystem.d.ts +29 -0
  67. package/dist/platform/filesystem.d.ts.map +1 -0
  68. package/dist/platform/filesystem.js +65 -0
  69. package/dist/platform/filesystem.js.map +1 -0
  70. package/dist/platform/node-filesystem.d.ts +21 -0
  71. package/dist/platform/node-filesystem.d.ts.map +1 -0
  72. package/dist/platform/node-filesystem.js +93 -0
  73. package/dist/platform/node-filesystem.js.map +1 -0
  74. package/dist/types/config.d.ts +119 -0
  75. package/dist/types/config.d.ts.map +1 -0
  76. package/dist/types/config.js +3 -0
  77. package/dist/types/config.js.map +1 -0
  78. package/dist/types/documents.d.ts +70 -0
  79. package/dist/types/documents.d.ts.map +1 -0
  80. package/dist/types/documents.js +23 -0
  81. package/dist/types/documents.js.map +1 -0
  82. package/dist/types/index.d.ts +4 -0
  83. package/dist/types/index.d.ts.map +1 -0
  84. package/dist/types/index.js +23 -0
  85. package/dist/types/index.js.map +1 -0
  86. package/dist/types/snapshot.d.ts +81 -0
  87. package/dist/types/snapshot.d.ts.map +1 -0
  88. package/dist/types/snapshot.js +17 -0
  89. package/dist/types/snapshot.js.map +1 -0
  90. package/dist/utils/content-similarity.d.ts +53 -0
  91. package/dist/utils/content-similarity.d.ts.map +1 -0
  92. package/dist/utils/content-similarity.js +155 -0
  93. package/dist/utils/content-similarity.js.map +1 -0
  94. package/dist/utils/content.d.ts +5 -0
  95. package/dist/utils/content.d.ts.map +1 -0
  96. package/dist/utils/content.js +30 -0
  97. package/dist/utils/content.js.map +1 -0
  98. package/dist/utils/fs-browser.d.ts +57 -0
  99. package/dist/utils/fs-browser.d.ts.map +1 -0
  100. package/dist/utils/fs-browser.js +311 -0
  101. package/dist/utils/fs-browser.js.map +1 -0
  102. package/dist/utils/fs-node.d.ts +53 -0
  103. package/dist/utils/fs-node.d.ts.map +1 -0
  104. package/dist/utils/fs-node.js +220 -0
  105. package/dist/utils/fs-node.js.map +1 -0
  106. package/dist/utils/fs.d.ts +62 -0
  107. package/dist/utils/fs.d.ts.map +1 -0
  108. package/dist/utils/fs.js +293 -0
  109. package/dist/utils/fs.js.map +1 -0
  110. package/dist/utils/index.d.ts +4 -0
  111. package/dist/utils/index.d.ts.map +1 -0
  112. package/dist/utils/index.js +23 -0
  113. package/dist/utils/index.js.map +1 -0
  114. package/dist/utils/isomorphic.d.ts +29 -0
  115. package/dist/utils/isomorphic.d.ts.map +1 -0
  116. package/dist/utils/isomorphic.js +139 -0
  117. package/dist/utils/isomorphic.js.map +1 -0
  118. package/dist/utils/mime-types.d.ts +13 -0
  119. package/dist/utils/mime-types.d.ts.map +1 -0
  120. package/dist/utils/mime-types.js +240 -0
  121. package/dist/utils/mime-types.js.map +1 -0
  122. package/dist/utils/network-sync.d.ts +12 -0
  123. package/dist/utils/network-sync.d.ts.map +1 -0
  124. package/dist/utils/network-sync.js +149 -0
  125. package/dist/utils/network-sync.js.map +1 -0
  126. package/dist/utils/pure.d.ts +25 -0
  127. package/dist/utils/pure.d.ts.map +1 -0
  128. package/dist/utils/pure.js +112 -0
  129. package/dist/utils/pure.js.map +1 -0
  130. package/dist/utils/repo-factory.d.ts +11 -0
  131. package/dist/utils/repo-factory.d.ts.map +1 -0
  132. package/dist/utils/repo-factory.js +77 -0
  133. package/dist/utils/repo-factory.js.map +1 -0
  134. package/package.json +83 -0
  135. package/src/cli/commands.ts +1053 -0
  136. package/src/cli/index.ts +2 -0
  137. package/src/cli.ts +287 -0
  138. package/src/config/index.ts +334 -0
  139. package/src/core/change-detection.ts +484 -0
  140. package/src/core/index.ts +5 -0
  141. package/src/core/move-detection.ts +269 -0
  142. package/src/core/snapshot.ts +285 -0
  143. package/src/core/sync-engine.ts +1167 -0
  144. package/src/index.ts +14 -0
  145. package/src/types/config.ts +130 -0
  146. package/src/types/documents.ts +72 -0
  147. package/src/types/index.ts +8 -0
  148. package/src/types/snapshot.ts +88 -0
  149. package/src/utils/content-similarity.ts +194 -0
  150. package/src/utils/content.ts +28 -0
  151. package/src/utils/fs.ts +289 -0
  152. package/src/utils/index.ts +8 -0
  153. package/src/utils/mime-types.ts +236 -0
  154. package/src/utils/network-sync.ts +153 -0
  155. package/src/utils/repo-factory.ts +58 -0
  156. package/test/README-TESTING-GAPS.md +174 -0
  157. package/test/integration/README.md +328 -0
  158. package/test/integration/clone-test.sh +310 -0
  159. package/test/integration/conflict-resolution-test.sh +309 -0
  160. package/test/integration/deletion-behavior-test.sh +487 -0
  161. package/test/integration/deletion-sync-test-simple.sh +193 -0
  162. package/test/integration/deletion-sync-test.sh +297 -0
  163. package/test/integration/exclude-patterns.test.ts +152 -0
  164. package/test/integration/full-integration-test.sh +363 -0
  165. package/test/integration/sync-deletion.test.ts +339 -0
  166. package/test/integration/sync-flow.test.ts +309 -0
  167. package/test/run-tests.sh +225 -0
  168. package/test/unit/content-similarity.test.ts +236 -0
  169. package/test/unit/deletion-behavior.test.ts +260 -0
  170. package/test/unit/enhanced-mime-detection.test.ts +266 -0
  171. package/test/unit/snapshot.test.ts +431 -0
  172. package/test/unit/sync-timing.test.ts +178 -0
  173. package/test/unit/utils.test.ts +368 -0
  174. package/tools/browser-sync/README.md +116 -0
  175. package/tools/browser-sync/package.json +44 -0
  176. package/tools/browser-sync/patchwork.json +1 -0
  177. package/tools/browser-sync/pnpm-lock.yaml +4202 -0
  178. package/tools/browser-sync/src/components/BrowserSyncTool.tsx +599 -0
  179. package/tools/browser-sync/src/index.ts +20 -0
  180. package/tools/browser-sync/src/polyfills.ts +31 -0
  181. package/tools/browser-sync/src/styles.css +290 -0
  182. package/tools/browser-sync/src/types.ts +27 -0
  183. package/tools/browser-sync/vite.config.ts +25 -0
  184. package/tsconfig.json +22 -0
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ /**
3
+ * Browser-compatible sync engine that adapts the core SyncEngine for browser use
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.BrowserSyncEngine = exports.BrowserRepoFactory = void 0;
40
+ const automerge_repo_1 = require("@automerge/automerge-repo");
41
+ const automerge_repo_storage_indexeddb_1 = require("@automerge/automerge-repo-storage-indexeddb");
42
+ const sync_engine_1 = require("../core/sync-engine");
43
+ const fs_browser_1 = require("../utils/fs-browser");
44
+ const filesystem_adapter_1 = require("./filesystem-adapter");
45
+ require("./globals");
46
+ /**
47
+ * Browser snapshot manager using IndexedDB
48
+ */
49
+ class BrowserSnapshotManager {
50
+ constructor() {
51
+ this.dbName = "pushwork-snapshots";
52
+ this.storeName = "snapshots";
53
+ this.version = 1;
54
+ }
55
+ async save(snapshot, key = "current") {
56
+ const db = await this.openDB();
57
+ const transaction = db.transaction([this.storeName], "readwrite");
58
+ const store = transaction.objectStore(this.storeName);
59
+ const putRequest = store.put({
60
+ key,
61
+ snapshot: JSON.stringify(snapshot, this.snapshotReplacer),
62
+ timestamp: Date.now(),
63
+ });
64
+ await new Promise((resolve, reject) => {
65
+ putRequest.onsuccess = () => resolve(undefined);
66
+ putRequest.onerror = () => reject(putRequest.error);
67
+ });
68
+ db.close();
69
+ }
70
+ async load(key = "current") {
71
+ try {
72
+ const db = await this.openDB();
73
+ const transaction = db.transaction([this.storeName], "readonly");
74
+ const store = transaction.objectStore(this.storeName);
75
+ const request = store.get(key);
76
+ const result = await new Promise((resolve, reject) => {
77
+ request.onsuccess = () => resolve(request.result);
78
+ request.onerror = () => reject(request.error);
79
+ });
80
+ db.close();
81
+ if (result) {
82
+ return JSON.parse(result.snapshot, this.snapshotReviver);
83
+ }
84
+ return null;
85
+ }
86
+ catch (error) {
87
+ console.warn("Failed to load snapshot from IndexedDB:", error);
88
+ return null;
89
+ }
90
+ }
91
+ async backup(key = "current") {
92
+ const snapshot = await this.load(key);
93
+ if (snapshot) {
94
+ await this.save(snapshot, `${key}-backup-${Date.now()}`);
95
+ }
96
+ }
97
+ async openDB() {
98
+ return new Promise((resolve, reject) => {
99
+ const request = window.indexedDB.open(this.dbName, this.version);
100
+ request.onerror = () => reject(request.error);
101
+ request.onsuccess = () => resolve(request.result);
102
+ request.onupgradeneeded = (event) => {
103
+ const db = event.target.result;
104
+ if (!db.objectStoreNames.contains(this.storeName)) {
105
+ db.createObjectStore(this.storeName, { keyPath: "key" });
106
+ }
107
+ };
108
+ });
109
+ }
110
+ snapshotReplacer(key, value) {
111
+ // Handle Map serialization
112
+ if (value instanceof Map) {
113
+ return {
114
+ __type: "Map",
115
+ entries: Array.from(value.entries()),
116
+ };
117
+ }
118
+ return value;
119
+ }
120
+ snapshotReviver(key, value) {
121
+ // Handle Map deserialization
122
+ if (value && value.__type === "Map") {
123
+ return new Map(value.entries);
124
+ }
125
+ return value;
126
+ }
127
+ }
128
+ /**
129
+ * Browser-compatible repo factory
130
+ */
131
+ class BrowserRepoFactory {
132
+ static async create(syncServerUrl, storageId) {
133
+ // Use IndexedDB storage for browser persistence
134
+ const storage = new automerge_repo_storage_indexeddb_1.IndexedDBStorageAdapter("pushwork-repo");
135
+ const repo = new automerge_repo_1.Repo({
136
+ storage,
137
+ network: [], // Network will be added separately if needed
138
+ sharePolicy: async () => false, // Don't auto-share documents
139
+ });
140
+ // Add WebSocket network if sync server provided
141
+ if (syncServerUrl) {
142
+ try {
143
+ const { BrowserWebSocketClientAdapter } = await Promise.resolve().then(() => __importStar(require("@automerge/automerge-repo-network-websocket")));
144
+ const websocketAdapter = new BrowserWebSocketClientAdapter(syncServerUrl);
145
+ repo.networkSubsystem.addNetworkAdapter(websocketAdapter);
146
+ }
147
+ catch (error) {
148
+ console.warn("Failed to setup WebSocket network:", error);
149
+ }
150
+ }
151
+ return repo;
152
+ }
153
+ }
154
+ exports.BrowserRepoFactory = BrowserRepoFactory;
155
+ /**
156
+ * Browser-specific sync engine that adapts filesystem operations
157
+ */
158
+ class BrowserSyncEngine {
159
+ constructor(repo, filesystem = filesystem_adapter_1.browserFS) {
160
+ this.coreEngine = null;
161
+ this.rootPath = "/"; // Virtual root for browser
162
+ this.repo = repo;
163
+ this.filesystem = filesystem;
164
+ this.snapshotManager = new BrowserSnapshotManager();
165
+ }
166
+ /**
167
+ * Initialize with directory picker
168
+ */
169
+ async initializeWithDirectoryPicker() {
170
+ const handle = await this.filesystem.showDirectoryPicker({
171
+ mode: "readwrite",
172
+ id: "pushwork-sync-folder",
173
+ });
174
+ // Set up browser filesystem for utils
175
+ (0, fs_browser_1.setRootDirectoryHandle)(handle);
176
+ // Initialize core engine once we have a directory
177
+ this.coreEngine = new sync_engine_1.SyncEngine(this.repo, this.rootPath, [".git", "node_modules", ".pushwork", "*.tmp"], // default excludes
178
+ true // network sync enabled
179
+ );
180
+ return handle;
181
+ }
182
+ /**
183
+ * Get current browser sync state
184
+ */
185
+ getSyncState() {
186
+ return this.filesystem.getSyncState();
187
+ }
188
+ /**
189
+ * Commit local changes from browser directory
190
+ */
191
+ async commitLocal(dryRun = false) {
192
+ if (!this.coreEngine) {
193
+ throw new Error("Sync engine not initialized. Call initializeWithDirectoryPicker() first.");
194
+ }
195
+ // Create browser-adapted version of commit
196
+ return this.adaptedSync(dryRun, false);
197
+ }
198
+ /**
199
+ * Full bidirectional sync
200
+ */
201
+ async sync(dryRun = false) {
202
+ if (!this.coreEngine) {
203
+ throw new Error("Sync engine not initialized. Call initializeWithDirectoryPicker() first.");
204
+ }
205
+ return this.adaptedSync(dryRun, true);
206
+ }
207
+ /**
208
+ * Adapted sync that works with browser filesystem
209
+ */
210
+ async adaptedSync(dryRun, fullSync) {
211
+ const result = {
212
+ success: false,
213
+ filesChanged: 0,
214
+ directoriesChanged: 0,
215
+ errors: [],
216
+ warnings: [],
217
+ };
218
+ try {
219
+ // Load browser snapshot
220
+ let snapshot = await this.snapshotManager.load();
221
+ if (!snapshot) {
222
+ // Create initial snapshot structure adapted for browser
223
+ snapshot = {
224
+ timestamp: Date.now(),
225
+ files: new Map(),
226
+ directories: new Map(),
227
+ rootDirectoryUrl: undefined,
228
+ rootPath: "/", // Virtual root for browser
229
+ };
230
+ }
231
+ const syncState = this.getSyncState();
232
+ if (!syncState.rootHandle || !syncState.hasPermission) {
233
+ throw new Error("No directory selected or permission denied");
234
+ }
235
+ // Get directory listing from browser filesystem
236
+ const entries = await this.filesystem.listDirectory(syncState.rootHandle, true, // recursive
237
+ [".git", "node_modules", ".pushwork", "*.tmp"]);
238
+ console.log(`🔍 Found ${entries.length} entries in browser directory`);
239
+ // For now, implement a simplified sync that demonstrates the concept
240
+ // In a full implementation, this would:
241
+ // 1. Detect changes by comparing entries with snapshot
242
+ // 2. Apply changes to Automerge documents
243
+ // 3. Pull remote changes and apply to browser filesystem
244
+ // 4. Update snapshot
245
+ if (!dryRun && snapshot) {
246
+ await this.snapshotManager.save(snapshot);
247
+ }
248
+ result.success = true;
249
+ result.filesChanged = entries.length;
250
+ return result;
251
+ }
252
+ catch (error) {
253
+ console.error("Browser sync failed:", error);
254
+ result.errors.push({
255
+ path: this.rootPath,
256
+ operation: fullSync ? "sync" : "commit",
257
+ error: error instanceof Error ? error : new Error(String(error)),
258
+ recoverable: true,
259
+ });
260
+ return result;
261
+ }
262
+ }
263
+ /**
264
+ * Get sync status
265
+ */
266
+ async getStatus() {
267
+ const snapshot = await this.snapshotManager.load();
268
+ const browserState = this.getSyncState();
269
+ return {
270
+ snapshot,
271
+ hasChanges: false, // TODO: implement change detection
272
+ changeCount: 0,
273
+ lastSync: snapshot ? new Date(snapshot.timestamp) : null,
274
+ browserState,
275
+ };
276
+ }
277
+ /**
278
+ * Set root directory URL for sharing
279
+ */
280
+ async setRootDirectoryUrl(url) {
281
+ let snapshot = await this.snapshotManager.load();
282
+ if (!snapshot) {
283
+ snapshot = {
284
+ timestamp: Date.now(),
285
+ files: new Map(),
286
+ directories: new Map(),
287
+ rootDirectoryUrl: undefined,
288
+ rootPath: "/", // Virtual root for browser
289
+ };
290
+ }
291
+ snapshot.rootDirectoryUrl = url; // AutomergeUrl type
292
+ await this.snapshotManager.save(snapshot);
293
+ }
294
+ /**
295
+ * Get root directory URL for sharing
296
+ */
297
+ async getRootDirectoryUrl() {
298
+ const snapshot = await this.snapshotManager.load();
299
+ return snapshot?.rootDirectoryUrl || null;
300
+ }
301
+ }
302
+ exports.BrowserSyncEngine = BrowserSyncEngine;
303
+ //# sourceMappingURL=browser-sync-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-sync-engine.js","sourceRoot":"","sources":["../../src/browser/browser-sync-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Browser filesystem adapter using File System Access API with browser-fs-access fallbacks
3
+ */
4
+ import { FileSystemEntry } from "../types";
5
+ import { BrowserDirectoryHandle, BrowserFileHandle, DirectoryPickerOptions, BrowserSyncState } from "./types";
6
+ import "./globals";
7
+ /**
8
+ * Browser filesystem adapter that provides Node.js fs-like interface
9
+ * using File System Access API with graceful fallbacks
10
+ */
11
+ export declare class BrowserFilesystemAdapter {
12
+ private state;
13
+ /**
14
+ * Check if File System Access API is supported
15
+ */
16
+ private checkSupport;
17
+ /**
18
+ * Check if File System Access API is supported
19
+ */
20
+ isSupported(): boolean;
21
+ /**
22
+ * Get current sync state
23
+ */
24
+ getSyncState(): BrowserSyncState;
25
+ /**
26
+ * Show directory picker and set as root directory
27
+ */
28
+ showDirectoryPicker(options?: DirectoryPickerOptions): Promise<BrowserDirectoryHandle>;
29
+ /**
30
+ * Read file content as string or Uint8Array
31
+ */
32
+ readFileContent(handle: BrowserFileHandle): Promise<string | Uint8Array>;
33
+ /**
34
+ * Write file content from string or Uint8Array
35
+ */
36
+ writeFileContent(handle: BrowserFileHandle, content: string | Uint8Array): Promise<void>;
37
+ /**
38
+ * List directory contents with metadata
39
+ */
40
+ listDirectory(dirHandle: BrowserDirectoryHandle, recursive?: boolean, excludePatterns?: string[]): Promise<FileSystemEntry[]>;
41
+ /**
42
+ * Create a file in the given directory
43
+ */
44
+ createFile(dirHandle: BrowserDirectoryHandle, fileName: string, content: string | Uint8Array): Promise<BrowserFileHandle>;
45
+ /**
46
+ * Create a directory
47
+ */
48
+ createDirectory(dirHandle: BrowserDirectoryHandle, dirName: string): Promise<BrowserDirectoryHandle>;
49
+ /**
50
+ * Remove a file or directory
51
+ */
52
+ removeEntry(dirHandle: BrowserDirectoryHandle, name: string, recursive?: boolean): Promise<void>;
53
+ /**
54
+ * Get file handle by path relative to root
55
+ */
56
+ getFileHandle(relativePath: string): Promise<BrowserFileHandle | null>;
57
+ /**
58
+ * Get directory handle by path relative to root
59
+ */
60
+ getDirectoryHandle(relativePath: string): Promise<BrowserDirectoryHandle | null>;
61
+ /**
62
+ * Check if file is text or binary
63
+ */
64
+ private isTextFile;
65
+ /**
66
+ * Recursive directory listing helper
67
+ */
68
+ private listDirectoryRecursive;
69
+ /**
70
+ * Check if path should be excluded
71
+ */
72
+ private isExcluded;
73
+ /**
74
+ * Create a virtual directory handle from browser-fs-access files
75
+ * (for browsers that don't support File System Access API)
76
+ */
77
+ private createVirtualDirectoryHandle;
78
+ /**
79
+ * Create a virtual file handle from a File object
80
+ */
81
+ private createVirtualFileHandle;
82
+ }
83
+ export declare const browserFS: BrowserFilesystemAdapter;
84
+ //# sourceMappingURL=filesystem-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-adapter.d.ts","sourceRoot":"","sources":["../../src/browser/filesystem-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAY,MAAM,UAAU,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EAEjB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,WAAW,CAAC;AAEnB;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,KAAK,CAIX;IAEF;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,YAAY,IAAI,gBAAgB;IAIhC;;OAEG;IACG,mBAAmB,CACvB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC;IAqClC;;OAEG;IACG,eAAe,CACnB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC;IAgB/B;;OAEG;IACG,gBAAgB,CACpB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,sBAAsB,EACjC,SAAS,UAAQ,EACjB,eAAe,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC;IAkB7B;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,sBAAsB,EACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,OAAO,CAAC,iBAAiB,CAAC;IAQ7B;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,sBAAsB,EACjC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,sBAAsB,CAAC;IAIlC;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,sBAAsB,EACjC,IAAI,EAAE,MAAM,EACZ,SAAS,UAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAiC5E;;OAEG;IACG,kBAAkB,CACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IA6BzC;;OAEG;YACW,UAAU;IAsBxB;;OAEG;YACW,sBAAsB;IAkDpC;;OAEG;IACH,OAAO,CAAC,UAAU;IA8BlB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA+DpC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAsBhC;AAGD,eAAO,MAAM,SAAS,0BAAiC,CAAC"}