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.
- package/README.md +460 -0
- package/dist/browser/browser-sync-engine.d.ts +64 -0
- package/dist/browser/browser-sync-engine.d.ts.map +1 -0
- package/dist/browser/browser-sync-engine.js +303 -0
- package/dist/browser/browser-sync-engine.js.map +1 -0
- package/dist/browser/filesystem-adapter.d.ts +84 -0
- package/dist/browser/filesystem-adapter.d.ts.map +1 -0
- package/dist/browser/filesystem-adapter.js +413 -0
- package/dist/browser/filesystem-adapter.js.map +1 -0
- package/dist/browser/index.d.ts +36 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +90 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/types.d.ts +70 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +6 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/cli/commands.d.ts +71 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +794 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +199 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +71 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +314 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/change-detection.d.ts +78 -0
- package/dist/core/change-detection.d.ts.map +1 -0
- package/dist/core/change-detection.js +370 -0
- package/dist/core/change-detection.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +22 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/isomorphic-snapshot.d.ts +58 -0
- package/dist/core/isomorphic-snapshot.d.ts.map +1 -0
- package/dist/core/isomorphic-snapshot.js +204 -0
- package/dist/core/isomorphic-snapshot.js.map +1 -0
- package/dist/core/move-detection.d.ts +72 -0
- package/dist/core/move-detection.d.ts.map +1 -0
- package/dist/core/move-detection.js +200 -0
- package/dist/core/move-detection.js.map +1 -0
- package/dist/core/snapshot.d.ts +109 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/core/snapshot.js +263 -0
- package/dist/core/snapshot.js.map +1 -0
- package/dist/core/sync-engine.d.ts +110 -0
- package/dist/core/sync-engine.d.ts.map +1 -0
- package/dist/core/sync-engine.js +817 -0
- package/dist/core/sync-engine.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/browser-filesystem.d.ts +26 -0
- package/dist/platform/browser-filesystem.d.ts.map +1 -0
- package/dist/platform/browser-filesystem.js +91 -0
- package/dist/platform/browser-filesystem.js.map +1 -0
- package/dist/platform/filesystem.d.ts +29 -0
- package/dist/platform/filesystem.d.ts.map +1 -0
- package/dist/platform/filesystem.js +65 -0
- package/dist/platform/filesystem.js.map +1 -0
- package/dist/platform/node-filesystem.d.ts +21 -0
- package/dist/platform/node-filesystem.d.ts.map +1 -0
- package/dist/platform/node-filesystem.js +93 -0
- package/dist/platform/node-filesystem.js.map +1 -0
- package/dist/types/config.d.ts +119 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/documents.d.ts +70 -0
- package/dist/types/documents.d.ts.map +1 -0
- package/dist/types/documents.js +23 -0
- package/dist/types/documents.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/snapshot.d.ts +81 -0
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +17 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/utils/content-similarity.d.ts +53 -0
- package/dist/utils/content-similarity.d.ts.map +1 -0
- package/dist/utils/content-similarity.js +155 -0
- package/dist/utils/content-similarity.js.map +1 -0
- package/dist/utils/content.d.ts +5 -0
- package/dist/utils/content.d.ts.map +1 -0
- package/dist/utils/content.js +30 -0
- package/dist/utils/content.js.map +1 -0
- package/dist/utils/fs-browser.d.ts +57 -0
- package/dist/utils/fs-browser.d.ts.map +1 -0
- package/dist/utils/fs-browser.js +311 -0
- package/dist/utils/fs-browser.js.map +1 -0
- package/dist/utils/fs-node.d.ts +53 -0
- package/dist/utils/fs-node.d.ts.map +1 -0
- package/dist/utils/fs-node.js +220 -0
- package/dist/utils/fs-node.js.map +1 -0
- package/dist/utils/fs.d.ts +62 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +293 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +23 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/isomorphic.d.ts +29 -0
- package/dist/utils/isomorphic.d.ts.map +1 -0
- package/dist/utils/isomorphic.js +139 -0
- package/dist/utils/isomorphic.js.map +1 -0
- package/dist/utils/mime-types.d.ts +13 -0
- package/dist/utils/mime-types.d.ts.map +1 -0
- package/dist/utils/mime-types.js +240 -0
- package/dist/utils/mime-types.js.map +1 -0
- package/dist/utils/network-sync.d.ts +12 -0
- package/dist/utils/network-sync.d.ts.map +1 -0
- package/dist/utils/network-sync.js +149 -0
- package/dist/utils/network-sync.js.map +1 -0
- package/dist/utils/pure.d.ts +25 -0
- package/dist/utils/pure.d.ts.map +1 -0
- package/dist/utils/pure.js +112 -0
- package/dist/utils/pure.js.map +1 -0
- package/dist/utils/repo-factory.d.ts +11 -0
- package/dist/utils/repo-factory.d.ts.map +1 -0
- package/dist/utils/repo-factory.js +77 -0
- package/dist/utils/repo-factory.js.map +1 -0
- package/package.json +83 -0
- package/src/cli/commands.ts +1053 -0
- package/src/cli/index.ts +2 -0
- package/src/cli.ts +287 -0
- package/src/config/index.ts +334 -0
- package/src/core/change-detection.ts +484 -0
- package/src/core/index.ts +5 -0
- package/src/core/move-detection.ts +269 -0
- package/src/core/snapshot.ts +285 -0
- package/src/core/sync-engine.ts +1167 -0
- package/src/index.ts +14 -0
- package/src/types/config.ts +130 -0
- package/src/types/documents.ts +72 -0
- package/src/types/index.ts +8 -0
- package/src/types/snapshot.ts +88 -0
- package/src/utils/content-similarity.ts +194 -0
- package/src/utils/content.ts +28 -0
- package/src/utils/fs.ts +289 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/mime-types.ts +236 -0
- package/src/utils/network-sync.ts +153 -0
- package/src/utils/repo-factory.ts +58 -0
- package/test/README-TESTING-GAPS.md +174 -0
- package/test/integration/README.md +328 -0
- package/test/integration/clone-test.sh +310 -0
- package/test/integration/conflict-resolution-test.sh +309 -0
- package/test/integration/deletion-behavior-test.sh +487 -0
- package/test/integration/deletion-sync-test-simple.sh +193 -0
- package/test/integration/deletion-sync-test.sh +297 -0
- package/test/integration/exclude-patterns.test.ts +152 -0
- package/test/integration/full-integration-test.sh +363 -0
- package/test/integration/sync-deletion.test.ts +339 -0
- package/test/integration/sync-flow.test.ts +309 -0
- package/test/run-tests.sh +225 -0
- package/test/unit/content-similarity.test.ts +236 -0
- package/test/unit/deletion-behavior.test.ts +260 -0
- package/test/unit/enhanced-mime-detection.test.ts +266 -0
- package/test/unit/snapshot.test.ts +431 -0
- package/test/unit/sync-timing.test.ts +178 -0
- package/test/unit/utils.test.ts +368 -0
- package/tools/browser-sync/README.md +116 -0
- package/tools/browser-sync/package.json +44 -0
- package/tools/browser-sync/patchwork.json +1 -0
- package/tools/browser-sync/pnpm-lock.yaml +4202 -0
- package/tools/browser-sync/src/components/BrowserSyncTool.tsx +599 -0
- package/tools/browser-sync/src/index.ts +20 -0
- package/tools/browser-sync/src/polyfills.ts +31 -0
- package/tools/browser-sync/src/styles.css +290 -0
- package/tools/browser-sync/src/types.ts +27 -0
- package/tools/browser-sync/vite.config.ts +25 -0
- 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"}
|