@tinyrack/devsync 1.1.0 → 1.2.2

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 (216) hide show
  1. package/README.md +230 -62
  2. package/dist/cli/base-command.d.ts +14 -0
  3. package/dist/cli/base-command.d.ts.map +1 -0
  4. package/dist/cli/base-command.js +22 -0
  5. package/dist/cli/base-command.js.map +1 -0
  6. package/dist/cli/commands/dir.d.ts +8 -0
  7. package/dist/cli/commands/dir.d.ts.map +1 -0
  8. package/dist/cli/commands/dir.js +16 -0
  9. package/dist/cli/commands/dir.js.map +1 -0
  10. package/dist/cli/commands/doctor.d.ts +8 -0
  11. package/dist/cli/commands/doctor.d.ts.map +1 -0
  12. package/dist/cli/commands/doctor.js +18 -0
  13. package/dist/cli/commands/doctor.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +23 -0
  15. package/dist/cli/commands/index.d.ts.map +1 -0
  16. package/dist/cli/commands/index.js +23 -0
  17. package/dist/cli/commands/index.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +15 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +43 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/machine/list.d.ts +7 -0
  23. package/dist/cli/commands/machine/list.d.ts.map +1 -0
  24. package/dist/cli/commands/machine/list.js +12 -0
  25. package/dist/cli/commands/machine/list.js.map +1 -0
  26. package/dist/cli/commands/machine/use.d.ts +11 -0
  27. package/dist/cli/commands/machine/use.d.ts.map +1 -0
  28. package/dist/cli/commands/machine/use.js +28 -0
  29. package/dist/cli/commands/machine/use.js.map +1 -0
  30. package/dist/cli/commands/pull.d.ts +12 -0
  31. package/dist/cli/commands/pull.d.ts.map +1 -0
  32. package/dist/cli/commands/pull.js +34 -0
  33. package/dist/cli/commands/pull.js.map +1 -0
  34. package/dist/cli/commands/push.d.ts +12 -0
  35. package/dist/cli/commands/push.d.ts.map +1 -0
  36. package/dist/cli/commands/push.js +34 -0
  37. package/dist/cli/commands/push.js.map +1 -0
  38. package/dist/cli/commands/status.d.ts +11 -0
  39. package/dist/cli/commands/status.d.ts.map +1 -0
  40. package/dist/cli/commands/status.js +27 -0
  41. package/dist/cli/commands/status.js.map +1 -0
  42. package/dist/cli/commands/track.d.ts +16 -0
  43. package/dist/cli/commands/track.d.ts.map +1 -0
  44. package/dist/cli/commands/track.js +82 -0
  45. package/dist/cli/commands/track.js.map +1 -0
  46. package/dist/cli/commands/untrack.d.ts +11 -0
  47. package/dist/cli/commands/untrack.d.ts.map +1 -0
  48. package/dist/cli/commands/untrack.js +28 -0
  49. package/dist/cli/commands/untrack.js.map +1 -0
  50. package/dist/config/global-config.d.ts +21 -0
  51. package/dist/config/global-config.d.ts.map +1 -0
  52. package/dist/config/global-config.js +106 -0
  53. package/dist/config/global-config.js.map +1 -0
  54. package/dist/config/sync.d.ts +96 -0
  55. package/dist/config/sync.d.ts.map +1 -0
  56. package/dist/config/sync.js +412 -0
  57. package/dist/config/sync.js.map +1 -0
  58. package/dist/config/xdg.d.ts +11 -0
  59. package/dist/config/xdg.d.ts.map +1 -0
  60. package/dist/config/xdg.js +79 -0
  61. package/dist/config/xdg.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/{src/index.ts → dist/index.js} +1 -1
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/file-mode.d.ts +3 -0
  67. package/dist/lib/file-mode.d.ts.map +1 -0
  68. package/dist/lib/file-mode.js +7 -0
  69. package/dist/lib/file-mode.js.map +1 -0
  70. package/dist/lib/output.d.ts +31 -0
  71. package/dist/lib/output.d.ts.map +1 -0
  72. package/dist/lib/output.js +198 -0
  73. package/dist/lib/output.js.map +1 -0
  74. package/dist/lib/path.d.ts +5 -0
  75. package/dist/lib/path.d.ts.map +1 -0
  76. package/dist/lib/path.js +25 -0
  77. package/dist/lib/path.js.map +1 -0
  78. package/dist/lib/string.d.ts +2 -0
  79. package/dist/lib/string.d.ts.map +1 -0
  80. package/dist/lib/string.js +4 -0
  81. package/dist/lib/string.js.map +1 -0
  82. package/dist/lib/validation.d.ts +3 -0
  83. package/dist/lib/validation.d.ts.map +1 -0
  84. package/dist/lib/validation.js +9 -0
  85. package/dist/lib/validation.js.map +1 -0
  86. package/dist/services/add.d.ts +20 -0
  87. package/dist/services/add.d.ts.map +1 -0
  88. package/dist/services/add.js +161 -0
  89. package/dist/services/add.js.map +1 -0
  90. package/dist/services/config-file.d.ts +30 -0
  91. package/dist/services/config-file.d.ts.map +1 -0
  92. package/dist/services/config-file.js +34 -0
  93. package/dist/services/config-file.js.map +1 -0
  94. package/dist/services/crypto.d.ts +9 -0
  95. package/dist/services/crypto.d.ts.map +1 -0
  96. package/dist/services/crypto.js +75 -0
  97. package/dist/services/crypto.js.map +1 -0
  98. package/dist/services/doctor.d.ts +16 -0
  99. package/dist/services/doctor.d.ts.map +1 -0
  100. package/dist/services/doctor.js +84 -0
  101. package/dist/services/doctor.js.map +1 -0
  102. package/dist/services/error.d.ts +14 -0
  103. package/dist/services/error.d.ts.map +1 -0
  104. package/dist/services/error.js +38 -0
  105. package/dist/services/error.js.map +1 -0
  106. package/dist/services/filesystem.d.ts +15 -0
  107. package/dist/services/filesystem.d.ts.map +1 -0
  108. package/dist/services/filesystem.js +113 -0
  109. package/dist/services/filesystem.js.map +1 -0
  110. package/dist/services/forget.d.ts +14 -0
  111. package/dist/services/forget.d.ts.map +1 -0
  112. package/dist/services/forget.js +124 -0
  113. package/dist/services/forget.js.map +1 -0
  114. package/dist/services/git.d.ts +10 -0
  115. package/dist/services/git.d.ts.map +1 -0
  116. package/dist/services/git.js +57 -0
  117. package/dist/services/git.js.map +1 -0
  118. package/dist/services/init.d.ts +19 -0
  119. package/dist/services/init.d.ts.map +1 -0
  120. package/dist/services/init.js +203 -0
  121. package/dist/services/init.js.map +1 -0
  122. package/dist/services/local-materialization.d.ts +28 -0
  123. package/dist/services/local-materialization.d.ts.map +1 -0
  124. package/dist/services/local-materialization.js +262 -0
  125. package/dist/services/local-materialization.js.map +1 -0
  126. package/dist/services/local-snapshot.d.ts +25 -0
  127. package/dist/services/local-snapshot.d.ts.map +1 -0
  128. package/dist/services/local-snapshot.js +93 -0
  129. package/dist/services/local-snapshot.js.map +1 -0
  130. package/dist/services/machine.d.ts +40 -0
  131. package/dist/services/machine.d.ts.map +1 -0
  132. package/dist/services/machine.js +113 -0
  133. package/dist/services/machine.js.map +1 -0
  134. package/dist/services/paths.d.ts +12 -0
  135. package/dist/services/paths.d.ts.map +1 -0
  136. package/dist/services/paths.js +71 -0
  137. package/dist/services/paths.js.map +1 -0
  138. package/dist/services/pull.d.ts +28 -0
  139. package/dist/services/pull.d.ts.map +1 -0
  140. package/dist/services/pull.js +67 -0
  141. package/dist/services/pull.js.map +1 -0
  142. package/dist/services/push.d.ts +35 -0
  143. package/dist/services/push.d.ts.map +1 -0
  144. package/dist/services/push.js +96 -0
  145. package/dist/services/push.js.map +1 -0
  146. package/dist/services/repo-artifacts.d.ts +52 -0
  147. package/dist/services/repo-artifacts.d.ts.map +1 -0
  148. package/dist/services/repo-artifacts.js +251 -0
  149. package/dist/services/repo-artifacts.js.map +1 -0
  150. package/dist/services/repo-snapshot.d.ts +6 -0
  151. package/dist/services/repo-snapshot.d.ts.map +1 -0
  152. package/dist/services/repo-snapshot.js +163 -0
  153. package/dist/services/repo-snapshot.js.map +1 -0
  154. package/dist/services/runtime.d.ts +40 -0
  155. package/dist/services/runtime.d.ts.map +1 -0
  156. package/dist/services/runtime.js +71 -0
  157. package/dist/services/runtime.js.map +1 -0
  158. package/dist/services/set.d.ts +38 -0
  159. package/dist/services/set.d.ts.map +1 -0
  160. package/dist/services/set.js +184 -0
  161. package/dist/services/set.js.map +1 -0
  162. package/dist/services/status.d.ts +30 -0
  163. package/dist/services/status.d.ts.map +1 -0
  164. package/dist/services/status.js +35 -0
  165. package/dist/services/status.js.map +1 -0
  166. package/package.json +15 -7
  167. package/src/cli/commands/add.ts +0 -40
  168. package/src/cli/commands/cd.ts +0 -80
  169. package/src/cli/commands/doctor.ts +0 -20
  170. package/src/cli/commands/forget.ts +0 -32
  171. package/src/cli/commands/index.ts +0 -23
  172. package/src/cli/commands/init.ts +0 -43
  173. package/src/cli/commands/list.ts +0 -17
  174. package/src/cli/commands/pull.ts +0 -31
  175. package/src/cli/commands/push.ts +0 -31
  176. package/src/cli/commands/set.ts +0 -47
  177. package/src/cli/commands/status.ts +0 -18
  178. package/src/cli/sync-output.test.ts +0 -173
  179. package/src/cli/sync-output.ts +0 -200
  180. package/src/config/sync.test.ts +0 -609
  181. package/src/config/sync.ts +0 -572
  182. package/src/config/xdg.ts +0 -138
  183. package/src/lib/string.test.ts +0 -13
  184. package/src/lib/string.ts +0 -3
  185. package/src/lib/validation.test.ts +0 -32
  186. package/src/lib/validation.ts +0 -11
  187. package/src/services/add.ts +0 -178
  188. package/src/services/config-file.test.ts +0 -161
  189. package/src/services/config-file.ts +0 -101
  190. package/src/services/crypto.test.ts +0 -132
  191. package/src/services/crypto.ts +0 -83
  192. package/src/services/doctor.ts +0 -142
  193. package/src/services/error.ts +0 -6
  194. package/src/services/filesystem.test.ts +0 -171
  195. package/src/services/filesystem.ts +0 -183
  196. package/src/services/forget.ts +0 -261
  197. package/src/services/git.test.ts +0 -83
  198. package/src/services/git.ts +0 -74
  199. package/src/services/init.test.ts +0 -109
  200. package/src/services/init.ts +0 -244
  201. package/src/services/list.ts +0 -63
  202. package/src/services/local-materialization.ts +0 -421
  203. package/src/services/local-snapshot.ts +0 -173
  204. package/src/services/paths.test.ts +0 -74
  205. package/src/services/paths.ts +0 -98
  206. package/src/services/pull.ts +0 -144
  207. package/src/services/push.ts +0 -168
  208. package/src/services/repo-artifacts.ts +0 -262
  209. package/src/services/repo-snapshot.ts +0 -197
  210. package/src/services/runtime.ts +0 -57
  211. package/src/services/set.ts +0 -383
  212. package/src/services/status.ts +0 -57
  213. package/src/services/sync.dry-run.test.ts +0 -179
  214. package/src/services/sync.runtime.test.ts +0 -756
  215. package/src/services/sync.service.test.ts +0 -1169
  216. package/src/test/helpers/sync-fixture.ts +0 -47
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { execute } from "@oclif/core";
3
-
4
3
  await execute({ dir: import.meta.url });
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const buildExecutableMode: (executable: boolean) => 493 | 420;
2
+ export declare const isExecutableMode: (mode: number | bigint) => boolean;
3
+ //# sourceMappingURL=file-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mode.d.ts","sourceRoot":"","sources":["../../src/lib/file-mode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,GAAI,YAAY,OAAO,cAEtD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,GAAG,MAAM,YAErD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const buildExecutableMode = (executable) => {
2
+ return executable ? 0o755 : 0o644;
3
+ };
4
+ export const isExecutableMode = (mode) => {
5
+ return (Number(mode) & 0o111) !== 0;
6
+ };
7
+ //# sourceMappingURL=file-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mode.js","sourceRoot":"","sources":["../../src/lib/file-mode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAmB,EAAE,EAAE;IACzD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAE,EAAE;IACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { SyncAddResult } from "#app/services/add.js";
2
+ import type { SyncDoctorResult } from "#app/services/doctor.js";
3
+ import type { SyncForgetResult } from "#app/services/forget.js";
4
+ import type { SyncInitResult } from "#app/services/init.js";
5
+ import type { SyncMachineListResult, SyncMachineUpdateResult } from "#app/services/machine.js";
6
+ import type { SyncPullResult } from "#app/services/pull.js";
7
+ import type { SyncPushResult } from "#app/services/push.js";
8
+ import type { SyncSetResult } from "#app/services/set.js";
9
+ import type { SyncStatusResult } from "#app/services/status.js";
10
+ type OutputLine = false | null | string | undefined;
11
+ export declare const output: (...lines: OutputLine[]) => string;
12
+ export declare const writeStdout: (value: string) => void;
13
+ export declare const writeStderr: (value: string) => void;
14
+ export declare const line: (label: string, value: number | string) => string;
15
+ export declare const summary: (...parts: string[]) => string;
16
+ export declare const bullets: (items: readonly string[], indent?: string) => string[];
17
+ export declare const preview: (label: string, items: readonly string[], emptyText: string) => string[];
18
+ export declare const levelTag: (level: "fail" | "ok" | "warn") => string;
19
+ export declare const formatErrorMessage: (message: Error | string) => string;
20
+ export declare const formatSyncInitResult: (result: SyncInitResult) => string;
21
+ export declare const formatSyncAddResult: (result: SyncAddResult) => string;
22
+ export declare const formatSyncForgetResult: (result: SyncForgetResult) => string;
23
+ export declare const formatSyncSetResult: (result: SyncSetResult) => string;
24
+ export declare const formatSyncPushResult: (result: SyncPushResult) => string;
25
+ export declare const formatSyncPullResult: (result: SyncPullResult) => string;
26
+ export declare const formatSyncStatusResult: (result: SyncStatusResult) => string;
27
+ export declare const formatSyncDoctorResult: (result: SyncDoctorResult) => string;
28
+ export declare const formatSyncMachineListResult: (result: SyncMachineListResult) => string;
29
+ export declare const formatSyncMachineUpdateResult: (result: SyncMachineUpdateResult) => string;
30
+ export {};
31
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAEjC,KAAK,UAAU,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAsBpD,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,UAAU,EAAE,WAE5C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,SAExC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,SAExC,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,GAAG,MAAM,WAEzD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,MAAM,EAAE,WAEzC,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,OAAO,SAAS,MAAM,EAAE,EAAE,eAAsB,aAIvE,CAAC;AAEF,eAAO,MAAM,OAAO,GAClB,OAAO,MAAM,EACb,OAAO,SAAS,MAAM,EAAE,EACxB,WAAW,MAAM,aAUlB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,GAAG,IAAI,GAAG,MAAM,WASrD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,KAAK,GAAG,MAAM,WAEzD,CAAC;AAqHF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,cAAc,WA4B1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,QAAQ,aAAa,WAmBxD,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,gBAAgB,WAY9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,QAAQ,aAAa,WAgBxD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,cAAc,WAa1D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,cAAc,WAa1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,gBAAgB,WAgB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,gBAAgB,WAW9D,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,QAAQ,qBAAqB,WAkCxE,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,uBAAuB,WAehC,CAAC"}
@@ -0,0 +1,198 @@
1
+ import { createColors } from "picocolors";
2
+ import { ensureTrailingNewline } from "#app/lib/string.js";
3
+ import { formatDevsyncError } from "#app/services/error.js";
4
+ const OUTPUT_INDENT = " ";
5
+ const colors = createColors(process.stdout.isTTY || process.stderr.isTTY);
6
+ const style = {
7
+ bullet: (value) => colors.dim(value),
8
+ detail: (value) => colors.dim(value),
9
+ error: (value) => colors.bold(colors.red(value)),
10
+ headline: (value) => colors.bold(colors.cyan(value)),
11
+ success: (value) => colors.bold(colors.green(value)),
12
+ value: (value) => colors.reset(value),
13
+ warn: (value) => colors.bold(colors.yellow(value)),
14
+ };
15
+ const compactLines = (lines) => {
16
+ return lines.filter((line) => line !== undefined && line !== null && line !== false);
17
+ };
18
+ export const output = (...lines) => {
19
+ return ensureTrailingNewline(compactLines(lines).join("\n"));
20
+ };
21
+ export const writeStdout = (value) => {
22
+ process.stdout.write(value);
23
+ };
24
+ export const writeStderr = (value) => {
25
+ process.stderr.write(value);
26
+ };
27
+ export const line = (label, value) => {
28
+ return `${style.detail(label)}: ${style.value(String(value))}`;
29
+ };
30
+ export const summary = (...parts) => {
31
+ return line("Summary", parts.join(", "));
32
+ };
33
+ export const bullets = (items, indent = OUTPUT_INDENT) => {
34
+ return items.map((item) => `${indent}${style.bullet("-")} ${style.value(item)}`);
35
+ };
36
+ export const preview = (label, items, emptyText) => {
37
+ if (items.length === 0) {
38
+ return [line(label, emptyText)];
39
+ }
40
+ return [
41
+ line(label, `${items.length} path${items.length === 1 ? "" : "s"}`),
42
+ ...bullets(items),
43
+ ];
44
+ };
45
+ export const levelTag = (level) => {
46
+ switch (level) {
47
+ case "fail":
48
+ return style.error("FAIL");
49
+ case "warn":
50
+ return style.warn("WARN");
51
+ default:
52
+ return style.success("OK");
53
+ }
54
+ };
55
+ export const formatErrorMessage = (message) => {
56
+ return output(...formatDevsyncError(message).split("\n").map(style.error));
57
+ };
58
+ const formatHeadline = (message, tone = "default") => {
59
+ switch (tone) {
60
+ case "error":
61
+ return style.error(message);
62
+ case "success":
63
+ return style.success(message);
64
+ case "warn":
65
+ return style.warn(message);
66
+ default:
67
+ return style.headline(message);
68
+ }
69
+ };
70
+ const formatSetReason = (reason, mode) => {
71
+ switch (reason) {
72
+ case "already-set":
73
+ return `This target already has ${mode} mode.`;
74
+ default:
75
+ return undefined;
76
+ }
77
+ };
78
+ const formatStoragePath = (repoPath) => {
79
+ return `default/${repoPath}`;
80
+ };
81
+ const formatPushSummary = (result) => {
82
+ return summary(`${result.plainFileCount} plain files`, `${result.encryptedFileCount} encrypted files`, `${result.symlinkCount} symlinks`, `${result.directoryCount} directory roots`, result.dryRun
83
+ ? `${result.deletedArtifactCount} stale repository artifacts would be removed`
84
+ : `${result.deletedArtifactCount} stale repository artifacts removed`);
85
+ };
86
+ const formatPullSummary = (result) => {
87
+ return summary(`${result.plainFileCount} plain files`, `${result.decryptedFileCount} decrypted files`, `${result.symlinkCount} symlinks`, `${result.directoryCount} directory roots`, result.dryRun
88
+ ? `${result.deletedLocalCount} local paths would be removed`
89
+ : `${result.deletedLocalCount} local paths removed`);
90
+ };
91
+ const formatTrackedEntry = (entry) => {
92
+ const lines = [
93
+ `${style.bullet("-")} ${style.value(entry.repoPath)} ${style.detail(`[${entry.kind}, ${entry.mode}] -> ${entry.localPath}`)}`,
94
+ `${OUTPUT_INDENT}${style.detail("storage")} ${style.value(formatStoragePath(entry.repoPath))}`,
95
+ ...(entry.machines.length > 0
96
+ ? [
97
+ `${OUTPUT_INDENT}${style.detail("machines")} ${style.value(entry.machines.join(", "))}`,
98
+ ]
99
+ : []),
100
+ ];
101
+ return lines;
102
+ };
103
+ const formatPushPlan = (result) => {
104
+ return [
105
+ line("Push plan", `${result.plainFileCount} plain files, ${result.encryptedFileCount} encrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedArtifactCount} stale repository artifacts.`),
106
+ ...preview("Push preview", result.preview, "no tracked paths"),
107
+ ];
108
+ };
109
+ const formatPullPlan = (result) => {
110
+ return [
111
+ line("Pull plan", `${result.plainFileCount} plain files, ${result.decryptedFileCount} decrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedLocalCount} local paths.`),
112
+ ...preview("Pull preview", result.preview, "no tracked paths"),
113
+ ];
114
+ };
115
+ const formatDoctorCounts = (checks) => {
116
+ const counts = checks.reduce((accumulator, check) => {
117
+ accumulator[check.level] += 1;
118
+ return accumulator;
119
+ }, {
120
+ fail: 0,
121
+ ok: 0,
122
+ warn: 0,
123
+ });
124
+ return summary(`${counts.ok} ok`, `${counts.warn} warnings`, `${counts.fail} failures`);
125
+ };
126
+ const formatDoctorCheck = (check) => {
127
+ return `${levelTag(check.level)} ${check.name}: ${check.detail}`;
128
+ };
129
+ export const formatSyncInitResult = (result) => {
130
+ return output(formatHeadline(result.alreadyInitialized
131
+ ? "Sync directory already initialized."
132
+ : "Initialized sync directory.", result.alreadyInitialized ? "warn" : "success"), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), line("Age identity file", result.identityFile), (() => {
133
+ switch (result.gitAction) {
134
+ case "cloned":
135
+ return line("Git repository", `cloned from ${result.gitSource}`);
136
+ case "initialized":
137
+ return line("Git repository", "initialized new repository");
138
+ default:
139
+ return line("Git repository", "using existing repository");
140
+ }
141
+ })(), result.generatedIdentity &&
142
+ "Age bootstrap: generated a new local identity.", summary(`${result.recipientCount} recipients`, `${result.entryCount} entries`));
143
+ };
144
+ export const formatSyncAddResult = (result) => {
145
+ const headline = !result.alreadyTracked
146
+ ? "Tracked sync target."
147
+ : result.changed
148
+ ? "Updated sync target."
149
+ : "Sync target already tracked.";
150
+ const tone = !result.alreadyTracked || result.changed ? "success" : "warn";
151
+ return output(formatHeadline(headline, tone), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), line("Local path", result.localPath), line("Repository path", result.repoPath), line("Repository storage", formatStoragePath(result.repoPath)), line("Kind", result.kind), line("Mode", result.mode), result.machines.length > 0 && line("Machines", result.machines.join(", ")));
152
+ };
153
+ export const formatSyncForgetResult = (result) => {
154
+ return output(formatHeadline("Untracked sync target.", "warn"), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), line("Local path", result.localPath), line("Repository path", result.repoPath), line("Removed repo artifacts", `${result.plainArtifactCount} plain, ${result.secretArtifactCount} secret.`));
155
+ };
156
+ export const formatSyncSetResult = (result) => {
157
+ return output(formatHeadline(result.action === "unchanged"
158
+ ? "Sync mode unchanged."
159
+ : "Updated sync mode.", result.action === "unchanged" ? "warn" : "success"), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), line("Owning entry", result.entryRepoPath), line("Target repository path", result.repoPath), line("Mode", result.mode), line("Action", result.action), formatSetReason(result.reason, result.mode));
160
+ };
161
+ export const formatSyncPushResult = (result) => {
162
+ return output(formatHeadline(result.dryRun
163
+ ? "Dry run for sync push."
164
+ : "Synchronized local config into the sync repository.", result.dryRun ? "warn" : "success"), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), formatPushSummary(result), result.dryRun && "No filesystem changes were made.");
165
+ };
166
+ export const formatSyncPullResult = (result) => {
167
+ return output(formatHeadline(result.dryRun
168
+ ? "Dry run for sync pull."
169
+ : "Applied sync repository to local config.", result.dryRun ? "warn" : "success"), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), formatPullSummary(result), result.dryRun && "No filesystem changes were made.");
170
+ };
171
+ export const formatSyncStatusResult = (result) => {
172
+ return output(formatHeadline("Sync status overview."), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), line("Active machine", result.activeMachine ?? "none"), summary(`${result.recipientCount} recipients`, `${result.entryCount} entries`), ...(result.entries.length === 0
173
+ ? [line("Entries", "none")]
174
+ : result.entries.flatMap(formatTrackedEntry)), ...formatPushPlan(result.push), ...formatPullPlan(result.pull));
175
+ };
176
+ export const formatSyncDoctorResult = (result) => {
177
+ return output(formatHeadline(result.hasFailures ? "Sync doctor found issues." : "Sync doctor passed.", result.hasFailures ? "error" : result.hasWarnings ? "warn" : "success"), line("Sync directory", result.syncDirectory), line("Config file", result.configPath), formatDoctorCounts(result.checks), ...result.checks.map(formatDoctorCheck));
178
+ };
179
+ export const formatSyncMachineListResult = (result) => {
180
+ const assignmentLines = result.assignments.length === 0
181
+ ? [line("Assignments", "none")]
182
+ : result.assignments.map((a) => `${OUTPUT_INDENT}${style.bullet("-")} ${style.value(a.entryRepoPath)} ${style.detail(`[${a.machines.join(", ")}]`)}`);
183
+ const noActiveMachine = result.activeMachine === undefined;
184
+ const hasRestrictedEntries = result.assignments.length > 0;
185
+ return output(formatHeadline("Sync machines overview."), line("Sync directory", result.syncDirectory), line("Global config", result.globalConfigPath), line("Active machines", result.activeMachine ?? "none"), summary(`${result.availableMachines.length} available machines`, `${result.assignments.length} assignments`, result.globalConfigExists
186
+ ? "global config present"
187
+ : "using implicit defaults"), ...(result.availableMachines.length === 0
188
+ ? [line("Machines", "none")]
189
+ : preview("Machines", result.availableMachines, "none")), ...assignmentLines, noActiveMachine &&
190
+ hasRestrictedEntries &&
191
+ style.warn("No active machine set. Entries restricted to specific machines will not sync."));
192
+ };
193
+ export const formatSyncMachineUpdateResult = (result) => {
194
+ return output(formatHeadline(result.mode === "use"
195
+ ? "Updated active sync machine."
196
+ : "Cleared active sync machine.", "success"), line("Sync directory", result.syncDirectory), line("Global config", result.globalConfigPath), result.machine !== undefined && line("Machine", result.machine), line("Active machines", result.activeMachine ?? "none"), result.warning !== undefined && style.warn(result.warning));
197
+ };
198
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const buildDirectoryKey: (repoPath: string) => string;
2
+ export declare const isPathEqualOrNested: (path: string, rootPath: string) => boolean;
3
+ export declare const doPathsOverlap: (leftPath: string, rightPath: string) => boolean;
4
+ export declare const isExplicitLocalPath: (target: string) => boolean;
5
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/lib/path.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,WAEjD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,YASjE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,YAKjE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,YAUjD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { isAbsolute, relative } from "node:path";
2
+ export const buildDirectoryKey = (repoPath) => {
3
+ return `${repoPath}/`;
4
+ };
5
+ export const isPathEqualOrNested = (path, rootPath) => {
6
+ const rootToPath = relative(rootPath, path);
7
+ return (rootToPath === "" ||
8
+ (!isAbsolute(rootToPath) &&
9
+ !rootToPath.startsWith("..") &&
10
+ rootToPath !== ".."));
11
+ };
12
+ export const doPathsOverlap = (leftPath, rightPath) => {
13
+ return (isPathEqualOrNested(leftPath, rightPath) ||
14
+ isPathEqualOrNested(rightPath, leftPath));
15
+ };
16
+ export const isExplicitLocalPath = (target) => {
17
+ return (target === "." ||
18
+ target === ".." ||
19
+ target === "~" ||
20
+ target.startsWith("./") ||
21
+ target.startsWith("../") ||
22
+ target.startsWith("~/") ||
23
+ isAbsolute(target));
24
+ };
25
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/lib/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE;IACpD,OAAO,GAAG,QAAQ,GAAG,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,EAAE;IACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE5C,OAAO,CACL,UAAU,KAAK,EAAE;QACjB,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;YACtB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;YAC5B,UAAU,KAAK,IAAI,CAAC,CACvB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAE;IACpE,OAAO,CACL,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC;QACxC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CACzC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,EAAE;IACpD,OAAO,CACL,MAAM,KAAK,GAAG;QACd,MAAM,KAAK,IAAI;QACf,MAAM,KAAK,GAAG;QACd,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;QACxB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB,UAAU,CAAC,MAAM,CAAC,CACnB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ensureTrailingNewline: (value: string) => string;
2
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/lib/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,WAElD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const ensureTrailingNewline = (value) => {
2
+ return value.endsWith("\n") ? value : `${value}\n`;
3
+ };
4
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/lib/string.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAE,EAAE;IACrD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;AACrD,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { z } from "zod";
2
+ export declare const formatInputIssues: (issues: z.ZodIssue[]) => string;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,eAAO,MAAM,iBAAiB,GAAI,QAAQ,CAAC,CAAC,QAAQ,EAAE,KAAG,MAQxD,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const formatInputIssues = (issues) => {
2
+ return issues
3
+ .map((issue) => {
4
+ const path = issue.path.length === 0 ? "input" : issue.path.join(".");
5
+ return `- ${path}: ${issue.message}`;
6
+ })
7
+ .join("\n");
8
+ };
9
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAoB,EAAU,EAAE;IAChE,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtE,OAAO,KAAK,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type SyncConfigEntryKind, type SyncMode } from "#app/config/sync.js";
2
+ import { type SyncContext } from "./runtime.js";
3
+ export type SyncAddRequest = Readonly<{
4
+ machines?: readonly string[];
5
+ mode: SyncMode;
6
+ target: string;
7
+ }>;
8
+ export type SyncAddResult = Readonly<{
9
+ alreadyTracked: boolean;
10
+ changed: boolean;
11
+ configPath: string;
12
+ kind: SyncConfigEntryKind;
13
+ localPath: string;
14
+ machines: readonly string[];
15
+ mode: SyncMode;
16
+ repoPath: string;
17
+ syncDirectory: string;
18
+ }>;
19
+ export declare const trackSyncTarget: (request: SyncAddRequest, context: SyncContext) => Promise<SyncAddResult>;
20
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/services/add.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAc7B,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAqFH,eAAO,MAAM,eAAe,GAC1B,SAAS,cAAc,EACvB,SAAS,WAAW,KACnB,OAAO,CAAC,aAAa,CAuIvB,CAAC"}
@@ -0,0 +1,161 @@
1
+ import { resolveConfiguredIdentityFile } from "#app/config/global-config.js";
2
+ import { normalizeSyncMachineName, readSyncConfig, } from "#app/config/sync.js";
3
+ import { createSyncConfigDocument, writeValidatedSyncConfig, } from "./config-file.js";
4
+ import { DevsyncError } from "./error.js";
5
+ import { getPathStats } from "./filesystem.js";
6
+ import { buildConfiguredHomeLocalPath, buildRepoPathWithinRoot, doPathsOverlap, resolveCommandTargetPath, } from "./paths.js";
7
+ import { ensureSyncRepository } from "./runtime.js";
8
+ const buildAddEntryCandidate = async (targetPath, context, input) => {
9
+ const targetStats = await getPathStats(targetPath);
10
+ if (targetStats === undefined) {
11
+ throw new DevsyncError("Sync target does not exist.", {
12
+ code: "TARGET_NOT_FOUND",
13
+ details: [`Target: ${targetPath}`],
14
+ hint: "Create the file or directory first, then run the command again.",
15
+ });
16
+ }
17
+ const kind = (() => {
18
+ if (targetStats.isDirectory()) {
19
+ return "directory";
20
+ }
21
+ if (targetStats.isFile() || targetStats.isSymbolicLink()) {
22
+ return "file";
23
+ }
24
+ throw new DevsyncError("Sync target type is not supported.", {
25
+ code: "TARGET_UNSUPPORTED_TYPE",
26
+ details: [`Target: ${targetPath}`],
27
+ hint: "Track a regular file, symlink, or directory.",
28
+ });
29
+ })();
30
+ if (doPathsOverlap(targetPath, context.paths.syncDirectory)) {
31
+ throw new DevsyncError("Sync target overlaps the devsync repository.", {
32
+ code: "TARGET_OVERLAPS_SYNC_DIR",
33
+ details: [
34
+ `Target: ${targetPath}`,
35
+ `Sync directory: ${context.paths.syncDirectory}`,
36
+ ],
37
+ hint: "Choose a path outside the devsync sync directory.",
38
+ });
39
+ }
40
+ if (input.identityFile !== undefined &&
41
+ doPathsOverlap(targetPath, input.identityFile)) {
42
+ throw new DevsyncError("Sync target contains the configured age identity file.", {
43
+ code: "TARGET_OVERLAPS_IDENTITY",
44
+ details: [
45
+ `Target: ${targetPath}`,
46
+ `Age identity file: ${input.identityFile}`,
47
+ ],
48
+ hint: "Store age key material outside tracked sync targets.",
49
+ });
50
+ }
51
+ const repoPath = buildRepoPathWithinRoot(targetPath, context.paths.homeDirectory, "Sync target");
52
+ const configuredLocalPath = buildConfiguredHomeLocalPath(repoPath);
53
+ return {
54
+ configuredLocalPath,
55
+ kind,
56
+ localPath: targetPath,
57
+ machines: input.machines?.map((m) => normalizeSyncMachineName(m)) ?? [],
58
+ machinesExplicit: input.machines !== undefined,
59
+ mode: input.mode,
60
+ modeExplicit: true,
61
+ name: repoPath,
62
+ repoPath,
63
+ };
64
+ };
65
+ export const trackSyncTarget = async (request, context) => {
66
+ const target = request.target.trim();
67
+ if (target.length === 0) {
68
+ throw new DevsyncError("Target path is required.", {
69
+ code: "TARGET_REQUIRED",
70
+ hint: "Pass a file or directory path, for example 'devsync track ~/.gitconfig'.",
71
+ });
72
+ }
73
+ await ensureSyncRepository(context);
74
+ const config = await readSyncConfig(context.paths.syncDirectory, context.environment);
75
+ const identityFile = config.age !== undefined
76
+ ? resolveConfiguredIdentityFile(config.age.identityFile, context.environment)
77
+ : undefined;
78
+ const isMachineClear = request.machines !== undefined &&
79
+ request.machines.length === 1 &&
80
+ request.machines[0] === "";
81
+ const effectiveMachines = isMachineClear ? [] : request.machines;
82
+ const candidate = await buildAddEntryCandidate(resolveCommandTargetPath(target, context.environment, context.cwd), context, {
83
+ identityFile,
84
+ machines: effectiveMachines,
85
+ mode: request.mode,
86
+ });
87
+ const existingEntry = config.entries.find((entry) => {
88
+ return (entry.localPath === candidate.localPath &&
89
+ entry.repoPath === candidate.repoPath);
90
+ });
91
+ const alreadyTracked = existingEntry !== undefined && existingEntry.kind === candidate.kind;
92
+ if (existingEntry !== undefined && existingEntry.kind !== candidate.kind) {
93
+ throw new DevsyncError("Sync target conflicts with an existing tracked entry.", {
94
+ code: "TARGET_CONFLICT",
95
+ details: [
96
+ `Requested local path: ${candidate.localPath}`,
97
+ `Requested repo path: ${candidate.repoPath}`,
98
+ `Existing entry: ${existingEntry.localPath} -> ${existingEntry.repoPath}`,
99
+ ],
100
+ hint: "Untrack or rename the existing entry before adding this root.",
101
+ });
102
+ }
103
+ if (!alreadyTracked) {
104
+ const nextConfig = createSyncConfigDocument({
105
+ ...config,
106
+ entries: [...config.entries, candidate],
107
+ });
108
+ await writeValidatedSyncConfig(context.paths.syncDirectory, nextConfig, context.environment);
109
+ return {
110
+ alreadyTracked,
111
+ changed: true,
112
+ configPath: context.paths.configPath,
113
+ kind: candidate.kind,
114
+ localPath: candidate.localPath,
115
+ machines: candidate.machines,
116
+ mode: candidate.mode,
117
+ repoPath: candidate.repoPath,
118
+ syncDirectory: context.paths.syncDirectory,
119
+ };
120
+ }
121
+ const modeChanged = existingEntry?.mode !== request.mode;
122
+ const machinesChanged = effectiveMachines !== undefined &&
123
+ (existingEntry?.machines.length !== candidate.machines.length ||
124
+ !candidate.machines.every((m) => existingEntry?.machines.includes(m)));
125
+ const changed = modeChanged || machinesChanged;
126
+ if (changed) {
127
+ const nextConfig = createSyncConfigDocument({
128
+ ...config,
129
+ entries: config.entries.map((entry) => {
130
+ if (entry.repoPath !== candidate.repoPath) {
131
+ return entry;
132
+ }
133
+ return {
134
+ ...entry,
135
+ ...(modeChanged ? { mode: request.mode } : {}),
136
+ ...(machinesChanged
137
+ ? {
138
+ machines: candidate.machines,
139
+ machinesExplicit: candidate.machinesExplicit,
140
+ }
141
+ : {}),
142
+ };
143
+ }),
144
+ });
145
+ await writeValidatedSyncConfig(context.paths.syncDirectory, nextConfig, context.environment);
146
+ }
147
+ return {
148
+ alreadyTracked,
149
+ changed,
150
+ configPath: context.paths.configPath,
151
+ kind: candidate.kind,
152
+ localPath: candidate.localPath,
153
+ machines: machinesChanged
154
+ ? candidate.machines
155
+ : (existingEntry?.machines ?? []),
156
+ mode: modeChanged ? request.mode : (existingEntry?.mode ?? request.mode),
157
+ repoPath: candidate.repoPath,
158
+ syncDirectory: context.paths.syncDirectory,
159
+ };
160
+ };
161
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/services/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type ResolvedSyncConfig, type SyncConfig } from "#app/config/sync.js";
2
+ export declare const sortSyncConfigEntries: (entries: readonly SyncConfig["entries"][number][]) => {
3
+ kind: "file" | "directory";
4
+ localPath: string;
5
+ machines?: string[] | undefined;
6
+ mode?: "normal" | "secret" | "ignore" | undefined;
7
+ }[];
8
+ export declare const createSyncConfigDocument: (config: ResolvedSyncConfig) => SyncConfig;
9
+ export declare const writeValidatedSyncConfig: (syncDirectory: string, config: SyncConfig, environment: NodeJS.ProcessEnv) => Promise<{
10
+ version: 5;
11
+ entries: {
12
+ kind: "file" | "directory";
13
+ localPath: string;
14
+ machines?: string[] | undefined;
15
+ mode?: "normal" | "secret" | "ignore" | undefined;
16
+ }[];
17
+ } | {
18
+ version: 6;
19
+ age: {
20
+ identityFile: string;
21
+ recipients: string[];
22
+ };
23
+ entries: {
24
+ kind: "file" | "directory";
25
+ localPath: string;
26
+ machines?: string[] | undefined;
27
+ mode?: "normal" | "secret" | "ignore" | undefined;
28
+ }[];
29
+ }>;
30
+ //# sourceMappingURL=config-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../../src/services/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAI7B,eAAO,MAAM,qBAAqB,GAChC,SAAS,SAAS,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE;;;;;GAKlD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,kBAAkB,KACzB,UAsBF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,QAAQ,UAAU,EAClB,aAAa,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;EAW/B,CAAC"}