pushwork 1.0.4 → 1.0.7
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 +87 -328
- package/dist/.pushwork/automerge/3P/Dm3ekE2pmjGnWvDaG3vSR7ww98/snapshot/aa2349c94955ea561f698720142f9d884a6872d9f82dc332d578c216beb0df0e +0 -0
- package/dist/.pushwork/automerge/st/orage-adapter-id +1 -0
- package/dist/.pushwork/config.json +15 -0
- package/dist/.pushwork/snapshot.json +7 -0
- package/dist/cli.js +231 -170
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +51 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +799 -0
- package/dist/commands.js.map +1 -0
- package/dist/core/change-detection.d.ts +6 -19
- package/dist/core/change-detection.d.ts.map +1 -1
- package/dist/core/change-detection.js +101 -80
- package/dist/core/change-detection.js.map +1 -1
- package/dist/{config/index.d.ts → core/config.d.ts} +13 -3
- package/dist/core/config.d.ts.map +1 -0
- package/dist/{config/index.js → core/config.js} +55 -73
- package/dist/core/config.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/move-detection.d.ts +12 -50
- package/dist/core/move-detection.d.ts.map +1 -1
- package/dist/core/move-detection.js +58 -139
- package/dist/core/move-detection.js.map +1 -1
- package/dist/core/snapshot.d.ts +0 -4
- package/dist/core/snapshot.d.ts.map +1 -1
- package/dist/core/snapshot.js +2 -11
- package/dist/core/snapshot.js.map +1 -1
- package/dist/core/sync-engine.d.ts +5 -11
- package/dist/core/sync-engine.d.ts.map +1 -1
- package/dist/core/sync-engine.js +220 -362
- package/dist/core/sync-engine.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/dist/types/config.d.ts +43 -67
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/documents.d.ts +15 -3
- package/dist/types/documents.d.ts.map +1 -1
- package/dist/types/documents.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/snapshot.d.ts +3 -21
- package/dist/types/snapshot.d.ts.map +1 -1
- package/dist/types/snapshot.js +0 -14
- package/dist/types/snapshot.js.map +1 -1
- package/dist/utils/content.d.ts.map +1 -1
- package/dist/utils/content.js +2 -6
- package/dist/utils/content.js.map +1 -1
- package/dist/utils/directory.d.ts +10 -0
- package/dist/utils/directory.d.ts.map +1 -0
- package/dist/utils/directory.js +37 -0
- package/dist/utils/directory.js.map +1 -0
- package/dist/utils/fs.d.ts +15 -2
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +63 -53
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/mime-types.d.ts.map +1 -1
- package/dist/utils/mime-types.js +11 -4
- package/dist/utils/mime-types.js.map +1 -1
- package/dist/utils/network-sync.d.ts +0 -6
- package/dist/utils/network-sync.d.ts.map +1 -1
- package/dist/utils/network-sync.js +55 -99
- package/dist/utils/network-sync.js.map +1 -1
- package/dist/utils/output.d.ts +129 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +375 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/repo-factory.d.ts +2 -6
- package/dist/utils/repo-factory.d.ts.map +1 -1
- package/dist/utils/repo-factory.js +8 -22
- package/dist/utils/repo-factory.js.map +1 -1
- package/dist/utils/string-similarity.d.ts +14 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +43 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/trace.d.ts +19 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +68 -0
- package/dist/utils/trace.js.map +1 -0
- package/package.json +17 -12
- package/src/cli.ts +326 -252
- package/src/commands.ts +988 -0
- package/src/core/change-detection.ts +199 -162
- package/src/{config/index.ts → core/config.ts} +65 -82
- package/src/core/index.ts +1 -1
- package/src/core/move-detection.ts +74 -180
- package/src/core/snapshot.ts +2 -12
- package/src/core/sync-engine.ts +248 -499
- package/src/index.ts +0 -10
- package/src/types/config.ts +50 -72
- package/src/types/documents.ts +16 -3
- package/src/types/index.ts +0 -5
- package/src/types/snapshot.ts +1 -23
- package/src/utils/content.ts +2 -6
- package/src/utils/directory.ts +50 -0
- package/src/utils/fs.ts +67 -56
- package/src/utils/index.ts +1 -6
- package/src/utils/mime-types.ts +12 -4
- package/src/utils/network-sync.ts +79 -137
- package/src/utils/output.ts +450 -0
- package/src/utils/repo-factory.ts +13 -31
- package/src/utils/string-similarity.ts +54 -0
- package/src/utils/trace.ts +70 -0
- package/test/integration/exclude-patterns.test.ts +6 -15
- package/test/integration/fuzzer.test.ts +308 -391
- package/test/integration/init-sync.test.ts +89 -0
- package/test/integration/sync-deletion.test.ts +2 -61
- package/test/integration/sync-flow.test.ts +4 -24
- package/test/jest.setup.ts +34 -0
- package/test/unit/deletion-behavior.test.ts +3 -14
- package/test/unit/enhanced-mime-detection.test.ts +0 -22
- package/test/unit/snapshot.test.ts +2 -29
- package/test/unit/sync-convergence.test.ts +3 -198
- package/test/unit/sync-timing.test.ts +0 -44
- package/test/unit/utils.test.ts +0 -2
- package/tsconfig.json +3 -3
- package/dist/browser/browser-sync-engine.d.ts +0 -64
- package/dist/browser/browser-sync-engine.d.ts.map +0 -1
- package/dist/browser/browser-sync-engine.js +0 -303
- package/dist/browser/browser-sync-engine.js.map +0 -1
- package/dist/browser/filesystem-adapter.d.ts +0 -84
- package/dist/browser/filesystem-adapter.d.ts.map +0 -1
- package/dist/browser/filesystem-adapter.js +0 -413
- package/dist/browser/filesystem-adapter.js.map +0 -1
- package/dist/browser/index.d.ts +0 -36
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -90
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/types.d.ts +0 -70
- package/dist/browser/types.d.ts.map +0 -1
- package/dist/browser/types.js +0 -6
- package/dist/browser/types.js.map +0 -1
- package/dist/cli/commands.d.ts +0 -77
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -904
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -19
- package/dist/cli/index.js.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/core/isomorphic-snapshot.d.ts +0 -58
- package/dist/core/isomorphic-snapshot.d.ts.map +0 -1
- package/dist/core/isomorphic-snapshot.js +0 -204
- package/dist/core/isomorphic-snapshot.js.map +0 -1
- package/dist/platform/browser-filesystem.d.ts +0 -26
- package/dist/platform/browser-filesystem.d.ts.map +0 -1
- package/dist/platform/browser-filesystem.js +0 -91
- package/dist/platform/browser-filesystem.js.map +0 -1
- package/dist/platform/filesystem.d.ts +0 -29
- package/dist/platform/filesystem.d.ts.map +0 -1
- package/dist/platform/filesystem.js +0 -65
- package/dist/platform/filesystem.js.map +0 -1
- package/dist/platform/node-filesystem.d.ts +0 -21
- package/dist/platform/node-filesystem.d.ts.map +0 -1
- package/dist/platform/node-filesystem.js +0 -93
- package/dist/platform/node-filesystem.js.map +0 -1
- package/dist/utils/content-similarity.d.ts +0 -53
- package/dist/utils/content-similarity.d.ts.map +0 -1
- package/dist/utils/content-similarity.js +0 -155
- package/dist/utils/content-similarity.js.map +0 -1
- package/dist/utils/fs-browser.d.ts +0 -57
- package/dist/utils/fs-browser.d.ts.map +0 -1
- package/dist/utils/fs-browser.js +0 -311
- package/dist/utils/fs-browser.js.map +0 -1
- package/dist/utils/fs-node.d.ts +0 -53
- package/dist/utils/fs-node.d.ts.map +0 -1
- package/dist/utils/fs-node.js +0 -220
- package/dist/utils/fs-node.js.map +0 -1
- package/dist/utils/isomorphic.d.ts +0 -29
- package/dist/utils/isomorphic.d.ts.map +0 -1
- package/dist/utils/isomorphic.js +0 -139
- package/dist/utils/isomorphic.js.map +0 -1
- package/dist/utils/pure.d.ts +0 -25
- package/dist/utils/pure.d.ts.map +0 -1
- package/dist/utils/pure.js +0 -112
- package/dist/utils/pure.js.map +0 -1
- package/src/cli/commands.ts +0 -1207
- package/src/cli/index.ts +0 -2
- package/src/utils/content-similarity.ts +0 -194
- package/test/README-TESTING-GAPS.md +0 -174
- package/test/unit/content-similarity.test.ts +0 -236
package/dist/utils/fs.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as A from "@automerge/automerge";
|
|
1
2
|
import { FileSystemEntry } from "../types";
|
|
2
3
|
/**
|
|
3
4
|
* Check if a path exists
|
|
@@ -18,7 +19,7 @@ export declare function readFileContent(filePath: string): Promise<string | Uint
|
|
|
18
19
|
/**
|
|
19
20
|
* Write file content from string or buffer
|
|
20
21
|
*/
|
|
21
|
-
export declare function writeFileContent(filePath: string, content: string | Uint8Array): Promise<void>;
|
|
22
|
+
export declare function writeFileContent(filePath: string, content: string | A.ImmutableString | Uint8Array): Promise<void>;
|
|
22
23
|
/**
|
|
23
24
|
* Ensure directory exists, creating it if necessary
|
|
24
25
|
*/
|
|
@@ -42,7 +43,7 @@ export declare function movePath(sourcePath: string, destPath: string): Promise<
|
|
|
42
43
|
/**
|
|
43
44
|
* Calculate content hash for change detection
|
|
44
45
|
*/
|
|
45
|
-
export declare function calculateContentHash(content: string | Uint8Array): Promise<string>;
|
|
46
|
+
export declare function calculateContentHash(content: string | A.ImmutableString | Uint8Array): Promise<string>;
|
|
46
47
|
/**
|
|
47
48
|
* Get MIME type for file
|
|
48
49
|
*/
|
|
@@ -53,10 +54,22 @@ export declare function getMimeType(filePath: string): string;
|
|
|
53
54
|
export declare function getFileExtension(filePath: string): string;
|
|
54
55
|
/**
|
|
55
56
|
* Normalize path separators for cross-platform compatibility
|
|
57
|
+
* Converts all path separators to forward slashes for consistent storage
|
|
56
58
|
*/
|
|
57
59
|
export declare function normalizePath(filePath: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Join paths and normalize separators for cross-platform compatibility
|
|
62
|
+
* Use this instead of string concatenation to ensure proper path handling on Windows
|
|
63
|
+
*/
|
|
64
|
+
export declare function joinAndNormalizePath(...paths: string[]): string;
|
|
58
65
|
/**
|
|
59
66
|
* Get relative path from base directory
|
|
60
67
|
*/
|
|
61
68
|
export declare function getRelativePath(basePath: string, filePath: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Format a path as a relative path with proper prefix
|
|
71
|
+
* Ensures paths like "src" become "./src" for clarity
|
|
72
|
+
* Leaves absolute paths and paths already starting with . or .. unchanged
|
|
73
|
+
*/
|
|
74
|
+
export declare function formatRelativePath(filePath: string): string;
|
|
62
75
|
//# sourceMappingURL=fs.d.ts.map
|
package/dist/utils/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAY,MAAM,UAAU,CAAC;AAGrD;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmBjC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBnE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAS9B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,eAAe,GAAG,UAAU,GAC/C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAsBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,EACjB,eAAe,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC,CAqC5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,eAAe,GAAG,UAAU,GAC/C,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAK/D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO3D"}
|
package/dist/utils/fs.js
CHANGED
|
@@ -47,12 +47,16 @@ exports.calculateContentHash = calculateContentHash;
|
|
|
47
47
|
exports.getMimeType = getMimeType;
|
|
48
48
|
exports.getFileExtension = getFileExtension;
|
|
49
49
|
exports.normalizePath = normalizePath;
|
|
50
|
+
exports.joinAndNormalizePath = joinAndNormalizePath;
|
|
50
51
|
exports.getRelativePath = getRelativePath;
|
|
52
|
+
exports.formatRelativePath = formatRelativePath;
|
|
51
53
|
const fs = __importStar(require("fs/promises"));
|
|
52
54
|
const path = __importStar(require("path"));
|
|
53
55
|
const crypto = __importStar(require("crypto"));
|
|
54
56
|
const glob_1 = require("glob");
|
|
55
57
|
const mimeTypes = __importStar(require("mime-types"));
|
|
58
|
+
const ignore = __importStar(require("ignore"));
|
|
59
|
+
const A = __importStar(require("@automerge/automerge"));
|
|
56
60
|
const types_1 = require("../types");
|
|
57
61
|
const mime_types_1 = require("./mime-types");
|
|
58
62
|
/**
|
|
@@ -136,6 +140,10 @@ async function writeFileContent(filePath, content) {
|
|
|
136
140
|
if (typeof content === "string") {
|
|
137
141
|
await fs.writeFile(filePath, content, "utf8");
|
|
138
142
|
}
|
|
143
|
+
else if (A.isImmutableString(content)) {
|
|
144
|
+
// Convert ImmutableString to regular string for filesystem operations
|
|
145
|
+
await fs.writeFile(filePath, content.toString(), "utf8");
|
|
146
|
+
}
|
|
139
147
|
else {
|
|
140
148
|
await fs.writeFile(filePath, content);
|
|
141
149
|
}
|
|
@@ -160,7 +168,7 @@ async function removePath(filePath) {
|
|
|
160
168
|
try {
|
|
161
169
|
const stats = await fs.stat(filePath);
|
|
162
170
|
if (stats.isDirectory()) {
|
|
163
|
-
await fs.
|
|
171
|
+
await fs.rm(filePath, { recursive: true });
|
|
164
172
|
}
|
|
165
173
|
else {
|
|
166
174
|
await fs.unlink(filePath);
|
|
@@ -173,42 +181,17 @@ async function removePath(filePath) {
|
|
|
173
181
|
}
|
|
174
182
|
}
|
|
175
183
|
/**
|
|
176
|
-
* Check if a path matches any of the exclude patterns
|
|
184
|
+
* Check if a path matches any of the exclude patterns using the ignore library
|
|
185
|
+
* Supports proper gitignore-style patterns (e.g., "node_modules", "*.tmp", ".git")
|
|
177
186
|
*/
|
|
178
187
|
function isExcluded(filePath, basePath, excludePatterns) {
|
|
188
|
+
if (excludePatterns.length === 0)
|
|
189
|
+
return false;
|
|
179
190
|
const relativePath = path.relative(basePath, filePath);
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
if (relativePath.startsWith(pattern) ||
|
|
185
|
-
relativePath.includes(`/${pattern}/`) ||
|
|
186
|
-
relativePath.includes(`\\${pattern}\\`)) {
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
else if (pattern.includes("*")) {
|
|
191
|
-
// Glob pattern like "*.tmp"
|
|
192
|
-
// CRITICAL FIX: Properly escape dots and anchor the pattern
|
|
193
|
-
// Convert glob to regex: *.tmp -> ^.*\.tmp$ (not /.*.tmp/ which matches "fuftmp.ts"!)
|
|
194
|
-
const regexPattern = pattern
|
|
195
|
-
.replace(/\./g, "\\.") // Escape dots first
|
|
196
|
-
.replace(/\*/g, ".*") // Then convert * to .*
|
|
197
|
-
.replace(/\?/g, "."); // And ? to single char
|
|
198
|
-
const regex = new RegExp(`^${regexPattern}$`); // Anchor to match full path
|
|
199
|
-
if (regex.test(relativePath)) {
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
// Exact directory name like "node_modules"
|
|
205
|
-
const parts = relativePath.split(/[/\\]/);
|
|
206
|
-
if (parts.includes(pattern)) {
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return false;
|
|
191
|
+
// Use the ignore library which implements proper .gitignore semantics
|
|
192
|
+
// This is the same library used by ESLint and other major tools
|
|
193
|
+
const ig = ignore.default().add(excludePatterns);
|
|
194
|
+
return ig.ignores(relativePath);
|
|
212
195
|
}
|
|
213
196
|
/**
|
|
214
197
|
* List directory contents with metadata
|
|
@@ -216,30 +199,28 @@ function isExcluded(filePath, basePath, excludePatterns) {
|
|
|
216
199
|
async function listDirectory(dirPath, recursive = false, excludePatterns = []) {
|
|
217
200
|
const entries = [];
|
|
218
201
|
try {
|
|
202
|
+
// Construct pattern using path.join for proper cross-platform handling
|
|
219
203
|
const pattern = recursive
|
|
220
204
|
? path.join(dirPath, "**/*")
|
|
221
205
|
: path.join(dirPath, "*");
|
|
222
|
-
//
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
return pattern;
|
|
229
|
-
});
|
|
230
|
-
const paths = await (0, glob_1.glob)(pattern, {
|
|
206
|
+
// CRITICAL: glob expects forward slashes, even on Windows
|
|
207
|
+
// Convert backslashes to forward slashes for glob pattern
|
|
208
|
+
const normalizedPattern = pattern.replace(/\\/g, "/");
|
|
209
|
+
// Use glob to get all paths (with dot files)
|
|
210
|
+
// Note: We don't use glob's ignore option because it doesn't support gitignore semantics
|
|
211
|
+
const paths = await (0, glob_1.glob)(normalizedPattern, {
|
|
231
212
|
dot: true,
|
|
232
|
-
ignore: ignorePatterns,
|
|
233
213
|
});
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
entries.push(entry);
|
|
240
|
-
}
|
|
214
|
+
// Parallelize all stat calls for better performance
|
|
215
|
+
const allEntries = await Promise.all(paths.map(async (filePath) => {
|
|
216
|
+
// Filter using proper gitignore semantics from the ignore library
|
|
217
|
+
if (isExcluded(filePath, dirPath, excludePatterns)) {
|
|
218
|
+
return null;
|
|
241
219
|
}
|
|
242
|
-
|
|
220
|
+
return await getFileSystemEntry(filePath);
|
|
221
|
+
}));
|
|
222
|
+
// Filter out null entries (excluded files or files that couldn't be read)
|
|
223
|
+
entries.push(...allEntries.filter((e) => e !== null));
|
|
243
224
|
}
|
|
244
225
|
catch {
|
|
245
226
|
// Return empty array if directory doesn't exist or can't be read
|
|
@@ -268,7 +249,12 @@ async function movePath(sourcePath, destPath) {
|
|
|
268
249
|
*/
|
|
269
250
|
async function calculateContentHash(content) {
|
|
270
251
|
const hash = crypto.createHash("sha256");
|
|
271
|
-
|
|
252
|
+
if (A.isImmutableString(content)) {
|
|
253
|
+
hash.update(content.toString());
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
hash.update(content);
|
|
257
|
+
}
|
|
272
258
|
return hash.digest("hex");
|
|
273
259
|
}
|
|
274
260
|
/**
|
|
@@ -286,14 +272,38 @@ function getFileExtension(filePath) {
|
|
|
286
272
|
}
|
|
287
273
|
/**
|
|
288
274
|
* Normalize path separators for cross-platform compatibility
|
|
275
|
+
* Converts all path separators to forward slashes for consistent storage
|
|
289
276
|
*/
|
|
290
277
|
function normalizePath(filePath) {
|
|
291
278
|
return path.posix.normalize(filePath.replace(/\\/g, "/"));
|
|
292
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* Join paths and normalize separators for cross-platform compatibility
|
|
282
|
+
* Use this instead of string concatenation to ensure proper path handling on Windows
|
|
283
|
+
*/
|
|
284
|
+
function joinAndNormalizePath(...paths) {
|
|
285
|
+
// Use path.join to properly handle path construction (handles Windows drive letters, etc.)
|
|
286
|
+
const joined = path.join(...paths);
|
|
287
|
+
// Then normalize to forward slashes for consistent storage/comparison
|
|
288
|
+
return normalizePath(joined);
|
|
289
|
+
}
|
|
293
290
|
/**
|
|
294
291
|
* Get relative path from base directory
|
|
295
292
|
*/
|
|
296
293
|
function getRelativePath(basePath, filePath) {
|
|
297
294
|
return normalizePath(path.relative(basePath, filePath));
|
|
298
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* Format a path as a relative path with proper prefix
|
|
298
|
+
* Ensures paths like "src" become "./src" for clarity
|
|
299
|
+
* Leaves absolute paths and paths already starting with . or .. unchanged
|
|
300
|
+
*/
|
|
301
|
+
function formatRelativePath(filePath) {
|
|
302
|
+
// Already starts with . or / - leave as-is
|
|
303
|
+
if (filePath.startsWith(".") || filePath.startsWith("/")) {
|
|
304
|
+
return filePath;
|
|
305
|
+
}
|
|
306
|
+
// Add ./ prefix for clarity
|
|
307
|
+
return `./${filePath}`;
|
|
308
|
+
}
|
|
299
309
|
//# sourceMappingURL=fs.js.map
|
package/dist/utils/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -14,10 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
// File system utilities
|
|
18
17
|
__exportStar(require("./fs"), exports);
|
|
19
|
-
// Content similarity utilities
|
|
20
|
-
__exportStar(require("./content-similarity"), exports);
|
|
21
|
-
// Enhanced MIME type detection
|
|
22
18
|
__exportStar(require("./mime-types"), exports);
|
|
19
|
+
__exportStar(require("./directory"), exports);
|
|
23
20
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uCAAqB;AACrB,+CAA6B;AAC7B,8CAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime-types.d.ts","sourceRoot":"","sources":["../../src/utils/mime-types.ts"],"names":[],"mappings":"AA2GA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"mime-types.d.ts","sourceRoot":"","sources":["../../src/utils/mime-types.ts"],"names":[],"mappings":"AA2GA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAiBD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB3E"}
|
package/dist/utils/mime-types.js
CHANGED
|
@@ -132,8 +132,9 @@ const FORCE_TEXT_EXTENSIONS = new Set([
|
|
|
132
132
|
* Get enhanced MIME type for file with custom dev file support
|
|
133
133
|
*/
|
|
134
134
|
function getEnhancedMimeType(filePath) {
|
|
135
|
-
const
|
|
136
|
-
const
|
|
135
|
+
const normalized = normalizePathSeparators(filePath);
|
|
136
|
+
const filename = normalized.split("/").pop() || "";
|
|
137
|
+
const extension = getFileExtension(normalized);
|
|
137
138
|
// Check custom definitions first (by extension)
|
|
138
139
|
if (extension && CUSTOM_MIME_TYPES[extension]) {
|
|
139
140
|
return CUSTOM_MIME_TYPES[extension];
|
|
@@ -143,7 +144,7 @@ function getEnhancedMimeType(filePath) {
|
|
|
143
144
|
return CUSTOM_MIME_TYPES[filename];
|
|
144
145
|
}
|
|
145
146
|
// Fall back to standard mime-types library
|
|
146
|
-
const standardMime = mimeTypes.lookup(
|
|
147
|
+
const standardMime = mimeTypes.lookup(normalized);
|
|
147
148
|
if (standardMime) {
|
|
148
149
|
return standardMime;
|
|
149
150
|
}
|
|
@@ -162,7 +163,13 @@ function shouldForceAsText(filePath) {
|
|
|
162
163
|
*/
|
|
163
164
|
function getFileExtension(filePath) {
|
|
164
165
|
const match = filePath.match(/\.[^.]*$/);
|
|
165
|
-
return match ? match[0] : "";
|
|
166
|
+
return match ? match[0].toLowerCase() : "";
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Normalize path separators to forward slashes for cross-platform consistency
|
|
170
|
+
*/
|
|
171
|
+
function normalizePathSeparators(p) {
|
|
172
|
+
return p.replace(/\\/g, "/");
|
|
166
173
|
}
|
|
167
174
|
/**
|
|
168
175
|
* Enhanced text file detection with developer file support
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime-types.js","sourceRoot":"","sources":["../../src/utils/mime-types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GA,
|
|
1
|
+
{"version":3,"file":"mime-types.js","sourceRoot":"","sources":["../../src/utils/mime-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { DocHandle, StorageId } from "@automerge/automerge-repo";
|
|
2
2
|
/**
|
|
3
3
|
* Wait for documents to sync to the remote server
|
|
4
|
-
* Based on patchwork-cli implementation with timeout for debugging
|
|
5
4
|
*/
|
|
6
5
|
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
6
|
//# sourceMappingURL=network-sync.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAIjE;;GAEG;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,CAmGf"}
|
|
@@ -34,129 +34,85 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.waitForSync = waitForSync;
|
|
37
|
-
exports.getSyncServerStorageId = getSyncServerStorageId;
|
|
38
37
|
const A = __importStar(require("@automerge/automerge"));
|
|
38
|
+
const output_1 = require("./output");
|
|
39
39
|
/**
|
|
40
40
|
* Wait for documents to sync to the remote server
|
|
41
|
-
* Based on patchwork-cli implementation with timeout for debugging
|
|
42
41
|
*/
|
|
43
|
-
async function waitForSync(handlesToWaitOn, syncServerStorageId, timeoutMs = 60000
|
|
44
|
-
) {
|
|
42
|
+
async function waitForSync(handlesToWaitOn, syncServerStorageId, timeoutMs = 60000) {
|
|
45
43
|
const startTime = Date.now();
|
|
46
44
|
if (!syncServerStorageId) {
|
|
47
|
-
|
|
45
|
+
// No sync server storage ID - skip network sync
|
|
48
46
|
return;
|
|
49
47
|
}
|
|
50
48
|
if (handlesToWaitOn.length === 0) {
|
|
51
|
-
|
|
49
|
+
// No documents to sync
|
|
52
50
|
return;
|
|
53
51
|
}
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
if (verbose) {
|
|
57
|
-
console.log(`🔄 Waiting for ${handlesToWaitOn.length} documents to sync...`);
|
|
58
|
-
console.log(`📡 Using sync server storage ID: ${syncServerStorageId}`);
|
|
59
|
-
handlesToWaitOn.forEach((handle, i) => {
|
|
60
|
-
const localHeads = handle.heads();
|
|
61
|
-
const syncInfo = handle.getSyncInfo(syncServerStorageId);
|
|
62
|
-
const remoteHeads = syncInfo?.lastHeads;
|
|
63
|
-
console.log(` 📄 Document ${i + 1}: ${handle.url}`);
|
|
64
|
-
console.log(` 🏠 Local heads: ${JSON.stringify(localHeads)}`);
|
|
65
|
-
console.log(` 🌐 Remote heads: ${JSON.stringify(remoteHeads)}`);
|
|
66
|
-
console.log(` ✅ Already synced: ${A.equals(localHeads, remoteHeads)}`);
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
const promises = handlesToWaitOn.map((handle, index) => new Promise((resolve, reject) => {
|
|
70
|
-
let pollInterval;
|
|
71
|
-
const timeout = setTimeout(() => {
|
|
72
|
-
clearInterval(pollInterval);
|
|
73
|
-
const localHeads = handle.heads();
|
|
74
|
-
const syncInfo = handle.getSyncInfo(syncServerStorageId);
|
|
75
|
-
const remoteHeads = syncInfo?.lastHeads;
|
|
76
|
-
console.log(`⏰ TIMEOUT for document ${index + 1}: ${handle.url}`);
|
|
77
|
-
console.log(` Final local heads: ${JSON.stringify(localHeads)}`);
|
|
78
|
-
console.log(` Final remote heads: ${JSON.stringify(remoteHeads)}`);
|
|
79
|
-
reject(new Error(`Sync timeout after ${timeoutMs}ms for document ${handle.url}`));
|
|
80
|
-
}, timeoutMs);
|
|
81
|
-
const checkSync = () => {
|
|
82
|
-
const newHeads = handle.heads();
|
|
83
|
-
const syncInfo = handle.getSyncInfo(syncServerStorageId);
|
|
84
|
-
const remoteHeads = syncInfo?.lastHeads;
|
|
85
|
-
if (verbose) {
|
|
86
|
-
console.log(`🔍 Checking sync for ${handle.url}:`);
|
|
87
|
-
console.log(` Local heads: ${JSON.stringify(newHeads)}`);
|
|
88
|
-
console.log(` Remote heads: ${JSON.stringify(remoteHeads)}`);
|
|
89
|
-
console.log(` Heads equal: ${A.equals(newHeads, remoteHeads)}`);
|
|
90
|
-
}
|
|
91
|
-
// If the remote heads are already up to date, we can resolve immediately
|
|
92
|
-
if (A.equals(newHeads, remoteHeads)) {
|
|
93
|
-
if (verbose) {
|
|
94
|
-
console.log(`✅ Document ${index + 1} synced: ${handle.url}`);
|
|
95
|
-
}
|
|
96
|
-
clearTimeout(timeout);
|
|
97
|
-
clearInterval(pollInterval);
|
|
98
|
-
resolve();
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
};
|
|
52
|
+
let alreadySynced = 0;
|
|
53
|
+
const promises = handlesToWaitOn.map((handle) => {
|
|
103
54
|
// Check if already synced
|
|
104
|
-
|
|
105
|
-
|
|
55
|
+
const heads = handle.heads();
|
|
56
|
+
const syncInfo = handle.getSyncInfo(syncServerStorageId);
|
|
57
|
+
const remoteHeads = syncInfo?.lastHeads;
|
|
58
|
+
const wasAlreadySynced = A.equals(heads, remoteHeads);
|
|
59
|
+
if (wasAlreadySynced) {
|
|
60
|
+
alreadySynced++;
|
|
61
|
+
return Promise.resolve();
|
|
106
62
|
}
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}, 100); // Check every 100ms for faster response
|
|
113
|
-
// Also wait for remote-heads event (faster when events work)
|
|
114
|
-
const onRemoteHeads = ({ storageId, heads, }) => {
|
|
115
|
-
if (verbose) {
|
|
116
|
-
console.log(`📡 Received remote heads event for ${handle.url}:`);
|
|
117
|
-
console.log(` Event storage ID: ${storageId}`);
|
|
118
|
-
console.log(` Expected storage ID: ${syncServerStorageId}`);
|
|
119
|
-
console.log(` Event heads: ${JSON.stringify(heads)}`);
|
|
120
|
-
console.log(` Current local heads: ${JSON.stringify(handle.heads())}`);
|
|
121
|
-
}
|
|
122
|
-
if (storageId === syncServerStorageId &&
|
|
123
|
-
A.equals(handle.heads(), heads)) {
|
|
124
|
-
if (verbose) {
|
|
125
|
-
console.log(`✅ Document ${index + 1} synced via event: ${handle.url}`);
|
|
126
|
-
}
|
|
63
|
+
// Wait for convergence
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
// TODO: can we delete this polling?
|
|
66
|
+
let pollInterval;
|
|
67
|
+
const cleanup = () => {
|
|
127
68
|
clearTimeout(timeout);
|
|
128
69
|
clearInterval(pollInterval);
|
|
129
70
|
handle.off("remote-heads", onRemoteHeads);
|
|
71
|
+
};
|
|
72
|
+
const onConverged = () => {
|
|
73
|
+
cleanup();
|
|
130
74
|
resolve();
|
|
75
|
+
};
|
|
76
|
+
const timeout = setTimeout(() => {
|
|
77
|
+
cleanup();
|
|
78
|
+
reject(new Error(`Sync timeout after ${timeoutMs}ms for document ${handle.url}`));
|
|
79
|
+
}, timeoutMs);
|
|
80
|
+
const isConverged = () => {
|
|
81
|
+
const localHeads = handle.heads();
|
|
82
|
+
const info = handle.getSyncInfo(syncServerStorageId);
|
|
83
|
+
return A.equals(localHeads, info?.lastHeads);
|
|
84
|
+
};
|
|
85
|
+
const onRemoteHeads = ({ storageId, }) => {
|
|
86
|
+
if (storageId === syncServerStorageId && isConverged()) {
|
|
87
|
+
onConverged();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const poll = () => {
|
|
91
|
+
if (isConverged()) {
|
|
92
|
+
onConverged();
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
};
|
|
97
|
+
// Initial check
|
|
98
|
+
if (poll()) {
|
|
99
|
+
return;
|
|
131
100
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
handle.on("remote-heads", onRemoteHeads);
|
|
140
|
-
}));
|
|
101
|
+
// Start polling and event listening
|
|
102
|
+
pollInterval = setInterval(() => {
|
|
103
|
+
poll();
|
|
104
|
+
}, 100);
|
|
105
|
+
handle.on("remote-heads", onRemoteHeads);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
141
108
|
try {
|
|
142
109
|
await Promise.all(promises);
|
|
143
|
-
const elapsed = Date.now() - startTime;
|
|
144
|
-
if (verbose) {
|
|
145
|
-
console.log(`✅ All documents synced to network (took ${elapsed}ms)`);
|
|
146
|
-
}
|
|
147
110
|
}
|
|
148
111
|
catch (error) {
|
|
149
112
|
const elapsed = Date.now() - startTime;
|
|
150
|
-
|
|
113
|
+
output_1.out.errorBlock("FAILED", `after ${elapsed}ms`);
|
|
114
|
+
output_1.out.crash(error);
|
|
151
115
|
throw error;
|
|
152
116
|
}
|
|
153
117
|
}
|
|
154
|
-
/**
|
|
155
|
-
* Get the storage ID for the sync server
|
|
156
|
-
* Using the same ID as patchwork-cli for consistency
|
|
157
|
-
*/
|
|
158
|
-
function getSyncServerStorageId(customStorageId) {
|
|
159
|
-
return (customStorageId ||
|
|
160
|
-
"3760df37-a4c6-4f66-9ecd-732039a9385d");
|
|
161
|
-
}
|
|
162
118
|
//# sourceMappingURL=network-sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-sync.js","sourceRoot":"","sources":["../../src/utils/network-sync.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,
|
|
1
|
+
{"version":3,"file":"network-sync.js","sourceRoot":"","sources":["../../src/utils/network-sync.ts"],"names":[],"mappings":"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"}
|