@tengx5383/aitool-sync-cli 0.1.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/.claude/settings.local.json +8 -0
- package/README.md +203 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +87 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +24 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +89 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +105 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +22 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +52 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +6 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +60 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +20 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +46 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/config-file.d.ts +22 -0
- package/dist/config/config-file.d.ts.map +1 -0
- package/dist/config/config-file.js +86 -0
- package/dist/config/config-file.js.map +1 -0
- package/dist/config/schema.d.ts +101 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/backup.d.ts +8 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +50 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/checksum.d.ts +14 -0
- package/dist/core/checksum.d.ts.map +1 -0
- package/dist/core/checksum.js +23 -0
- package/dist/core/checksum.js.map +1 -0
- package/dist/core/exclusions.d.ts +8 -0
- package/dist/core/exclusions.d.ts.map +1 -0
- package/dist/core/exclusions.js +29 -0
- package/dist/core/exclusions.js.map +1 -0
- package/dist/core/file-collector.d.ts +16 -0
- package/dist/core/file-collector.d.ts.map +1 -0
- package/dist/core/file-collector.js +104 -0
- package/dist/core/file-collector.js.map +1 -0
- package/dist/core/manifest.d.ts +18 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +42 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/path-expander.d.ts +6 -0
- package/dist/core/path-expander.d.ts.map +1 -0
- package/dist/core/path-expander.js +25 -0
- package/dist/core/path-expander.js.map +1 -0
- package/dist/core/sync-engine.d.ts +24 -0
- package/dist/core/sync-engine.d.ts.map +1 -0
- package/dist/core/sync-engine.js +206 -0
- package/dist/core/sync-engine.js.map +1 -0
- package/dist/core/sync-package.d.ts +12 -0
- package/dist/core/sync-package.d.ts.map +1 -0
- package/dist/core/sync-package.js +95 -0
- package/dist/core/sync-package.js.map +1 -0
- package/dist/crypto/encryptor.d.ts +15 -0
- package/dist/crypto/encryptor.d.ts.map +1 -0
- package/dist/crypto/encryptor.js +77 -0
- package/dist/crypto/encryptor.js.map +1 -0
- package/dist/crypto/key-resolver.d.ts +28 -0
- package/dist/crypto/key-resolver.d.ts.map +1 -0
- package/dist/crypto/key-resolver.js +62 -0
- package/dist/crypto/key-resolver.js.map +1 -0
- package/dist/gist/client.d.ts +18 -0
- package/dist/gist/client.d.ts.map +1 -0
- package/dist/gist/client.js +58 -0
- package/dist/gist/client.js.map +1 -0
- package/dist/gist/mock-client.d.ts +19 -0
- package/dist/gist/mock-client.d.ts.map +1 -0
- package/dist/gist/mock-client.js +61 -0
- package/dist/gist/mock-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/claude-code.d.ts +3 -0
- package/dist/presets/claude-code.d.ts.map +1 -0
- package/dist/presets/claude-code.js +27 -0
- package/dist/presets/claude-code.js.map +1 -0
- package/dist/presets/hermes.d.ts +3 -0
- package/dist/presets/hermes.d.ts.map +1 -0
- package/dist/presets/hermes.js +27 -0
- package/dist/presets/hermes.js.map +1 -0
- package/dist/presets/index.d.ts +15 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +42 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/openclaw.d.ts +3 -0
- package/dist/presets/openclaw.d.ts.map +1 -0
- package/dist/presets/openclaw.js +27 -0
- package/dist/presets/openclaw.js.map +1 -0
- package/dist/types/config.d.ts +45 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/gist.d.ts +25 -0
- package/dist/types/gist.d.ts.map +1 -0
- package/dist/types/gist.js +2 -0
- package/dist/types/gist.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 +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/sync.d.ts +78 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +2 -0
- package/dist/types/sync.js.map +1 -0
- package/dist/utils/diff.d.ts +7 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +99 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/env.d.ts +13 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +29 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/table.d.ts +5 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +59 -0
- package/dist/utils/table.js.map +1 -0
- package/package.json +41 -0
- package/tests/integration/encryption-flow.test.ts +142 -0
- package/tests/integration/init-flow.test.ts +69 -0
- package/tests/integration/push-pull-flow.test.ts +183 -0
- package/tests/integration/status-flow.test.ts +149 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +10 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exclusions.js","sourceRoot":"","sources":["../../src/core/exclusions.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,MAAM,kBAAkB,GAAoB;IAC1C,EAAE,OAAO,EAAE,oBAAoB,EAAE;IACjC,EAAE,OAAO,EAAE,YAAY,EAAE;IACzB,EAAE,OAAO,EAAE,YAAY,EAAE;IACzB,EAAE,OAAO,EAAE,UAAU,EAAE;IACvB,EAAE,OAAO,EAAE,cAAc,EAAE;CAC5B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,YAAoB,EACpB,KAAsB;IAEtB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,uDAAuD;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SyncPathEntry, EncryptionRule } from '../types/config.js';
|
|
2
|
+
import type { ManifestEntry } from '../types/sync.js';
|
|
3
|
+
import type { ExclusionRule } from '../types/config.js';
|
|
4
|
+
interface CollectOptions {
|
|
5
|
+
syncPaths: SyncPathEntry[];
|
|
6
|
+
exclusions: ExclusionRule[];
|
|
7
|
+
encryption: EncryptionRule[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Walk sync paths and collect file entries.
|
|
11
|
+
* Handles both single-file and directory paths.
|
|
12
|
+
* Globs are expanded using simple fs.glob-like behavior.
|
|
13
|
+
*/
|
|
14
|
+
export declare function collectFiles(options: CollectOptions): ManifestEntry[];
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=file-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-collector.d.ts","sourceRoot":"","sources":["../../src/core/file-collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,UAAU,cAAc;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAuCrE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { expandPath } from './path-expander.js';
|
|
4
|
+
import { isExcluded } from './exclusions.js';
|
|
5
|
+
import { computeChecksum } from './checksum.js';
|
|
6
|
+
import { debug, warn } from '../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Walk sync paths and collect file entries.
|
|
9
|
+
* Handles both single-file and directory paths.
|
|
10
|
+
* Globs are expanded using simple fs.glob-like behavior.
|
|
11
|
+
*/
|
|
12
|
+
export function collectFiles(options) {
|
|
13
|
+
const entries = [];
|
|
14
|
+
const seen = new Set();
|
|
15
|
+
for (const syncPath of options.syncPaths) {
|
|
16
|
+
if (!syncPath.enabled)
|
|
17
|
+
continue;
|
|
18
|
+
const expanded = expandPath(syncPath.path);
|
|
19
|
+
debug(`Collecting files from: ${syncPath.name} -> ${expanded}`);
|
|
20
|
+
let stat;
|
|
21
|
+
try {
|
|
22
|
+
stat = fs.statSync(expanded);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
warn(`Path not found, skipping: ${syncPath.name} (${expanded})`);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (stat.isDirectory()) {
|
|
29
|
+
// Walk directory recursively
|
|
30
|
+
walkDirectory(expanded, expanded, syncPath.name, seen, entries, options);
|
|
31
|
+
}
|
|
32
|
+
else if (stat.isFile()) {
|
|
33
|
+
// Single file
|
|
34
|
+
const relativePath = path.basename(expanded);
|
|
35
|
+
if (seen.has(relativePath)) {
|
|
36
|
+
warn(`Duplicate file skipped: ${relativePath}`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (isExcluded(relativePath, options.exclusions)) {
|
|
40
|
+
debug(`Excluded: ${relativePath}`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
seen.add(relativePath);
|
|
44
|
+
const entry = createEntry(expanded, relativePath, syncPath.name, options.encryption);
|
|
45
|
+
if (entry)
|
|
46
|
+
entries.push(entry);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return entries;
|
|
50
|
+
}
|
|
51
|
+
function walkDirectory(baseDir, currentDir, sourceName, seen, entries, options) {
|
|
52
|
+
let items;
|
|
53
|
+
try {
|
|
54
|
+
items = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
warn(`Cannot read directory: ${currentDir}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const item of items) {
|
|
61
|
+
const fullPath = path.join(currentDir, item.name);
|
|
62
|
+
const relativePath = path.relative(baseDir, fullPath);
|
|
63
|
+
if (isExcluded(relativePath, options.exclusions)) {
|
|
64
|
+
debug(`Excluded: ${relativePath}`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (item.isDirectory()) {
|
|
68
|
+
walkDirectory(baseDir, fullPath, sourceName, seen, entries, options);
|
|
69
|
+
}
|
|
70
|
+
else if (item.isFile()) {
|
|
71
|
+
if (seen.has(relativePath)) {
|
|
72
|
+
warn(`Duplicate file skipped: ${relativePath}`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
seen.add(relativePath);
|
|
76
|
+
const entry = createEntry(fullPath, relativePath, sourceName, options.encryption);
|
|
77
|
+
if (entry)
|
|
78
|
+
entries.push(entry);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function createEntry(fullPath, relativePath, sourceName, encryptionRules) {
|
|
83
|
+
try {
|
|
84
|
+
const stat = fs.statSync(fullPath);
|
|
85
|
+
const checksum = computeChecksum(fullPath);
|
|
86
|
+
// Check if file matches any encryption pattern
|
|
87
|
+
const encrypted = false; // Encryption is applied during packaging
|
|
88
|
+
const encryptionPattern = null; // Determined at package time
|
|
89
|
+
return {
|
|
90
|
+
relativePath,
|
|
91
|
+
checksum,
|
|
92
|
+
size: stat.size,
|
|
93
|
+
modifiedAt: stat.mtime.toISOString(),
|
|
94
|
+
sourceName,
|
|
95
|
+
encrypted,
|
|
96
|
+
encryptionPattern,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
warn(`Failed to read file: ${fullPath}`);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=file-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-collector.js","sourceRoot":"","sources":["../../src/core/file-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Manifest, ManifestEntry } from '../types/sync.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a Manifest from collected entries.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createManifest(entries: ManifestEntry[]): Manifest;
|
|
6
|
+
/**
|
|
7
|
+
* Serialize a Manifest to a JSON string.
|
|
8
|
+
*/
|
|
9
|
+
export declare function serializeManifest(manifest: Manifest): string;
|
|
10
|
+
/**
|
|
11
|
+
* Parse a JSON string into a Manifest.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseManifest(json: string): Manifest | null;
|
|
14
|
+
/**
|
|
15
|
+
* Create a lookup map from relativePath to ManifestEntry.
|
|
16
|
+
*/
|
|
17
|
+
export declare function manifestToMap(manifest: Manifest): Map<string, ManifestEntry>;
|
|
18
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAGvF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,QAAQ,CAMjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAU3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAM5E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a Manifest from collected entries.
|
|
3
|
+
*/
|
|
4
|
+
export function createManifest(entries) {
|
|
5
|
+
return {
|
|
6
|
+
version: 1,
|
|
7
|
+
generatedAt: new Date().toISOString(),
|
|
8
|
+
entries,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Serialize a Manifest to a JSON string.
|
|
13
|
+
*/
|
|
14
|
+
export function serializeManifest(manifest) {
|
|
15
|
+
return JSON.stringify(manifest);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse a JSON string into a Manifest.
|
|
19
|
+
*/
|
|
20
|
+
export function parseManifest(json) {
|
|
21
|
+
try {
|
|
22
|
+
const obj = JSON.parse(json);
|
|
23
|
+
if (obj.version !== 1 || !Array.isArray(obj.entries)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a lookup map from relativePath to ManifestEntry.
|
|
34
|
+
*/
|
|
35
|
+
export function manifestToMap(manifest) {
|
|
36
|
+
const map = new Map();
|
|
37
|
+
for (const entry of manifest.entries) {
|
|
38
|
+
map.set(entry.relativePath, entry);
|
|
39
|
+
}
|
|
40
|
+
return map;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAe,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-expander.d.ts","sourceRoot":"","sources":["../../src/core/path-expander.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsB9C"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Expand paths containing ~, $HOME, and other shell-like expansions.
|
|
5
|
+
* Returns absolute paths.
|
|
6
|
+
*/
|
|
7
|
+
export function expandPath(raw) {
|
|
8
|
+
let expanded = raw;
|
|
9
|
+
// Expand tilde
|
|
10
|
+
if (expanded.startsWith('~')) {
|
|
11
|
+
expanded = expanded.replace(/^~(?=$|\/)/, os.homedir());
|
|
12
|
+
}
|
|
13
|
+
// Expand $HOME and %HOME%
|
|
14
|
+
expanded = expanded.replace(/\$HOME|%HOME%/gi, os.homedir());
|
|
15
|
+
// Expand ~user (just do a basic check)
|
|
16
|
+
expanded = expanded.replace(/~(\w+)/g, (_match, user) => {
|
|
17
|
+
return path.join('/Users', user);
|
|
18
|
+
});
|
|
19
|
+
// Resolve to absolute path
|
|
20
|
+
if (!path.isAbsolute(expanded)) {
|
|
21
|
+
expanded = path.resolve(process.cwd(), expanded);
|
|
22
|
+
}
|
|
23
|
+
return expanded;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=path-expander.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-expander.js","sourceRoot":"","sources":["../../src/core/path-expander.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,QAAQ,GAAG,GAAG,CAAC;IAEnB,eAAe;IACf,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,0BAA0B;IAC1B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7D,uCAAuC;IACvC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AppConfig } from '../types/config.js';
|
|
2
|
+
import type { Manifest, SyncDiff, SyncResult, SyncPackage } from '../types/sync.js';
|
|
3
|
+
import type { GistClientInterface } from '../types/gist.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build a local Manifest from the current file system state.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildLocalManifest(config: AppConfig): Manifest;
|
|
8
|
+
/**
|
|
9
|
+
* Compute diff between local and remote manifests.
|
|
10
|
+
*/
|
|
11
|
+
export declare function computeDiff(config: AppConfig, remoteManifest: Manifest): SyncDiff;
|
|
12
|
+
/**
|
|
13
|
+
* Push local files to remote Gist.
|
|
14
|
+
*/
|
|
15
|
+
export declare function pushSync(config: AppConfig, gistClient: GistClientInterface, force: boolean, encryptFn?: (content: string) => string): Promise<SyncResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Pull remote files from Gist to local.
|
|
18
|
+
*/
|
|
19
|
+
export declare function pullSync(config: AppConfig, gistClient: GistClientInterface, force: boolean, decryptFn?: (content: string) => string): Promise<SyncResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Write remote files locally, handling encryption.
|
|
22
|
+
*/
|
|
23
|
+
export declare function writeRemoteFiles(remotePackage: SyncPackage, config: AppConfig, decryptFn?: (content: string) => string): Promise<string[]>;
|
|
24
|
+
//# sourceMappingURL=sync-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAY5D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAO9D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAIjF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,UAAU,CAAC,CAqErB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,UAAU,CAAC,CA8DrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,WAAW,EAC1B,MAAM,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CAgDnB"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { collectFiles } from './file-collector.js';
|
|
4
|
+
import { createManifest, serializeManifest, parseManifest } from './manifest.js';
|
|
5
|
+
import { diffManifests } from '../utils/diff.js';
|
|
6
|
+
import { buildSyncPackage, parseSyncPackage } from './sync-package.js';
|
|
7
|
+
import { createBackup } from './backup.js';
|
|
8
|
+
import { expandPath } from './path-expander.js';
|
|
9
|
+
import { writeConfig } from '../config/config-file.js';
|
|
10
|
+
import { warn } from '../utils/logger.js';
|
|
11
|
+
const PACKAGE_FILENAME = 'aitool-sync-package.json';
|
|
12
|
+
/**
|
|
13
|
+
* Build a local Manifest from the current file system state.
|
|
14
|
+
*/
|
|
15
|
+
export function buildLocalManifest(config) {
|
|
16
|
+
const entries = collectFiles({
|
|
17
|
+
syncPaths: config.syncPaths,
|
|
18
|
+
exclusions: config.exclusions,
|
|
19
|
+
encryption: config.encryption,
|
|
20
|
+
});
|
|
21
|
+
return createManifest(entries);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compute diff between local and remote manifests.
|
|
25
|
+
*/
|
|
26
|
+
export function computeDiff(config, remoteManifest) {
|
|
27
|
+
const localManifest = buildLocalManifest(config);
|
|
28
|
+
const lastKnown = config.lastKnownManifest ? parseManifest(config.lastKnownManifest) : null;
|
|
29
|
+
return diffManifests(localManifest, remoteManifest, lastKnown);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Push local files to remote Gist.
|
|
33
|
+
*/
|
|
34
|
+
export async function pushSync(config, gistClient, force, encryptFn) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
// Ensure Gist exists
|
|
37
|
+
if (!config.gistId) {
|
|
38
|
+
return { success: false, action: 'push', filesUploaded: 0, filesDownloaded: 0, errors: ['No Gist configured. Run `aitool-sync init` first.'] };
|
|
39
|
+
}
|
|
40
|
+
let remoteManifest = null;
|
|
41
|
+
try {
|
|
42
|
+
const gist = await gistClient.getGist(config.gistId);
|
|
43
|
+
const pkgFile = gist.files.find((f) => f.filename === PACKAGE_FILENAME);
|
|
44
|
+
if (pkgFile) {
|
|
45
|
+
const parsed = parseSyncPackage(pkgFile.content);
|
|
46
|
+
remoteManifest = parsed?.manifest || null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
warn(`Could not fetch remote Gist: ${e.message}`);
|
|
51
|
+
}
|
|
52
|
+
const localManifest = buildLocalManifest(config);
|
|
53
|
+
const lastKnown = config.lastKnownManifest ? parseManifest(config.lastKnownManifest) : null;
|
|
54
|
+
// If remote exists, check for conflicts
|
|
55
|
+
if (remoteManifest) {
|
|
56
|
+
const diff = diffManifests(localManifest, remoteManifest, lastKnown);
|
|
57
|
+
if (diff.hasConflicts && !force) {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
action: 'push',
|
|
61
|
+
filesUploaded: 0,
|
|
62
|
+
filesDownloaded: 0,
|
|
63
|
+
errors: ['Conflicts detected. Use --force to overwrite remote.'],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Build sync package
|
|
68
|
+
const syncPackage = await buildSyncPackage(localManifest, config, encryptFn);
|
|
69
|
+
const packageJson = JSON.stringify(syncPackage, null, 2);
|
|
70
|
+
// Upload to Gist
|
|
71
|
+
try {
|
|
72
|
+
await gistClient.updateGist(config.gistId, {
|
|
73
|
+
[PACKAGE_FILENAME]: { content: packageJson },
|
|
74
|
+
});
|
|
75
|
+
// Update config
|
|
76
|
+
config.lastKnownManifest = serializeManifest(localManifest);
|
|
77
|
+
config.lastPushAt = new Date().toISOString();
|
|
78
|
+
writeConfig(config);
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
action: force ? 'force-push' : 'push',
|
|
82
|
+
filesUploaded: syncPackage.files.length,
|
|
83
|
+
filesDownloaded: 0,
|
|
84
|
+
errors: [],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
action: 'push',
|
|
91
|
+
filesUploaded: 0,
|
|
92
|
+
filesDownloaded: 0,
|
|
93
|
+
errors: [`Upload failed: ${e.message}`],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pull remote files from Gist to local.
|
|
99
|
+
*/
|
|
100
|
+
export async function pullSync(config, gistClient, force, decryptFn) {
|
|
101
|
+
const errors = [];
|
|
102
|
+
if (!config.gistId) {
|
|
103
|
+
return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: ['No Gist configured. Run `aitool-sync init` first.'] };
|
|
104
|
+
}
|
|
105
|
+
// Fetch remote
|
|
106
|
+
let gist;
|
|
107
|
+
try {
|
|
108
|
+
gist = await gistClient.getGist(config.gistId);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: [`Failed to fetch Gist: ${e.message}`] };
|
|
112
|
+
}
|
|
113
|
+
const pkgFile = gist.files.find((f) => f.filename === PACKAGE_FILENAME);
|
|
114
|
+
if (!pkgFile) {
|
|
115
|
+
return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: ['No sync package found in Gist.'] };
|
|
116
|
+
}
|
|
117
|
+
const remotePackage = parseSyncPackage(pkgFile.content);
|
|
118
|
+
if (!remotePackage) {
|
|
119
|
+
return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: ['Failed to parse remote sync package.'] };
|
|
120
|
+
}
|
|
121
|
+
const remoteManifest = remotePackage.manifest;
|
|
122
|
+
const localManifest = buildLocalManifest(config);
|
|
123
|
+
const lastKnown = config.lastKnownManifest ? parseManifest(config.lastKnownManifest) : null;
|
|
124
|
+
// Check conflicts
|
|
125
|
+
const diff = diffManifests(localManifest, remoteManifest, lastKnown);
|
|
126
|
+
if (diff.hasConflicts && !force) {
|
|
127
|
+
return {
|
|
128
|
+
success: false,
|
|
129
|
+
action: 'pull',
|
|
130
|
+
filesUploaded: 0,
|
|
131
|
+
filesDownloaded: 0,
|
|
132
|
+
errors: ['Conflicts detected. Use --force to overwrite local files.'],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Create backup before overwriting
|
|
136
|
+
createBackup(config);
|
|
137
|
+
// Write files locally
|
|
138
|
+
const writeErrors = await writeRemoteFiles(remotePackage, config, decryptFn);
|
|
139
|
+
for (const e of writeErrors) {
|
|
140
|
+
errors.push(e);
|
|
141
|
+
}
|
|
142
|
+
// Update config
|
|
143
|
+
config.lastKnownManifest = serializeManifest(remoteManifest);
|
|
144
|
+
config.lastPullAt = new Date().toISOString();
|
|
145
|
+
writeConfig(config);
|
|
146
|
+
return {
|
|
147
|
+
success: true,
|
|
148
|
+
action: force ? 'force-pull' : 'pull',
|
|
149
|
+
filesUploaded: 0,
|
|
150
|
+
filesDownloaded: remotePackage.files.length,
|
|
151
|
+
errors,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Write remote files locally, handling encryption.
|
|
156
|
+
*/
|
|
157
|
+
export async function writeRemoteFiles(remotePackage, config, decryptFn) {
|
|
158
|
+
const errors = [];
|
|
159
|
+
for (const file of remotePackage.files) {
|
|
160
|
+
// Determine output path by matching source name in syncPaths
|
|
161
|
+
const sourceName = file.entry.sourceName;
|
|
162
|
+
const syncPath = config.syncPaths.find((sp) => sp.name === sourceName);
|
|
163
|
+
if (!syncPath) {
|
|
164
|
+
errors.push(`No matching sync path for source "${sourceName}"`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const expandedBase = expandPath(syncPath.path);
|
|
168
|
+
let fullPath;
|
|
169
|
+
// Check if the base path is a file or directory
|
|
170
|
+
const baseStat = (() => {
|
|
171
|
+
try {
|
|
172
|
+
return fs.statSync(expandedBase);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
})();
|
|
178
|
+
if (baseStat?.isFile()) {
|
|
179
|
+
fullPath = expandedBase;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
fullPath = path.join(expandedBase, file.relativePath);
|
|
183
|
+
}
|
|
184
|
+
// Ensure directory exists
|
|
185
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
186
|
+
let content;
|
|
187
|
+
if (file.encrypted && decryptFn) {
|
|
188
|
+
try {
|
|
189
|
+
// Content is base64(encrypted_payload), so decode outer base64 first
|
|
190
|
+
const decoded = Buffer.from(file.content, 'base64').toString('utf-8');
|
|
191
|
+
content = decryptFn(decoded);
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
errors.push(`Failed to decrypt ${file.relativePath}: ${e.message}`);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// Content is base64 encoded in the package
|
|
200
|
+
content = Buffer.from(file.content, 'base64').toString('utf-8');
|
|
201
|
+
}
|
|
202
|
+
fs.writeFileSync(fullPath, content, 'utf-8');
|
|
203
|
+
}
|
|
204
|
+
return errors;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=sync-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AppConfig } from '../types/config.js';
|
|
2
|
+
import type { Manifest, SyncPackage } from '../types/sync.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build a SyncPackage from a local manifest and config.
|
|
5
|
+
* Reads file contents from disk, optionally encrypting them.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildSyncPackage(manifest: Manifest, config: AppConfig, encryptFn?: (content: string) => string): Promise<SyncPackage>;
|
|
8
|
+
/**
|
|
9
|
+
* Parse a SyncPackage from a JSON string.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseSyncPackage(json: string): SyncPackage | null;
|
|
12
|
+
//# sourceMappingURL=sync-package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-package.d.ts","sourceRoot":"","sources":["../../src/core/sync-package.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAiB,WAAW,EAAY,MAAM,kBAAkB,CAAC;AAIvF;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,WAAW,CAAC,CA4EtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUjE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { expandPath } from './path-expander.js';
|
|
4
|
+
import { warn } from '../utils/logger.js';
|
|
5
|
+
import micromatch from 'micromatch';
|
|
6
|
+
/**
|
|
7
|
+
* Build a SyncPackage from a local manifest and config.
|
|
8
|
+
* Reads file contents from disk, optionally encrypting them.
|
|
9
|
+
*/
|
|
10
|
+
export async function buildSyncPackage(manifest, config, encryptFn) {
|
|
11
|
+
const files = [];
|
|
12
|
+
const encryptionPatterns = config.encryption.map((r) => r.pattern);
|
|
13
|
+
for (const entry of manifest.entries) {
|
|
14
|
+
const sourcePath = config.syncPaths.find((sp) => sp.name === entry.sourceName);
|
|
15
|
+
if (!sourcePath) {
|
|
16
|
+
warn(`No matching source for ${entry.sourceName}, skipping ${entry.relativePath}`);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const expandedBase = expandPath(sourcePath.path);
|
|
20
|
+
const baseIsFile = (() => {
|
|
21
|
+
try {
|
|
22
|
+
return fs.statSync(expandedBase).isFile();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
})();
|
|
28
|
+
// Determine full file path
|
|
29
|
+
let fullPath;
|
|
30
|
+
if (baseIsFile) {
|
|
31
|
+
// Single file source — relativePath is the filename
|
|
32
|
+
fullPath = expandedBase;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Directory source — relativePath is from the base
|
|
36
|
+
fullPath = path.join(expandedBase, entry.relativePath);
|
|
37
|
+
}
|
|
38
|
+
let content;
|
|
39
|
+
try {
|
|
40
|
+
content = fs.readFileSync(fullPath, 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
warn(`Failed to read file, skipping: ${fullPath}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Check if this file should be encrypted
|
|
47
|
+
let encrypted = false;
|
|
48
|
+
let encryptionPattern = null;
|
|
49
|
+
if (encryptionPatterns.length > 0 && encryptFn) {
|
|
50
|
+
const matched = encryptionPatterns.find((p) => micromatch.isMatch(entry.relativePath, p));
|
|
51
|
+
if (matched) {
|
|
52
|
+
try {
|
|
53
|
+
content = encryptFn(content);
|
|
54
|
+
encrypted = true;
|
|
55
|
+
encryptionPattern = matched;
|
|
56
|
+
entry.encrypted = true;
|
|
57
|
+
entry.encryptionPattern = matched;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
warn(`Failed to encrypt ${entry.relativePath}: ${e.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Store content as base64 to avoid encoding issues
|
|
65
|
+
const base64Content = Buffer.from(content, 'utf-8').toString('base64');
|
|
66
|
+
files.push({
|
|
67
|
+
relativePath: entry.relativePath,
|
|
68
|
+
content: base64Content,
|
|
69
|
+
encrypted,
|
|
70
|
+
entry: { ...entry, encrypted, encryptionPattern },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
version: 1,
|
|
75
|
+
createdAt: new Date().toISOString(),
|
|
76
|
+
manifest,
|
|
77
|
+
files,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Parse a SyncPackage from a JSON string.
|
|
82
|
+
*/
|
|
83
|
+
export function parseSyncPackage(json) {
|
|
84
|
+
try {
|
|
85
|
+
const obj = JSON.parse(json);
|
|
86
|
+
if (obj.version !== 1 || !Array.isArray(obj.files) || !obj.manifest) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return obj;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=sync-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-package.js","sourceRoot":"","sources":["../../src/core/sync-package.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypt plaintext with AES-256-GCM.
|
|
3
|
+
* Returns a base64-encoded string in the format: salt:iv:authTag:ciphertext
|
|
4
|
+
*/
|
|
5
|
+
export declare function encrypt(plaintext: string, password: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Decrypt ciphertext produced by encrypt().
|
|
8
|
+
* Expects the format: salt:iv:authTag:ciphertext
|
|
9
|
+
*/
|
|
10
|
+
export declare function decrypt(encryptedData: string, password: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Check whether a string looks like an encrypted payload.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isEncrypted(data: string): boolean;
|
|
15
|
+
//# sourceMappingURL=encryptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryptor.d.ts","sourceRoot":"","sources":["../../src/crypto/encryptor.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBnE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYjD"}
|