@tinyrack/dotweave 0.39.4
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/bin/index.js +5 -0
- package/dist/application.d.ts +5 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +86 -0
- package/dist/application.js.map +1 -0
- package/dist/cli/autocomplete.d.ts +7 -0
- package/dist/cli/autocomplete.d.ts.map +1 -0
- package/dist/cli/autocomplete.js +62 -0
- package/dist/cli/autocomplete.js.map +1 -0
- package/dist/cli/cd.d.ts +4 -0
- package/dist/cli/cd.d.ts.map +1 -0
- package/dist/cli/cd.js +23 -0
- package/dist/cli/cd.js.map +1 -0
- package/dist/cli/doctor.d.ts +4 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +92 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +110 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/profile/index.d.ts +3 -0
- package/dist/cli/profile/index.d.ts.map +1 -0
- package/dist/cli/profile/index.js +15 -0
- package/dist/cli/profile/index.js.map +1 -0
- package/dist/cli/profile/list.d.ts +4 -0
- package/dist/cli/profile/list.d.ts.map +1 -0
- package/dist/cli/profile/list.js +42 -0
- package/dist/cli/profile/list.js.map +1 -0
- package/dist/cli/profile/use.d.ts +4 -0
- package/dist/cli/profile/use.d.ts.map +1 -0
- package/dist/cli/profile/use.js +49 -0
- package/dist/cli/profile/use.js.map +1 -0
- package/dist/cli/pull.d.ts +4 -0
- package/dist/cli/pull.d.ts.map +1 -0
- package/dist/cli/pull.js +107 -0
- package/dist/cli/pull.js.map +1 -0
- package/dist/cli/push.d.ts +4 -0
- package/dist/cli/push.d.ts.map +1 -0
- package/dist/cli/push.js +49 -0
- package/dist/cli/push.js.map +1 -0
- package/dist/cli/root-commands.d.ts +13 -0
- package/dist/cli/root-commands.d.ts.map +1 -0
- package/dist/cli/root-commands.js +25 -0
- package/dist/cli/root-commands.js.map +1 -0
- package/dist/cli/status.d.ts +4 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +132 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/track.d.ts +4 -0
- package/dist/cli/track.d.ts.map +1 -0
- package/dist/cli/track.js +133 -0
- package/dist/cli/track.js.map +1 -0
- package/dist/cli/untrack.d.ts +4 -0
- package/dist/cli/untrack.d.ts.map +1 -0
- package/dist/cli/untrack.js +40 -0
- package/dist/cli/untrack.js.map +1 -0
- package/dist/config/constants.d.ts +31 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +33 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/global-config.d.ts +21 -0
- package/dist/config/global-config.d.ts.map +1 -0
- package/dist/config/global-config.js +89 -0
- package/dist/config/global-config.js.map +1 -0
- package/dist/config/identity-file.d.ts +9 -0
- package/dist/config/identity-file.d.ts.map +1 -0
- package/dist/config/identity-file.js +48 -0
- package/dist/config/identity-file.js.map +1 -0
- package/dist/config/migration.d.ts +9 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +61 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/platform.d.ts +12 -0
- package/dist/config/platform.d.ts.map +1 -0
- package/dist/config/platform.js +25 -0
- package/dist/config/platform.js.map +1 -0
- package/dist/config/runtime-env.d.ts +7 -0
- package/dist/config/runtime-env.d.ts.map +1 -0
- package/dist/config/runtime-env.js +31 -0
- package/dist/config/runtime-env.js.map +1 -0
- package/dist/config/sync-entry.d.ts +14 -0
- package/dist/config/sync-entry.d.ts.map +1 -0
- package/dist/config/sync-entry.js +99 -0
- package/dist/config/sync-entry.js.map +1 -0
- package/dist/config/sync-schema.d.ts +146 -0
- package/dist/config/sync-schema.d.ts.map +1 -0
- package/dist/config/sync-schema.js +392 -0
- package/dist/config/sync-schema.js.map +1 -0
- package/dist/config/sync.d.ts +8 -0
- package/dist/config/sync.d.ts.map +1 -0
- package/dist/config/sync.js +53 -0
- package/dist/config/sync.js.map +1 -0
- package/dist/config/xdg.d.ts +10 -0
- package/dist/config/xdg.d.ts.map +1 -0
- package/dist/config/xdg.js +90 -0
- package/dist/config/xdg.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/content.d.ts +5 -0
- package/dist/lib/content.d.ts.map +1 -0
- package/dist/lib/content.js +29 -0
- package/dist/lib/content.js.map +1 -0
- package/dist/lib/crypto.d.ts +45 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +130 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/env.d.ts +13 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +50 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/error.d.ts +22 -0
- package/dist/lib/error.d.ts.map +1 -0
- package/dist/lib/error.js +50 -0
- package/dist/lib/error.js.map +1 -0
- package/dist/lib/file-mode.d.ts +36 -0
- package/dist/lib/file-mode.d.ts.map +1 -0
- package/dist/lib/file-mode.js +55 -0
- package/dist/lib/file-mode.js.map +1 -0
- package/dist/lib/filesystem.d.ts +60 -0
- package/dist/lib/filesystem.d.ts.map +1 -0
- package/dist/lib/filesystem.js +190 -0
- package/dist/lib/filesystem.js.map +1 -0
- package/dist/lib/git.d.ts +23 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +162 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/jsonc.d.ts +8 -0
- package/dist/lib/jsonc.d.ts.map +1 -0
- package/dist/lib/jsonc.js +78 -0
- package/dist/lib/jsonc.js.map +1 -0
- package/dist/lib/path.d.ts +21 -0
- package/dist/lib/path.d.ts.map +1 -0
- package/dist/lib/path.js +44 -0
- package/dist/lib/path.js.map +1 -0
- package/dist/lib/promise.d.ts +10 -0
- package/dist/lib/promise.d.ts.map +1 -0
- package/dist/lib/promise.js +25 -0
- package/dist/lib/promise.js.map +1 -0
- package/dist/lib/string.d.ts +6 -0
- package/dist/lib/string.d.ts.map +1 -0
- package/dist/lib/string.js +8 -0
- package/dist/lib/string.js.map +1 -0
- package/dist/lib/validation.d.ts +7 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +13 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +4 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/migrations/global-v3.d.ts +3 -0
- package/dist/migrations/global-v3.d.ts.map +1 -0
- package/dist/migrations/global-v3.js +5 -0
- package/dist/migrations/global-v3.js.map +1 -0
- package/dist/services/autocomplete.d.ts +5 -0
- package/dist/services/autocomplete.d.ts.map +1 -0
- package/dist/services/autocomplete.js +185 -0
- package/dist/services/autocomplete.js.map +1 -0
- package/dist/services/config-file.d.ts +73 -0
- package/dist/services/config-file.d.ts.map +1 -0
- package/dist/services/config-file.js +40 -0
- package/dist/services/config-file.js.map +1 -0
- package/dist/services/doctor.d.ts +16 -0
- package/dist/services/doctor.d.ts.map +1 -0
- package/dist/services/doctor.js +126 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/init.d.ts +24 -0
- package/dist/services/init.d.ts.map +1 -0
- package/dist/services/init.js +265 -0
- package/dist/services/init.js.map +1 -0
- package/dist/services/local-materialization.d.ts +30 -0
- package/dist/services/local-materialization.d.ts.map +1 -0
- package/dist/services/local-materialization.js +451 -0
- package/dist/services/local-materialization.js.map +1 -0
- package/dist/services/local-snapshot.d.ts +26 -0
- package/dist/services/local-snapshot.d.ts.map +1 -0
- package/dist/services/local-snapshot.js +119 -0
- package/dist/services/local-snapshot.js.map +1 -0
- package/dist/services/paths.d.ts +8 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/paths.js +71 -0
- package/dist/services/paths.js.map +1 -0
- package/dist/services/profile.d.ts +39 -0
- package/dist/services/profile.d.ts.map +1 -0
- package/dist/services/profile.js +124 -0
- package/dist/services/profile.js.map +1 -0
- package/dist/services/pull.d.ts +38 -0
- package/dist/services/pull.d.ts.map +1 -0
- package/dist/services/pull.js +148 -0
- package/dist/services/pull.js.map +1 -0
- package/dist/services/push.d.ts +38 -0
- package/dist/services/push.d.ts.map +1 -0
- package/dist/services/push.js +120 -0
- package/dist/services/push.js.map +1 -0
- package/dist/services/repo-artifacts.d.ts +52 -0
- package/dist/services/repo-artifacts.d.ts.map +1 -0
- package/dist/services/repo-artifacts.js +325 -0
- package/dist/services/repo-artifacts.js.map +1 -0
- package/dist/services/repo-snapshot.d.ts +7 -0
- package/dist/services/repo-snapshot.d.ts.map +1 -0
- package/dist/services/repo-snapshot.js +181 -0
- package/dist/services/repo-snapshot.js.map +1 -0
- package/dist/services/runtime.d.ts +30 -0
- package/dist/services/runtime.d.ts.map +1 -0
- package/dist/services/runtime.js +71 -0
- package/dist/services/runtime.js.map +1 -0
- package/dist/services/set.d.ts +41 -0
- package/dist/services/set.d.ts.map +1 -0
- package/dist/services/set.js +288 -0
- package/dist/services/set.js.map +1 -0
- package/dist/services/status.d.ts +41 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +87 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/terminal/cli-runtime.d.ts +18 -0
- package/dist/services/terminal/cli-runtime.d.ts.map +1 -0
- package/dist/services/terminal/cli-runtime.js +19 -0
- package/dist/services/terminal/cli-runtime.js.map +1 -0
- package/dist/services/terminal/logger.d.ts +9 -0
- package/dist/services/terminal/logger.d.ts.map +1 -0
- package/dist/services/terminal/logger.js +15 -0
- package/dist/services/terminal/logger.js.map +1 -0
- package/dist/services/terminal/path-completion.d.ts +3 -0
- package/dist/services/terminal/path-completion.d.ts.map +1 -0
- package/dist/services/terminal/path-completion.js +108 -0
- package/dist/services/terminal/path-completion.js.map +1 -0
- package/dist/services/terminal/shell.d.ts +24 -0
- package/dist/services/terminal/shell.d.ts.map +1 -0
- package/dist/services/terminal/shell.js +227 -0
- package/dist/services/terminal/shell.js.map +1 -0
- package/dist/services/track.d.ts +20 -0
- package/dist/services/track.d.ts.map +1 -0
- package/dist/services/track.js +224 -0
- package/dist/services/track.js.map +1 -0
- package/dist/services/untrack.d.ts +13 -0
- package/dist/services/untrack.d.ts.map +1 -0
- package/dist/services/untrack.js +133 -0
- package/dist/services/untrack.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CONSTANTS } from "#app/config/constants.ts";
|
|
3
|
+
import { type PlatformKey, type PlatformStringValue } from "#app/config/platform.ts";
|
|
4
|
+
declare const platformSyncModeSchema: z.ZodObject<{
|
|
5
|
+
default: z.ZodEnum<{
|
|
6
|
+
normal: "normal";
|
|
7
|
+
secret: "secret";
|
|
8
|
+
ignore: "ignore";
|
|
9
|
+
}>;
|
|
10
|
+
win: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
normal: "normal";
|
|
12
|
+
secret: "secret";
|
|
13
|
+
ignore: "ignore";
|
|
14
|
+
}>>;
|
|
15
|
+
mac: z.ZodOptional<z.ZodEnum<{
|
|
16
|
+
normal: "normal";
|
|
17
|
+
secret: "secret";
|
|
18
|
+
ignore: "ignore";
|
|
19
|
+
}>>;
|
|
20
|
+
linux: z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
normal: "normal";
|
|
22
|
+
secret: "secret";
|
|
23
|
+
ignore: "ignore";
|
|
24
|
+
}>>;
|
|
25
|
+
wsl: z.ZodOptional<z.ZodEnum<{
|
|
26
|
+
normal: "normal";
|
|
27
|
+
secret: "secret";
|
|
28
|
+
ignore: "ignore";
|
|
29
|
+
}>>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
declare const platformPermissionSchema: z.ZodObject<{
|
|
32
|
+
default: z.ZodString;
|
|
33
|
+
win: z.ZodOptional<z.ZodString>;
|
|
34
|
+
mac: z.ZodOptional<z.ZodString>;
|
|
35
|
+
linux: z.ZodOptional<z.ZodString>;
|
|
36
|
+
wsl: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
declare const syncConfigSchema: z.ZodObject<{
|
|
39
|
+
version: z.ZodLiteral<7>;
|
|
40
|
+
age: z.ZodOptional<z.ZodObject<{
|
|
41
|
+
recipients: z.ZodArray<z.ZodString>;
|
|
42
|
+
}, z.core.$strip>>;
|
|
43
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
44
|
+
kind: z.ZodEnum<{
|
|
45
|
+
file: "file";
|
|
46
|
+
directory: "directory";
|
|
47
|
+
}>;
|
|
48
|
+
localPath: z.ZodObject<{
|
|
49
|
+
default: z.ZodString;
|
|
50
|
+
win: z.ZodOptional<z.ZodString>;
|
|
51
|
+
mac: z.ZodOptional<z.ZodString>;
|
|
52
|
+
linux: z.ZodOptional<z.ZodString>;
|
|
53
|
+
wsl: z.ZodOptional<z.ZodString>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
repoPath: z.ZodOptional<z.ZodObject<{
|
|
56
|
+
default: z.ZodString;
|
|
57
|
+
win: z.ZodOptional<z.ZodString>;
|
|
58
|
+
mac: z.ZodOptional<z.ZodString>;
|
|
59
|
+
linux: z.ZodOptional<z.ZodString>;
|
|
60
|
+
wsl: z.ZodOptional<z.ZodString>;
|
|
61
|
+
}, z.core.$strip>>;
|
|
62
|
+
profiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
63
|
+
mode: z.ZodOptional<z.ZodObject<{
|
|
64
|
+
default: z.ZodEnum<{
|
|
65
|
+
normal: "normal";
|
|
66
|
+
secret: "secret";
|
|
67
|
+
ignore: "ignore";
|
|
68
|
+
}>;
|
|
69
|
+
win: z.ZodOptional<z.ZodEnum<{
|
|
70
|
+
normal: "normal";
|
|
71
|
+
secret: "secret";
|
|
72
|
+
ignore: "ignore";
|
|
73
|
+
}>>;
|
|
74
|
+
mac: z.ZodOptional<z.ZodEnum<{
|
|
75
|
+
normal: "normal";
|
|
76
|
+
secret: "secret";
|
|
77
|
+
ignore: "ignore";
|
|
78
|
+
}>>;
|
|
79
|
+
linux: z.ZodOptional<z.ZodEnum<{
|
|
80
|
+
normal: "normal";
|
|
81
|
+
secret: "secret";
|
|
82
|
+
ignore: "ignore";
|
|
83
|
+
}>>;
|
|
84
|
+
wsl: z.ZodOptional<z.ZodEnum<{
|
|
85
|
+
normal: "normal";
|
|
86
|
+
secret: "secret";
|
|
87
|
+
ignore: "ignore";
|
|
88
|
+
}>>;
|
|
89
|
+
}, z.core.$strip>>;
|
|
90
|
+
permission: z.ZodOptional<z.ZodObject<{
|
|
91
|
+
default: z.ZodString;
|
|
92
|
+
win: z.ZodOptional<z.ZodString>;
|
|
93
|
+
mac: z.ZodOptional<z.ZodString>;
|
|
94
|
+
linux: z.ZodOptional<z.ZodString>;
|
|
95
|
+
wsl: z.ZodOptional<z.ZodString>;
|
|
96
|
+
}, z.core.$strip>>;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
declare const syncEntryKinds: readonly ["file", "directory"];
|
|
100
|
+
export type SyncConfigEntryKind = (typeof syncEntryKinds)[number];
|
|
101
|
+
export type SyncMode = (typeof CONSTANTS.SYNC.MODES)[number];
|
|
102
|
+
export type ConfiguredSyncRepoPath = PlatformStringValue;
|
|
103
|
+
export type PlatformSyncMode = z.infer<typeof platformSyncModeSchema>;
|
|
104
|
+
export type PlatformPermission = z.infer<typeof platformPermissionSchema>;
|
|
105
|
+
export type SyncConfig = z.infer<typeof syncConfigSchema>;
|
|
106
|
+
export type SyncConfigResolutionContext = Readonly<{
|
|
107
|
+
homeDirectory: string;
|
|
108
|
+
platformKey: PlatformKey;
|
|
109
|
+
readEnv: (name: string) => string | undefined;
|
|
110
|
+
xdgConfigHome: string;
|
|
111
|
+
}>;
|
|
112
|
+
export type ResolvedSyncConfigEntry = Readonly<{
|
|
113
|
+
configuredMode: PlatformSyncMode;
|
|
114
|
+
configuredLocalPath: PlatformStringValue;
|
|
115
|
+
configuredPermission?: PlatformPermission;
|
|
116
|
+
configuredRepoPath?: ConfiguredSyncRepoPath;
|
|
117
|
+
kind: SyncConfigEntryKind;
|
|
118
|
+
localPath: string;
|
|
119
|
+
profiles: readonly string[];
|
|
120
|
+
profilesExplicit: boolean;
|
|
121
|
+
mode: SyncMode;
|
|
122
|
+
modeExplicit: boolean;
|
|
123
|
+
permission?: number;
|
|
124
|
+
permissionExplicit: boolean;
|
|
125
|
+
repoPath: string;
|
|
126
|
+
}>;
|
|
127
|
+
export type AgeConfig = Readonly<{
|
|
128
|
+
recipients: readonly string[];
|
|
129
|
+
}>;
|
|
130
|
+
export type ResolvedSyncConfig = Readonly<{
|
|
131
|
+
age?: AgeConfig;
|
|
132
|
+
entries: readonly ResolvedSyncConfigEntry[];
|
|
133
|
+
version: typeof CONSTANTS.SYNC.CONFIG_VERSION;
|
|
134
|
+
}>;
|
|
135
|
+
export declare const normalizeSyncRepoPath: (value: string) => string;
|
|
136
|
+
export declare const normalizeSyncProfileName: (value: string, description?: string) => string;
|
|
137
|
+
export declare const hasReservedSyncArtifactSuffixSegment: (value: string) => boolean;
|
|
138
|
+
export declare const deriveRepoPathFromLocalPath: (localPath: PlatformStringValue, homeDirectory: string) => string;
|
|
139
|
+
export declare const validateResolvedSyncConfigEntries: (entries: readonly ResolvedSyncConfigEntry[]) => void;
|
|
140
|
+
export declare const parseSyncConfig: (input: unknown, context: SyncConfigResolutionContext) => ResolvedSyncConfig;
|
|
141
|
+
export declare const createInitialSyncConfig: (age: {
|
|
142
|
+
recipients: string[];
|
|
143
|
+
}) => SyncConfig;
|
|
144
|
+
export declare const formatSyncConfig: (config: SyncConfig) => string;
|
|
145
|
+
export {};
|
|
146
|
+
//# sourceMappingURL=sync-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schema.d.ts","sourceRoot":"","sources":["../../src/config/sync-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EAEzB,MAAM,yBAAyB,CAAC;AAwCjC,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM1B,CAAC;AASH,QAAA,MAAM,wBAAwB;;;;;;iBAM5B,CAAC;AAuBH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAqB,CAAC;AAM5C,QAAA,MAAM,cAAc,gCAAiC,CAAC;AAEtD,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AACzD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,cAAc,EAAE,gBAAgB,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAC1C,kBAAkB,CAAC,EAAE,sBAAsB,CAAC;IAC5C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC/B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC5C,OAAO,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;CAC/C,CAAC,CAAC;AAMH,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,WAgClD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,OAAO,MAAM,EACb,oBAA4B,WAoC7B,CAAC;AAEF,eAAO,MAAM,oCAAoC,GAAI,OAAO,MAAM,YAKjE,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,WAAW,mBAAmB,EAC9B,eAAe,MAAM,WAUtB,CAAC;AAyFF,eAAO,MAAM,iCAAiC,GAC5C,SAAS,SAAS,uBAAuB,EAAE,SAI5C,CAAC;AAwLF,eAAO,MAAM,eAAe,GAC1B,OAAO,OAAO,EACd,SAAS,2BAA2B,KACnC,kBA2EF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,KAAK;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,KAAG,UAMH,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,UAAU,WAElD,CAAC"}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { isAbsolute, posix, relative, sep } from "node:path";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { CONSTANTS } from "#app/config/constants.ts";
|
|
4
|
+
import { resolvePlatformValue, } from "#app/config/platform.ts";
|
|
5
|
+
import { resolveConfiguredAbsolutePath } from "#app/config/xdg.ts";
|
|
6
|
+
import { DotweaveError } from "#app/lib/error.ts";
|
|
7
|
+
import { parsePermissionOctal } from "#app/lib/file-mode.ts";
|
|
8
|
+
import { doPathsOverlap } from "#app/lib/path.ts";
|
|
9
|
+
import { ensureTrailingNewline } from "#app/lib/string.ts";
|
|
10
|
+
import { formatInputIssues } from "#app/lib/validation.ts";
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Zod schemas
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const requiredTrimmedStringSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.trim()
|
|
17
|
+
.min(1, "Value must not be empty.");
|
|
18
|
+
const syncProfileNameArraySchema = z
|
|
19
|
+
.array(requiredTrimmedStringSchema)
|
|
20
|
+
.min(1, "At least one profile must be specified.");
|
|
21
|
+
const platformLocalPathSchema = z.object({
|
|
22
|
+
default: requiredTrimmedStringSchema,
|
|
23
|
+
win: requiredTrimmedStringSchema.optional(),
|
|
24
|
+
mac: requiredTrimmedStringSchema.optional(),
|
|
25
|
+
linux: requiredTrimmedStringSchema.optional(),
|
|
26
|
+
wsl: requiredTrimmedStringSchema.optional(),
|
|
27
|
+
});
|
|
28
|
+
const localPathSchema = platformLocalPathSchema;
|
|
29
|
+
const platformRepoPathSchema = z.object({
|
|
30
|
+
default: requiredTrimmedStringSchema,
|
|
31
|
+
win: requiredTrimmedStringSchema.optional(),
|
|
32
|
+
mac: requiredTrimmedStringSchema.optional(),
|
|
33
|
+
linux: requiredTrimmedStringSchema.optional(),
|
|
34
|
+
wsl: requiredTrimmedStringSchema.optional(),
|
|
35
|
+
});
|
|
36
|
+
const repoPathSchema = platformRepoPathSchema;
|
|
37
|
+
const platformSyncModeSchema = z.object({
|
|
38
|
+
default: z.enum(CONSTANTS.SYNC.MODES),
|
|
39
|
+
win: z.enum(CONSTANTS.SYNC.MODES).optional(),
|
|
40
|
+
mac: z.enum(CONSTANTS.SYNC.MODES).optional(),
|
|
41
|
+
linux: z.enum(CONSTANTS.SYNC.MODES).optional(),
|
|
42
|
+
wsl: z.enum(CONSTANTS.SYNC.MODES).optional(),
|
|
43
|
+
});
|
|
44
|
+
const permissionOctalSchema = z
|
|
45
|
+
.string()
|
|
46
|
+
.regex(/^0[0-7]{3}$/, "Permission must be a 4-character octal string like '0600' or '0755'.");
|
|
47
|
+
const platformPermissionSchema = z.object({
|
|
48
|
+
default: permissionOctalSchema,
|
|
49
|
+
win: permissionOctalSchema.optional(),
|
|
50
|
+
mac: permissionOctalSchema.optional(),
|
|
51
|
+
linux: permissionOctalSchema.optional(),
|
|
52
|
+
wsl: permissionOctalSchema.optional(),
|
|
53
|
+
});
|
|
54
|
+
const syncConfigEntrySchema = z.object({
|
|
55
|
+
kind: z.enum(["file", "directory"]),
|
|
56
|
+
localPath: localPathSchema,
|
|
57
|
+
repoPath: repoPathSchema.optional(),
|
|
58
|
+
profiles: syncProfileNameArraySchema.optional(),
|
|
59
|
+
mode: platformSyncModeSchema.optional(),
|
|
60
|
+
permission: platformPermissionSchema.optional(),
|
|
61
|
+
});
|
|
62
|
+
const syncConfigAgeSchema = z.object({
|
|
63
|
+
recipients: z
|
|
64
|
+
.array(requiredTrimmedStringSchema)
|
|
65
|
+
.min(1, "At least one age recipient is required."),
|
|
66
|
+
});
|
|
67
|
+
const syncConfigSchemaV7 = z.object({
|
|
68
|
+
version: z.literal(CONSTANTS.SYNC.CONFIG_VERSION),
|
|
69
|
+
age: syncConfigAgeSchema.optional(),
|
|
70
|
+
entries: z.array(syncConfigEntrySchema),
|
|
71
|
+
});
|
|
72
|
+
const syncConfigSchema = syncConfigSchemaV7;
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Exported types
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
const syncEntryKinds = ["file", "directory"];
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Normalization utilities
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
export const normalizeSyncRepoPath = (value) => {
|
|
81
|
+
const normalizedValue = posix.normalize(value.replaceAll("\\", "/"));
|
|
82
|
+
if (normalizedValue === "" ||
|
|
83
|
+
normalizedValue === "." ||
|
|
84
|
+
normalizedValue.startsWith("../") ||
|
|
85
|
+
normalizedValue.includes("/../") ||
|
|
86
|
+
normalizedValue.startsWith("/")) {
|
|
87
|
+
throw new DotweaveError("Repository path must be a relative POSIX path inside the repository root.", {
|
|
88
|
+
code: "INVALID_REPO_PATH",
|
|
89
|
+
details: [`Repository path: ${value}`],
|
|
90
|
+
hint: "Use a relative path like '.config/tool/settings.json' without '..' segments.",
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (hasReservedSyncArtifactSuffixSegment(normalizedValue)) {
|
|
94
|
+
throw new DotweaveError(`Repository path must not use the reserved suffix ${CONSTANTS.SYNC.SECRET_ARTIFACT_SUFFIX}.`, {
|
|
95
|
+
code: "RESERVED_SECRET_SUFFIX",
|
|
96
|
+
details: [`Repository path: ${value}`],
|
|
97
|
+
hint: "Rename the path so no segment ends with the secret artifact suffix.",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return normalizedValue;
|
|
101
|
+
};
|
|
102
|
+
export const normalizeSyncProfileName = (value, description = "Profile name") => {
|
|
103
|
+
const normalizedValue = value.trim();
|
|
104
|
+
if (normalizedValue.length === 0) {
|
|
105
|
+
throw new DotweaveError(`${description} must not be empty.`, {
|
|
106
|
+
code: "INVALID_PROFILE_NAME",
|
|
107
|
+
details: [`${description}: ${value}`],
|
|
108
|
+
hint: "Use a short profile name like 'work' or 'personal'.",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(normalizedValue)) {
|
|
112
|
+
throw new DotweaveError(`${description} contains unsupported characters.`, {
|
|
113
|
+
code: "INVALID_PROFILE_NAME",
|
|
114
|
+
details: [`${description}: ${value}`],
|
|
115
|
+
hint: "Use letters, numbers, dots, underscores, or hyphens, and start with a letter or number.",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (normalizedValue.startsWith(".")) {
|
|
119
|
+
throw new DotweaveError(`${description} must not start with '.'.`, {
|
|
120
|
+
code: "INVALID_PROFILE_NAME",
|
|
121
|
+
details: [`${description}: ${value}`],
|
|
122
|
+
hint: "Use a plain name like 'work' instead of hidden-path style names.",
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (normalizedValue === "." || normalizedValue === "..") {
|
|
126
|
+
throw new DotweaveError(`${description} is invalid.`, {
|
|
127
|
+
code: "INVALID_PROFILE_NAME",
|
|
128
|
+
details: [`${description}: ${value}`],
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return normalizedValue;
|
|
132
|
+
};
|
|
133
|
+
export const hasReservedSyncArtifactSuffixSegment = (value) => {
|
|
134
|
+
return value
|
|
135
|
+
.replaceAll("\\", "/")
|
|
136
|
+
.split("/")
|
|
137
|
+
.some((segment) => segment.endsWith(CONSTANTS.SYNC.SECRET_ARTIFACT_SUFFIX));
|
|
138
|
+
};
|
|
139
|
+
export const deriveRepoPathFromLocalPath = (localPath, homeDirectory) => {
|
|
140
|
+
const resolvedDefaultPath = resolveConfiguredAbsolutePath(localPath.default, homeDirectory, undefined);
|
|
141
|
+
const relativePath = relative(homeDirectory, resolvedDefaultPath);
|
|
142
|
+
return normalizeSyncRepoPath(relativePath.replaceAll("\\", "/"));
|
|
143
|
+
};
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Validation
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
const validatePathOverlaps = (entries, property, description) => {
|
|
148
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
149
|
+
const currentEntry = entries[index];
|
|
150
|
+
if (currentEntry === undefined) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
for (let otherIndex = index + 1; otherIndex < entries.length; otherIndex += 1) {
|
|
154
|
+
const otherEntry = entries[otherIndex];
|
|
155
|
+
if (otherEntry === undefined) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const currentValue = currentEntry[property];
|
|
159
|
+
const otherValue = otherEntry[property];
|
|
160
|
+
if (currentValue === otherValue) {
|
|
161
|
+
const isRepoPath = property === "repoPath";
|
|
162
|
+
throw new DotweaveError(isRepoPath
|
|
163
|
+
? `Multiple entries target the same repository path in ${CONSTANTS.SYNC.CONFIG_FILE_NAME}.`
|
|
164
|
+
: `Duplicate ${description.toLowerCase()} paths in ${CONSTANTS.SYNC.CONFIG_FILE_NAME}.`, {
|
|
165
|
+
code: "DUPLICATE_PATHS",
|
|
166
|
+
details: isRepoPath
|
|
167
|
+
? [
|
|
168
|
+
`${currentEntry.localPath} -> ${currentValue}`,
|
|
169
|
+
`${otherEntry.localPath} -> ${otherValue}`,
|
|
170
|
+
]
|
|
171
|
+
: [
|
|
172
|
+
`${currentEntry.repoPath}: ${currentValue}`,
|
|
173
|
+
`${otherEntry.repoPath}: ${otherValue}`,
|
|
174
|
+
],
|
|
175
|
+
hint: isRepoPath
|
|
176
|
+
? "Each entry must use a unique repoPath. Change or remove one of the conflicting entries."
|
|
177
|
+
: `Remove the duplicate entry from ${CONSTANTS.SYNC.CONFIG_FILE_NAME}.`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const isParentChild = currentValue.startsWith(`${otherValue}/`) ||
|
|
181
|
+
currentValue.startsWith(`${otherValue}${sep}`) ||
|
|
182
|
+
otherValue.startsWith(`${currentValue}/`) ||
|
|
183
|
+
otherValue.startsWith(`${currentValue}${sep}`);
|
|
184
|
+
if (isParentChild) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const overlaps = property === "repoPath"
|
|
188
|
+
? false
|
|
189
|
+
: doPathsOverlap(currentValue, otherValue);
|
|
190
|
+
if (overlaps) {
|
|
191
|
+
throw new DotweaveError(`${description} paths must not overlap in ${CONSTANTS.SYNC.CONFIG_FILE_NAME}.`, {
|
|
192
|
+
code: "OVERLAPPING_PATHS",
|
|
193
|
+
details: [
|
|
194
|
+
`${currentEntry.repoPath}: ${currentValue}`,
|
|
195
|
+
`${otherEntry.repoPath}: ${otherValue}`,
|
|
196
|
+
],
|
|
197
|
+
hint: "Split overlapping entries so each tracked root owns a distinct path.",
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
export const validateResolvedSyncConfigEntries = (entries) => {
|
|
204
|
+
validatePathOverlaps(entries, "repoPath", "Repository");
|
|
205
|
+
validatePathOverlaps(entries, "localPath", "Local");
|
|
206
|
+
};
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Internal parsing helpers
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
const defaultSyncMode = { default: CONSTANTS.SYNC.MODES[0] };
|
|
211
|
+
const resolveSyncModeForPlatform = (configuredMode, platformKey) => {
|
|
212
|
+
if (platformKey === "wsl") {
|
|
213
|
+
return configuredMode.wsl ?? configuredMode.linux ?? configuredMode.default;
|
|
214
|
+
}
|
|
215
|
+
return configuredMode[platformKey] ?? configuredMode.default;
|
|
216
|
+
};
|
|
217
|
+
const resolveSyncPermissionForPlatform = (configuredPermission, platformKey) => {
|
|
218
|
+
if (platformKey === "wsl") {
|
|
219
|
+
const raw = configuredPermission.wsl ??
|
|
220
|
+
configuredPermission.linux ??
|
|
221
|
+
configuredPermission.default;
|
|
222
|
+
return parsePermissionOctal(raw);
|
|
223
|
+
}
|
|
224
|
+
const raw = configuredPermission[platformKey] ?? configuredPermission.default;
|
|
225
|
+
return parsePermissionOctal(raw);
|
|
226
|
+
};
|
|
227
|
+
const normalizeConfiguredRepoPath = (repoPath) => {
|
|
228
|
+
const result = {
|
|
229
|
+
default: normalizeSyncRepoPath(repoPath.default),
|
|
230
|
+
};
|
|
231
|
+
for (const key of ["win", "mac", "linux", "wsl"]) {
|
|
232
|
+
if (repoPath[key] !== undefined) {
|
|
233
|
+
result[key] = normalizeSyncRepoPath(repoPath[key]);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return result;
|
|
237
|
+
};
|
|
238
|
+
const resolveSyncEntryLocalPath = (value, context) => {
|
|
239
|
+
const { platformKey, homeDirectory, xdgConfigHome, readEnv } = context;
|
|
240
|
+
const platformPath = resolvePlatformValue(value, platformKey);
|
|
241
|
+
let resolvedLocalPath;
|
|
242
|
+
try {
|
|
243
|
+
resolvedLocalPath = resolveConfiguredAbsolutePath(platformPath, homeDirectory, xdgConfigHome, readEnv);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
throw new DotweaveError(error instanceof Error
|
|
247
|
+
? error.message
|
|
248
|
+
: `Invalid sync entry local path: ${platformPath}`);
|
|
249
|
+
}
|
|
250
|
+
const relativePath = relative(homeDirectory, resolvedLocalPath);
|
|
251
|
+
if (relativePath === "") {
|
|
252
|
+
throw new DotweaveError("Sync entry local path cannot be the home directory itself.", {
|
|
253
|
+
code: "ENTRY_ROOT_DISALLOWED",
|
|
254
|
+
details: [
|
|
255
|
+
`Configured path: ${platformPath}`,
|
|
256
|
+
`Home directory: ${homeDirectory}`,
|
|
257
|
+
],
|
|
258
|
+
hint: "Track a file or subdirectory inside HOME instead.",
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (isAbsolute(relativePath) ||
|
|
262
|
+
relativePath.startsWith("..") ||
|
|
263
|
+
relativePath === "..") {
|
|
264
|
+
throw new DotweaveError("Sync entry local path must stay inside HOME.", {
|
|
265
|
+
code: "ENTRY_OUTSIDE_HOME",
|
|
266
|
+
details: [
|
|
267
|
+
`Configured path: ${platformPath}`,
|
|
268
|
+
`Home directory: ${homeDirectory}`,
|
|
269
|
+
],
|
|
270
|
+
hint: "Use a path under HOME, such as '~/...'.",
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return resolvedLocalPath;
|
|
274
|
+
};
|
|
275
|
+
const findNearestParentEntry = (entries, childRepoPath) => {
|
|
276
|
+
let best;
|
|
277
|
+
for (const entry of entries.values()) {
|
|
278
|
+
if (entry.kind === "directory" &&
|
|
279
|
+
childRepoPath !== entry.repoPath &&
|
|
280
|
+
childRepoPath.startsWith(`${entry.repoPath}/`) &&
|
|
281
|
+
(best === undefined || entry.repoPath.length > best.repoPath.length)) {
|
|
282
|
+
best = entry;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return best;
|
|
286
|
+
};
|
|
287
|
+
const applyEntryInheritance = (entries, platformKey) => {
|
|
288
|
+
const sorted = [...entries].sort((a, b) => a.repoPath.length - b.repoPath.length);
|
|
289
|
+
const resolved = new Map();
|
|
290
|
+
for (const entry of sorted) {
|
|
291
|
+
const parent = findNearestParentEntry(resolved, entry.repoPath);
|
|
292
|
+
const inheritedMode = !entry.modeExplicit && parent !== undefined
|
|
293
|
+
? parent.configuredMode
|
|
294
|
+
: entry.configuredMode;
|
|
295
|
+
const inheritedProfiles = !entry.profilesExplicit && parent !== undefined
|
|
296
|
+
? parent.profiles
|
|
297
|
+
: entry.profiles;
|
|
298
|
+
const inheritedPermission = !entry.permissionExplicit && parent !== undefined
|
|
299
|
+
? parent.configuredPermission
|
|
300
|
+
: entry.configuredPermission;
|
|
301
|
+
resolved.set(entry.repoPath, {
|
|
302
|
+
...entry,
|
|
303
|
+
configuredMode: inheritedMode,
|
|
304
|
+
configuredPermission: inheritedPermission,
|
|
305
|
+
profiles: inheritedProfiles,
|
|
306
|
+
mode: resolveSyncModeForPlatform(inheritedMode, platformKey),
|
|
307
|
+
permission: inheritedPermission !== undefined
|
|
308
|
+
? resolveSyncPermissionForPlatform(inheritedPermission, platformKey)
|
|
309
|
+
: undefined,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return entries.map((e) => {
|
|
313
|
+
const entry = resolved.get(e.repoPath);
|
|
314
|
+
if (entry === undefined) {
|
|
315
|
+
throw new Error(`Missing resolved entry for ${e.repoPath}`);
|
|
316
|
+
}
|
|
317
|
+
return entry;
|
|
318
|
+
});
|
|
319
|
+
};
|
|
320
|
+
// ---------------------------------------------------------------------------
|
|
321
|
+
// Public API: parsing & serialization
|
|
322
|
+
// ---------------------------------------------------------------------------
|
|
323
|
+
export const parseSyncConfig = (input, context) => {
|
|
324
|
+
const { platformKey, homeDirectory } = context;
|
|
325
|
+
const result = syncConfigSchema.safeParse(input);
|
|
326
|
+
if (!result.success) {
|
|
327
|
+
throw new DotweaveError("Sync configuration is invalid.", {
|
|
328
|
+
code: "CONFIG_VALIDATION_FAILED",
|
|
329
|
+
details: formatInputIssues(result.error.issues).split("\n"),
|
|
330
|
+
hint: `Fix the invalid fields in ${CONSTANTS.SYNC.CONFIG_FILE_NAME}, then run the command again.`,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const rawEntries = result.data.entries.map((entry) => {
|
|
334
|
+
const resolvedLocalPath = resolveSyncEntryLocalPath(entry.localPath, context);
|
|
335
|
+
const configuredRepoPath = entry.repoPath === undefined
|
|
336
|
+
? undefined
|
|
337
|
+
: normalizeConfiguredRepoPath(entry.repoPath);
|
|
338
|
+
const repoPath = configuredRepoPath === undefined
|
|
339
|
+
? deriveRepoPathFromLocalPath(entry.localPath, homeDirectory)
|
|
340
|
+
: resolvePlatformValue(configuredRepoPath, platformKey);
|
|
341
|
+
if (entry.profiles !== undefined && entry.profiles.length > 0) {
|
|
342
|
+
for (const profile of entry.profiles) {
|
|
343
|
+
normalizeSyncProfileName(profile);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const profiles = entry.profiles !== undefined && entry.profiles.length > 0
|
|
347
|
+
? entry.profiles
|
|
348
|
+
: [];
|
|
349
|
+
const configuredMode = entry.mode ?? defaultSyncMode;
|
|
350
|
+
const configuredPermission = entry.permission;
|
|
351
|
+
return {
|
|
352
|
+
configuredMode,
|
|
353
|
+
configuredLocalPath: entry.localPath,
|
|
354
|
+
configuredPermission,
|
|
355
|
+
...(configuredRepoPath === undefined ? {} : { configuredRepoPath }),
|
|
356
|
+
kind: entry.kind,
|
|
357
|
+
localPath: resolvedLocalPath,
|
|
358
|
+
profiles,
|
|
359
|
+
profilesExplicit: entry.profiles !== undefined,
|
|
360
|
+
mode: resolveSyncModeForPlatform(configuredMode, platformKey),
|
|
361
|
+
modeExplicit: entry.mode !== undefined,
|
|
362
|
+
permission: configuredPermission !== undefined
|
|
363
|
+
? resolveSyncPermissionForPlatform(configuredPermission, platformKey)
|
|
364
|
+
: undefined,
|
|
365
|
+
permissionExplicit: entry.permission !== undefined,
|
|
366
|
+
repoPath,
|
|
367
|
+
};
|
|
368
|
+
});
|
|
369
|
+
validateResolvedSyncConfigEntries(rawEntries);
|
|
370
|
+
const entries = applyEntryInheritance(rawEntries, platformKey);
|
|
371
|
+
const age = result.data.age === undefined
|
|
372
|
+
? undefined
|
|
373
|
+
: {
|
|
374
|
+
recipients: [...new Set(result.data.age.recipients)],
|
|
375
|
+
};
|
|
376
|
+
return {
|
|
377
|
+
...(age === undefined ? {} : { age }),
|
|
378
|
+
entries,
|
|
379
|
+
version: result.data.version,
|
|
380
|
+
};
|
|
381
|
+
};
|
|
382
|
+
export const createInitialSyncConfig = (age) => {
|
|
383
|
+
return {
|
|
384
|
+
version: CONSTANTS.SYNC.CONFIG_VERSION,
|
|
385
|
+
age,
|
|
386
|
+
entries: [],
|
|
387
|
+
};
|
|
388
|
+
};
|
|
389
|
+
export const formatSyncConfig = (config) => {
|
|
390
|
+
return ensureTrailingNewline(JSON.stringify(config, null, 2));
|
|
391
|
+
};
|
|
392
|
+
//# sourceMappingURL=sync-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schema.js","sourceRoot":"","sources":["../../src/config/sync-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ResolvedSyncConfig, type SyncConfigResolutionContext } from "#app/config/sync-schema.ts";
|
|
2
|
+
export { collectAllProfileNames, collectChildEntryPaths, findOwningSyncEntry, isIgnoredSyncPath, isSecretSyncPath, resolveEntryRelativeRepoPath, resolveManagedSyncMode, resolveSyncMode, resolveSyncRule, } from "#app/config/sync-entry.ts";
|
|
3
|
+
export type { AgeConfig, ConfiguredSyncRepoPath, PlatformPermission, PlatformSyncMode, ResolvedSyncConfig, ResolvedSyncConfigEntry, SyncConfig, SyncConfigEntryKind, SyncConfigResolutionContext, SyncMode, } from "#app/config/sync-schema.ts";
|
|
4
|
+
export { createInitialSyncConfig, deriveRepoPathFromLocalPath, formatSyncConfig, hasReservedSyncArtifactSuffixSegment, normalizeSyncProfileName, normalizeSyncRepoPath, parseSyncConfig, validateResolvedSyncConfigEntries, } from "#app/config/sync-schema.ts";
|
|
5
|
+
export declare const syncConfigFileName: "manifest.jsonc";
|
|
6
|
+
export declare const resolveSyncConfigFilePath: (syncDirectory: string) => string;
|
|
7
|
+
export declare const readSyncConfig: (syncDirectory: string, context: SyncConfigResolutionContext) => Promise<ResolvedSyncConfig>;
|
|
8
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/config/sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EACjC,MAAM,4BAA4B,CAAC;AAUpC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,QAAQ,GACT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,oCAAoC,EACpC,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,iCAAiC,GAClC,MAAM,4BAA4B,CAAC;AAMpC,eAAO,MAAM,kBAAkB,kBAAkC,CAAC;AAMlE,eAAO,MAAM,yBAAyB,GAAI,eAAe,MAAM,WAE9D,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,eAAe,MAAM,EACrB,SAAS,2BAA2B,KACnC,OAAO,CAAC,kBAAkB,CAqC5B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CONSTANTS } from "#app/config/constants.ts";
|
|
4
|
+
import { runConfigMigrations } from "#app/config/migration.ts";
|
|
5
|
+
import { parseSyncConfig, } from "#app/config/sync-schema.ts";
|
|
6
|
+
import { DotweaveError } from "#app/lib/error.ts";
|
|
7
|
+
import { parseJsonc, resolveJsoncConfigPath } from "#app/lib/jsonc.ts";
|
|
8
|
+
const syncConfigMigrationRegistry = new Map();
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Re-exports: types, schema, entry utilities
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export { collectAllProfileNames, collectChildEntryPaths, findOwningSyncEntry, isIgnoredSyncPath, isSecretSyncPath, resolveEntryRelativeRepoPath, resolveManagedSyncMode, resolveSyncMode, resolveSyncRule, } from "#app/config/sync-entry.ts";
|
|
13
|
+
export { createInitialSyncConfig, deriveRepoPathFromLocalPath, formatSyncConfig, hasReservedSyncArtifactSuffixSegment, normalizeSyncProfileName, normalizeSyncRepoPath, parseSyncConfig, validateResolvedSyncConfigEntries, } from "#app/config/sync-schema.ts";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Constants
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
export const syncConfigFileName = CONSTANTS.SYNC.CONFIG_FILE_NAME;
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// I/O
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export const resolveSyncConfigFilePath = (syncDirectory) => {
|
|
22
|
+
return join(syncDirectory, CONSTANTS.SYNC.CONFIG_FILE_NAME);
|
|
23
|
+
};
|
|
24
|
+
export const readSyncConfig = async (syncDirectory, context) => {
|
|
25
|
+
const filePath = await resolveJsoncConfigPath(resolveSyncConfigFilePath(syncDirectory));
|
|
26
|
+
try {
|
|
27
|
+
const contents = await readFile(filePath, "utf8");
|
|
28
|
+
const parsed = parseJsonc(contents);
|
|
29
|
+
const migrated = await runConfigMigrations(parsed, syncConfigMigrationRegistry, CONSTANTS.SYNC.CONFIG_VERSION, filePath);
|
|
30
|
+
return parseSyncConfig(migrated, context);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof DotweaveError) {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
if (error instanceof SyntaxError) {
|
|
37
|
+
throw new DotweaveError("Sync configuration is not valid JSON.", {
|
|
38
|
+
code: "CONFIG_INVALID_JSON",
|
|
39
|
+
details: [`Config file: ${filePath}`, error.message],
|
|
40
|
+
hint: `Fix the JSON syntax in ${CONSTANTS.SYNC.CONFIG_FILE_NAME}, then run the command again.`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
throw new DotweaveError("Failed to read sync configuration.", {
|
|
44
|
+
code: "CONFIG_READ_FAILED",
|
|
45
|
+
details: [
|
|
46
|
+
`Config file: ${filePath}`,
|
|
47
|
+
...(error instanceof Error ? [error.message] : []),
|
|
48
|
+
],
|
|
49
|
+
hint: "Run 'dotweave init' if the sync directory has not been initialized yet.",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/config/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,eAAe,GAGhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAiB,CAAC;AAE7D,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAanC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,oCAAoC,EACpC,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,iCAAiC,GAClC,MAAM,4BAA4B,CAAC;AAEpC,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAElE,8EAA8E;AAC9E,MAAM;AACN,8EAA8E;AAE9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,aAAqB,EAAE,EAAE;IACjE,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,aAAqB,EACrB,OAAoC,EACP,EAAE;IAC/B,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAC3C,yBAAyB,CAAC,aAAa,CAAC,CACzC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,MAAM,EACN,2BAA2B,EAC3B,SAAS,CAAC,IAAI,CAAC,cAAc,EAC7B,QAAQ,CACT,CAAC;QAEF,OAAO,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,aAAa,CAAC,uCAAuC,EAAE;gBAC/D,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,CAAC,gBAAgB,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;gBACpD,IAAI,EAAE,0BAA0B,SAAS,CAAC,IAAI,CAAC,gBAAgB,+BAA+B;aAC/F,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,aAAa,CAAC,oCAAoC,EAAE;YAC5D,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE;gBACP,gBAAgB,QAAQ,EAAE;gBAC1B,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACnD;YACD,IAAI,EAAE,yEAAyE;SAChF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const resolveHomeDirectory: (home: string | undefined) => string;
|
|
2
|
+
export declare const resolveXdgConfigHome: (home: string | undefined, xdgConfigHome: string | undefined) => string;
|
|
3
|
+
export declare const resolveDotweaveConfigDirectory: (xdgConfigHome: string) => string;
|
|
4
|
+
export declare const resolveDotweaveGlobalConfigFilePath: (dotweaveConfigDirectory: string) => string;
|
|
5
|
+
export declare const resolveDotweaveSyncDirectory: (dotweaveConfigDirectory: string) => string;
|
|
6
|
+
export declare const expandHomePath: (value: string, home: string | undefined) => string;
|
|
7
|
+
export declare const expandConfiguredPath: (value: string, home: string | undefined, xdgConfigHome: string | undefined, readEnv?: (name: string) => string | undefined) => string;
|
|
8
|
+
export declare const resolveConfiguredAbsolutePath: (value: string, home: string | undefined, xdgConfigHome: string | undefined, readEnv?: (name: string) => string | undefined) => string;
|
|
9
|
+
export declare const expandWindowsEnvVars: (value: string, readEnv: (name: string) => string | undefined) => string;
|
|
10
|
+
//# sourceMappingURL=xdg.d.ts.map
|