@tinyrack/devsync 1.0.3 → 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 (210) hide show
  1. package/README.md +248 -56
  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/forget.ts +0 -32
  170. package/src/cli/commands/index.ts +0 -17
  171. package/src/cli/commands/init.ts +0 -43
  172. package/src/cli/commands/pull.ts +0 -31
  173. package/src/cli/commands/push.ts +0 -31
  174. package/src/cli/commands/set.ts +0 -47
  175. package/src/cli/sync-output.test.ts +0 -105
  176. package/src/cli/sync-output.ts +0 -129
  177. package/src/config/sync.test.ts +0 -609
  178. package/src/config/sync.ts +0 -572
  179. package/src/config/xdg.ts +0 -138
  180. package/src/lib/string.test.ts +0 -13
  181. package/src/lib/string.ts +0 -3
  182. package/src/lib/validation.test.ts +0 -32
  183. package/src/lib/validation.ts +0 -11
  184. package/src/services/add.ts +0 -178
  185. package/src/services/config-file.test.ts +0 -161
  186. package/src/services/config-file.ts +0 -101
  187. package/src/services/crypto.test.ts +0 -132
  188. package/src/services/crypto.ts +0 -83
  189. package/src/services/error.ts +0 -6
  190. package/src/services/filesystem.test.ts +0 -171
  191. package/src/services/filesystem.ts +0 -183
  192. package/src/services/forget.ts +0 -261
  193. package/src/services/git.test.ts +0 -83
  194. package/src/services/git.ts +0 -74
  195. package/src/services/init.test.ts +0 -109
  196. package/src/services/init.ts +0 -244
  197. package/src/services/local-materialization.ts +0 -421
  198. package/src/services/local-snapshot.ts +0 -173
  199. package/src/services/paths.test.ts +0 -74
  200. package/src/services/paths.ts +0 -98
  201. package/src/services/pull.ts +0 -75
  202. package/src/services/push.ts +0 -121
  203. package/src/services/repo-artifacts.ts +0 -262
  204. package/src/services/repo-snapshot.ts +0 -197
  205. package/src/services/runtime.ts +0 -57
  206. package/src/services/set.ts +0 -383
  207. package/src/services/sync.dry-run.test.ts +0 -179
  208. package/src/services/sync.runtime.test.ts +0 -756
  209. package/src/services/sync.service.test.ts +0 -1025
  210. package/src/test/helpers/sync-fixture.ts +0 -47
@@ -1,74 +0,0 @@
1
- import { execFile } from "node:child_process";
2
- import { promisify } from "node:util";
3
-
4
- import { DevsyncError } from "./error.ts";
5
-
6
- const execFileAsync = promisify(execFile);
7
-
8
- const runGitCommand = async (
9
- args: readonly string[],
10
- options?: Readonly<{ cwd?: string }>,
11
- ) => {
12
- try {
13
- const result = await execFileAsync("git", [...args], {
14
- cwd: options?.cwd,
15
- encoding: "utf8",
16
- maxBuffer: 10_000_000,
17
- });
18
-
19
- return {
20
- stderr: result.stderr,
21
- stdout: result.stdout,
22
- };
23
- } catch (error: unknown) {
24
- if (error instanceof Error && "stderr" in error) {
25
- const stderr =
26
- typeof error.stderr === "string" ? error.stderr.trim() : undefined;
27
- const stdout =
28
- "stdout" in error && typeof error.stdout === "string"
29
- ? error.stdout.trim()
30
- : undefined;
31
- const message = stderr || stdout || error.message;
32
-
33
- throw new Error(message);
34
- }
35
-
36
- throw new Error(error instanceof Error ? error.message : "git failed.");
37
- }
38
- };
39
-
40
- export const ensureRepository = async (directory: string) => {
41
- await runGitCommand(["-C", directory, "rev-parse", "--is-inside-work-tree"]);
42
- };
43
-
44
- export const initializeRepository = async (
45
- directory: string,
46
- source?: string,
47
- ) => {
48
- if (source === undefined) {
49
- await runGitCommand(["init", "-b", "main", directory]);
50
-
51
- return {
52
- action: "initialized" as const,
53
- };
54
- }
55
-
56
- await runGitCommand(["clone", source, directory]);
57
-
58
- return {
59
- action: "cloned" as const,
60
- source,
61
- };
62
- };
63
-
64
- export const ensureGitRepository = async (syncDirectory: string) => {
65
- try {
66
- await ensureRepository(syncDirectory);
67
- } catch (error: unknown) {
68
- throw new DevsyncError(
69
- error instanceof Error
70
- ? `Sync directory is not a git repository: ${error.message}`
71
- : "Sync directory is not a git repository.",
72
- );
73
- }
74
- };
@@ -1,109 +0,0 @@
1
- import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
-
4
- import { afterEach, describe, expect, it } from "vitest";
5
-
6
- import { DevsyncError } from "#app/services/error.ts";
7
- import { initializeSync } from "#app/services/init.ts";
8
- import { createSyncContext } from "#app/services/runtime.ts";
9
- import {
10
- createAgeKeyPair,
11
- createTemporaryDirectory,
12
- runGit,
13
- writeIdentityFile,
14
- } from "../test/helpers/sync-fixture.ts";
15
-
16
- const temporaryDirectories: string[] = [];
17
-
18
- const createWorkspace = async () => {
19
- const directory = await createTemporaryDirectory("devsync-init-");
20
-
21
- temporaryDirectories.push(directory);
22
-
23
- return directory;
24
- };
25
-
26
- const createEnvironment = (
27
- homeDirectory: string,
28
- xdgConfigHome: string,
29
- ): NodeJS.ProcessEnv => {
30
- return {
31
- HOME: homeDirectory,
32
- XDG_CONFIG_HOME: xdgConfigHome,
33
- };
34
- };
35
-
36
- afterEach(async () => {
37
- while (temporaryDirectories.length > 0) {
38
- const directory = temporaryDirectories.pop();
39
-
40
- if (directory !== undefined) {
41
- await rm(directory, { force: true, recursive: true });
42
- }
43
- }
44
- });
45
-
46
- describe("init service", () => {
47
- it("clones a configured repository source during initialization", async () => {
48
- const workspace = await createWorkspace();
49
- const homeDirectory = join(workspace, "home");
50
- const xdgConfigHome = join(workspace, "xdg");
51
- const sourceRepository = join(workspace, "remote-sync");
52
- const ageKeys = await createAgeKeyPair();
53
-
54
- await writeIdentityFile(xdgConfigHome, ageKeys.identity);
55
- await runGit(["init", "-b", "main", sourceRepository], workspace);
56
-
57
- const result = await initializeSync(
58
- {
59
- identityFile: "$XDG_CONFIG_HOME/devsync/age/keys.txt",
60
- recipients: [ageKeys.recipient],
61
- repository: sourceRepository,
62
- },
63
- createSyncContext({
64
- environment: createEnvironment(homeDirectory, xdgConfigHome),
65
- }),
66
- );
67
-
68
- expect(result.gitAction).toBe("cloned");
69
- expect(result.gitSource).toBe(sourceRepository);
70
- expect(
71
- await readFile(join(result.syncDirectory, "config.json"), "utf8"),
72
- ).toContain("$XDG_CONFIG_HOME/devsync/age/keys.txt");
73
- });
74
-
75
- it("rejects non-empty sync directories that are not git repositories", async () => {
76
- const workspace = await createWorkspace();
77
- const homeDirectory = join(workspace, "home");
78
- const xdgConfigHome = join(workspace, "xdg");
79
- const syncDirectory = join(xdgConfigHome, "devsync", "sync");
80
- const ageKeys = await createAgeKeyPair();
81
-
82
- await writeIdentityFile(xdgConfigHome, ageKeys.identity);
83
- await mkdir(syncDirectory, { recursive: true });
84
- await writeFile(join(syncDirectory, "placeholder.txt"), "keep\n", "utf8");
85
-
86
- await expect(
87
- initializeSync(
88
- {
89
- identityFile: "$XDG_CONFIG_HOME/devsync/age/keys.txt",
90
- recipients: [ageKeys.recipient],
91
- },
92
- createSyncContext({
93
- environment: createEnvironment(homeDirectory, xdgConfigHome),
94
- }),
95
- ),
96
- ).rejects.toThrowError(DevsyncError);
97
- await expect(
98
- initializeSync(
99
- {
100
- identityFile: "$XDG_CONFIG_HOME/devsync/age/keys.txt",
101
- recipients: [ageKeys.recipient],
102
- },
103
- createSyncContext({
104
- environment: createEnvironment(homeDirectory, xdgConfigHome),
105
- }),
106
- ),
107
- ).rejects.toThrowError(/already exists and is not empty/u);
108
- });
109
- });
@@ -1,244 +0,0 @@
1
- import { mkdir, readdir, writeFile } from "node:fs/promises";
2
- import { dirname } from "node:path";
3
-
4
- import {
5
- createInitialSyncConfig,
6
- formatSyncConfig,
7
- parseSyncConfig,
8
- type ResolvedSyncConfig,
9
- readSyncConfig,
10
- resolveSyncArtifactsDirectoryPath,
11
- } from "#app/config/sync.ts";
12
- import { resolveConfiguredAbsolutePath } from "#app/config/xdg.ts";
13
-
14
- import { countConfiguredRules } from "./config-file.ts";
15
- import {
16
- createAgeIdentityFile,
17
- readAgeRecipientsFromIdentityFile,
18
- } from "./crypto.ts";
19
- import { DevsyncError } from "./error.ts";
20
- import { pathExists } from "./filesystem.ts";
21
- import { ensureRepository, initializeRepository } from "./git.ts";
22
- import { ensureSyncRepository, type SyncContext } from "./runtime.ts";
23
-
24
- export type SyncInitRequest = Readonly<{
25
- identityFile?: string;
26
- recipients: readonly string[];
27
- repository?: string;
28
- }>;
29
-
30
- export type SyncInitResult = Readonly<{
31
- alreadyInitialized: boolean;
32
- configPath: string;
33
- entryCount: number;
34
- gitAction: "cloned" | "existing" | "initialized";
35
- gitSource?: string;
36
- identityFile: string;
37
- generatedIdentity: boolean;
38
- recipientCount: number;
39
- ruleCount: number;
40
- syncDirectory: string;
41
- }>;
42
-
43
- const defaultSyncIdentityFile = "$XDG_CONFIG_HOME/devsync/age/keys.txt";
44
-
45
- const normalizeRecipients = (recipients: readonly string[]) => {
46
- return [
47
- ...new Set(recipients.map((recipient) => recipient.trim()).filter(Boolean)),
48
- ].sort((left, right) => {
49
- return left.localeCompare(right);
50
- });
51
- };
52
-
53
- const resolveInitAgeBootstrap = async (
54
- request: SyncInitRequest,
55
- context: Pick<SyncContext, "environment">,
56
- ) => {
57
- const configuredIdentityFile =
58
- request.identityFile?.trim() || defaultSyncIdentityFile;
59
- const identityFile = resolveConfiguredAbsolutePath(
60
- configuredIdentityFile,
61
- context.environment,
62
- );
63
- const explicitRecipients = normalizeRecipients(request.recipients);
64
-
65
- if (explicitRecipients.length === 0) {
66
- if (await pathExists(identityFile)) {
67
- return {
68
- configuredIdentityFile,
69
- generatedIdentity: false,
70
- recipients: normalizeRecipients(
71
- await readAgeRecipientsFromIdentityFile(identityFile),
72
- ),
73
- };
74
- }
75
-
76
- const { recipient } = await createAgeIdentityFile(identityFile);
77
-
78
- return {
79
- configuredIdentityFile,
80
- generatedIdentity: true,
81
- recipients: [recipient],
82
- };
83
- }
84
-
85
- if (await pathExists(identityFile)) {
86
- return {
87
- configuredIdentityFile,
88
- generatedIdentity: false,
89
- recipients: explicitRecipients,
90
- };
91
- }
92
-
93
- const { recipient } = await createAgeIdentityFile(identityFile);
94
-
95
- return {
96
- configuredIdentityFile,
97
- generatedIdentity: true,
98
- recipients: normalizeRecipients([...explicitRecipients, recipient]),
99
- };
100
- };
101
-
102
- const assertInitRequestMatchesConfig = (
103
- config: ResolvedSyncConfig,
104
- request: SyncInitRequest,
105
- environment: NodeJS.ProcessEnv,
106
- ) => {
107
- const recipients = normalizeRecipients(request.recipients);
108
-
109
- if (
110
- recipients.length > 0 &&
111
- JSON.stringify(recipients) !==
112
- JSON.stringify(normalizeRecipients(config.age.recipients))
113
- ) {
114
- throw new DevsyncError(
115
- "Sync configuration already exists with different recipients.",
116
- );
117
- }
118
-
119
- if (
120
- request.identityFile === undefined ||
121
- request.identityFile.trim() === ""
122
- ) {
123
- return;
124
- }
125
-
126
- const resolvedIdentity = resolveConfiguredAbsolutePath(
127
- request.identityFile,
128
- environment,
129
- );
130
-
131
- if (resolvedIdentity !== config.age.identityFile) {
132
- throw new DevsyncError(
133
- "Sync configuration already exists with a different identity file.",
134
- );
135
- }
136
- };
137
-
138
- export const initializeSync = async (
139
- request: SyncInitRequest,
140
- context: SyncContext,
141
- ): Promise<SyncInitResult> => {
142
- const syncDirectory = context.paths.syncDirectory;
143
- const configPath = context.paths.configPath;
144
- const configExists = await pathExists(configPath);
145
-
146
- if (configExists) {
147
- await ensureSyncRepository(context);
148
-
149
- const config = await readSyncConfig(syncDirectory, context.environment);
150
- assertInitRequestMatchesConfig(config, request, context.environment);
151
-
152
- return {
153
- alreadyInitialized: true,
154
- configPath,
155
- entryCount: config.entries.length,
156
- gitAction: "existing",
157
- generatedIdentity: false,
158
- identityFile: config.age.identityFile,
159
- recipientCount: config.age.recipients.length,
160
- ruleCount: countConfiguredRules(config),
161
- syncDirectory,
162
- };
163
- }
164
-
165
- await mkdir(dirname(syncDirectory), {
166
- recursive: true,
167
- });
168
-
169
- let gitAction: SyncInitResult["gitAction"] = "existing";
170
- let gitSource: string | undefined;
171
-
172
- try {
173
- await ensureRepository(syncDirectory);
174
- } catch {
175
- const syncDirectoryExists = await pathExists(syncDirectory);
176
-
177
- if (syncDirectoryExists) {
178
- const entries = await readdir(syncDirectory);
179
-
180
- if (entries.length > 0) {
181
- throw new DevsyncError(
182
- `Sync directory already exists and is not empty: ${syncDirectory}`,
183
- );
184
- }
185
- }
186
-
187
- const gitResult = await initializeRepository(
188
- syncDirectory,
189
- request.repository?.trim() || undefined,
190
- );
191
-
192
- gitAction = gitResult.action;
193
- gitSource = gitResult.source;
194
- }
195
-
196
- await mkdir(resolveSyncArtifactsDirectoryPath(syncDirectory), {
197
- recursive: true,
198
- });
199
-
200
- if (await pathExists(configPath)) {
201
- const config = await readSyncConfig(syncDirectory, context.environment);
202
-
203
- assertInitRequestMatchesConfig(config, request, context.environment);
204
-
205
- return {
206
- alreadyInitialized: true,
207
- configPath,
208
- entryCount: config.entries.length,
209
- gitAction,
210
- ...(gitSource === undefined ? {} : { gitSource }),
211
- generatedIdentity: false,
212
- identityFile: config.age.identityFile,
213
- recipientCount: config.age.recipients.length,
214
- ruleCount: countConfiguredRules(config),
215
- syncDirectory,
216
- };
217
- }
218
-
219
- const ageBootstrap = await resolveInitAgeBootstrap(request, context);
220
-
221
- const initialConfig = createInitialSyncConfig({
222
- identityFile: ageBootstrap.configuredIdentityFile,
223
- recipients: ageBootstrap.recipients,
224
- });
225
-
226
- parseSyncConfig(initialConfig, context.environment);
227
- await writeFile(configPath, formatSyncConfig(initialConfig), "utf8");
228
-
229
- return {
230
- alreadyInitialized: false,
231
- configPath,
232
- entryCount: 0,
233
- gitAction,
234
- ...(gitSource === undefined ? {} : { gitSource }),
235
- generatedIdentity: ageBootstrap.generatedIdentity,
236
- identityFile: resolveConfiguredAbsolutePath(
237
- ageBootstrap.configuredIdentityFile,
238
- context.environment,
239
- ),
240
- recipientCount: ageBootstrap.recipients.length,
241
- ruleCount: 0,
242
- syncDirectory,
243
- };
244
- };