@tinyrack/devsync 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) 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/platform.d.ts +11 -0
  55. package/dist/config/platform.d.ts.map +1 -0
  56. package/dist/config/platform.js +19 -0
  57. package/dist/config/platform.js.map +1 -0
  58. package/dist/config/sync.d.ts +107 -0
  59. package/dist/config/sync.d.ts.map +1 -0
  60. package/dist/config/sync.js +424 -0
  61. package/dist/config/sync.js.map +1 -0
  62. package/dist/config/xdg.d.ts +14 -0
  63. package/dist/config/xdg.d.ts.map +1 -0
  64. package/dist/config/xdg.js +102 -0
  65. package/dist/config/xdg.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/{src/index.ts → dist/index.js} +1 -1
  69. package/dist/index.js.map +1 -0
  70. package/dist/lib/file-mode.d.ts +3 -0
  71. package/dist/lib/file-mode.d.ts.map +1 -0
  72. package/dist/lib/file-mode.js +7 -0
  73. package/dist/lib/file-mode.js.map +1 -0
  74. package/dist/lib/output.d.ts +31 -0
  75. package/dist/lib/output.d.ts.map +1 -0
  76. package/dist/lib/output.js +198 -0
  77. package/dist/lib/output.js.map +1 -0
  78. package/dist/lib/path.d.ts +5 -0
  79. package/dist/lib/path.d.ts.map +1 -0
  80. package/dist/lib/path.js +25 -0
  81. package/dist/lib/path.js.map +1 -0
  82. package/dist/lib/string.d.ts +2 -0
  83. package/dist/lib/string.d.ts.map +1 -0
  84. package/dist/lib/string.js +4 -0
  85. package/dist/lib/string.js.map +1 -0
  86. package/dist/lib/validation.d.ts +3 -0
  87. package/dist/lib/validation.d.ts.map +1 -0
  88. package/dist/lib/validation.js +9 -0
  89. package/dist/lib/validation.js.map +1 -0
  90. package/dist/services/add.d.ts +20 -0
  91. package/dist/services/add.d.ts.map +1 -0
  92. package/dist/services/add.js +161 -0
  93. package/dist/services/add.js.map +1 -0
  94. package/dist/services/config-file.d.ts +45 -0
  95. package/dist/services/config-file.d.ts.map +1 -0
  96. package/dist/services/config-file.js +35 -0
  97. package/dist/services/config-file.js.map +1 -0
  98. package/dist/services/crypto.d.ts +9 -0
  99. package/dist/services/crypto.d.ts.map +1 -0
  100. package/dist/services/crypto.js +75 -0
  101. package/dist/services/crypto.js.map +1 -0
  102. package/dist/services/doctor.d.ts +16 -0
  103. package/dist/services/doctor.d.ts.map +1 -0
  104. package/dist/services/doctor.js +84 -0
  105. package/dist/services/doctor.js.map +1 -0
  106. package/dist/services/error.d.ts +14 -0
  107. package/dist/services/error.d.ts.map +1 -0
  108. package/dist/services/error.js +38 -0
  109. package/dist/services/error.js.map +1 -0
  110. package/dist/services/filesystem.d.ts +15 -0
  111. package/dist/services/filesystem.d.ts.map +1 -0
  112. package/dist/services/filesystem.js +113 -0
  113. package/dist/services/filesystem.js.map +1 -0
  114. package/dist/services/forget.d.ts +14 -0
  115. package/dist/services/forget.d.ts.map +1 -0
  116. package/dist/services/forget.js +124 -0
  117. package/dist/services/forget.js.map +1 -0
  118. package/dist/services/git.d.ts +10 -0
  119. package/dist/services/git.d.ts.map +1 -0
  120. package/dist/services/git.js +57 -0
  121. package/dist/services/git.js.map +1 -0
  122. package/dist/services/init.d.ts +19 -0
  123. package/dist/services/init.d.ts.map +1 -0
  124. package/dist/services/init.js +203 -0
  125. package/dist/services/init.js.map +1 -0
  126. package/dist/services/local-materialization.d.ts +28 -0
  127. package/dist/services/local-materialization.d.ts.map +1 -0
  128. package/dist/services/local-materialization.js +262 -0
  129. package/dist/services/local-materialization.js.map +1 -0
  130. package/dist/services/local-snapshot.d.ts +25 -0
  131. package/dist/services/local-snapshot.d.ts.map +1 -0
  132. package/dist/services/local-snapshot.js +93 -0
  133. package/dist/services/local-snapshot.js.map +1 -0
  134. package/dist/services/machine.d.ts +40 -0
  135. package/dist/services/machine.d.ts.map +1 -0
  136. package/dist/services/machine.js +113 -0
  137. package/dist/services/machine.js.map +1 -0
  138. package/dist/services/paths.d.ts +13 -0
  139. package/dist/services/paths.d.ts.map +1 -0
  140. package/dist/services/paths.js +71 -0
  141. package/dist/services/paths.js.map +1 -0
  142. package/dist/services/pull.d.ts +28 -0
  143. package/dist/services/pull.d.ts.map +1 -0
  144. package/dist/services/pull.js +67 -0
  145. package/dist/services/pull.js.map +1 -0
  146. package/dist/services/push.d.ts +35 -0
  147. package/dist/services/push.d.ts.map +1 -0
  148. package/dist/services/push.js +96 -0
  149. package/dist/services/push.js.map +1 -0
  150. package/dist/services/repo-artifacts.d.ts +52 -0
  151. package/dist/services/repo-artifacts.d.ts.map +1 -0
  152. package/dist/services/repo-artifacts.js +251 -0
  153. package/dist/services/repo-artifacts.js.map +1 -0
  154. package/dist/services/repo-snapshot.d.ts +6 -0
  155. package/dist/services/repo-snapshot.d.ts.map +1 -0
  156. package/dist/services/repo-snapshot.js +163 -0
  157. package/dist/services/repo-snapshot.js.map +1 -0
  158. package/dist/services/runtime.d.ts +40 -0
  159. package/dist/services/runtime.d.ts.map +1 -0
  160. package/dist/services/runtime.js +71 -0
  161. package/dist/services/runtime.js.map +1 -0
  162. package/dist/services/set.d.ts +38 -0
  163. package/dist/services/set.d.ts.map +1 -0
  164. package/dist/services/set.js +184 -0
  165. package/dist/services/set.js.map +1 -0
  166. package/dist/services/status.d.ts +30 -0
  167. package/dist/services/status.d.ts.map +1 -0
  168. package/dist/services/status.js +35 -0
  169. package/dist/services/status.js.map +1 -0
  170. package/package.json +15 -7
  171. package/src/cli/commands/add.ts +0 -40
  172. package/src/cli/commands/cd.ts +0 -80
  173. package/src/cli/commands/doctor.ts +0 -20
  174. package/src/cli/commands/forget.ts +0 -32
  175. package/src/cli/commands/index.ts +0 -23
  176. package/src/cli/commands/init.ts +0 -43
  177. package/src/cli/commands/list.ts +0 -17
  178. package/src/cli/commands/pull.ts +0 -31
  179. package/src/cli/commands/push.ts +0 -31
  180. package/src/cli/commands/set.ts +0 -47
  181. package/src/cli/commands/status.ts +0 -18
  182. package/src/cli/sync-output.test.ts +0 -173
  183. package/src/cli/sync-output.ts +0 -200
  184. package/src/config/sync.test.ts +0 -609
  185. package/src/config/sync.ts +0 -572
  186. package/src/config/xdg.ts +0 -138
  187. package/src/lib/string.test.ts +0 -13
  188. package/src/lib/string.ts +0 -3
  189. package/src/lib/validation.test.ts +0 -32
  190. package/src/lib/validation.ts +0 -11
  191. package/src/services/add.ts +0 -178
  192. package/src/services/config-file.test.ts +0 -161
  193. package/src/services/config-file.ts +0 -101
  194. package/src/services/crypto.test.ts +0 -132
  195. package/src/services/crypto.ts +0 -83
  196. package/src/services/doctor.ts +0 -142
  197. package/src/services/error.ts +0 -6
  198. package/src/services/filesystem.test.ts +0 -171
  199. package/src/services/filesystem.ts +0 -183
  200. package/src/services/forget.ts +0 -261
  201. package/src/services/git.test.ts +0 -83
  202. package/src/services/git.ts +0 -74
  203. package/src/services/init.test.ts +0 -109
  204. package/src/services/init.ts +0 -244
  205. package/src/services/list.ts +0 -63
  206. package/src/services/local-materialization.ts +0 -421
  207. package/src/services/local-snapshot.ts +0 -173
  208. package/src/services/paths.test.ts +0 -74
  209. package/src/services/paths.ts +0 -98
  210. package/src/services/pull.ts +0 -144
  211. package/src/services/push.ts +0 -168
  212. package/src/services/repo-artifacts.ts +0 -262
  213. package/src/services/repo-snapshot.ts +0 -197
  214. package/src/services/runtime.ts +0 -57
  215. package/src/services/set.ts +0 -383
  216. package/src/services/status.ts +0 -57
  217. package/src/services/sync.dry-run.test.ts +0 -179
  218. package/src/services/sync.runtime.test.ts +0 -756
  219. package/src/services/sync.service.test.ts +0 -1169
  220. package/src/test/helpers/sync-fixture.ts +0 -47
@@ -0,0 +1,262 @@
1
+ import { lstat, mkdir, mkdtemp, rm, symlink } from "node:fs/promises";
2
+ import { basename, dirname, join, posix } from "node:path";
3
+ import { resolveManagedSyncMode, } from "#app/config/sync.js";
4
+ import { buildDirectoryKey } from "#app/lib/path.js";
5
+ import { DevsyncError } from "./error.js";
6
+ import { copyFilesystemNode, getPathStats, listDirectoryEntries, removePathAtomically, replacePathAtomically, writeFileNode, writeSymlinkNode, } from "./filesystem.js";
7
+ const copyIgnoredLocalNodesToDirectory = async (sourceDirectory, targetDirectory, config, repoPathPrefix) => {
8
+ const stats = await getPathStats(sourceDirectory);
9
+ if (stats === undefined || !stats.isDirectory()) {
10
+ return 0;
11
+ }
12
+ let copiedNodeCount = 0;
13
+ const entries = await listDirectoryEntries(sourceDirectory);
14
+ const directoryMode = resolveManagedSyncMode(config, repoPathPrefix, config.activeMachine);
15
+ if (directoryMode === "ignore") {
16
+ await mkdir(targetDirectory, { recursive: true });
17
+ copiedNodeCount += 1;
18
+ }
19
+ for (const entry of entries) {
20
+ const sourcePath = join(sourceDirectory, entry.name);
21
+ const targetPath = join(targetDirectory, entry.name);
22
+ const repoPath = posix.join(repoPathPrefix, entry.name);
23
+ const entryStats = await lstat(sourcePath);
24
+ if (entryStats.isDirectory()) {
25
+ copiedNodeCount += await copyIgnoredLocalNodesToDirectory(sourcePath, targetPath, config, repoPath);
26
+ continue;
27
+ }
28
+ if (resolveManagedSyncMode(config, repoPath, config.activeMachine) !==
29
+ "ignore") {
30
+ continue;
31
+ }
32
+ await mkdir(dirname(targetPath), { recursive: true });
33
+ await copyFilesystemNode(sourcePath, targetPath, entryStats);
34
+ copiedNodeCount += 1;
35
+ }
36
+ return copiedNodeCount;
37
+ };
38
+ const stageAndReplaceFilePath = async (targetPath, node) => {
39
+ await mkdir(dirname(targetPath), { recursive: true });
40
+ const stagingDirectory = await mkdtemp(join(dirname(targetPath), `.${basename(targetPath)}.devsync-sync-`));
41
+ const stagedPath = join(stagingDirectory, basename(targetPath));
42
+ try {
43
+ if (node.type === "symlink") {
44
+ await symlink(node.linkTarget, stagedPath);
45
+ }
46
+ else {
47
+ await writeFileNode(stagedPath, node);
48
+ }
49
+ await replacePathAtomically(targetPath, stagedPath);
50
+ }
51
+ finally {
52
+ await rm(stagingDirectory, { force: true, recursive: true });
53
+ }
54
+ };
55
+ const stageAndReplaceMergedDirectoryPath = async (entry, config, desiredNodes) => {
56
+ await mkdir(dirname(entry.localPath), { recursive: true });
57
+ const stagingDirectory = await mkdtemp(join(dirname(entry.localPath), `.${basename(entry.localPath)}.devsync-sync-`));
58
+ try {
59
+ const preservedIgnoredNodeCount = await copyIgnoredLocalNodesToDirectory(entry.localPath, stagingDirectory, config, entry.repoPath);
60
+ for (const relativePath of [...desiredNodes.keys()].sort((left, right) => {
61
+ return left.localeCompare(right);
62
+ })) {
63
+ const node = desiredNodes.get(relativePath);
64
+ if (node === undefined) {
65
+ continue;
66
+ }
67
+ const targetNodePath = join(stagingDirectory, ...relativePath.split("/"));
68
+ if (node.type === "symlink") {
69
+ await writeSymlinkNode(targetNodePath, node.linkTarget);
70
+ }
71
+ else {
72
+ await writeFileNode(targetNodePath, node);
73
+ }
74
+ }
75
+ if (preservedIgnoredNodeCount === 0 && desiredNodes.size === 0) {
76
+ await removePathAtomically(entry.localPath);
77
+ return;
78
+ }
79
+ await replacePathAtomically(entry.localPath, stagingDirectory);
80
+ }
81
+ finally {
82
+ await rm(stagingDirectory, { force: true, recursive: true });
83
+ }
84
+ };
85
+ export const buildEntryMaterialization = (entry, snapshot) => {
86
+ if (entry.kind === "file") {
87
+ const node = snapshot.get(entry.repoPath);
88
+ if (node === undefined) {
89
+ return {
90
+ desiredKeys: new Set(),
91
+ type: "absent",
92
+ };
93
+ }
94
+ if (node.type === "directory") {
95
+ throw new DevsyncError("File sync entry resolves to a directory in the repository.", {
96
+ code: "FILE_ENTRY_RESOLVES_DIRECTORY",
97
+ details: [`Repository path: ${entry.repoPath}`],
98
+ hint: "Run 'devsync push' or fix the repository so this path is stored as a file.",
99
+ });
100
+ }
101
+ return {
102
+ desiredKeys: new Set([entry.repoPath]),
103
+ node,
104
+ type: "file",
105
+ };
106
+ }
107
+ const rootNode = snapshot.get(entry.repoPath);
108
+ if (rootNode !== undefined && rootNode.type !== "directory") {
109
+ throw new DevsyncError("Directory sync entry resolves to a file in the repository.", {
110
+ code: "DIRECTORY_ENTRY_RESOLVES_FILE",
111
+ details: [`Repository path: ${entry.repoPath}`],
112
+ hint: "Run 'devsync push' or fix the repository so this path is stored as a directory.",
113
+ });
114
+ }
115
+ const nodes = new Map();
116
+ const desiredKeys = new Set();
117
+ for (const [repoPath, node] of snapshot.entries()) {
118
+ if (!repoPath.startsWith(`${entry.repoPath}/`)) {
119
+ continue;
120
+ }
121
+ if (node.type === "directory") {
122
+ continue;
123
+ }
124
+ const relativePath = repoPath.slice(entry.repoPath.length + 1);
125
+ nodes.set(relativePath, node);
126
+ desiredKeys.add(repoPath);
127
+ }
128
+ if (rootNode === undefined && nodes.size === 0) {
129
+ return {
130
+ desiredKeys,
131
+ type: "absent",
132
+ };
133
+ }
134
+ desiredKeys.add(buildDirectoryKey(entry.repoPath));
135
+ return {
136
+ desiredKeys,
137
+ nodes,
138
+ type: "directory",
139
+ };
140
+ };
141
+ const collectLocalLeafKeys = async (targetPath, repoPathPrefix, keys, prefix) => {
142
+ const stats = await getPathStats(targetPath);
143
+ if (stats === undefined) {
144
+ return;
145
+ }
146
+ if (!stats.isDirectory()) {
147
+ keys.add(repoPathPrefix);
148
+ return;
149
+ }
150
+ keys.add(buildDirectoryKey(repoPathPrefix));
151
+ const entries = await listDirectoryEntries(targetPath);
152
+ for (const entry of entries) {
153
+ const absolutePath = join(targetPath, entry.name);
154
+ const relativePath = prefix === undefined ? entry.name : `${prefix}/${entry.name}`;
155
+ const childStats = await lstat(absolutePath);
156
+ if (childStats?.isDirectory()) {
157
+ await collectLocalLeafKeys(absolutePath, repoPathPrefix, keys, relativePath);
158
+ continue;
159
+ }
160
+ keys.add(posix.join(repoPathPrefix, relativePath));
161
+ }
162
+ };
163
+ const collectIgnoredLocalKeys = async (targetPath, repoPath, config, keys) => {
164
+ const stats = await getPathStats(targetPath);
165
+ if (stats === undefined) {
166
+ return false;
167
+ }
168
+ const mode = resolveManagedSyncMode(config, repoPath, config.activeMachine);
169
+ if (!stats.isDirectory()) {
170
+ if (mode !== "ignore") {
171
+ return false;
172
+ }
173
+ keys.add(repoPath);
174
+ return true;
175
+ }
176
+ let preservedIgnoredChildren = mode === "ignore";
177
+ const entries = await listDirectoryEntries(targetPath);
178
+ for (const entry of entries) {
179
+ const childPath = join(targetPath, entry.name);
180
+ const childRepoPath = posix.join(repoPath, entry.name);
181
+ preservedIgnoredChildren =
182
+ (await collectIgnoredLocalKeys(childPath, childRepoPath, config, keys)) ||
183
+ preservedIgnoredChildren;
184
+ }
185
+ if (mode === "ignore" || preservedIgnoredChildren) {
186
+ keys.add(buildDirectoryKey(repoPath));
187
+ }
188
+ return mode === "ignore" || preservedIgnoredChildren;
189
+ };
190
+ export const countDeletedLocalNodes = async (entry, desiredKeys, config, existingKeys = new Set()) => {
191
+ const preservedIgnoredKeys = new Set();
192
+ await collectLocalLeafKeys(entry.localPath, entry.repoPath, existingKeys);
193
+ await collectIgnoredLocalKeys(entry.localPath, entry.repoPath, config, preservedIgnoredKeys);
194
+ return [...existingKeys].filter((key) => {
195
+ return !desiredKeys.has(key) && !preservedIgnoredKeys.has(key);
196
+ }).length;
197
+ };
198
+ export const applyEntryMaterialization = async (entry, materialization, config) => {
199
+ if (entry.kind === "file" &&
200
+ resolveManagedSyncMode(config, entry.repoPath, config.activeMachine) ===
201
+ "ignore") {
202
+ return;
203
+ }
204
+ if (materialization.type === "absent") {
205
+ if (entry.kind === "directory") {
206
+ await stageAndReplaceMergedDirectoryPath(entry, config, new Map());
207
+ return;
208
+ }
209
+ await removePathAtomically(entry.localPath);
210
+ return;
211
+ }
212
+ if (materialization.type === "file") {
213
+ await stageAndReplaceFilePath(entry.localPath, materialization.node);
214
+ return;
215
+ }
216
+ await stageAndReplaceMergedDirectoryPath(entry, config, materialization.nodes);
217
+ };
218
+ export const buildPullCounts = (materializations) => {
219
+ let decryptedFileCount = 0;
220
+ let directoryCount = 0;
221
+ let plainFileCount = 0;
222
+ let symlinkCount = 0;
223
+ for (const materialization of materializations) {
224
+ if (materialization === undefined) {
225
+ continue;
226
+ }
227
+ if (materialization.type === "file") {
228
+ if (materialization.node.type === "symlink") {
229
+ symlinkCount += 1;
230
+ }
231
+ else if (materialization.node.secret) {
232
+ decryptedFileCount += 1;
233
+ }
234
+ else {
235
+ plainFileCount += 1;
236
+ }
237
+ continue;
238
+ }
239
+ if (materialization.type !== "directory") {
240
+ continue;
241
+ }
242
+ directoryCount += 1;
243
+ for (const node of materialization.nodes.values()) {
244
+ if (node.type === "symlink") {
245
+ symlinkCount += 1;
246
+ }
247
+ else if (node.secret) {
248
+ decryptedFileCount += 1;
249
+ }
250
+ else {
251
+ plainFileCount += 1;
252
+ }
253
+ }
254
+ }
255
+ return {
256
+ decryptedFileCount,
257
+ directoryCount,
258
+ plainFileCount,
259
+ symlinkCount,
260
+ };
261
+ };
262
+ //# sourceMappingURL=local-materialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-materialization.js","sourceRoot":"","sources":["../../src/services/local-materialization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type ResolvedSyncConfig } from "#app/config/sync.js";
2
+ type SnapshotConfig = ResolvedSyncConfig & Readonly<{
3
+ activeMachine?: string;
4
+ }>;
5
+ export type SnapshotNode = Readonly<{
6
+ type: "directory";
7
+ }> | Readonly<{
8
+ executable: boolean;
9
+ secret: boolean;
10
+ type: "file";
11
+ contents: Uint8Array;
12
+ }> | Readonly<{
13
+ linkTarget: string;
14
+ type: "symlink";
15
+ }>;
16
+ export type FileSnapshotNode = Extract<SnapshotNode, Readonly<{
17
+ type: "file";
18
+ }>>;
19
+ export type FileLikeSnapshotNode = Extract<SnapshotNode, Readonly<{
20
+ type: "file" | "symlink";
21
+ }>>;
22
+ export declare const addSnapshotNode: (snapshot: Map<string, SnapshotNode>, repoPath: string, node: SnapshotNode) => void;
23
+ export declare const buildLocalSnapshot: (config: SnapshotConfig) => Promise<Map<string, SnapshotNode>>;
24
+ export {};
25
+ //# sourceMappingURL=local-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-snapshot.d.ts","sourceRoot":"","sources":["../../src/services/local-snapshot.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAC;AAM7B,KAAK,cAAc,GAAG,kBAAkB,GACtC,QAAQ,CAAC;IACP,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAEL,MAAM,MAAM,YAAY,GACpB,QAAQ,CAAC;IACP,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC,GACF,QAAQ,CAAC;IACP,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC,GACF,QAAQ,CAAC;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC,CAAC;AAEP,MAAM,MAAM,gBAAgB,GAAG,OAAO,CACpC,YAAY,EACZ,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,CACxC,YAAY,EACZ,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CACvC,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,UAAU,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACnC,UAAU,MAAM,EAChB,MAAM,YAAY,SAOnB,CAAC;AAoFF,eAAO,MAAM,kBAAkB,GAAU,QAAQ,cAAc,uCAmE9D,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { lstat, readFile, readlink } from "node:fs/promises";
2
+ import { join, posix } from "node:path";
3
+ import { resolveManagedSyncMode, } from "#app/config/sync.js";
4
+ import { isExecutableMode } from "#app/lib/file-mode.js";
5
+ import { DevsyncError } from "./error.js";
6
+ import { getPathStats, listDirectoryEntries } from "./filesystem.js";
7
+ import { assertStorageSafeRepoPath } from "./repo-artifacts.js";
8
+ export const addSnapshotNode = (snapshot, repoPath, node) => {
9
+ if (snapshot.has(repoPath)) {
10
+ throw new DevsyncError(`Duplicate sync path generated for ${repoPath}`);
11
+ }
12
+ snapshot.set(repoPath, node);
13
+ };
14
+ const addLocalNode = async (snapshot, config, repoPath, path, stats) => {
15
+ assertStorageSafeRepoPath(repoPath);
16
+ const mode = resolveManagedSyncMode(config, repoPath, config.activeMachine);
17
+ if (mode === "ignore") {
18
+ return;
19
+ }
20
+ if (stats.isDirectory()) {
21
+ throw new DevsyncError(`Expected a file-like path but found a directory: ${path}`);
22
+ }
23
+ if (stats.isSymbolicLink()) {
24
+ if (mode === "secret") {
25
+ throw new DevsyncError(`Secret sync paths must be regular files, not symlinks: ${repoPath}`);
26
+ }
27
+ addSnapshotNode(snapshot, repoPath, {
28
+ linkTarget: await readlink(path),
29
+ type: "symlink",
30
+ });
31
+ return;
32
+ }
33
+ if (!stats.isFile()) {
34
+ throw new DevsyncError(`Unsupported filesystem entry: ${path}`);
35
+ }
36
+ addSnapshotNode(snapshot, repoPath, {
37
+ contents: await readFile(path),
38
+ executable: isExecutableMode(stats.mode),
39
+ secret: mode === "secret",
40
+ type: "file",
41
+ });
42
+ };
43
+ const walkLocalDirectory = async (snapshot, config, localDirectory, repoPathPrefix, childEntryPaths) => {
44
+ const entries = await listDirectoryEntries(localDirectory);
45
+ for (const entry of entries) {
46
+ const localPath = join(localDirectory, entry.name);
47
+ const repoPath = posix.join(repoPathPrefix, entry.name);
48
+ if (childEntryPaths.has(repoPath)) {
49
+ continue;
50
+ }
51
+ const stats = await lstat(localPath);
52
+ if (stats.isDirectory()) {
53
+ assertStorageSafeRepoPath(repoPath);
54
+ await walkLocalDirectory(snapshot, config, localPath, repoPath, childEntryPaths);
55
+ continue;
56
+ }
57
+ await addLocalNode(snapshot, config, repoPath, localPath, stats);
58
+ }
59
+ };
60
+ export const buildLocalSnapshot = async (config) => {
61
+ const snapshot = new Map();
62
+ const allEntryPaths = new Set(config.entries.map((e) => e.repoPath));
63
+ for (const entry of config.entries) {
64
+ const stats = await getPathStats(entry.localPath);
65
+ if (stats === undefined) {
66
+ continue;
67
+ }
68
+ const entryMode = resolveManagedSyncMode(config, entry.repoPath, config.activeMachine);
69
+ if (entry.kind === "file") {
70
+ if (entryMode === "ignore") {
71
+ continue;
72
+ }
73
+ if (stats.isDirectory()) {
74
+ throw new DevsyncError(`Sync entry ${entry.name} expects a file, but found a directory: ${entry.localPath}`);
75
+ }
76
+ await addLocalNode(snapshot, config, entry.repoPath, entry.localPath, stats);
77
+ continue;
78
+ }
79
+ if (!stats.isDirectory()) {
80
+ throw new DevsyncError(`Sync entry ${entry.name} expects a directory: ${entry.localPath}`);
81
+ }
82
+ const childEntryPaths = new Set([...allEntryPaths].filter((p) => p !== entry.repoPath && p.startsWith(`${entry.repoPath}/`)));
83
+ const snapshotSizeBeforeWalk = snapshot.size;
84
+ await walkLocalDirectory(snapshot, config, entry.localPath, entry.repoPath, childEntryPaths);
85
+ if (entryMode !== "ignore" || snapshot.size > snapshotSizeBeforeWalk) {
86
+ addSnapshotNode(snapshot, entry.repoPath, {
87
+ type: "directory",
88
+ });
89
+ }
90
+ }
91
+ return snapshot;
92
+ };
93
+ //# sourceMappingURL=local-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-snapshot.js","sourceRoot":"","sources":["../../src/services/local-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type SyncContext } from "./runtime.js";
2
+ export type SyncMachineAssignment = Readonly<{
3
+ entryLocalPath: string;
4
+ entryRepoPath: string;
5
+ machines: readonly string[];
6
+ }>;
7
+ export type SyncMachineListResult = Readonly<{
8
+ activeMachine?: string;
9
+ activeMachinesMode: "none" | "single";
10
+ assignments: readonly SyncMachineAssignment[];
11
+ availableMachines: readonly string[];
12
+ globalConfigExists: boolean;
13
+ globalConfigPath: string;
14
+ syncDirectory: string;
15
+ }>;
16
+ export type SyncMachineUpdateResult = Readonly<{
17
+ activeMachine?: string;
18
+ globalConfigPath: string;
19
+ mode: "clear" | "use";
20
+ machine?: string;
21
+ syncDirectory: string;
22
+ warning?: string;
23
+ }>;
24
+ type SyncMachineAssignRequest = Readonly<{
25
+ machines: readonly string[];
26
+ target: string;
27
+ }>;
28
+ type SyncMachineAssignResult = Readonly<{
29
+ action: "assigned" | "unchanged";
30
+ configPath: string;
31
+ entryRepoPath: string;
32
+ machines: readonly string[];
33
+ syncDirectory: string;
34
+ }>;
35
+ export declare const listSyncMachines: (context: SyncContext) => Promise<SyncMachineListResult>;
36
+ export declare const useSyncMachine: (machine: string, context: SyncContext) => Promise<SyncMachineUpdateResult>;
37
+ export declare const clearSyncMachines: (context: SyncContext) => Promise<SyncMachineUpdateResult>;
38
+ export declare const assignSyncMachines: (request: SyncMachineAssignRequest, context: SyncContext) => Promise<SyncMachineAssignResult>;
39
+ export {};
40
+ //# sourceMappingURL=machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/services/machine.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEtE,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,GAAG,QAAQ,CAAC;IACtC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC9C,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,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,KAAK,wBAAwB,GAAG,QAAQ,CAAC;IACvC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,KAAK,uBAAuB,GAAG,QAAQ,CAAC;IACtC,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,gBAAgB,GAC3B,SAAS,WAAW,KACnB,OAAO,CAAC,qBAAqB,CA6B/B,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,SAAS,MAAM,EACf,SAAS,WAAW,KACnB,OAAO,CAAC,uBAAuB,CA8BjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,WAAW,KACnB,OAAO,CAAC,uBAAuB,CAajC,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,SAAS,wBAAwB,EACjC,SAAS,WAAW,KACnB,OAAO,CAAC,uBAAuB,CAsEjC,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { formatGlobalDevsyncConfig, readGlobalDevsyncConfig, } from "#app/config/global-config.js";
2
+ import { collectAllMachineNames, normalizeSyncMachineName, readSyncConfig, } from "#app/config/sync.js";
3
+ import { createSyncConfigDocument, writeValidatedSyncConfig, } from "./config-file.js";
4
+ import { DevsyncError } from "./error.js";
5
+ import { writeTextFileAtomically } from "./filesystem.js";
6
+ import { resolveTrackedEntry } from "./paths.js";
7
+ import { ensureSyncRepository } from "./runtime.js";
8
+ export const listSyncMachines = async (context) => {
9
+ await ensureSyncRepository(context);
10
+ const [globalConfig, syncConfig] = await Promise.all([
11
+ readGlobalDevsyncConfig(context.environment),
12
+ readSyncConfig(context.paths.syncDirectory, context.environment),
13
+ ]);
14
+ return {
15
+ ...(globalConfig?.activeMachine === undefined
16
+ ? {}
17
+ : { activeMachine: globalConfig.activeMachine }),
18
+ activeMachinesMode: globalConfig?.activeMachine === undefined ? "none" : "single",
19
+ assignments: syncConfig.entries
20
+ .filter((entry) => entry.machinesExplicit && entry.machines.length > 0)
21
+ .map((entry) => ({
22
+ entryLocalPath: entry.localPath,
23
+ entryRepoPath: entry.repoPath,
24
+ machines: entry.machines,
25
+ }))
26
+ .sort((left, right) => left.entryRepoPath.localeCompare(right.entryRepoPath)),
27
+ availableMachines: collectAllMachineNames(syncConfig.entries),
28
+ globalConfigExists: globalConfig !== undefined,
29
+ globalConfigPath: context.paths.globalConfigPath,
30
+ syncDirectory: context.paths.syncDirectory,
31
+ };
32
+ };
33
+ export const useSyncMachine = async (machine, context) => {
34
+ const normalizedMachine = normalizeSyncMachineName(machine);
35
+ await ensureSyncRepository(context);
36
+ const syncConfig = await readSyncConfig(context.paths.syncDirectory, context.environment);
37
+ const knownMachines = collectAllMachineNames(syncConfig.entries);
38
+ const warning = knownMachines.includes(normalizedMachine)
39
+ ? undefined
40
+ : `Machine '${normalizedMachine}' is not referenced by any tracked entry.`;
41
+ await writeTextFileAtomically(context.paths.globalConfigPath, formatGlobalDevsyncConfig({
42
+ activeMachine: normalizedMachine,
43
+ version: 3,
44
+ }));
45
+ return {
46
+ activeMachine: normalizedMachine,
47
+ globalConfigPath: context.paths.globalConfigPath,
48
+ mode: "use",
49
+ machine: normalizedMachine,
50
+ syncDirectory: context.paths.syncDirectory,
51
+ ...(warning !== undefined ? { warning } : {}),
52
+ };
53
+ };
54
+ export const clearSyncMachines = async (context) => {
55
+ await ensureSyncRepository(context);
56
+ await writeTextFileAtomically(context.paths.globalConfigPath, formatGlobalDevsyncConfig({ version: 3 }));
57
+ return {
58
+ globalConfigPath: context.paths.globalConfigPath,
59
+ mode: "clear",
60
+ syncDirectory: context.paths.syncDirectory,
61
+ };
62
+ };
63
+ export const assignSyncMachines = async (request, context) => {
64
+ const target = request.target.trim();
65
+ if (target.length === 0) {
66
+ throw new DevsyncError("Target path is required.", {
67
+ code: "TARGET_REQUIRED",
68
+ hint: "Pass a tracked entry path, for example 'devsync track ~/.gitconfig --machine default --machine work'.",
69
+ });
70
+ }
71
+ await ensureSyncRepository(context);
72
+ const config = await readSyncConfig(context.paths.syncDirectory, context.environment);
73
+ const entry = resolveTrackedEntry(target, config.entries, context);
74
+ if (entry === undefined) {
75
+ throw new DevsyncError(`No tracked sync entry matches: ${target}`, {
76
+ code: "TARGET_NOT_TRACKED",
77
+ hint: "Track the root first with 'devsync track'.",
78
+ });
79
+ }
80
+ const normalizedMachines = request.machines.map((m) => normalizeSyncMachineName(m));
81
+ if (entry.machines.length === normalizedMachines.length &&
82
+ normalizedMachines.every((m) => entry.machines.includes(m))) {
83
+ return {
84
+ action: "unchanged",
85
+ configPath: context.paths.configPath,
86
+ entryRepoPath: entry.repoPath,
87
+ machines: normalizedMachines,
88
+ syncDirectory: context.paths.syncDirectory,
89
+ };
90
+ }
91
+ const nextConfig = createSyncConfigDocument({
92
+ ...config,
93
+ entries: config.entries.map((e) => {
94
+ if (e.repoPath !== entry.repoPath) {
95
+ return e;
96
+ }
97
+ return {
98
+ ...e,
99
+ machines: normalizedMachines,
100
+ machinesExplicit: normalizedMachines.length > 0,
101
+ };
102
+ }),
103
+ });
104
+ await writeValidatedSyncConfig(context.paths.syncDirectory, nextConfig, context.environment);
105
+ return {
106
+ action: "assigned",
107
+ configPath: context.paths.configPath,
108
+ entryRepoPath: entry.repoPath,
109
+ machines: normalizedMachines,
110
+ syncDirectory: context.paths.syncDirectory,
111
+ };
112
+ };
113
+ //# sourceMappingURL=machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/services/machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ConfiguredLocalPath } from "#app/config/platform.js";
2
+ import { type ResolvedSyncConfigEntry } from "#app/config/sync.js";
3
+ export { buildDirectoryKey, doPathsOverlap, isExplicitLocalPath, isPathEqualOrNested, } from "#app/lib/path.js";
4
+ export declare const resolveCommandTargetPath: (target: string, environment: NodeJS.ProcessEnv, cwd: string) => string;
5
+ export declare const buildRepoPathWithinRoot: (absolutePath: string, rootPath: string, description: string) => string;
6
+ export declare const buildConfiguredHomeLocalPath: (repoPath: string) => ConfiguredLocalPath;
7
+ export declare const tryBuildRepoPathWithinRoot: (absolutePath: string, rootPath: string, description: string) => string | undefined;
8
+ export declare const tryNormalizeRepoPathInput: (value: string) => string | undefined;
9
+ export declare const resolveTrackedEntry: (target: string, entries: readonly ResolvedSyncConfigEntry[], context: Readonly<{
10
+ cwd: string;
11
+ environment: NodeJS.ProcessEnv;
12
+ }>) => ResolvedSyncConfigEntry | undefined;
13
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/services/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAI1B,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,EACd,aAAa,MAAM,CAAC,UAAU,EAC9B,KAAK,MAAM,WAGZ,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,cAAc,MAAM,EACpB,UAAU,MAAM,EAChB,aAAa,MAAM,WA+BpB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,MAAM,KACf,mBAEF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,cAAc,MAAM,EACpB,UAAU,MAAM,EAChB,aAAa,MAAM,uBAOpB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,MAAM,uBAMtD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,MAAM,EACd,SAAS,SAAS,uBAAuB,EAAE,EAC3C,SAAS,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,CAAC,KACjE,uBAAuB,GAAG,SA8B5B,CAAC"}