@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.
Files changed (246) hide show
  1. package/bin/index.js +5 -0
  2. package/dist/application.d.ts +5 -0
  3. package/dist/application.d.ts.map +1 -0
  4. package/dist/application.js +86 -0
  5. package/dist/application.js.map +1 -0
  6. package/dist/cli/autocomplete.d.ts +7 -0
  7. package/dist/cli/autocomplete.d.ts.map +1 -0
  8. package/dist/cli/autocomplete.js +62 -0
  9. package/dist/cli/autocomplete.js.map +1 -0
  10. package/dist/cli/cd.d.ts +4 -0
  11. package/dist/cli/cd.d.ts.map +1 -0
  12. package/dist/cli/cd.js +23 -0
  13. package/dist/cli/cd.js.map +1 -0
  14. package/dist/cli/doctor.d.ts +4 -0
  15. package/dist/cli/doctor.d.ts.map +1 -0
  16. package/dist/cli/doctor.js +92 -0
  17. package/dist/cli/doctor.js.map +1 -0
  18. package/dist/cli/index.d.ts +4 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +22 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/init.d.ts +4 -0
  23. package/dist/cli/init.d.ts.map +1 -0
  24. package/dist/cli/init.js +110 -0
  25. package/dist/cli/init.js.map +1 -0
  26. package/dist/cli/profile/index.d.ts +3 -0
  27. package/dist/cli/profile/index.d.ts.map +1 -0
  28. package/dist/cli/profile/index.js +15 -0
  29. package/dist/cli/profile/index.js.map +1 -0
  30. package/dist/cli/profile/list.d.ts +4 -0
  31. package/dist/cli/profile/list.d.ts.map +1 -0
  32. package/dist/cli/profile/list.js +42 -0
  33. package/dist/cli/profile/list.js.map +1 -0
  34. package/dist/cli/profile/use.d.ts +4 -0
  35. package/dist/cli/profile/use.d.ts.map +1 -0
  36. package/dist/cli/profile/use.js +49 -0
  37. package/dist/cli/profile/use.js.map +1 -0
  38. package/dist/cli/pull.d.ts +4 -0
  39. package/dist/cli/pull.d.ts.map +1 -0
  40. package/dist/cli/pull.js +107 -0
  41. package/dist/cli/pull.js.map +1 -0
  42. package/dist/cli/push.d.ts +4 -0
  43. package/dist/cli/push.d.ts.map +1 -0
  44. package/dist/cli/push.js +49 -0
  45. package/dist/cli/push.js.map +1 -0
  46. package/dist/cli/root-commands.d.ts +13 -0
  47. package/dist/cli/root-commands.d.ts.map +1 -0
  48. package/dist/cli/root-commands.js +25 -0
  49. package/dist/cli/root-commands.js.map +1 -0
  50. package/dist/cli/status.d.ts +4 -0
  51. package/dist/cli/status.d.ts.map +1 -0
  52. package/dist/cli/status.js +132 -0
  53. package/dist/cli/status.js.map +1 -0
  54. package/dist/cli/track.d.ts +4 -0
  55. package/dist/cli/track.d.ts.map +1 -0
  56. package/dist/cli/track.js +133 -0
  57. package/dist/cli/track.js.map +1 -0
  58. package/dist/cli/untrack.d.ts +4 -0
  59. package/dist/cli/untrack.d.ts.map +1 -0
  60. package/dist/cli/untrack.js +40 -0
  61. package/dist/cli/untrack.js.map +1 -0
  62. package/dist/config/constants.d.ts +31 -0
  63. package/dist/config/constants.d.ts.map +1 -0
  64. package/dist/config/constants.js +33 -0
  65. package/dist/config/constants.js.map +1 -0
  66. package/dist/config/global-config.d.ts +21 -0
  67. package/dist/config/global-config.d.ts.map +1 -0
  68. package/dist/config/global-config.js +89 -0
  69. package/dist/config/global-config.js.map +1 -0
  70. package/dist/config/identity-file.d.ts +9 -0
  71. package/dist/config/identity-file.d.ts.map +1 -0
  72. package/dist/config/identity-file.js +48 -0
  73. package/dist/config/identity-file.js.map +1 -0
  74. package/dist/config/migration.d.ts +9 -0
  75. package/dist/config/migration.d.ts.map +1 -0
  76. package/dist/config/migration.js +61 -0
  77. package/dist/config/migration.js.map +1 -0
  78. package/dist/config/platform.d.ts +12 -0
  79. package/dist/config/platform.d.ts.map +1 -0
  80. package/dist/config/platform.js +25 -0
  81. package/dist/config/platform.js.map +1 -0
  82. package/dist/config/runtime-env.d.ts +7 -0
  83. package/dist/config/runtime-env.d.ts.map +1 -0
  84. package/dist/config/runtime-env.js +31 -0
  85. package/dist/config/runtime-env.js.map +1 -0
  86. package/dist/config/sync-entry.d.ts +14 -0
  87. package/dist/config/sync-entry.d.ts.map +1 -0
  88. package/dist/config/sync-entry.js +99 -0
  89. package/dist/config/sync-entry.js.map +1 -0
  90. package/dist/config/sync-schema.d.ts +146 -0
  91. package/dist/config/sync-schema.d.ts.map +1 -0
  92. package/dist/config/sync-schema.js +392 -0
  93. package/dist/config/sync-schema.js.map +1 -0
  94. package/dist/config/sync.d.ts +8 -0
  95. package/dist/config/sync.d.ts.map +1 -0
  96. package/dist/config/sync.js +53 -0
  97. package/dist/config/sync.js.map +1 -0
  98. package/dist/config/xdg.d.ts +10 -0
  99. package/dist/config/xdg.d.ts.map +1 -0
  100. package/dist/config/xdg.js +90 -0
  101. package/dist/config/xdg.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +4 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/content.d.ts +5 -0
  107. package/dist/lib/content.d.ts.map +1 -0
  108. package/dist/lib/content.js +29 -0
  109. package/dist/lib/content.js.map +1 -0
  110. package/dist/lib/crypto.d.ts +45 -0
  111. package/dist/lib/crypto.d.ts.map +1 -0
  112. package/dist/lib/crypto.js +130 -0
  113. package/dist/lib/crypto.js.map +1 -0
  114. package/dist/lib/env.d.ts +13 -0
  115. package/dist/lib/env.d.ts.map +1 -0
  116. package/dist/lib/env.js +50 -0
  117. package/dist/lib/env.js.map +1 -0
  118. package/dist/lib/error.d.ts +22 -0
  119. package/dist/lib/error.d.ts.map +1 -0
  120. package/dist/lib/error.js +50 -0
  121. package/dist/lib/error.js.map +1 -0
  122. package/dist/lib/file-mode.d.ts +36 -0
  123. package/dist/lib/file-mode.d.ts.map +1 -0
  124. package/dist/lib/file-mode.js +55 -0
  125. package/dist/lib/file-mode.js.map +1 -0
  126. package/dist/lib/filesystem.d.ts +60 -0
  127. package/dist/lib/filesystem.d.ts.map +1 -0
  128. package/dist/lib/filesystem.js +190 -0
  129. package/dist/lib/filesystem.js.map +1 -0
  130. package/dist/lib/git.d.ts +23 -0
  131. package/dist/lib/git.d.ts.map +1 -0
  132. package/dist/lib/git.js +162 -0
  133. package/dist/lib/git.js.map +1 -0
  134. package/dist/lib/jsonc.d.ts +8 -0
  135. package/dist/lib/jsonc.d.ts.map +1 -0
  136. package/dist/lib/jsonc.js +78 -0
  137. package/dist/lib/jsonc.js.map +1 -0
  138. package/dist/lib/path.d.ts +21 -0
  139. package/dist/lib/path.d.ts.map +1 -0
  140. package/dist/lib/path.js +44 -0
  141. package/dist/lib/path.js.map +1 -0
  142. package/dist/lib/promise.d.ts +10 -0
  143. package/dist/lib/promise.d.ts.map +1 -0
  144. package/dist/lib/promise.js +25 -0
  145. package/dist/lib/promise.js.map +1 -0
  146. package/dist/lib/string.d.ts +6 -0
  147. package/dist/lib/string.d.ts.map +1 -0
  148. package/dist/lib/string.js +8 -0
  149. package/dist/lib/string.js.map +1 -0
  150. package/dist/lib/validation.d.ts +7 -0
  151. package/dist/lib/validation.d.ts.map +1 -0
  152. package/dist/lib/validation.js +13 -0
  153. package/dist/lib/validation.js.map +1 -0
  154. package/dist/lib/version.d.ts +2 -0
  155. package/dist/lib/version.d.ts.map +1 -0
  156. package/dist/lib/version.js +4 -0
  157. package/dist/lib/version.js.map +1 -0
  158. package/dist/migrations/global-v3.d.ts +3 -0
  159. package/dist/migrations/global-v3.d.ts.map +1 -0
  160. package/dist/migrations/global-v3.js +5 -0
  161. package/dist/migrations/global-v3.js.map +1 -0
  162. package/dist/services/autocomplete.d.ts +5 -0
  163. package/dist/services/autocomplete.d.ts.map +1 -0
  164. package/dist/services/autocomplete.js +185 -0
  165. package/dist/services/autocomplete.js.map +1 -0
  166. package/dist/services/config-file.d.ts +73 -0
  167. package/dist/services/config-file.d.ts.map +1 -0
  168. package/dist/services/config-file.js +40 -0
  169. package/dist/services/config-file.js.map +1 -0
  170. package/dist/services/doctor.d.ts +16 -0
  171. package/dist/services/doctor.d.ts.map +1 -0
  172. package/dist/services/doctor.js +126 -0
  173. package/dist/services/doctor.js.map +1 -0
  174. package/dist/services/init.d.ts +24 -0
  175. package/dist/services/init.d.ts.map +1 -0
  176. package/dist/services/init.js +265 -0
  177. package/dist/services/init.js.map +1 -0
  178. package/dist/services/local-materialization.d.ts +30 -0
  179. package/dist/services/local-materialization.d.ts.map +1 -0
  180. package/dist/services/local-materialization.js +451 -0
  181. package/dist/services/local-materialization.js.map +1 -0
  182. package/dist/services/local-snapshot.d.ts +26 -0
  183. package/dist/services/local-snapshot.d.ts.map +1 -0
  184. package/dist/services/local-snapshot.js +119 -0
  185. package/dist/services/local-snapshot.js.map +1 -0
  186. package/dist/services/paths.d.ts +8 -0
  187. package/dist/services/paths.d.ts.map +1 -0
  188. package/dist/services/paths.js +71 -0
  189. package/dist/services/paths.js.map +1 -0
  190. package/dist/services/profile.d.ts +39 -0
  191. package/dist/services/profile.d.ts.map +1 -0
  192. package/dist/services/profile.js +124 -0
  193. package/dist/services/profile.js.map +1 -0
  194. package/dist/services/pull.d.ts +38 -0
  195. package/dist/services/pull.d.ts.map +1 -0
  196. package/dist/services/pull.js +148 -0
  197. package/dist/services/pull.js.map +1 -0
  198. package/dist/services/push.d.ts +38 -0
  199. package/dist/services/push.d.ts.map +1 -0
  200. package/dist/services/push.js +120 -0
  201. package/dist/services/push.js.map +1 -0
  202. package/dist/services/repo-artifacts.d.ts +52 -0
  203. package/dist/services/repo-artifacts.d.ts.map +1 -0
  204. package/dist/services/repo-artifacts.js +325 -0
  205. package/dist/services/repo-artifacts.js.map +1 -0
  206. package/dist/services/repo-snapshot.d.ts +7 -0
  207. package/dist/services/repo-snapshot.d.ts.map +1 -0
  208. package/dist/services/repo-snapshot.js +181 -0
  209. package/dist/services/repo-snapshot.js.map +1 -0
  210. package/dist/services/runtime.d.ts +30 -0
  211. package/dist/services/runtime.d.ts.map +1 -0
  212. package/dist/services/runtime.js +71 -0
  213. package/dist/services/runtime.js.map +1 -0
  214. package/dist/services/set.d.ts +41 -0
  215. package/dist/services/set.d.ts.map +1 -0
  216. package/dist/services/set.js +288 -0
  217. package/dist/services/set.js.map +1 -0
  218. package/dist/services/status.d.ts +41 -0
  219. package/dist/services/status.d.ts.map +1 -0
  220. package/dist/services/status.js +87 -0
  221. package/dist/services/status.js.map +1 -0
  222. package/dist/services/terminal/cli-runtime.d.ts +18 -0
  223. package/dist/services/terminal/cli-runtime.d.ts.map +1 -0
  224. package/dist/services/terminal/cli-runtime.js +19 -0
  225. package/dist/services/terminal/cli-runtime.js.map +1 -0
  226. package/dist/services/terminal/logger.d.ts +9 -0
  227. package/dist/services/terminal/logger.d.ts.map +1 -0
  228. package/dist/services/terminal/logger.js +15 -0
  229. package/dist/services/terminal/logger.js.map +1 -0
  230. package/dist/services/terminal/path-completion.d.ts +3 -0
  231. package/dist/services/terminal/path-completion.d.ts.map +1 -0
  232. package/dist/services/terminal/path-completion.js +108 -0
  233. package/dist/services/terminal/path-completion.js.map +1 -0
  234. package/dist/services/terminal/shell.d.ts +24 -0
  235. package/dist/services/terminal/shell.d.ts.map +1 -0
  236. package/dist/services/terminal/shell.js +227 -0
  237. package/dist/services/terminal/shell.js.map +1 -0
  238. package/dist/services/track.d.ts +20 -0
  239. package/dist/services/track.d.ts.map +1 -0
  240. package/dist/services/track.js +224 -0
  241. package/dist/services/track.js.map +1 -0
  242. package/dist/services/untrack.d.ts +13 -0
  243. package/dist/services/untrack.d.ts.map +1 -0
  244. package/dist/services/untrack.js +133 -0
  245. package/dist/services/untrack.js.map +1 -0
  246. 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":"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"}
@@ -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