@andrestobelem/clone 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -23
  3. package/app.js +645 -0
  4. package/bin/clone.js +11 -230
  5. package/dist/actors.js +49 -0
  6. package/dist/actors.js.map +1 -0
  7. package/dist/automations.js +57 -0
  8. package/dist/automations.js.map +1 -0
  9. package/dist/cli.js +565 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/database.js +62 -0
  12. package/dist/database.js.map +1 -0
  13. package/dist/errors.js +46 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/issues.js +264 -0
  16. package/dist/issues.js.map +1 -0
  17. package/dist/paths.js +42 -0
  18. package/dist/paths.js.map +1 -0
  19. package/dist/projects.js +134 -0
  20. package/dist/projects.js.map +1 -0
  21. package/dist/recurring.js +45 -0
  22. package/dist/recurring.js.map +1 -0
  23. package/dist/schema.js +52 -0
  24. package/dist/schema.js.map +1 -0
  25. package/dist/seed.js +498 -0
  26. package/dist/seed.js.map +1 -0
  27. package/dist/server.js +232 -0
  28. package/dist/server.js.map +1 -0
  29. package/dist/sync.js +625 -0
  30. package/dist/sync.js.map +1 -0
  31. package/dist/teams.js +77 -0
  32. package/dist/teams.js.map +1 -0
  33. package/dist/time.js +4 -0
  34. package/dist/time.js.map +1 -0
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/validation.js +254 -0
  38. package/dist/validation.js.map +1 -0
  39. package/dist/workspace-helpers.js +75 -0
  40. package/dist/workspace-helpers.js.map +1 -0
  41. package/dist/workspace-mutations.js +160 -0
  42. package/dist/workspace-mutations.js.map +1 -0
  43. package/dist/workspace-reads.js +62 -0
  44. package/dist/workspace-reads.js.map +1 -0
  45. package/dist/workspace.js +8 -0
  46. package/dist/workspace.js.map +1 -0
  47. package/index.html +73 -0
  48. package/package.json +33 -4
  49. package/styles.css +108 -0
package/dist/sync.js ADDED
@@ -0,0 +1,625 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ import lockfile from "proper-lockfile";
6
+ import { hasTable, openDatabase } from "./database.js";
7
+ import { InvalidInputError, PendingExportError, SyncConflictError, } from "./errors.js";
8
+ import { initializeSchema, seedDemo, seedEmpty } from "./workspace.js";
9
+ export async function withStorageLock(paths, operation) {
10
+ fs.mkdirSync(paths.dataDirectory, { recursive: true });
11
+ const target = localPath(paths, "lock");
12
+ if (!fs.existsSync(target))
13
+ fs.writeFileSync(target, "");
14
+ const release = await lockfile.lock(target, {
15
+ realpath: false,
16
+ retries: { retries: 150, minTimeout: 100, maxTimeout: 100 },
17
+ stale: 30_000,
18
+ update: 10_000,
19
+ });
20
+ try {
21
+ return await operation();
22
+ }
23
+ finally {
24
+ await release();
25
+ }
26
+ }
27
+ export function initialize(paths, demo = false) {
28
+ if (fs.existsSync(paths.database))
29
+ throw new InvalidInputError("Database already exists");
30
+ const database = openDatabase(paths, { create: true });
31
+ try {
32
+ database.exec("BEGIN IMMEDIATE");
33
+ demo ? seedDemo(database) : seedEmpty(database);
34
+ database.exec("COMMIT");
35
+ exportSnapshot(paths, database, { force: true });
36
+ }
37
+ catch (error) {
38
+ try {
39
+ database.exec("ROLLBACK");
40
+ }
41
+ catch { }
42
+ database.close();
43
+ fs.rmSync(paths.database, { force: true });
44
+ throw error;
45
+ }
46
+ database.close();
47
+ return { initialized: true, demo };
48
+ }
49
+ export function prepare(paths) {
50
+ const database = openDatabase(paths);
51
+ try {
52
+ recover(paths, database);
53
+ removeUnusedTables(database);
54
+ }
55
+ finally {
56
+ database.close();
57
+ }
58
+ }
59
+ export function mutate(paths, operation) {
60
+ const database = openDatabase(paths);
61
+ let committed = false;
62
+ let stage = null;
63
+ try {
64
+ recover(paths, database);
65
+ checkFiles(paths, database);
66
+ database.exec("BEGIN IMMEDIATE");
67
+ const result = operation(database);
68
+ removeUnusedTables(database);
69
+ const files = databaseFiles(paths, database);
70
+ stage = stageFiles(paths, files);
71
+ const token = randomUUID();
72
+ ensureSyncMeta(database);
73
+ database
74
+ .prepare("INSERT INTO __sync_meta(id,token) VALUES(1,?) ON CONFLICT(id) DO UPDATE SET token=excluded.token")
75
+ .run(token);
76
+ writeJson(localPath(paths, "journal.json"), { token, stage });
77
+ database.exec("COMMIT");
78
+ committed = true;
79
+ publish(paths, database, files, stage);
80
+ stage = null;
81
+ return result;
82
+ }
83
+ catch (error) {
84
+ if (!committed) {
85
+ try {
86
+ database.exec("ROLLBACK");
87
+ }
88
+ catch { }
89
+ if (stage)
90
+ fs.rmSync(stage, { recursive: true, force: true });
91
+ }
92
+ else if (!(error instanceof PendingExportError)) {
93
+ throw new PendingExportError(String(error instanceof Error ? error.message : error));
94
+ }
95
+ throw error;
96
+ }
97
+ finally {
98
+ database.close();
99
+ }
100
+ }
101
+ export function exportSnapshot(paths, existing, options = {}) {
102
+ const database = existing ?? openDatabase(paths, { allowLegacy: true });
103
+ try {
104
+ recover(paths, database);
105
+ if (!options.force)
106
+ checkFiles(paths, database, "export");
107
+ const files = databaseFiles(paths, database);
108
+ const before = diskFiles(paths.snapshotDirectory);
109
+ const diff = differences(before, files);
110
+ if (options.dryRun)
111
+ return diff;
112
+ const stage = stageFiles(paths, files);
113
+ replaceDirectory(paths.snapshotDirectory, stage);
114
+ saveState(paths, files, files);
115
+ clearRecovery(paths, database);
116
+ return { ...diff, exported: true };
117
+ }
118
+ finally {
119
+ if (!existing)
120
+ database.close();
121
+ }
122
+ }
123
+ export function validateSnapshot(paths) {
124
+ const loaded = loadSnapshot(paths);
125
+ return {
126
+ valid: true,
127
+ formatVersion: loaded.manifest.format_version,
128
+ records: Object.values(loaded.records).reduce((sum, records) => sum + records.length, 0),
129
+ attachments: Object.keys(loaded.attachments).length,
130
+ };
131
+ }
132
+ export function importSnapshot(paths, options = {}) {
133
+ const loaded = loadSnapshot(paths);
134
+ const records = loaded.manifest.format_version === 1
135
+ ? upgradeRecords(loaded.records)
136
+ : loaded.records;
137
+ const candidatePath = path.join(paths.dataDirectory, `.sync-${path.basename(paths.database)}-import-${randomUUID()}.sqlite3`);
138
+ const candidatePaths = { ...paths, database: candidatePath };
139
+ const candidate = openDatabase(candidatePaths, { create: true });
140
+ try {
141
+ initializeSchema(candidate);
142
+ insertRecords(candidate, records);
143
+ validateActorRecords(candidate);
144
+ }
145
+ finally {
146
+ candidate.close();
147
+ }
148
+ let before = {};
149
+ if (fs.existsSync(paths.database)) {
150
+ const current = openDatabase(paths, { allowLegacy: true });
151
+ try {
152
+ try {
153
+ before = databaseFiles(paths, current);
154
+ }
155
+ catch (error) {
156
+ if (!options.force)
157
+ throw error;
158
+ }
159
+ }
160
+ finally {
161
+ current.close();
162
+ }
163
+ }
164
+ const candidateForFiles = openDatabase(candidatePaths);
165
+ let after;
166
+ try {
167
+ after = filesFromRecords(schemaManifest(candidateForFiles), records, loaded.attachments);
168
+ }
169
+ finally {
170
+ candidateForFiles.close();
171
+ }
172
+ const diff = differences(before, after);
173
+ if (options.dryRun) {
174
+ fs.rmSync(candidatePath, { force: true });
175
+ return diff;
176
+ }
177
+ if (fs.existsSync(paths.database) && !options.force) {
178
+ const current = openDatabase(paths, { allowLegacy: true });
179
+ try {
180
+ checkFiles(paths, current, "import");
181
+ }
182
+ finally {
183
+ current.close();
184
+ }
185
+ }
186
+ backupStorage(paths);
187
+ removeDatabaseSidecars(paths.database);
188
+ fs.rmSync(paths.database, { force: true });
189
+ fs.mkdirSync(paths.dataDirectory, { recursive: true });
190
+ fs.renameSync(candidatePath, paths.database);
191
+ replaceAttachments(paths, loaded.attachments);
192
+ const stage = stageFiles(paths, after);
193
+ replaceDirectory(paths.snapshotDirectory, stage);
194
+ saveState(paths, after, after);
195
+ return { ...diff, imported: true };
196
+ }
197
+ export function migrateStorage(paths) {
198
+ const source = openDatabase(paths, { allowLegacy: true });
199
+ try {
200
+ recover(paths, source);
201
+ if (hasTable(source, "actors"))
202
+ return { migrated: false, format_version: 2 };
203
+ checkFiles(paths, source);
204
+ const manifest = schemaManifest(source);
205
+ const records = {};
206
+ for (const [table, spec] of Object.entries(manifest.tables)) {
207
+ const order = spec.primary_key.map(quoteIdentifier).join(",");
208
+ records[table] = source
209
+ .prepare(`SELECT * FROM ${quoteIdentifier(table)} ORDER BY ${order}`)
210
+ .all();
211
+ }
212
+ const upgraded = upgradeRecords(records);
213
+ const candidatePath = path.join(paths.dataDirectory, `.sync-${path.basename(paths.database)}-migrate-${randomUUID()}.sqlite3`);
214
+ const candidatePaths = { ...paths, database: candidatePath };
215
+ const candidate = openDatabase(candidatePaths, { create: true });
216
+ let files;
217
+ try {
218
+ initializeSchema(candidate);
219
+ insertRecords(candidate, upgraded);
220
+ validateActorRecords(candidate);
221
+ files = databaseFiles({ ...paths, database: candidatePath }, candidate);
222
+ }
223
+ finally {
224
+ candidate.close();
225
+ }
226
+ source.exec("PRAGMA wal_checkpoint(TRUNCATE)");
227
+ backupStorage(paths);
228
+ source.close();
229
+ removeDatabaseSidecars(paths.database);
230
+ fs.rmSync(paths.database, { force: true });
231
+ fs.renameSync(candidatePath, paths.database);
232
+ const stage = stageFiles(paths, files);
233
+ replaceDirectory(paths.snapshotDirectory, stage);
234
+ saveState(paths, files, files);
235
+ return { migrated: true, format_version: 2 };
236
+ }
237
+ finally {
238
+ try {
239
+ source.close();
240
+ }
241
+ catch { }
242
+ }
243
+ }
244
+ export function syncStatus(paths) {
245
+ const databaseExists = fs.existsSync(paths.database);
246
+ const snapshotExists = fs.existsSync(paths.snapshotDirectory);
247
+ if (!databaseExists && !snapshotExists)
248
+ return {
249
+ database_exists: false,
250
+ snapshot_exists: false,
251
+ files_changed: false,
252
+ database_changed: false,
253
+ differences: { added: [], changed: [], deleted: [] },
254
+ migration_required: false,
255
+ };
256
+ const snapshot = diskFiles(paths.snapshotDirectory);
257
+ let databaseFilesValue = {};
258
+ let migrationRequired = false;
259
+ if (databaseExists) {
260
+ const database = openDatabase(paths, { allowLegacy: true });
261
+ try {
262
+ migrationRequired = !hasTable(database, "actors");
263
+ databaseFilesValue = databaseFiles(paths, database);
264
+ }
265
+ finally {
266
+ database.close();
267
+ }
268
+ }
269
+ const saved = readState(paths);
270
+ const snapshotDigest = digest(snapshot);
271
+ const databaseDigest = digest(databaseFilesValue);
272
+ return {
273
+ database_exists: databaseExists,
274
+ snapshot_exists: snapshotExists,
275
+ files_changed: Boolean(saved && saved.digest !== snapshotDigest),
276
+ database_changed: Boolean(saved && saved.database_digest !== databaseDigest),
277
+ differences: differences(snapshot, databaseFilesValue),
278
+ migration_required: migrationRequired,
279
+ };
280
+ }
281
+ export function recover(paths, database) {
282
+ const journalPath = localPath(paths, "journal.json");
283
+ if (!fs.existsSync(journalPath))
284
+ return;
285
+ const journal = readJson(journalPath);
286
+ const token = hasTable(database, "__sync_meta")
287
+ ? database.prepare("SELECT token FROM __sync_meta WHERE id=1").get()?.token
288
+ : undefined;
289
+ if (token === journal.token) {
290
+ const files = fs.existsSync(journal.stage)
291
+ ? diskFiles(journal.stage)
292
+ : diskFiles(paths.snapshotDirectory);
293
+ if (fs.existsSync(journal.stage))
294
+ replaceDirectory(paths.snapshotDirectory, journal.stage);
295
+ saveState(paths, files, databaseFiles(paths, database));
296
+ }
297
+ else {
298
+ fs.rmSync(journal.stage, { recursive: true, force: true });
299
+ }
300
+ clearRecovery(paths, database);
301
+ }
302
+ function publish(paths, database, files, stage) {
303
+ try {
304
+ replaceDirectory(paths.snapshotDirectory, stage);
305
+ saveState(paths, files, files);
306
+ clearRecovery(paths, database);
307
+ }
308
+ catch (error) {
309
+ throw new PendingExportError(error instanceof Error ? error.message : String(error));
310
+ }
311
+ }
312
+ function databaseFiles(paths, database) {
313
+ const manifest = schemaManifest(database);
314
+ const records = {};
315
+ for (const [table, spec] of Object.entries(manifest.tables)) {
316
+ const order = spec.primary_key.map(quoteIdentifier).join(",");
317
+ const selected = spec.columns.map(quoteIdentifier).join(",");
318
+ records[table] = database
319
+ .prepare(`SELECT ${selected} FROM ${quoteIdentifier(table)} ORDER BY ${order}`)
320
+ .all();
321
+ }
322
+ const attachments = {};
323
+ for (const row of records.issue_attachments ?? []) {
324
+ const name = String(row.storage_name);
325
+ if (path.basename(name) !== name ||
326
+ name === "." ||
327
+ name === ".." ||
328
+ name.includes("\\"))
329
+ throw new InvalidInputError("Unsafe attachment path");
330
+ const file = path.join(paths.attachmentsDirectory, name);
331
+ if (!fs.existsSync(file) || fs.lstatSync(file).isSymbolicLink())
332
+ throw new InvalidInputError(`Attachment file not found or unsafe: ${name}`);
333
+ const content = fs.readFileSync(file);
334
+ if (content.length !== Number(row.size))
335
+ throw new InvalidInputError(`Attachment size does not match: ${name}`);
336
+ attachments[name] = content;
337
+ }
338
+ return filesFromRecords(manifest, records, attachments);
339
+ }
340
+ function schemaManifest(database) {
341
+ const tables = database
342
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name!='__sync_meta' ORDER BY name")
343
+ .all();
344
+ const specs = {};
345
+ for (const { name } of tables) {
346
+ const fields = database
347
+ .prepare(`PRAGMA table_info(${quoteIdentifier(name)})`)
348
+ .all();
349
+ specs[name] = {
350
+ columns: fields.map((field) => field.name),
351
+ primary_key: fields
352
+ .filter((field) => field.pk)
353
+ .sort((a, b) => a.pk - b.pk)
354
+ .map((field) => field.name),
355
+ };
356
+ }
357
+ return {
358
+ format_version: hasTable(database, "actors") ? 2 : 1,
359
+ tables: specs,
360
+ };
361
+ }
362
+ function filesFromRecords(manifest, records, attachments) {
363
+ const files = {
364
+ "manifest.json": encode(manifest),
365
+ };
366
+ for (const [table, rows] of Object.entries(records)) {
367
+ const spec = manifest.tables[table];
368
+ for (const row of rows)
369
+ files[`${table}/${recordName(row, spec)}.json`] = encode(row);
370
+ }
371
+ for (const [name, content] of Object.entries(attachments))
372
+ files[`attachments/${name}`] = content;
373
+ return files;
374
+ }
375
+ function loadSnapshot(paths) {
376
+ const files = diskFiles(paths.snapshotDirectory);
377
+ const manifestBuffer = files["manifest.json"];
378
+ if (!manifestBuffer)
379
+ throw new InvalidInputError("Snapshot manifest not found");
380
+ const manifest = JSON.parse(manifestBuffer.toString("utf8"));
381
+ if (![1, 2].includes(manifest.format_version))
382
+ throw new InvalidInputError("Unsupported snapshot format");
383
+ const records = Object.fromEntries(Object.keys(manifest.tables).map((table) => [table, []]));
384
+ const attachments = {};
385
+ for (const [name, content] of Object.entries(files)) {
386
+ if (name === "manifest.json")
387
+ continue;
388
+ if (name.startsWith("attachments/")) {
389
+ attachments[name.slice(12)] = content;
390
+ continue;
391
+ }
392
+ const [table, filename, extra] = name.split("/");
393
+ if (extra ||
394
+ !table ||
395
+ !filename ||
396
+ !filename.startsWith("row-") ||
397
+ !filename.endsWith(".json") ||
398
+ !records[table])
399
+ throw new InvalidInputError(`Unknown snapshot file: ${name}`);
400
+ const row = JSON.parse(content.toString("utf8"));
401
+ const allowed = manifest.tables[table].columns;
402
+ if (Object.keys(row).some((column) => !allowed.includes(column)))
403
+ throw new InvalidInputError(`Unknown field in ${name}`);
404
+ records[table].push(row);
405
+ }
406
+ return { manifest, records, attachments };
407
+ }
408
+ function insertRecords(database, records) {
409
+ database.exec("PRAGMA defer_foreign_keys = ON; BEGIN IMMEDIATE");
410
+ try {
411
+ for (const [table, entries] of Object.entries(records)) {
412
+ for (const row of entries) {
413
+ const columns = Object.keys(row);
414
+ database
415
+ .prepare(`INSERT INTO ${quoteIdentifier(table)}(${columns.map(quoteIdentifier).join(",")}) VALUES(${columns.map(() => "?").join(",")})`)
416
+ .run(...columns.map((column) => row[column] ?? null));
417
+ }
418
+ }
419
+ database.exec("COMMIT");
420
+ }
421
+ catch (error) {
422
+ database.exec("ROLLBACK");
423
+ throw error;
424
+ }
425
+ }
426
+ function validateActorRecords(database) {
427
+ if (!hasTable(database, "actors"))
428
+ return;
429
+ const invalid = database
430
+ .prepare(`SELECT id FROM actors WHERE
431
+ (kind='member' AND (member_id IS NULL OR member_id!=id OR key IS NOT NULL)) OR
432
+ (kind='agent' AND (member_id IS NOT NULL OR key IS NULL OR length(trim(key))=0)) LIMIT 1`)
433
+ .get();
434
+ if (invalid)
435
+ throw new InvalidInputError("Invalid actor records");
436
+ }
437
+ function upgradeRecords(records) {
438
+ return {
439
+ ...records,
440
+ actors: (records.members ?? []).map((member) => ({
441
+ id: member.id ?? null,
442
+ kind: "member",
443
+ name: member.name ?? "",
444
+ active: member.active ?? 1,
445
+ member_id: member.id ?? null,
446
+ key: null,
447
+ avatar_color: member.avatar_color ?? "#8585cc",
448
+ created_at: member.created_at ?? "",
449
+ })),
450
+ };
451
+ }
452
+ function checkFiles(paths, database, direction = "write") {
453
+ const saved = readState(paths);
454
+ if (!saved) {
455
+ if (fs.existsSync(paths.snapshotDirectory) &&
456
+ fs.readdirSync(paths.snapshotDirectory).length)
457
+ throw new SyncConflictError("Synchronization state is missing. Use sync export --force or sync import --force.");
458
+ return;
459
+ }
460
+ if (saved.snapshot_dir !== paths.snapshotDirectory)
461
+ throw new SyncConflictError("Snapshot path changed. Use sync export --force or sync import --force.");
462
+ const snapshotChanged = saved.digest !== digest(diskFiles(paths.snapshotDirectory));
463
+ const databaseChanged = saved.database_digest !== digest(databaseFiles(paths, database));
464
+ if (snapshotChanged || (direction === "import" && databaseChanged))
465
+ throw new SyncConflictError("Database and snapshot changed independently. Review changes before import or export.");
466
+ }
467
+ function stageFiles(paths, files) {
468
+ const stage = path.join(paths.dataDirectory, `.sync-${path.basename(paths.database)}-stage-${randomUUID()}`);
469
+ writeFiles(stage, files);
470
+ return stage;
471
+ }
472
+ function replaceDirectory(destination, source) {
473
+ const previous = `${destination}.previous-${randomUUID()}`;
474
+ fs.mkdirSync(path.dirname(destination), { recursive: true });
475
+ if (fs.existsSync(destination))
476
+ fs.renameSync(destination, previous);
477
+ try {
478
+ fs.renameSync(source, destination);
479
+ fs.rmSync(previous, { recursive: true, force: true });
480
+ }
481
+ catch (error) {
482
+ if (!fs.existsSync(destination) && fs.existsSync(previous))
483
+ fs.renameSync(previous, destination);
484
+ throw error;
485
+ }
486
+ }
487
+ function replaceAttachments(paths, attachments) {
488
+ const stage = path.join(paths.dataDirectory, `.sync-attachments-${randomUUID()}`);
489
+ fs.mkdirSync(stage, { recursive: true });
490
+ for (const [name, content] of Object.entries(attachments))
491
+ fs.writeFileSync(path.join(stage, name), content);
492
+ replaceDirectory(paths.attachmentsDirectory, stage);
493
+ }
494
+ function backupStorage(paths) {
495
+ if (!fs.existsSync(paths.database))
496
+ return;
497
+ fs.mkdirSync(paths.backupsDirectory, { recursive: true });
498
+ const destination = path.join(paths.backupsDirectory, `workspace-${new Date().toISOString().replaceAll(":", "-")}.sqlite3`);
499
+ fs.copyFileSync(paths.database, destination);
500
+ if (fs.existsSync(paths.attachmentsDirectory)) {
501
+ fs.cpSync(paths.attachmentsDirectory, path.join(paths.backupsDirectory, `${path.basename(destination, ".sqlite3")}-attachments`), { recursive: true });
502
+ }
503
+ if (fs.existsSync(paths.snapshotDirectory)) {
504
+ fs.cpSync(paths.snapshotDirectory, path.join(paths.backupsDirectory, `${path.basename(destination, ".sqlite3")}-snapshot`), { recursive: true });
505
+ }
506
+ }
507
+ function removeDatabaseSidecars(database) {
508
+ fs.rmSync(`${database}-wal`, { force: true });
509
+ fs.rmSync(`${database}-shm`, { force: true });
510
+ }
511
+ function removeUnusedTables(database) {
512
+ for (const table of [
513
+ "agent_messages",
514
+ "agent_threads",
515
+ "reviews",
516
+ "documents",
517
+ ]) {
518
+ if (hasTable(database, table))
519
+ database.exec(`DROP TABLE ${quoteIdentifier(table)}`);
520
+ }
521
+ }
522
+ function ensureSyncMeta(database) {
523
+ database.exec("CREATE TABLE IF NOT EXISTS __sync_meta (id INTEGER PRIMARY KEY CHECK(id=1), token TEXT)");
524
+ }
525
+ function clearRecovery(paths, database) {
526
+ if (hasTable(database, "__sync_meta"))
527
+ database.exec("DELETE FROM __sync_meta");
528
+ fs.rmSync(localPath(paths, "journal.json"), { force: true });
529
+ }
530
+ function saveState(paths, snapshot, database) {
531
+ writeJson(localPath(paths, "state.json"), {
532
+ snapshot_dir: paths.snapshotDirectory,
533
+ digest: digest(snapshot),
534
+ database_digest: digest(database),
535
+ });
536
+ }
537
+ function readState(paths) {
538
+ const file = localPath(paths, "state.json");
539
+ return fs.existsSync(file) ? readJson(file) : null;
540
+ }
541
+ function writeFiles(directory, files) {
542
+ fs.rmSync(directory, { recursive: true, force: true });
543
+ for (const [name, content] of Object.entries(files)) {
544
+ const target = path.join(directory, name);
545
+ fs.mkdirSync(path.dirname(target), { recursive: true });
546
+ fs.writeFileSync(target, content);
547
+ }
548
+ }
549
+ function diskFiles(directory) {
550
+ const result = {};
551
+ if (!fs.existsSync(directory))
552
+ return result;
553
+ if (fs.lstatSync(directory).isSymbolicLink() ||
554
+ !fs.statSync(directory).isDirectory())
555
+ throw new InvalidInputError("Snapshot path must be a directory");
556
+ const visit = (current) => {
557
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
558
+ const target = path.join(current, entry.name);
559
+ if (entry.isSymbolicLink())
560
+ throw new InvalidInputError(`Symbolic links are not allowed: ${target}`);
561
+ if (entry.isDirectory())
562
+ visit(target);
563
+ else
564
+ result[path.relative(directory, target).split(path.sep).join("/")] =
565
+ fs.readFileSync(target);
566
+ }
567
+ };
568
+ visit(directory);
569
+ return result;
570
+ }
571
+ function differences(before, after) {
572
+ const beforeNames = new Set(Object.keys(before));
573
+ const afterNames = new Set(Object.keys(after));
574
+ return {
575
+ added: [...afterNames].filter((name) => !beforeNames.has(name)).sort(),
576
+ changed: [...afterNames]
577
+ .filter((name) => beforeNames.has(name) && !after[name].equals(before[name]))
578
+ .sort(),
579
+ deleted: [...beforeNames].filter((name) => !afterNames.has(name)).sort(),
580
+ };
581
+ }
582
+ function digest(files) {
583
+ const hash = crypto.createHash("sha256");
584
+ for (const name of Object.keys(files).sort()) {
585
+ hash.update(encode([
586
+ name,
587
+ crypto.createHash("sha256").update(files[name]).digest("hex"),
588
+ ]));
589
+ }
590
+ return hash.digest("hex");
591
+ }
592
+ function recordName(row, spec) {
593
+ return `row-${spec.primary_key.map((key) => encodePart(String(row[key]))).join("--")}`;
594
+ }
595
+ function encodePart(value) {
596
+ return encodeURIComponent(value).replace(/[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
597
+ }
598
+ function encode(value) {
599
+ return Buffer.from(`${JSON.stringify(sortJson(value), null, 2)}\n`, "utf8");
600
+ }
601
+ function sortJson(value) {
602
+ if (Array.isArray(value))
603
+ return value.map(sortJson);
604
+ if (value && typeof value === "object")
605
+ return Object.fromEntries(Object.entries(value)
606
+ .sort(([left], [right]) => left.localeCompare(right))
607
+ .map(([key, child]) => [key, sortJson(child)]));
608
+ return value;
609
+ }
610
+ function quoteIdentifier(value) {
611
+ return `"${value.replaceAll('"', '""')}"`;
612
+ }
613
+ function localPath(paths, name) {
614
+ return path.join(paths.dataDirectory, `.sync-${path.basename(paths.database)}-${name}`);
615
+ }
616
+ function writeJson(file, value) {
617
+ fs.mkdirSync(path.dirname(file), { recursive: true });
618
+ const temporary = `${file}.tmp`;
619
+ fs.writeFileSync(temporary, encode(value));
620
+ fs.renameSync(temporary, file);
621
+ }
622
+ function readJson(file) {
623
+ return JSON.parse(fs.readFileSync(file, "utf8"));
624
+ }
625
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}