@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,71 @@
1
+ import { isAbsolute, relative, resolve } from "node:path";
2
+ import { normalizeSyncRepoPath, } from "#app/config/sync.ts";
3
+ import { expandHomePath } from "#app/config/xdg.ts";
4
+ import { DotweaveError } from "#app/lib/error.ts";
5
+ import { isExplicitLocalPath } from "#app/lib/path.ts";
6
+ const homePrefix = "~";
7
+ const shellPathSeparator = "/";
8
+ export const buildRepoPathWithinRoot = (absolutePath, rootPath, description) => {
9
+ const relativePath = relative(rootPath, absolutePath);
10
+ if (relativePath === "") {
11
+ throw new DotweaveError(`${description} resolves to the root directory, which cannot be tracked directly.`, {
12
+ code: "TARGET_ROOT_DISALLOWED",
13
+ details: [`Target: ${absolutePath}`, `Root: ${rootPath}`],
14
+ hint: `Choose a file or subdirectory inside ${rootPath}.`,
15
+ });
16
+ }
17
+ if (isAbsolute(relativePath) ||
18
+ relativePath.startsWith("..") ||
19
+ relativePath === "..") {
20
+ throw new DotweaveError(`${description} must stay inside the configured home root.`, {
21
+ code: "TARGET_OUTSIDE_ROOT",
22
+ details: [`Target: ${absolutePath}`, `Allowed root: ${rootPath}`],
23
+ hint: `Use a path inside ${rootPath}.`,
24
+ });
25
+ }
26
+ return normalizeSyncRepoPath(relativePath);
27
+ };
28
+ export const buildConfiguredHomeLocalPath = (repoPath) => {
29
+ return {
30
+ default: `${homePrefix}${shellPathSeparator}${repoPath}`,
31
+ };
32
+ };
33
+ export const tryBuildRepoPathWithinRoot = (absolutePath, rootPath, description) => {
34
+ try {
35
+ return buildRepoPathWithinRoot(absolutePath, rootPath, description);
36
+ }
37
+ catch {
38
+ return undefined;
39
+ }
40
+ };
41
+ export const tryNormalizeRepoPathInput = (value) => {
42
+ try {
43
+ return normalizeSyncRepoPath(value);
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ };
49
+ export const resolveTrackedEntry = (target, entries, cwd, homeDirectory) => {
50
+ const resolvedTargetPath = resolve(cwd, expandHomePath(target, homeDirectory));
51
+ const byLocalPath = entries.filter((entry) => entry.localPath === resolvedTargetPath);
52
+ let matches;
53
+ if (byLocalPath.length > 0 || isExplicitLocalPath(target)) {
54
+ matches = byLocalPath;
55
+ }
56
+ else {
57
+ const normalizedRepoPath = tryNormalizeRepoPathInput(target);
58
+ matches =
59
+ normalizedRepoPath === undefined
60
+ ? []
61
+ : entries.filter((entry) => entry.repoPath === normalizedRepoPath);
62
+ }
63
+ if (matches.length > 1) {
64
+ throw new DotweaveError(`Multiple tracked sync entries match: ${target}`, {
65
+ code: "TARGET_CONFLICT",
66
+ hint: "Use an explicit local path to choose the tracked entry.",
67
+ });
68
+ }
69
+ return matches[0];
70
+ };
71
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/services/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EACL,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,YAAoB,EACpB,QAAgB,EAChB,WAAmB,EACnB,EAAE;IACF,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEtD,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CACrB,GAAG,WAAW,oEAAoE,EAClF;YACE,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,CAAC,WAAW,YAAY,EAAE,EAAE,SAAS,QAAQ,EAAE,CAAC;YACzD,IAAI,EAAE,wCAAwC,QAAQ,GAAG;SAC1D,CACF,CAAC;IACJ,CAAC;IAED,IACE,UAAU,CAAC,YAAY,CAAC;QACxB,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAC7B,YAAY,KAAK,IAAI,EACrB,CAAC;QACD,MAAM,IAAI,aAAa,CACrB,GAAG,WAAW,6CAA6C,EAC3D;YACE,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,CAAC,WAAW,YAAY,EAAE,EAAE,iBAAiB,QAAQ,EAAE,CAAC;YACjE,IAAI,EAAE,qBAAqB,QAAQ,GAAG;SACvC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,qBAAqB,CAAC,YAAY,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,QAAgB,EACK,EAAE;IACvB,OAAO;QACL,OAAO,EAAE,GAAG,UAAU,GAAG,kBAAkB,GAAG,QAAQ,EAAE;KACzD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,YAAoB,EACpB,QAAgB,EAChB,WAAmB,EACnB,EAAE;IACF,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAE,EAAE;IACzD,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAc,EACd,OAA2C,EAC3C,GAAW,EACX,aAAqB,EACgB,EAAE;IACvC,MAAM,kBAAkB,GAAG,OAAO,CAChC,GAAG,EACH,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CACtC,CAAC;IACF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,kBAAkB,CAClD,CAAC;IAEF,IAAI,OAA2B,CAAC;IAEhC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,WAAW,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO;YACL,kBAAkB,KAAK,SAAS;gBAC9B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,kBAAkB,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CAAC,wCAAwC,MAAM,EAAE,EAAE;YACxE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,yDAAyD;SAChE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ export type ProfileAssignment = Readonly<{
2
+ entryLocalPath: string;
3
+ entryRepoPath: string;
4
+ profiles: readonly string[];
5
+ }>;
6
+ export type ProfileListResult = Readonly<{
7
+ activeProfile?: string;
8
+ activeProfileMode: "none" | "single";
9
+ assignments: readonly ProfileAssignment[];
10
+ availableProfiles: readonly string[];
11
+ globalConfigExists: boolean;
12
+ globalConfigPath: string;
13
+ syncDirectory: string;
14
+ }>;
15
+ export type ProfileUpdateResult = Readonly<{
16
+ activeProfile?: string;
17
+ action: "clear" | "use";
18
+ globalConfigPath: string;
19
+ profile?: string;
20
+ syncDirectory: string;
21
+ warning?: string;
22
+ }>;
23
+ type AssignProfilesRequest = Readonly<{
24
+ profiles: readonly string[];
25
+ target: string;
26
+ }>;
27
+ type AssignProfilesResult = Readonly<{
28
+ action: "assigned" | "unchanged";
29
+ configPath: string;
30
+ entryRepoPath: string;
31
+ profiles: readonly string[];
32
+ syncDirectory: string;
33
+ }>;
34
+ export declare const listProfiles: () => Promise<ProfileListResult>;
35
+ export declare const setActiveProfile: (profile: string) => Promise<ProfileUpdateResult>;
36
+ export declare const clearActiveProfile: () => Promise<ProfileUpdateResult>;
37
+ export declare const assignProfiles: (request: AssignProfilesRequest, cwd: string) => Promise<AssignProfilesResult>;
38
+ export {};
39
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/services/profile.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC;IACrC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,KAAK,oBAAoB,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,iBAAiB,CAgC9D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,MAAM,KACd,OAAO,CAAC,mBAAmB,CA6B7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,mBAAmB,CAiBtE,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,SAAS,qBAAqB,EAC9B,KAAK,MAAM,KACV,OAAO,CAAC,oBAAoB,CAuE9B,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { CONSTANTS } from "#app/config/constants.ts";
2
+ import { formatGlobalDotweaveConfig, readGlobalDotweaveConfig, } from "#app/config/global-config.ts";
3
+ import { collectAllProfileNames, normalizeSyncProfileName, readSyncConfig, } from "#app/config/sync.ts";
4
+ import { DotweaveError } from "#app/lib/error.ts";
5
+ import { writeTextFileAtomically } from "#app/lib/filesystem.ts";
6
+ import { ensureGitRepository } from "#app/lib/git.ts";
7
+ import { buildSyncConfigDocument, writeValidatedSyncConfig, } from "./config-file.js";
8
+ import { resolveTrackedEntry } from "./paths.js";
9
+ import { resolveSyncConfigResolutionContext, resolveSyncPaths, } from "./runtime.js";
10
+ export const listProfiles = async () => {
11
+ const { syncDirectory, globalConfigPath } = resolveSyncPaths();
12
+ const context = resolveSyncConfigResolutionContext();
13
+ await ensureGitRepository(syncDirectory);
14
+ const [globalConfig, syncConfig] = await Promise.all([
15
+ readGlobalDotweaveConfig(globalConfigPath),
16
+ readSyncConfig(syncDirectory, context),
17
+ ]);
18
+ return {
19
+ ...(globalConfig?.activeProfile === undefined
20
+ ? {}
21
+ : { activeProfile: globalConfig.activeProfile }),
22
+ activeProfileMode: globalConfig?.activeProfile === undefined ? "none" : "single",
23
+ assignments: syncConfig.entries
24
+ .filter((entry) => entry.profilesExplicit && entry.profiles.length > 0)
25
+ .map((entry) => ({
26
+ entryLocalPath: entry.localPath,
27
+ entryRepoPath: entry.repoPath,
28
+ profiles: entry.profiles,
29
+ }))
30
+ .sort((left, right) => left.entryRepoPath.localeCompare(right.entryRepoPath)),
31
+ availableProfiles: collectAllProfileNames(syncConfig.entries),
32
+ globalConfigExists: globalConfig !== undefined,
33
+ globalConfigPath,
34
+ syncDirectory,
35
+ };
36
+ };
37
+ export const setActiveProfile = async (profile) => {
38
+ const normalizedProfile = normalizeSyncProfileName(profile);
39
+ const { syncDirectory, globalConfigPath } = resolveSyncPaths();
40
+ const context = resolveSyncConfigResolutionContext();
41
+ await ensureGitRepository(syncDirectory);
42
+ const syncConfig = await readSyncConfig(syncDirectory, context);
43
+ const knownProfiles = collectAllProfileNames(syncConfig.entries);
44
+ const warning = knownProfiles.includes(normalizedProfile)
45
+ ? undefined
46
+ : `Profile '${normalizedProfile}' is not referenced by any tracked entry.`;
47
+ await writeTextFileAtomically(globalConfigPath, formatGlobalDotweaveConfig({
48
+ activeProfile: normalizedProfile,
49
+ version: CONSTANTS.GLOBAL_CONFIG.CURRENT_VERSION,
50
+ }));
51
+ return {
52
+ activeProfile: normalizedProfile,
53
+ globalConfigPath,
54
+ action: "use",
55
+ profile: normalizedProfile,
56
+ syncDirectory,
57
+ ...(warning !== undefined ? { warning } : {}),
58
+ };
59
+ };
60
+ export const clearActiveProfile = async () => {
61
+ const { syncDirectory, globalConfigPath } = resolveSyncPaths();
62
+ await ensureGitRepository(syncDirectory);
63
+ await writeTextFileAtomically(globalConfigPath, formatGlobalDotweaveConfig({
64
+ version: CONSTANTS.GLOBAL_CONFIG.CURRENT_VERSION,
65
+ }));
66
+ return {
67
+ globalConfigPath,
68
+ action: "clear",
69
+ syncDirectory,
70
+ };
71
+ };
72
+ export const assignProfiles = async (request, cwd) => {
73
+ const target = request.target.trim();
74
+ if (target.length === 0) {
75
+ throw new DotweaveError("Target path is required.", {
76
+ code: "TARGET_REQUIRED",
77
+ hint: "Pass a tracked entry path, for example 'dotweave track ~/.gitconfig --profile default --profile work'.",
78
+ });
79
+ }
80
+ const { syncDirectory, configPath } = resolveSyncPaths();
81
+ const context = resolveSyncConfigResolutionContext();
82
+ await ensureGitRepository(syncDirectory);
83
+ const config = await readSyncConfig(syncDirectory, context);
84
+ const entry = resolveTrackedEntry(target, config.entries, cwd, context.homeDirectory);
85
+ if (entry === undefined) {
86
+ throw new DotweaveError(`No tracked sync entry matches: ${target}`, {
87
+ code: "TARGET_NOT_TRACKED",
88
+ hint: "Track the root first with 'dotweave track'.",
89
+ });
90
+ }
91
+ const normalizedProfiles = request.profiles.map((m) => normalizeSyncProfileName(m));
92
+ if (entry.profiles.length === normalizedProfiles.length &&
93
+ normalizedProfiles.every((m) => entry.profiles.includes(m))) {
94
+ return {
95
+ action: "unchanged",
96
+ configPath,
97
+ entryRepoPath: entry.repoPath,
98
+ profiles: normalizedProfiles,
99
+ syncDirectory,
100
+ };
101
+ }
102
+ const nextConfig = buildSyncConfigDocument({
103
+ ...config,
104
+ entries: config.entries.map((e) => {
105
+ if (e.repoPath !== entry.repoPath) {
106
+ return e;
107
+ }
108
+ return {
109
+ ...e,
110
+ profiles: normalizedProfiles,
111
+ profilesExplicit: normalizedProfiles.length > 0,
112
+ };
113
+ }),
114
+ });
115
+ await writeValidatedSyncConfig(syncDirectory, nextConfig, context);
116
+ return {
117
+ action: "assigned",
118
+ configPath,
119
+ entryRepoPath: entry.repoPath,
120
+ profiles: normalizedProfiles,
121
+ syncDirectory,
122
+ };
123
+ };
124
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/services/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { ConsolaInstance } from "consola";
2
+ import { buildPullCounts, type EntryMaterialization } from "./local-materialization.ts";
3
+ import { type EffectiveSyncConfig } from "./runtime.ts";
4
+ export type PullRequest = Readonly<{
5
+ dryRun: boolean;
6
+ profile?: string;
7
+ }>;
8
+ export type PullResult = Readonly<{
9
+ configPath: string;
10
+ decryptedFileCount: number;
11
+ deletedLocalCount: number;
12
+ directoryCount: number;
13
+ dryRun: boolean;
14
+ plainFileCount: number;
15
+ symlinkCount: number;
16
+ syncDirectory: string;
17
+ }>;
18
+ export type PullPlan = Readonly<{
19
+ counts: ReturnType<typeof buildPullCounts>;
20
+ deletedLocalCount: number;
21
+ deletedLocalPaths: readonly string[];
22
+ desiredKeys: ReadonlySet<string>;
23
+ existingKeys: ReadonlySet<string>;
24
+ materializations: readonly (EntryMaterialization | undefined)[];
25
+ updatedLocalPaths: readonly string[];
26
+ }>;
27
+ export type PreparedPull = Readonly<{
28
+ config: EffectiveSyncConfig;
29
+ plan: PullPlan;
30
+ syncDirectory: string;
31
+ }>;
32
+ export declare const buildPullPlan: (config: EffectiveSyncConfig, syncDirectory: string, reporter?: ConsolaInstance) => Promise<PullPlan>;
33
+ export declare const buildPullPlanPreview: (plan: PullPlan) => string[];
34
+ export declare const buildPullResultFromPlan: (plan: PullPlan, syncDirectory: string, dryRun: boolean) => PullResult;
35
+ export declare const pullChanges: (request: PullRequest, reporter?: ConsolaInstance) => Promise<PullResult>;
36
+ export declare const preparePull: (request: PullRequest, reporter?: ConsolaInstance) => Promise<PreparedPull>;
37
+ export declare const applyPullPlan: (config: EffectiveSyncConfig, plan: PullPlan, reporter?: ConsolaInstance) => Promise<void>;
38
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/services/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C,OAAO,EAGL,eAAe,EAGf,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,SAAS,CAAC,oBAAoB,GAAG,SAAS,CAAC,EAAE,CAAC;IAChE,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAoEH,eAAO,MAAM,aAAa,GACxB,QAAQ,mBAAmB,EAC3B,eAAe,MAAM,EACrB,WAAW,eAAe,KACzB,OAAO,CAAC,QAAQ,CA0ElB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,MAAM,QAAQ,aAKlD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,MAAM,QAAQ,EACd,eAAe,MAAM,EACrB,QAAQ,OAAO,KACd,UASF,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,SAAS,WAAW,EACpB,WAAW,eAAe,KACzB,OAAO,CAAC,UAAU,CAYpB,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,SAAS,WAAW,EACpB,WAAW,eAAe,KACzB,OAAO,CAAC,YAAY,CAkBtB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,mBAAmB,EAC3B,MAAM,QAAQ,EACd,WAAW,eAAe,kBAgB3B,CAAC"}
@@ -0,0 +1,148 @@
1
+ import { CONSTANTS } from "#app/config/constants.ts";
2
+ import { resolveSyncConfigFilePath } from "#app/config/sync.ts";
3
+ import { ensureGitRepository } from "#app/lib/git.ts";
4
+ import { isPathEqualOrNested } from "#app/lib/path.ts";
5
+ import { limitConcurrency } from "#app/lib/promise.ts";
6
+ import { applyEntryMaterialization, buildEntryMaterialization, buildPullCounts, collectChangedLocalPaths, countDeletedLocalNodes, } from "./local-materialization.js";
7
+ import { buildRepositorySnapshot } from "./repo-snapshot.js";
8
+ import { loadSyncConfig, resolveSyncPaths, } from "./runtime.js";
9
+ const buildDeletedLocalPaths = (deletedKeys, keyToLocalPath) => {
10
+ return [...deletedKeys]
11
+ .map((key) => {
12
+ return keyToLocalPath.get(key);
13
+ })
14
+ .filter((path) => {
15
+ return path !== undefined;
16
+ })
17
+ .sort((left, right) => {
18
+ return left.localeCompare(right);
19
+ });
20
+ };
21
+ const buildUpdatedLocalPaths = async (config, materializations) => {
22
+ const changedLocalPaths = new Set();
23
+ for (let index = 0; index < config.entries.length; index += 1) {
24
+ const entry = config.entries[index];
25
+ const materialization = materializations[index];
26
+ if (entry === undefined || materialization === undefined) {
27
+ continue;
28
+ }
29
+ const childEntryLocalPaths = entry.kind !== "directory"
30
+ ? []
31
+ : config.entries
32
+ .filter((candidate) => {
33
+ return (candidate !== entry &&
34
+ isPathEqualOrNested(candidate.localPath, entry.localPath));
35
+ })
36
+ .map((candidate) => {
37
+ return candidate.localPath;
38
+ });
39
+ for (const path of await collectChangedLocalPaths(entry, materialization, config)) {
40
+ if (childEntryLocalPaths.some((childPath) => {
41
+ return isPathEqualOrNested(path, childPath);
42
+ })) {
43
+ continue;
44
+ }
45
+ changedLocalPaths.add(path);
46
+ }
47
+ }
48
+ return [...changedLocalPaths].sort((left, right) => {
49
+ return left.localeCompare(right);
50
+ });
51
+ };
52
+ export const buildPullPlan = async (config, syncDirectory, reporter) => {
53
+ reporter?.start("Scanning repository artifacts...");
54
+ const snapshot = await buildRepositorySnapshot(syncDirectory, config, reporter);
55
+ reporter?.start("Planning local materializations...");
56
+ const materializations = config.entries.map((entry) => {
57
+ if (entry.mode === "ignore") {
58
+ return undefined;
59
+ }
60
+ return buildEntryMaterialization(entry, snapshot, reporter);
61
+ });
62
+ let deletedLocalCount = 0;
63
+ const existingKeys = new Set();
64
+ const keyToLocalPath = new Map();
65
+ const deletedKeys = new Set();
66
+ reporter?.start("Scanning existing local paths...");
67
+ for (let index = 0; index < config.entries.length; index += 1) {
68
+ const entry = config.entries[index];
69
+ const materialization = materializations[index];
70
+ if (entry === undefined || materialization === undefined) {
71
+ continue;
72
+ }
73
+ const entryExistingKeys = new Set();
74
+ const entryKeyToLocalPath = new Map();
75
+ deletedLocalCount += await countDeletedLocalNodes(entry, materialization.desiredKeys, config, entryExistingKeys, reporter, entryKeyToLocalPath, deletedKeys);
76
+ for (const key of entryExistingKeys) {
77
+ existingKeys.add(key);
78
+ }
79
+ for (const [key, localPath] of entryKeyToLocalPath.entries()) {
80
+ keyToLocalPath.set(key, localPath);
81
+ }
82
+ }
83
+ const desiredKeys = new Set(materializations.flatMap((m) => m === undefined ? [] : [...m.desiredKeys]));
84
+ const deletedLocalPaths = buildDeletedLocalPaths(deletedKeys, keyToLocalPath);
85
+ const deletedLocalPathSet = new Set(deletedLocalPaths);
86
+ const updatedLocalPaths = (await buildUpdatedLocalPaths(config, materializations)).filter((path) => {
87
+ return !deletedLocalPathSet.has(path);
88
+ });
89
+ return {
90
+ counts: buildPullCounts(materializations),
91
+ deletedLocalCount,
92
+ deletedLocalPaths,
93
+ desiredKeys,
94
+ existingKeys,
95
+ materializations,
96
+ updatedLocalPaths,
97
+ };
98
+ };
99
+ export const buildPullPlanPreview = (plan) => {
100
+ return [
101
+ ...plan.updatedLocalPaths.slice(0, 4),
102
+ ...plan.deletedLocalPaths.slice(0, 4),
103
+ ].slice(0, 6);
104
+ };
105
+ export const buildPullResultFromPlan = (plan, syncDirectory, dryRun) => {
106
+ const configPath = resolveSyncConfigFilePath(syncDirectory);
107
+ return {
108
+ configPath,
109
+ deletedLocalCount: plan.deletedLocalCount,
110
+ dryRun,
111
+ syncDirectory,
112
+ ...plan.counts,
113
+ };
114
+ };
115
+ export const pullChanges = async (request, reporter) => {
116
+ const prepared = await preparePull(request, reporter);
117
+ if (!request.dryRun) {
118
+ await applyPullPlan(prepared.config, prepared.plan, reporter);
119
+ }
120
+ return buildPullResultFromPlan(prepared.plan, prepared.syncDirectory, request.dryRun);
121
+ };
122
+ export const preparePull = async (request, reporter) => {
123
+ reporter?.start("Starting pull...");
124
+ const { syncDirectory } = resolveSyncPaths();
125
+ reporter?.start("Checking sync directory...");
126
+ await ensureGitRepository(syncDirectory);
127
+ reporter?.start("Loading sync configuration...");
128
+ const { effectiveConfig: config } = await loadSyncConfig(syncDirectory, {
129
+ ...(request.profile === undefined ? {} : { profile: request.profile }),
130
+ });
131
+ const plan = await buildPullPlan(config, syncDirectory, reporter);
132
+ return {
133
+ config,
134
+ plan,
135
+ syncDirectory,
136
+ };
137
+ };
138
+ export const applyPullPlan = async (config, plan, reporter) => {
139
+ await limitConcurrency(CONSTANTS.SYNC.DEFAULT_CONCURRENCY, config.entries, async (entry, index) => {
140
+ const materialization = plan.materializations[index];
141
+ if (entry === undefined || materialization === undefined) {
142
+ return;
143
+ }
144
+ reporter?.start(`Applying ${entry.repoPath}...`);
145
+ await applyEntryMaterialization(entry, materialization, config, reporter);
146
+ });
147
+ };
148
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/services/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { ConsolaInstance } from "consola";
2
+ import { type SnapshotNode } from "./local-snapshot.ts";
3
+ import { type RepoArtifact } from "./repo-artifacts.ts";
4
+ import { type EffectiveSyncConfig } from "./runtime.ts";
5
+ export type PushRequest = Readonly<{
6
+ dryRun: boolean;
7
+ profile?: string;
8
+ }>;
9
+ export type PushResult = Readonly<{
10
+ configPath: string;
11
+ deletedArtifactCount: number;
12
+ directoryCount: number;
13
+ dryRun: boolean;
14
+ encryptedFileCount: number;
15
+ plainFileCount: number;
16
+ symlinkCount: number;
17
+ syncDirectory: string;
18
+ }>;
19
+ export type PushPlan = Readonly<{
20
+ artifacts: readonly RepoArtifact[];
21
+ counts: ReturnType<typeof buildPushCounts>;
22
+ deletedArtifactCount: number;
23
+ desiredArtifactKeys: ReadonlySet<string>;
24
+ existingArtifactKeys: ReadonlySet<string>;
25
+ snapshot: ReadonlyMap<string, SnapshotNode>;
26
+ }>;
27
+ declare const buildPushCounts: (snapshot: ReadonlyMap<string, SnapshotNode>) => {
28
+ directoryCount: number;
29
+ encryptedFileCount: number;
30
+ plainFileCount: number;
31
+ symlinkCount: number;
32
+ };
33
+ export declare const buildPushPlan: (config: EffectiveSyncConfig, syncDirectory: string, reporter?: ConsolaInstance) => Promise<PushPlan>;
34
+ export declare const buildPushPlanPreview: (plan: PushPlan) => string[];
35
+ export declare const buildPushResultFromPlan: (plan: PushPlan, syncDirectory: string, dryRun: boolean) => PushResult;
36
+ export declare const pushChanges: (request: PushRequest, reporter?: ConsolaInstance) => Promise<PushResult>;
37
+ export {};
38
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/services/push.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IACnC,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC3C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C,CAAC,CAAC;AAEH,QAAA,MAAM,eAAe,GAAI,UAAU,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC;;;;;CA8BnE,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,mBAAmB,EAC3B,eAAe,MAAM,EACrB,WAAW,eAAe,KACzB,OAAO,CAAC,QAAQ,CA4BlB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,MAAM,QAAQ,aAalD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,MAAM,QAAQ,EACd,eAAe,MAAM,EACrB,QAAQ,OAAO,KACd,UASF,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,SAAS,WAAW,EACpB,WAAW,eAAe,KACzB,OAAO,CAAC,UAAU,CAiEpB,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { join } from "node:path";
2
+ import { CONSTANTS } from "#app/config/constants.ts";
3
+ import { resolveSyncConfigFilePath } from "#app/config/sync.ts";
4
+ import { removePathAtomically } from "#app/lib/filesystem.ts";
5
+ import { ensureGitRepository } from "#app/lib/git.ts";
6
+ import { limitConcurrency } from "#app/lib/promise.ts";
7
+ import { buildLocalSnapshot } from "./local-snapshot.js";
8
+ import { buildArtifactKey, buildRepoArtifacts, collectExistingArtifactKeys, writeArtifactsToDirectory, } from "./repo-artifacts.js";
9
+ import { loadSyncConfig, resolveSyncPaths, } from "./runtime.js";
10
+ const buildPushCounts = (snapshot) => {
11
+ let directoryCount = 0;
12
+ let encryptedFileCount = 0;
13
+ let plainFileCount = 0;
14
+ let symlinkCount = 0;
15
+ for (const node of snapshot.values()) {
16
+ if (node.type === "directory") {
17
+ directoryCount += 1;
18
+ continue;
19
+ }
20
+ if (node.type === "symlink") {
21
+ symlinkCount += 1;
22
+ continue;
23
+ }
24
+ if (node.secret) {
25
+ encryptedFileCount += 1;
26
+ }
27
+ else {
28
+ plainFileCount += 1;
29
+ }
30
+ }
31
+ return {
32
+ directoryCount,
33
+ encryptedFileCount,
34
+ plainFileCount,
35
+ symlinkCount,
36
+ };
37
+ };
38
+ export const buildPushPlan = async (config, syncDirectory, reporter) => {
39
+ reporter?.start("Scanning local files...");
40
+ const snapshot = await buildLocalSnapshot(config, reporter);
41
+ reporter?.start("Preparing repository artifacts...");
42
+ const artifacts = await buildRepoArtifacts(snapshot, config, reporter);
43
+ const desiredArtifactKeys = new Set(artifacts.map((artifact) => {
44
+ return buildArtifactKey(artifact);
45
+ }));
46
+ reporter?.start("Scanning existing repository artifacts...");
47
+ const existingArtifactKeys = await collectExistingArtifactKeys(syncDirectory, config, reporter);
48
+ const deletedArtifactCount = [...existingArtifactKeys].filter((key) => {
49
+ return !desiredArtifactKeys.has(key);
50
+ }).length;
51
+ return {
52
+ artifacts,
53
+ counts: buildPushCounts(snapshot),
54
+ deletedArtifactCount,
55
+ desiredArtifactKeys,
56
+ existingArtifactKeys,
57
+ snapshot,
58
+ };
59
+ };
60
+ export const buildPushPlanPreview = (plan) => {
61
+ const createdOrUpdated = [...plan.snapshot.keys()].sort((left, right) => {
62
+ return left.localeCompare(right);
63
+ });
64
+ const deleted = [...plan.existingArtifactKeys]
65
+ .filter((key) => {
66
+ return !plan.desiredArtifactKeys.has(key);
67
+ })
68
+ .sort((left, right) => {
69
+ return left.localeCompare(right);
70
+ });
71
+ return [...createdOrUpdated.slice(0, 4), ...deleted.slice(0, 4)].slice(0, 6);
72
+ };
73
+ export const buildPushResultFromPlan = (plan, syncDirectory, dryRun) => {
74
+ const configPath = resolveSyncConfigFilePath(syncDirectory);
75
+ return {
76
+ configPath,
77
+ deletedArtifactCount: plan.deletedArtifactCount,
78
+ dryRun,
79
+ syncDirectory,
80
+ ...plan.counts,
81
+ };
82
+ };
83
+ export const pushChanges = async (request, reporter) => {
84
+ reporter?.start("Starting push...");
85
+ const { syncDirectory } = resolveSyncPaths();
86
+ reporter?.start("Checking sync directory...");
87
+ await ensureGitRepository(syncDirectory);
88
+ reporter?.start("Loading sync configuration...");
89
+ const { effectiveConfig: config } = await loadSyncConfig(syncDirectory, {
90
+ ...(request.profile === undefined ? {} : { profile: request.profile }),
91
+ });
92
+ const plan = await buildPushPlan(config, syncDirectory, reporter);
93
+ if (!request.dryRun) {
94
+ const artifactsDirectory = syncDirectory;
95
+ const staleArtifactKeys = [...plan.existingArtifactKeys].filter((key) => {
96
+ return !plan.desiredArtifactKeys.has(key);
97
+ });
98
+ if (staleArtifactKeys.length > 0) {
99
+ reporter?.start(`Removing ${staleArtifactKeys.length} stale repository artifact${staleArtifactKeys.length === 1 ? "" : "s"}...`);
100
+ }
101
+ let removedArtifactCount = 0;
102
+ await limitConcurrency(CONSTANTS.SYNC.DEFAULT_CONCURRENCY, staleArtifactKeys, async (staleKey) => {
103
+ const relativePath = staleKey.endsWith("/")
104
+ ? staleKey.slice(0, -1)
105
+ : staleKey;
106
+ removedArtifactCount += 1;
107
+ if ((reporter?.level ?? 0) >= 4) {
108
+ reporter?.verbose(`removing stale repository artifact ${relativePath}`);
109
+ }
110
+ else if (removedArtifactCount % 100 === 0) {
111
+ reporter?.start(`Removed ${removedArtifactCount} stale repository artifacts...`);
112
+ }
113
+ await removePathAtomically(join(artifactsDirectory, ...relativePath.split("/")));
114
+ });
115
+ reporter?.start(`Writing ${plan.artifacts.length} repository artifact${plan.artifacts.length === 1 ? "" : "s"}...`);
116
+ await writeArtifactsToDirectory(artifactsDirectory, plan.artifacts, config.age, reporter);
117
+ }
118
+ return buildPushResultFromPlan(plan, syncDirectory, request.dryRun);
119
+ };
120
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/services/push.ts"],"names":[],"mappings":"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"}