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
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
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.pathExists = pathExists;
|
|
37
|
+
exports.getFileSystemEntry = getFileSystemEntry;
|
|
38
|
+
exports.isTextFile = isTextFile;
|
|
39
|
+
exports.readFileContent = readFileContent;
|
|
40
|
+
exports.writeFileContent = writeFileContent;
|
|
41
|
+
exports.ensureDirectoryExists = ensureDirectoryExists;
|
|
42
|
+
exports.removePath = removePath;
|
|
43
|
+
exports.listDirectory = listDirectory;
|
|
44
|
+
exports.copyFile = copyFile;
|
|
45
|
+
exports.movePath = movePath;
|
|
46
|
+
exports.calculateContentHash = calculateContentHash;
|
|
47
|
+
exports.getMimeType = getMimeType;
|
|
48
|
+
exports.getFileExtension = getFileExtension;
|
|
49
|
+
exports.normalizePath = normalizePath;
|
|
50
|
+
exports.getRelativePath = getRelativePath;
|
|
51
|
+
const fs = __importStar(require("fs/promises"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const crypto = __importStar(require("crypto"));
|
|
54
|
+
const glob_1 = require("glob");
|
|
55
|
+
const mimeTypes = __importStar(require("mime-types"));
|
|
56
|
+
const types_1 = require("../types");
|
|
57
|
+
const mime_types_1 = require("./mime-types");
|
|
58
|
+
/**
|
|
59
|
+
* Check if a path exists
|
|
60
|
+
*/
|
|
61
|
+
async function pathExists(filePath) {
|
|
62
|
+
try {
|
|
63
|
+
await fs.access(filePath);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get file system entry metadata
|
|
72
|
+
*/
|
|
73
|
+
async function getFileSystemEntry(filePath) {
|
|
74
|
+
try {
|
|
75
|
+
const stats = await fs.stat(filePath);
|
|
76
|
+
const type = stats.isDirectory()
|
|
77
|
+
? types_1.FileType.DIRECTORY
|
|
78
|
+
: (await (0, mime_types_1.isEnhancedTextFile)(filePath))
|
|
79
|
+
? types_1.FileType.TEXT
|
|
80
|
+
: types_1.FileType.BINARY;
|
|
81
|
+
return {
|
|
82
|
+
path: filePath,
|
|
83
|
+
type,
|
|
84
|
+
size: stats.size,
|
|
85
|
+
mtime: stats.mtime,
|
|
86
|
+
permissions: stats.mode & parseInt("777", 8),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Determine if a file is text or binary
|
|
95
|
+
*/
|
|
96
|
+
async function isTextFile(filePath) {
|
|
97
|
+
try {
|
|
98
|
+
const mimeType = mimeTypes.lookup(filePath);
|
|
99
|
+
if (mimeType) {
|
|
100
|
+
return (mimeType.startsWith("text/") ||
|
|
101
|
+
mimeType === "application/json" ||
|
|
102
|
+
mimeType === "application/xml" ||
|
|
103
|
+
mimeType.includes("javascript") ||
|
|
104
|
+
mimeType.includes("typescript"));
|
|
105
|
+
}
|
|
106
|
+
// Sample first 8KB to detect binary content
|
|
107
|
+
const handle = await fs.open(filePath, "r");
|
|
108
|
+
const buffer = Buffer.alloc(Math.min(8192, (await handle.stat()).size));
|
|
109
|
+
await handle.read(buffer, 0, buffer.length, 0);
|
|
110
|
+
await handle.close();
|
|
111
|
+
// Check for null bytes which indicate binary content
|
|
112
|
+
return !buffer.includes(0);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Read file content as string or buffer
|
|
120
|
+
*/
|
|
121
|
+
async function readFileContent(filePath) {
|
|
122
|
+
const isText = await (0, mime_types_1.isEnhancedTextFile)(filePath);
|
|
123
|
+
if (isText) {
|
|
124
|
+
return await fs.readFile(filePath, "utf8");
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const buffer = await fs.readFile(filePath);
|
|
128
|
+
return new Uint8Array(buffer);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Write file content from string or buffer
|
|
133
|
+
*/
|
|
134
|
+
async function writeFileContent(filePath, content) {
|
|
135
|
+
await ensureDirectoryExists(path.dirname(filePath));
|
|
136
|
+
if (typeof content === "string") {
|
|
137
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
await fs.writeFile(filePath, content);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Ensure directory exists, creating it if necessary
|
|
145
|
+
*/
|
|
146
|
+
async function ensureDirectoryExists(dirPath) {
|
|
147
|
+
try {
|
|
148
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error.code !== "EEXIST") {
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Remove file or directory
|
|
158
|
+
*/
|
|
159
|
+
async function removePath(filePath) {
|
|
160
|
+
try {
|
|
161
|
+
const stats = await fs.stat(filePath);
|
|
162
|
+
if (stats.isDirectory()) {
|
|
163
|
+
await fs.rmdir(filePath, { recursive: true });
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
await fs.unlink(filePath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error.code !== "ENOENT") {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if a path matches any of the exclude patterns
|
|
177
|
+
*/
|
|
178
|
+
function isExcluded(filePath, basePath, excludePatterns) {
|
|
179
|
+
const relativePath = path.relative(basePath, filePath);
|
|
180
|
+
for (const pattern of excludePatterns) {
|
|
181
|
+
// Handle different pattern types
|
|
182
|
+
if (pattern.startsWith(".") && !pattern.includes("*")) {
|
|
183
|
+
// Directory pattern like ".pushwork" or ".git"
|
|
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
|
+
const regex = new RegExp(pattern.replace(/\*/g, ".*").replace(/\?/g, "."));
|
|
193
|
+
if (regex.test(relativePath)) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Exact directory name like "node_modules"
|
|
199
|
+
const parts = relativePath.split(/[/\\]/);
|
|
200
|
+
if (parts.includes(pattern)) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* List directory contents with metadata
|
|
209
|
+
*/
|
|
210
|
+
async function listDirectory(dirPath, recursive = false, excludePatterns = []) {
|
|
211
|
+
const entries = [];
|
|
212
|
+
try {
|
|
213
|
+
const pattern = recursive
|
|
214
|
+
? path.join(dirPath, "**/*")
|
|
215
|
+
: path.join(dirPath, "*");
|
|
216
|
+
// Convert exclude patterns to glob ignore patterns
|
|
217
|
+
const ignorePatterns = excludePatterns.map((pattern) => {
|
|
218
|
+
if (pattern.startsWith(".") && !pattern.includes("*")) {
|
|
219
|
+
// Directory patterns
|
|
220
|
+
return `${pattern}/**`;
|
|
221
|
+
}
|
|
222
|
+
return pattern;
|
|
223
|
+
});
|
|
224
|
+
const paths = await (0, glob_1.glob)(pattern, {
|
|
225
|
+
dot: true,
|
|
226
|
+
ignore: ignorePatterns,
|
|
227
|
+
});
|
|
228
|
+
for (const filePath of paths) {
|
|
229
|
+
// Additional filtering for safety
|
|
230
|
+
if (!isExcluded(filePath, dirPath, excludePatterns)) {
|
|
231
|
+
const entry = await getFileSystemEntry(filePath);
|
|
232
|
+
if (entry) {
|
|
233
|
+
entries.push(entry);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// Return empty array if directory doesn't exist or can't be read
|
|
240
|
+
}
|
|
241
|
+
return entries;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Copy file with metadata preservation
|
|
245
|
+
*/
|
|
246
|
+
async function copyFile(sourcePath, destPath) {
|
|
247
|
+
await ensureDirectoryExists(path.dirname(destPath));
|
|
248
|
+
await fs.copyFile(sourcePath, destPath);
|
|
249
|
+
// Preserve file permissions
|
|
250
|
+
const stats = await fs.stat(sourcePath);
|
|
251
|
+
await fs.chmod(destPath, stats.mode);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Move/rename file or directory
|
|
255
|
+
*/
|
|
256
|
+
async function movePath(sourcePath, destPath) {
|
|
257
|
+
await ensureDirectoryExists(path.dirname(destPath));
|
|
258
|
+
await fs.rename(sourcePath, destPath);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Calculate content hash for change detection
|
|
262
|
+
*/
|
|
263
|
+
async function calculateContentHash(content) {
|
|
264
|
+
const hash = crypto.createHash("sha256");
|
|
265
|
+
hash.update(content);
|
|
266
|
+
return hash.digest("hex");
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get MIME type for file
|
|
270
|
+
*/
|
|
271
|
+
function getMimeType(filePath) {
|
|
272
|
+
return mimeTypes.lookup(filePath) || "application/octet-stream";
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get file extension
|
|
276
|
+
*/
|
|
277
|
+
function getFileExtension(filePath) {
|
|
278
|
+
const ext = path.extname(filePath);
|
|
279
|
+
return ext.startsWith(".") ? ext.slice(1) : ext;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Normalize path separators for cross-platform compatibility
|
|
283
|
+
*/
|
|
284
|
+
function normalizePath(filePath) {
|
|
285
|
+
return path.posix.normalize(filePath.replace(/\\/g, "/"));
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get relative path from base directory
|
|
289
|
+
*/
|
|
290
|
+
function getRelativePath(basePath, filePath) {
|
|
291
|
+
return normalizePath(path.relative(basePath, filePath));
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,MAAM,CAAC;AAGrB,cAAc,sBAAsB,CAAC;AAGrC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// File system utilities
|
|
18
|
+
__exportStar(require("./fs"), exports);
|
|
19
|
+
// Content similarity utilities
|
|
20
|
+
__exportStar(require("./content-similarity"), exports);
|
|
21
|
+
// Enhanced MIME type detection
|
|
22
|
+
__exportStar(require("./mime-types"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wBAAwB;AACxB,uCAAqB;AAErB,+BAA+B;AAC/B,uDAAqC;AAErC,+BAA+B;AAC/B,+CAA6B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Isomorphic utilities that work in both Node.js and browser environments
|
|
3
|
+
*/
|
|
4
|
+
import { FileSystemInterface } from "../platform/filesystem";
|
|
5
|
+
export declare function getFileExtension(filePath: string): string;
|
|
6
|
+
export declare function normalizePath(filePath: string): string;
|
|
7
|
+
export declare function getRelativePath(basePath: string, filePath: string): string;
|
|
8
|
+
export declare function calculateContentHash(content: string | Uint8Array): string;
|
|
9
|
+
export declare function getMimeType(filePath: string): string;
|
|
10
|
+
export declare function isTextFile(filePath: string): boolean;
|
|
11
|
+
export declare function readFileContent(filePath: string): Promise<string | Uint8Array>;
|
|
12
|
+
export declare function writeFileContent(filePath: string, content: string | Uint8Array): Promise<void>;
|
|
13
|
+
export declare function removePath(filePath: string): Promise<void>;
|
|
14
|
+
export declare function movePath(sourcePath: string, targetPath: string): Promise<void>;
|
|
15
|
+
export declare function ensureDirectoryExists(dirPath: string): Promise<void>;
|
|
16
|
+
export declare function pathExists(filePath: string): Promise<boolean>;
|
|
17
|
+
export declare function listDirectory(dirPath: string, excludePatterns?: string[]): Promise<Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
type: "file" | "directory";
|
|
20
|
+
}>>;
|
|
21
|
+
export declare function getFileSystemEntry(filePath: string): Promise<{
|
|
22
|
+
path: string;
|
|
23
|
+
type: "file";
|
|
24
|
+
size: number;
|
|
25
|
+
mtime: Date;
|
|
26
|
+
permissions: number;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function setFilesystemInstance(fs: FileSystemInterface): void;
|
|
29
|
+
//# sourceMappingURL=isomorphic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isomorphic.d.ts","sourceRoot":"","sources":["../../src/utils/isomorphic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAiB,MAAM,wBAAwB,CAAC;AAI5E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyB1E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAazE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAYD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAG9B;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnE;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,eAAe,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAAC,CAAC,CAkB9D;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM;;;;;;GAexD;AAGD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,CAEnE"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Isomorphic utilities that work in both Node.js and browser environments
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getFileExtension = getFileExtension;
|
|
7
|
+
exports.normalizePath = normalizePath;
|
|
8
|
+
exports.getRelativePath = getRelativePath;
|
|
9
|
+
exports.calculateContentHash = calculateContentHash;
|
|
10
|
+
exports.getMimeType = getMimeType;
|
|
11
|
+
exports.isTextFile = isTextFile;
|
|
12
|
+
exports.readFileContent = readFileContent;
|
|
13
|
+
exports.writeFileContent = writeFileContent;
|
|
14
|
+
exports.removePath = removePath;
|
|
15
|
+
exports.movePath = movePath;
|
|
16
|
+
exports.ensureDirectoryExists = ensureDirectoryExists;
|
|
17
|
+
exports.pathExists = pathExists;
|
|
18
|
+
exports.listDirectory = listDirectory;
|
|
19
|
+
exports.getFileSystemEntry = getFileSystemEntry;
|
|
20
|
+
exports.setFilesystemInstance = setFilesystemInstance;
|
|
21
|
+
const filesystem_1 = require("../platform/filesystem");
|
|
22
|
+
const mime_types_1 = require("./mime-types");
|
|
23
|
+
// Pure functions that work in both environments
|
|
24
|
+
function getFileExtension(filePath) {
|
|
25
|
+
const ext = filePath.split(".").pop() || "";
|
|
26
|
+
return ext.startsWith(".") ? ext : `.${ext}`;
|
|
27
|
+
}
|
|
28
|
+
function normalizePath(filePath) {
|
|
29
|
+
// Simple path normalization that works in browser
|
|
30
|
+
return filePath.replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
31
|
+
}
|
|
32
|
+
function getRelativePath(basePath, filePath) {
|
|
33
|
+
// Simple relative path calculation for browser compatibility
|
|
34
|
+
const base = normalizePath(basePath)
|
|
35
|
+
.split("/")
|
|
36
|
+
.filter((p) => p);
|
|
37
|
+
const file = normalizePath(filePath)
|
|
38
|
+
.split("/")
|
|
39
|
+
.filter((p) => p);
|
|
40
|
+
// Find common prefix
|
|
41
|
+
let commonLength = 0;
|
|
42
|
+
for (let i = 0; i < Math.min(base.length, file.length); i++) {
|
|
43
|
+
if (base[i] === file[i]) {
|
|
44
|
+
commonLength++;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Build relative path
|
|
51
|
+
const upCount = base.length - commonLength;
|
|
52
|
+
const downPath = file.slice(commonLength);
|
|
53
|
+
const result = ["..".repeat(upCount), ...downPath].filter((p) => p).join("/");
|
|
54
|
+
return result || ".";
|
|
55
|
+
}
|
|
56
|
+
function calculateContentHash(content) {
|
|
57
|
+
// Simple hash function for browser compatibility
|
|
58
|
+
let hash = 0;
|
|
59
|
+
const str = typeof content === "string" ? content : new TextDecoder().decode(content);
|
|
60
|
+
for (let i = 0; i < str.length; i++) {
|
|
61
|
+
const char = str.charCodeAt(i);
|
|
62
|
+
hash = (hash << 5) - hash + char;
|
|
63
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
64
|
+
}
|
|
65
|
+
return Math.abs(hash).toString(16);
|
|
66
|
+
}
|
|
67
|
+
function getMimeType(filePath) {
|
|
68
|
+
return (0, mime_types_1.getEnhancedMimeType)(filePath);
|
|
69
|
+
}
|
|
70
|
+
function isTextFile(filePath) {
|
|
71
|
+
return (0, mime_types_1.isEnhancedTextFile)(filePath);
|
|
72
|
+
}
|
|
73
|
+
// Filesystem-dependent functions that use the platform interface
|
|
74
|
+
let _filesystem = null;
|
|
75
|
+
async function getFs() {
|
|
76
|
+
if (!_filesystem) {
|
|
77
|
+
_filesystem = await (0, filesystem_1.getFilesystem)();
|
|
78
|
+
}
|
|
79
|
+
return _filesystem;
|
|
80
|
+
}
|
|
81
|
+
async function readFileContent(filePath) {
|
|
82
|
+
const fs = await getFs();
|
|
83
|
+
return fs.readFileContent(filePath);
|
|
84
|
+
}
|
|
85
|
+
async function writeFileContent(filePath, content) {
|
|
86
|
+
const fs = await getFs();
|
|
87
|
+
return fs.writeFileContent(filePath, content);
|
|
88
|
+
}
|
|
89
|
+
async function removePath(filePath) {
|
|
90
|
+
const fs = await getFs();
|
|
91
|
+
return fs.removePath(filePath);
|
|
92
|
+
}
|
|
93
|
+
async function movePath(sourcePath, targetPath) {
|
|
94
|
+
const fs = await getFs();
|
|
95
|
+
return fs.movePath(sourcePath, targetPath);
|
|
96
|
+
}
|
|
97
|
+
async function ensureDirectoryExists(dirPath) {
|
|
98
|
+
const fs = await getFs();
|
|
99
|
+
return fs.ensureDirectoryExists(dirPath);
|
|
100
|
+
}
|
|
101
|
+
async function pathExists(filePath) {
|
|
102
|
+
const fs = await getFs();
|
|
103
|
+
return fs.exists(filePath);
|
|
104
|
+
}
|
|
105
|
+
async function listDirectory(dirPath, excludePatterns = []) {
|
|
106
|
+
const fs = await getFs();
|
|
107
|
+
const entries = await fs.listDirectory(dirPath);
|
|
108
|
+
// Apply exclude patterns
|
|
109
|
+
if (excludePatterns.length > 0) {
|
|
110
|
+
return entries.filter((entry) => {
|
|
111
|
+
return !excludePatterns.some((pattern) => {
|
|
112
|
+
// Simple glob pattern matching
|
|
113
|
+
const regex = new RegExp(pattern.replace(/\*/g, ".*").replace(/\?/g, "."));
|
|
114
|
+
return regex.test(entry.name);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return entries;
|
|
119
|
+
}
|
|
120
|
+
async function getFileSystemEntry(filePath) {
|
|
121
|
+
const fs = await getFs();
|
|
122
|
+
const exists = await fs.exists(filePath);
|
|
123
|
+
if (!exists) {
|
|
124
|
+
throw new Error(`Path does not exist: ${filePath}`);
|
|
125
|
+
}
|
|
126
|
+
const stats = await fs.getFileStats(filePath);
|
|
127
|
+
return {
|
|
128
|
+
path: filePath,
|
|
129
|
+
type: "file", // Simplified - in real implementation would check if directory
|
|
130
|
+
size: stats.size,
|
|
131
|
+
mtime: stats.mtime,
|
|
132
|
+
permissions: 0o644, // Default permissions
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Set filesystem instance (useful for browser where we need to inject the root handle)
|
|
136
|
+
function setFilesystemInstance(fs) {
|
|
137
|
+
_filesystem = fs;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=isomorphic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isomorphic.js","sourceRoot":"","sources":["../../src/utils/isomorphic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get enhanced MIME type for file with custom dev file support
|
|
3
|
+
*/
|
|
4
|
+
export declare function getEnhancedMimeType(filePath: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Check if file extension should be forced to text type
|
|
7
|
+
*/
|
|
8
|
+
export declare function shouldForceAsText(filePath: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Enhanced text file detection with developer file support
|
|
11
|
+
*/
|
|
12
|
+
export declare function isEnhancedTextFile(filePath: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=mime-types.d.ts.map
|
|
@@ -0,0 +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,CAsB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAUD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB3E"}
|