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,240 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getEnhancedMimeType = getEnhancedMimeType;
37
+ exports.shouldForceAsText = shouldForceAsText;
38
+ exports.isEnhancedTextFile = isEnhancedTextFile;
39
+ const mimeTypes = __importStar(require("mime-types"));
40
+ /**
41
+ * Custom MIME type definitions for developer files
42
+ * Based on patchwork-cli's approach
43
+ */
44
+ const CUSTOM_MIME_TYPES = {
45
+ // TypeScript files - override the incorrect video/mp2t detection
46
+ ".ts": "text/typescript",
47
+ ".tsx": "text/tsx",
48
+ // Config file formats
49
+ ".json": "application/json",
50
+ ".yaml": "text/yaml",
51
+ ".yml": "text/yaml",
52
+ ".toml": "application/toml",
53
+ ".ini": "text/plain",
54
+ ".conf": "text/plain",
55
+ ".config": "text/plain",
56
+ // Vue.js single file components
57
+ ".vue": "text/vue",
58
+ // Modern CSS preprocessors
59
+ ".scss": "text/scss",
60
+ ".sass": "text/sass",
61
+ ".less": "text/less",
62
+ ".styl": "text/stylus",
63
+ // Modern JavaScript variants
64
+ ".mjs": "application/javascript",
65
+ ".cjs": "application/javascript",
66
+ // React JSX
67
+ ".jsx": "text/jsx",
68
+ // Svelte components
69
+ ".svelte": "text/svelte",
70
+ // Web assembly
71
+ ".wasm": "application/wasm",
72
+ // Other common dev files
73
+ ".d.ts": "text/typescript",
74
+ ".map": "application/json", // Source maps
75
+ ".env": "text/plain",
76
+ ".gitignore": "text/plain",
77
+ ".gitattributes": "text/plain",
78
+ ".editorconfig": "text/plain",
79
+ ".prettierrc": "application/json",
80
+ ".eslintrc": "application/json",
81
+ ".babelrc": "application/json",
82
+ // Documentation formats
83
+ ".mdx": "text/markdown",
84
+ ".rst": "text/x-rst",
85
+ // Docker files
86
+ Dockerfile: "text/plain",
87
+ ".dockerignore": "text/plain",
88
+ // Package manager files
89
+ "package.json": "application/json",
90
+ "package-lock.json": "application/json",
91
+ "yarn.lock": "text/plain",
92
+ "pnpm-lock.yaml": "text/yaml",
93
+ "composer.json": "application/json",
94
+ Pipfile: "text/plain",
95
+ "requirements.txt": "text/plain",
96
+ // Build tool configs
97
+ "webpack.config.js": "application/javascript",
98
+ "vite.config.js": "application/javascript",
99
+ "rollup.config.js": "application/javascript",
100
+ "tsconfig.json": "application/json",
101
+ "jsconfig.json": "application/json",
102
+ };
103
+ /**
104
+ * File extensions that should always be treated as text
105
+ * regardless of MIME type detection
106
+ */
107
+ const FORCE_TEXT_EXTENSIONS = new Set([
108
+ ".ts",
109
+ ".tsx",
110
+ ".jsx",
111
+ ".vue",
112
+ ".svelte",
113
+ ".scss",
114
+ ".sass",
115
+ ".less",
116
+ ".styl",
117
+ ".env",
118
+ ".gitignore",
119
+ ".gitattributes",
120
+ ".editorconfig",
121
+ ".d.ts",
122
+ ".map",
123
+ ".mdx",
124
+ ".rst",
125
+ ".toml",
126
+ ".ini",
127
+ ".conf",
128
+ ".config",
129
+ ".lock",
130
+ ]);
131
+ /**
132
+ * Get enhanced MIME type for file with custom dev file support
133
+ */
134
+ function getEnhancedMimeType(filePath) {
135
+ const filename = filePath.split("/").pop() || "";
136
+ const extension = getFileExtension(filePath);
137
+ // Check custom definitions first (by extension)
138
+ if (extension && CUSTOM_MIME_TYPES[extension]) {
139
+ return CUSTOM_MIME_TYPES[extension];
140
+ }
141
+ // Check custom definitions by full filename
142
+ if (CUSTOM_MIME_TYPES[filename]) {
143
+ return CUSTOM_MIME_TYPES[filename];
144
+ }
145
+ // Fall back to standard mime-types library
146
+ const standardMime = mimeTypes.lookup(filePath);
147
+ if (standardMime) {
148
+ return standardMime;
149
+ }
150
+ // Final fallback
151
+ return "application/octet-stream";
152
+ }
153
+ /**
154
+ * Check if file extension should be forced to text type
155
+ */
156
+ function shouldForceAsText(filePath) {
157
+ const extension = getFileExtension(filePath);
158
+ return extension ? FORCE_TEXT_EXTENSIONS.has(extension) : false;
159
+ }
160
+ /**
161
+ * Get file extension including the dot (internal helper)
162
+ */
163
+ function getFileExtension(filePath) {
164
+ const match = filePath.match(/\.[^.]*$/);
165
+ return match ? match[0] : "";
166
+ }
167
+ /**
168
+ * Enhanced text file detection with developer file support
169
+ */
170
+ async function isEnhancedTextFile(filePath) {
171
+ // Force certain extensions to be treated as text
172
+ if (shouldForceAsText(filePath)) {
173
+ return true;
174
+ }
175
+ // Check MIME type
176
+ const mimeType = getEnhancedMimeType(filePath);
177
+ if (isTextMimeType(mimeType)) {
178
+ return true;
179
+ }
180
+ // If it's a known binary type (but not the generic fallback), don't fall back to content detection
181
+ if (isBinaryMimeType(mimeType) && mimeType !== "application/octet-stream") {
182
+ return false;
183
+ }
184
+ // For generic octet-stream or unknown types, use content-based detection
185
+ return isTextByContent(filePath);
186
+ }
187
+ /**
188
+ * Check if MIME type indicates text content
189
+ */
190
+ function isTextMimeType(mimeType) {
191
+ return (mimeType.startsWith("text/") ||
192
+ mimeType === "application/json" ||
193
+ mimeType === "application/xml" ||
194
+ mimeType === "application/javascript" ||
195
+ mimeType === "application/typescript" ||
196
+ mimeType === "application/toml" ||
197
+ mimeType.includes("javascript") ||
198
+ mimeType.includes("typescript") ||
199
+ mimeType.includes("json") ||
200
+ mimeType.includes("xml"));
201
+ }
202
+ /**
203
+ * Check if MIME type indicates binary content
204
+ */
205
+ function isBinaryMimeType(mimeType) {
206
+ return (mimeType.startsWith("image/") ||
207
+ mimeType.startsWith("video/") ||
208
+ mimeType.startsWith("audio/") ||
209
+ mimeType.startsWith("font/") ||
210
+ mimeType === "application/zip" ||
211
+ mimeType === "application/pdf" ||
212
+ mimeType === "application/octet-stream" ||
213
+ mimeType === "application/wasm" ||
214
+ mimeType.includes("binary"));
215
+ }
216
+ /**
217
+ * Content-based text detection (fallback method)
218
+ */
219
+ async function isTextByContent(filePath) {
220
+ try {
221
+ const fs = await Promise.resolve().then(() => __importStar(require("fs/promises")));
222
+ // Sample first 8KB to detect binary content
223
+ const handle = await fs.open(filePath, "r");
224
+ const stats = await handle.stat();
225
+ const sampleSize = Math.min(8192, stats.size);
226
+ if (sampleSize === 0) {
227
+ await handle.close();
228
+ return true; // Empty file is text
229
+ }
230
+ const buffer = Buffer.alloc(sampleSize);
231
+ await handle.read(buffer, 0, sampleSize, 0);
232
+ await handle.close();
233
+ // Check for null bytes which indicate binary content
234
+ return !buffer.includes(0);
235
+ }
236
+ catch {
237
+ return false;
238
+ }
239
+ }
240
+ //# sourceMappingURL=mime-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime-types.js","sourceRoot":"","sources":["../../src/utils/mime-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { DocHandle, StorageId } from "@automerge/automerge-repo";
2
+ /**
3
+ * Wait for documents to sync to the remote server
4
+ * Based on patchwork-cli implementation with timeout for debugging
5
+ */
6
+ export declare function waitForSync(handlesToWaitOn: DocHandle<unknown>[], syncServerStorageId?: StorageId, timeoutMs?: number): Promise<void>;
7
+ /**
8
+ * Get the storage ID for the sync server
9
+ * Using the same ID as patchwork-cli for consistency
10
+ */
11
+ export declare function getSyncServerStorageId(customStorageId?: string): StorageId;
12
+ //# sourceMappingURL=network-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-sync.d.ts","sourceRoot":"","sources":["../../src/utils/network-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGjE;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,eAAe,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EACrC,mBAAmB,CAAC,EAAE,SAAS,EAC/B,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,IAAI,CAAC,CAoIf;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAG1E"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.waitForSync = waitForSync;
37
+ exports.getSyncServerStorageId = getSyncServerStorageId;
38
+ const A = __importStar(require("@automerge/automerge"));
39
+ /**
40
+ * Wait for documents to sync to the remote server
41
+ * Based on patchwork-cli implementation with timeout for debugging
42
+ */
43
+ async function waitForSync(handlesToWaitOn, syncServerStorageId, timeoutMs = 60000 // 60 second timeout for debugging
44
+ ) {
45
+ if (!syncServerStorageId) {
46
+ console.warn("No sync server storage ID provided. Skipping network sync wait.");
47
+ return;
48
+ }
49
+ if (handlesToWaitOn.length === 0) {
50
+ console.log("🔄 No documents to sync");
51
+ return;
52
+ }
53
+ // Debug logging only in verbose mode (can be controlled via env var later)
54
+ const verbose = false;
55
+ if (verbose) {
56
+ console.log(`🔄 Waiting for ${handlesToWaitOn.length} documents to sync...`);
57
+ console.log(`📡 Using sync server storage ID: ${syncServerStorageId}`);
58
+ handlesToWaitOn.forEach((handle, i) => {
59
+ const localHeads = handle.heads();
60
+ const syncInfo = handle.getSyncInfo(syncServerStorageId);
61
+ const remoteHeads = syncInfo?.lastHeads;
62
+ console.log(` 📄 Document ${i + 1}: ${handle.url}`);
63
+ console.log(` 🏠 Local heads: ${JSON.stringify(localHeads)}`);
64
+ console.log(` 🌐 Remote heads: ${JSON.stringify(remoteHeads)}`);
65
+ console.log(` ✅ Already synced: ${A.equals(localHeads, remoteHeads)}`);
66
+ });
67
+ }
68
+ const promises = handlesToWaitOn.map((handle, index) => new Promise((resolve, reject) => {
69
+ const timeout = setTimeout(() => {
70
+ const localHeads = handle.heads();
71
+ const syncInfo = handle.getSyncInfo(syncServerStorageId);
72
+ const remoteHeads = syncInfo?.lastHeads;
73
+ console.log(`⏰ TIMEOUT for document ${index + 1}: ${handle.url}`);
74
+ console.log(` Final local heads: ${JSON.stringify(localHeads)}`);
75
+ console.log(` Final remote heads: ${JSON.stringify(remoteHeads)}`);
76
+ reject(new Error(`Sync timeout after ${timeoutMs}ms for document ${handle.url}`));
77
+ }, timeoutMs);
78
+ const checkSync = () => {
79
+ const newHeads = handle.heads();
80
+ const syncInfo = handle.getSyncInfo(syncServerStorageId);
81
+ const remoteHeads = syncInfo?.lastHeads;
82
+ if (verbose) {
83
+ console.log(`🔍 Checking sync for ${handle.url}:`);
84
+ console.log(` Local heads: ${JSON.stringify(newHeads)}`);
85
+ console.log(` Remote heads: ${JSON.stringify(remoteHeads)}`);
86
+ console.log(` Heads equal: ${A.equals(newHeads, remoteHeads)}`);
87
+ }
88
+ // If the remote heads are already up to date, we can resolve immediately
89
+ if (A.equals(newHeads, remoteHeads)) {
90
+ if (verbose) {
91
+ console.log(`✅ Document ${index + 1} synced: ${handle.url}`);
92
+ }
93
+ clearTimeout(timeout);
94
+ resolve();
95
+ return true;
96
+ }
97
+ return false;
98
+ };
99
+ // Check if already synced
100
+ if (checkSync()) {
101
+ return;
102
+ }
103
+ // Otherwise, wait for remote-heads event
104
+ const onRemoteHeads = ({ storageId, heads, }) => {
105
+ if (verbose) {
106
+ console.log(`📡 Received remote heads event for ${handle.url}:`);
107
+ console.log(` Event storage ID: ${storageId}`);
108
+ console.log(` Expected storage ID: ${syncServerStorageId}`);
109
+ console.log(` Event heads: ${JSON.stringify(heads)}`);
110
+ console.log(` Current local heads: ${JSON.stringify(handle.heads())}`);
111
+ }
112
+ if (storageId === syncServerStorageId &&
113
+ A.equals(handle.heads(), heads)) {
114
+ if (verbose) {
115
+ console.log(`✅ Document ${index + 1} synced via event: ${handle.url}`);
116
+ }
117
+ clearTimeout(timeout);
118
+ handle.off("remote-heads", onRemoteHeads);
119
+ resolve();
120
+ }
121
+ else if (verbose) {
122
+ console.log(`❌ Heads/storage mismatch for ${handle.url}`);
123
+ }
124
+ };
125
+ if (verbose) {
126
+ console.log(`👂 Listening for remote-heads events on ${handle.url}`);
127
+ }
128
+ handle.on("remote-heads", onRemoteHeads);
129
+ }));
130
+ try {
131
+ await Promise.all(promises);
132
+ if (verbose) {
133
+ console.log("✅ All documents synced to network");
134
+ }
135
+ }
136
+ catch (error) {
137
+ console.error(`❌ Sync wait failed: ${error}`);
138
+ throw error;
139
+ }
140
+ }
141
+ /**
142
+ * Get the storage ID for the sync server
143
+ * Using the same ID as patchwork-cli for consistency
144
+ */
145
+ function getSyncServerStorageId(customStorageId) {
146
+ return (customStorageId ||
147
+ "3760df37-a4c6-4f66-9ecd-732039a9385d");
148
+ }
149
+ //# sourceMappingURL=network-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-sync.js","sourceRoot":"","sources":["../../src/utils/network-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pure utility functions that work in both Node.js and browser environments
3
+ * These functions don't depend on any platform-specific APIs
4
+ */
5
+ /**
6
+ * Get file extension from a file path
7
+ */
8
+ export declare function getFileExtension(filePath: string): string;
9
+ /**
10
+ * Normalize file path to use forward slashes and resolve relative components
11
+ */
12
+ export declare function normalizePath(filePath: string): string;
13
+ /**
14
+ * Get relative path from base to target
15
+ */
16
+ export declare function getRelativePath(basePath: string, targetPath: string): string;
17
+ /**
18
+ * Simple content hash calculation (browser-compatible)
19
+ */
20
+ export declare function calculateContentHash(content: string | Uint8Array): string;
21
+ /**
22
+ * Check if a path matches any of the exclude patterns
23
+ */
24
+ export declare function matchesExcludePatterns(path: string, patterns: string[]): boolean;
25
+ //# sourceMappingURL=pure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pure.d.ts","sourceRoot":"","sources":["../../src/utils/pure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8BtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA6B5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAYzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAUT"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * Pure utility functions that work in both Node.js and browser environments
4
+ * These functions don't depend on any platform-specific APIs
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getFileExtension = getFileExtension;
8
+ exports.normalizePath = normalizePath;
9
+ exports.getRelativePath = getRelativePath;
10
+ exports.calculateContentHash = calculateContentHash;
11
+ exports.matchesExcludePatterns = matchesExcludePatterns;
12
+ /**
13
+ * Get file extension from a file path
14
+ */
15
+ function getFileExtension(filePath) {
16
+ const parts = filePath.split(".");
17
+ if (parts.length < 2)
18
+ return "";
19
+ const ext = parts[parts.length - 1];
20
+ return ext.startsWith(".") ? ext : `.${ext}`;
21
+ }
22
+ /**
23
+ * Normalize file path to use forward slashes and resolve relative components
24
+ */
25
+ function normalizePath(filePath) {
26
+ // Convert backslashes to forward slashes
27
+ let normalized = filePath.replace(/\\/g, "/");
28
+ // Split into parts and process
29
+ const parts = normalized.split("/");
30
+ const result = [];
31
+ for (const part of parts) {
32
+ if (part === "" && result.length === 0) {
33
+ // Leading slash - keep it
34
+ result.push("");
35
+ }
36
+ else if (part === "" || part === ".") {
37
+ // Empty or current directory - skip
38
+ continue;
39
+ }
40
+ else if (part === "..") {
41
+ // Parent directory
42
+ if (result.length > 0 && result[result.length - 1] !== "..") {
43
+ result.pop();
44
+ }
45
+ else if (result.length === 0 || result[0] !== "") {
46
+ // Not an absolute path, can go up
47
+ result.push("..");
48
+ }
49
+ }
50
+ else {
51
+ result.push(part);
52
+ }
53
+ }
54
+ const final = result.join("/");
55
+ return final || (filePath.startsWith("/") ? "/" : ".");
56
+ }
57
+ /**
58
+ * Get relative path from base to target
59
+ */
60
+ function getRelativePath(basePath, targetPath) {
61
+ const base = normalizePath(basePath)
62
+ .split("/")
63
+ .filter((p) => p !== "");
64
+ const target = normalizePath(targetPath)
65
+ .split("/")
66
+ .filter((p) => p !== "");
67
+ // Find common prefix length
68
+ let commonLength = 0;
69
+ for (let i = 0; i < Math.min(base.length, target.length); i++) {
70
+ if (base[i] === target[i]) {
71
+ commonLength++;
72
+ }
73
+ else {
74
+ break;
75
+ }
76
+ }
77
+ // Build relative path
78
+ const upLevels = base.length - commonLength;
79
+ const downPath = target.slice(commonLength);
80
+ const parts = [];
81
+ for (let i = 0; i < upLevels; i++) {
82
+ parts.push("..");
83
+ }
84
+ parts.push(...downPath);
85
+ return parts.length === 0 ? "." : parts.join("/");
86
+ }
87
+ /**
88
+ * Simple content hash calculation (browser-compatible)
89
+ */
90
+ function calculateContentHash(content) {
91
+ let hash = 0;
92
+ const str = typeof content === "string" ? content : new TextDecoder().decode(content);
93
+ for (let i = 0; i < str.length; i++) {
94
+ const char = str.charCodeAt(i);
95
+ hash = (hash << 5) - hash + char;
96
+ hash = hash & hash; // Convert to 32-bit integer
97
+ }
98
+ return Math.abs(hash).toString(16);
99
+ }
100
+ /**
101
+ * Check if a path matches any of the exclude patterns
102
+ */
103
+ function matchesExcludePatterns(path, patterns) {
104
+ return patterns.some((pattern) => {
105
+ // Simple glob pattern matching
106
+ const regex = new RegExp("^" +
107
+ pattern.replace(/\./g, "\\.").replace(/\*/g, ".*").replace(/\?/g, ".") +
108
+ "$");
109
+ return regex.test(path);
110
+ });
111
+ }
112
+ //# sourceMappingURL=pure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pure.js","sourceRoot":"","sources":["../../src/utils/pure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Repo } from "@automerge/automerge-repo";
2
+ export interface RepoFactoryOptions {
3
+ enableNetwork?: boolean;
4
+ syncServer?: string;
5
+ syncServerStorageId?: string;
6
+ }
7
+ /**
8
+ * Create an Automerge repository with configuration-based setup
9
+ */
10
+ export declare function createRepo(workingDir: string, options?: RepoFactoryOptions): Promise<Repo>;
11
+ //# sourceMappingURL=repo-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-factory.d.ts","sourceRoot":"","sources":["../../src/utils/repo-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,2BAA2B,CAAC;AAO5D,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAsCf"}