sync-worktrees 0.4.0 → 0.5.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -80
  3. package/dist/index.js +7 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/services/config-loader.service.js +7 -7
  6. package/dist/services/config-loader.service.js.map +1 -1
  7. package/dist/services/git.service.d.ts +4 -1
  8. package/dist/services/git.service.d.ts.map +1 -1
  9. package/dist/services/git.service.js +72 -21
  10. package/dist/services/git.service.js.map +1 -1
  11. package/dist/services/worktree-sync.service.d.ts.map +1 -1
  12. package/dist/services/worktree-sync.service.js +14 -3
  13. package/dist/services/worktree-sync.service.js.map +1 -1
  14. package/dist/types/index.d.ts +2 -2
  15. package/dist/types/index.d.ts.map +1 -1
  16. package/dist/utils/cli.d.ts +1 -0
  17. package/dist/utils/cli.d.ts.map +1 -1
  18. package/dist/utils/cli.js +10 -12
  19. package/dist/utils/cli.js.map +1 -1
  20. package/dist/utils/config-generator.d.ts.map +1 -1
  21. package/dist/utils/config-generator.js +55 -20
  22. package/dist/utils/config-generator.js.map +1 -1
  23. package/dist/utils/git-url.d.ts +15 -0
  24. package/dist/utils/git-url.d.ts.map +1 -0
  25. package/dist/utils/git-url.js +41 -0
  26. package/dist/utils/git-url.js.map +1 -0
  27. package/dist/utils/interactive.d.ts.map +1 -1
  28. package/dist/utils/interactive.js +43 -28
  29. package/dist/utils/interactive.js.map +1 -1
  30. package/package.json +8 -5
  31. package/dist/__tests__/fixtures/git-responses.d.ts +0 -114
  32. package/dist/__tests__/fixtures/git-responses.d.ts.map +0 -1
  33. package/dist/__tests__/fixtures/git-responses.js +0 -119
  34. package/dist/__tests__/fixtures/git-responses.js.map +0 -1
  35. package/dist/__tests__/helpers/mock-helpers.d.ts +0 -29
  36. package/dist/__tests__/helpers/mock-helpers.d.ts.map +0 -1
  37. package/dist/__tests__/helpers/mock-helpers.js +0 -82
  38. package/dist/__tests__/helpers/mock-helpers.js.map +0 -1
  39. package/dist/__tests__/integration.test.d.ts +0 -2
  40. package/dist/__tests__/integration.test.d.ts.map +0 -1
  41. package/dist/__tests__/integration.test.js +0 -300
  42. package/dist/__tests__/integration.test.js.map +0 -1
  43. package/dist/__tests__/setup.d.ts +0 -2
  44. package/dist/__tests__/setup.d.ts.map +0 -1
  45. package/dist/__tests__/setup.js +0 -18
  46. package/dist/__tests__/setup.js.map +0 -1
  47. package/dist/services/__tests__/config-loader.service.test.d.ts +0 -2
  48. package/dist/services/__tests__/config-loader.service.test.d.ts.map +0 -1
  49. package/dist/services/__tests__/config-loader.service.test.js +0 -222
  50. package/dist/services/__tests__/config-loader.service.test.js.map +0 -1
  51. package/dist/services/__tests__/git.service.test.d.ts +0 -2
  52. package/dist/services/__tests__/git.service.test.d.ts.map +0 -1
  53. package/dist/services/__tests__/git.service.test.js +0 -289
  54. package/dist/services/__tests__/git.service.test.js.map +0 -1
  55. package/dist/services/__tests__/worktree-sync.service.test.d.ts +0 -2
  56. package/dist/services/__tests__/worktree-sync.service.test.d.ts.map +0 -1
  57. package/dist/services/__tests__/worktree-sync.service.test.js +0 -272
  58. package/dist/services/__tests__/worktree-sync.service.test.js.map +0 -1
  59. package/dist/utils/__tests__/config-generator.test.d.ts +0 -2
  60. package/dist/utils/__tests__/config-generator.test.d.ts.map +0 -1
  61. package/dist/utils/__tests__/config-generator.test.js +0 -142
  62. package/dist/utils/__tests__/config-generator.test.js.map +0 -1
  63. package/dist/utils/__tests__/interactive.test.d.ts +0 -2
  64. package/dist/utils/__tests__/interactive.test.d.ts.map +0 -1
  65. package/dist/utils/__tests__/interactive.test.js +0 -281
  66. package/dist/utils/__tests__/interactive.test.js.map +0 -1
@@ -1,272 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const fs = __importStar(require("fs/promises"));
37
- const path = __importStar(require("path"));
38
- const globals_1 = require("@jest/globals");
39
- const git_service_1 = require("../git.service");
40
- const worktree_sync_service_1 = require("../worktree-sync.service");
41
- // Mock modules
42
- globals_1.jest.mock("fs/promises");
43
- globals_1.jest.mock("../git.service");
44
- (0, globals_1.describe)("WorktreeSyncService", () => {
45
- let service;
46
- let mockConfig;
47
- let mockGitService;
48
- (0, globals_1.beforeEach)(() => {
49
- globals_1.jest.clearAllMocks();
50
- mockConfig = {
51
- repoPath: "/test/repo",
52
- repoUrl: "https://github.com/test/repo.git",
53
- worktreeDir: "/test/worktrees",
54
- cronSchedule: "0 * * * *",
55
- runOnce: false,
56
- };
57
- // Create mock GitService
58
- mockGitService = {
59
- initialize: globals_1.jest.fn().mockResolvedValue(undefined),
60
- fetchAll: globals_1.jest.fn().mockResolvedValue(undefined),
61
- getRemoteBranches: globals_1.jest.fn().mockResolvedValue(["main", "feature-1", "feature-2"]),
62
- addWorktree: globals_1.jest.fn().mockResolvedValue(undefined),
63
- removeWorktree: globals_1.jest.fn().mockResolvedValue(undefined),
64
- pruneWorktrees: globals_1.jest.fn().mockResolvedValue(undefined),
65
- checkWorktreeStatus: globals_1.jest.fn().mockResolvedValue(true),
66
- hasUnpushedCommits: globals_1.jest.fn().mockResolvedValue(false),
67
- getCurrentBranch: globals_1.jest.fn().mockResolvedValue("main"),
68
- getWorktrees: globals_1.jest.fn().mockResolvedValue([]),
69
- getGit: globals_1.jest.fn(),
70
- };
71
- // Mock GitService constructor
72
- git_service_1.GitService.mockImplementation(() => mockGitService);
73
- service = new worktree_sync_service_1.WorktreeSyncService(mockConfig);
74
- });
75
- (0, globals_1.describe)("initialize", () => {
76
- (0, globals_1.it)("should initialize git service", async () => {
77
- await service.initialize();
78
- (0, globals_1.expect)(mockGitService.initialize).toHaveBeenCalled();
79
- });
80
- });
81
- (0, globals_1.describe)("sync", () => {
82
- (0, globals_1.beforeEach)(async () => {
83
- await service.initialize();
84
- fs.mkdir.mockResolvedValue(undefined);
85
- });
86
- (0, globals_1.it)("should complete full sync workflow successfully", async () => {
87
- // Mock existing worktree directories
88
- fs.readdir.mockResolvedValue(["feature-1", "old-branch"]);
89
- // Mock actual Git worktrees
90
- mockGitService.getWorktrees.mockResolvedValue([
91
- { path: "/test/worktrees/feature-1", branch: "feature-1" },
92
- { path: "/test/worktrees/old-branch", branch: "old-branch" },
93
- ]);
94
- await service.sync();
95
- // Verify workflow steps
96
- (0, globals_1.expect)(mockGitService.fetchAll).toHaveBeenCalled();
97
- (0, globals_1.expect)(mockGitService.getRemoteBranches).toHaveBeenCalled();
98
- (0, globals_1.expect)(mockGitService.getCurrentBranch).toHaveBeenCalled();
99
- (0, globals_1.expect)(fs.mkdir).toHaveBeenCalledWith("/test/worktrees", { recursive: true });
100
- (0, globals_1.expect)(mockGitService.getWorktrees).toHaveBeenCalled();
101
- // Should create new worktree for feature-2 (but not main, as it's the current branch)
102
- (0, globals_1.expect)(mockGitService.addWorktree).toHaveBeenCalledWith("feature-2", path.join("/test/worktrees", "feature-2"));
103
- (0, globals_1.expect)(mockGitService.addWorktree).not.toHaveBeenCalledWith("main", path.join("/test/worktrees", "main"));
104
- // Should check and remove old-branch
105
- (0, globals_1.expect)(mockGitService.checkWorktreeStatus).toHaveBeenCalledWith(path.join("/test/worktrees", "old-branch"));
106
- (0, globals_1.expect)(mockGitService.hasUnpushedCommits).toHaveBeenCalledWith(path.join("/test/worktrees", "old-branch"));
107
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledWith("old-branch");
108
- // Should prune at the end
109
- (0, globals_1.expect)(mockGitService.pruneWorktrees).toHaveBeenCalled();
110
- });
111
- (0, globals_1.it)("should handle empty remote branches", async () => {
112
- mockGitService.getRemoteBranches.mockResolvedValue([]);
113
- fs.readdir.mockResolvedValue([]);
114
- await service.sync();
115
- (0, globals_1.expect)(mockGitService.addWorktree).not.toHaveBeenCalled();
116
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalled();
117
- (0, globals_1.expect)(mockGitService.pruneWorktrees).toHaveBeenCalled();
118
- });
119
- (0, globals_1.it)("should skip worktrees with local changes", async () => {
120
- fs.readdir.mockResolvedValue(["dirty-branch"]);
121
- mockGitService.getWorktrees.mockResolvedValue([{ path: "/test/worktrees/dirty-branch", branch: "dirty-branch" }]);
122
- mockGitService.checkWorktreeStatus.mockResolvedValue(false); // Has local changes
123
- await service.sync();
124
- (0, globals_1.expect)(mockGitService.checkWorktreeStatus).toHaveBeenCalledWith(path.join("/test/worktrees", "dirty-branch"));
125
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalled();
126
- });
127
- (0, globals_1.it)("should skip worktrees with unpushed commits", async () => {
128
- fs.readdir.mockResolvedValue(["unpushed-branch"]);
129
- mockGitService.getWorktrees.mockResolvedValue([
130
- { path: "/test/worktrees/unpushed-branch", branch: "unpushed-branch" },
131
- ]);
132
- mockGitService.checkWorktreeStatus.mockResolvedValue(true); // Clean
133
- mockGitService.hasUnpushedCommits.mockResolvedValue(true); // Has unpushed commits
134
- await service.sync();
135
- (0, globals_1.expect)(mockGitService.checkWorktreeStatus).toHaveBeenCalledWith(path.join("/test/worktrees", "unpushed-branch"));
136
- (0, globals_1.expect)(mockGitService.hasUnpushedCommits).toHaveBeenCalledWith(path.join("/test/worktrees", "unpushed-branch"));
137
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalled();
138
- });
139
- (0, globals_1.it)("should skip worktrees with both local changes and unpushed commits", async () => {
140
- fs.readdir.mockResolvedValue(["dirty-unpushed-branch"]);
141
- mockGitService.getWorktrees.mockResolvedValue([
142
- { path: "/test/worktrees/dirty-unpushed-branch", branch: "dirty-unpushed-branch" },
143
- ]);
144
- mockGitService.checkWorktreeStatus.mockResolvedValue(false); // Has local changes
145
- mockGitService.hasUnpushedCommits.mockResolvedValue(true); // Has unpushed commits
146
- await service.sync();
147
- (0, globals_1.expect)(mockGitService.checkWorktreeStatus).toHaveBeenCalledWith(path.join("/test/worktrees", "dirty-unpushed-branch"));
148
- (0, globals_1.expect)(mockGitService.hasUnpushedCommits).toHaveBeenCalledWith(path.join("/test/worktrees", "dirty-unpushed-branch"));
149
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalled();
150
- });
151
- (0, globals_1.it)("should handle errors during sync but still cleanup", async () => {
152
- const error = new Error("Fetch failed");
153
- mockGitService.fetchAll.mockRejectedValue(error);
154
- await (0, globals_1.expect)(service.sync()).rejects.toThrow("Fetch failed");
155
- // Verify error is logged
156
- (0, globals_1.expect)(console.error).toHaveBeenCalledWith("Error during worktree synchronization:", error);
157
- });
158
- (0, globals_1.it)("should handle errors when checking worktree status", async () => {
159
- fs.readdir.mockResolvedValue(["broken-branch"]);
160
- mockGitService.getWorktrees.mockResolvedValue([
161
- { path: "/test/worktrees/broken-branch", branch: "broken-branch" },
162
- ]);
163
- mockGitService.checkWorktreeStatus.mockRejectedValue(new Error("Status check failed"));
164
- await service.sync();
165
- // Should log error but continue
166
- (0, globals_1.expect)(console.error).toHaveBeenCalledWith(globals_1.expect.stringContaining("Error checking worktree"), globals_1.expect.any(Error));
167
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalled();
168
- (0, globals_1.expect)(mockGitService.pruneWorktrees).toHaveBeenCalled();
169
- });
170
- (0, globals_1.it)("should create multiple new worktrees", async () => {
171
- mockGitService.getRemoteBranches.mockResolvedValue(["main", "feature-1", "feature-2", "feature-3"]);
172
- fs.readdir.mockResolvedValue([]);
173
- await service.sync();
174
- // Should skip main (current branch) and create the other 3
175
- (0, globals_1.expect)(mockGitService.addWorktree).toHaveBeenCalledTimes(3);
176
- (0, globals_1.expect)(mockGitService.addWorktree).toHaveBeenCalledWith("feature-1", path.join("/test/worktrees", "feature-1"));
177
- (0, globals_1.expect)(mockGitService.addWorktree).toHaveBeenCalledWith("feature-2", path.join("/test/worktrees", "feature-2"));
178
- (0, globals_1.expect)(mockGitService.addWorktree).toHaveBeenCalledWith("feature-3", path.join("/test/worktrees", "feature-3"));
179
- (0, globals_1.expect)(mockGitService.addWorktree).not.toHaveBeenCalledWith("main", path.join("/test/worktrees", "main"));
180
- });
181
- (0, globals_1.it)("should remove multiple stale worktrees", async () => {
182
- mockGitService.getRemoteBranches.mockResolvedValue(["main"]);
183
- fs.readdir.mockResolvedValue(["old-1", "old-2", "old-3"]);
184
- mockGitService.getWorktrees.mockResolvedValue([
185
- { path: "/test/worktrees/old-1", branch: "old-1" },
186
- { path: "/test/worktrees/old-2", branch: "old-2" },
187
- { path: "/test/worktrees/old-3", branch: "old-3" },
188
- ]);
189
- mockGitService.checkWorktreeStatus.mockResolvedValue(true); // All clean
190
- await service.sync();
191
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledTimes(3);
192
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledWith("old-1");
193
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledWith("old-2");
194
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledWith("old-3");
195
- });
196
- (0, globals_1.it)("should only remove worktrees that are clean with no unpushed commits", async () => {
197
- mockGitService.getRemoteBranches.mockResolvedValue(["main"]);
198
- fs.readdir.mockResolvedValue(["deleted-clean", "deleted-dirty", "deleted-unpushed"]);
199
- mockGitService.getWorktrees.mockResolvedValue([
200
- { path: "/test/worktrees/deleted-clean", branch: "deleted-clean" },
201
- { path: "/test/worktrees/deleted-dirty", branch: "deleted-dirty" },
202
- { path: "/test/worktrees/deleted-unpushed", branch: "deleted-unpushed" },
203
- ]);
204
- // Set up different conditions for each worktree
205
- mockGitService.checkWorktreeStatus
206
- .mockResolvedValueOnce(true) // deleted-clean: clean
207
- .mockResolvedValueOnce(false) // deleted-dirty: has uncommitted changes
208
- .mockResolvedValueOnce(true); // deleted-unpushed: clean
209
- mockGitService.hasUnpushedCommits
210
- .mockResolvedValueOnce(false) // deleted-clean: no unpushed commits
211
- .mockResolvedValueOnce(false) // deleted-dirty: no unpushed commits (but won't be checked due to uncommitted changes)
212
- .mockResolvedValueOnce(true); // deleted-unpushed: has unpushed commits
213
- await service.sync();
214
- // Should only remove the worktree that is both clean AND has no unpushed commits
215
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledTimes(1);
216
- (0, globals_1.expect)(mockGitService.removeWorktree).toHaveBeenCalledWith("deleted-clean");
217
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalledWith("deleted-dirty");
218
- (0, globals_1.expect)(mockGitService.removeWorktree).not.toHaveBeenCalledWith("deleted-unpushed");
219
- // Verify all safety checks were performed
220
- (0, globals_1.expect)(mockGitService.checkWorktreeStatus).toHaveBeenCalledTimes(3);
221
- (0, globals_1.expect)(mockGitService.hasUnpushedCommits).toHaveBeenCalledTimes(3); // Called for all worktrees regardless of checkWorktreeStatus result
222
- });
223
- (0, globals_1.it)("should clean up orphaned directories that are not Git worktrees", async () => {
224
- // Mock file system with directories that don't match Git worktrees
225
- fs.readdir.mockResolvedValue(["feature-1", "orphaned-dir", "another-orphan"]);
226
- // Mock Git worktrees - only feature-1 is a valid worktree
227
- mockGitService.getWorktrees.mockResolvedValue([{ path: "/test/worktrees/feature-1", branch: "feature-1" }]);
228
- // Mock fs.stat to return directory info
229
- const mockStat = { isDirectory: globals_1.jest.fn().mockReturnValue(true) };
230
- fs.stat.mockResolvedValue(mockStat);
231
- // Mock fs.rm
232
- fs.rm.mockResolvedValue(undefined);
233
- await service.sync();
234
- // Should remove orphaned directories
235
- (0, globals_1.expect)(fs.rm).toHaveBeenCalledTimes(2);
236
- (0, globals_1.expect)(fs.rm).toHaveBeenCalledWith(path.join("/test/worktrees", "orphaned-dir"), {
237
- recursive: true,
238
- force: true,
239
- });
240
- (0, globals_1.expect)(fs.rm).toHaveBeenCalledWith(path.join("/test/worktrees", "another-orphan"), {
241
- recursive: true,
242
- force: true,
243
- });
244
- // Should not remove valid worktree directory
245
- (0, globals_1.expect)(fs.rm).not.toHaveBeenCalledWith(path.join("/test/worktrees", "feature-1"), globals_1.expect.any(Object));
246
- });
247
- (0, globals_1.it)("should handle errors during orphaned directory cleanup gracefully", async () => {
248
- fs.readdir.mockResolvedValue(["feature-1", "orphaned-dir"]);
249
- mockGitService.getWorktrees.mockResolvedValue([{ path: "/test/worktrees/feature-1", branch: "feature-1" }]);
250
- const mockStat = { isDirectory: globals_1.jest.fn().mockReturnValue(true) };
251
- fs.stat.mockResolvedValue(mockStat);
252
- // Mock fs.rm to throw an error
253
- fs.rm.mockRejectedValue(new Error("Permission denied"));
254
- // Should not throw, just log the error
255
- await service.sync();
256
- (0, globals_1.expect)(console.error).toHaveBeenCalledWith(globals_1.expect.stringContaining("Failed to remove orphaned directory"), globals_1.expect.any(Error));
257
- // Should continue with the rest of the sync
258
- (0, globals_1.expect)(mockGitService.pruneWorktrees).toHaveBeenCalled();
259
- });
260
- (0, globals_1.it)("should handle errors when reading worktree directory", async () => {
261
- // Mock fs.readdir to throw an error
262
- fs.readdir.mockRejectedValue(new Error("Permission denied"));
263
- mockGitService.getWorktrees.mockResolvedValue([{ path: "/test/worktrees/feature-1", branch: "feature-1" }]);
264
- // Should not throw, just log the error
265
- await service.sync();
266
- (0, globals_1.expect)(console.error).toHaveBeenCalledWith("Error during orphaned directory cleanup:", globals_1.expect.any(Error));
267
- // Should continue with the rest of the sync
268
- (0, globals_1.expect)(mockGitService.pruneWorktrees).toHaveBeenCalled();
269
- });
270
- });
271
- });
272
- //# sourceMappingURL=worktree-sync.service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktree-sync.service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/worktree-sync.service.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config-generator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-generator.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/config-generator.test.ts"],"names":[],"mappings":""}
@@ -1,142 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const fs = __importStar(require("fs/promises"));
37
- const path = __importStar(require("path"));
38
- const globals_1 = require("@jest/globals");
39
- const config_generator_1 = require("../config-generator");
40
- (0, globals_1.describe)("Config Generator", () => {
41
- let tempDir;
42
- (0, globals_1.beforeEach)(async () => {
43
- tempDir = await fs.mkdtemp(path.join(process.cwd(), "test-config-gen-"));
44
- });
45
- afterEach(async () => {
46
- await fs.rm(tempDir, { recursive: true, force: true });
47
- });
48
- (0, globals_1.describe)("generateConfigFile", () => {
49
- (0, globals_1.it)("should generate a basic config file", async () => {
50
- const config = {
51
- repoPath: "/absolute/path/to/repo",
52
- worktreeDir: "/absolute/path/to/worktrees",
53
- cronSchedule: "0 * * * *",
54
- runOnce: false,
55
- };
56
- const configPath = path.join(tempDir, "test.config.js");
57
- await (0, config_generator_1.generateConfigFile)(config, configPath);
58
- const content = await fs.readFile(configPath, "utf-8");
59
- (0, globals_1.expect)(content).toContain('name: "repo"');
60
- (0, globals_1.expect)(content).toContain('repoPath: "/absolute/path/to/repo"');
61
- (0, globals_1.expect)(content).toContain('worktreeDir: "/absolute/path/to/worktrees"');
62
- (0, globals_1.expect)(content).toContain('cronSchedule: "0 * * * *"');
63
- (0, globals_1.expect)(content).toContain("runOnce: false");
64
- });
65
- (0, globals_1.it)("should include repoUrl when provided", async () => {
66
- const config = {
67
- repoPath: "/path/to/repo",
68
- repoUrl: "https://github.com/user/repo.git",
69
- worktreeDir: "/path/to/worktrees",
70
- cronSchedule: "*/30 * * * *",
71
- runOnce: true,
72
- };
73
- const configPath = path.join(tempDir, "test.config.js");
74
- await (0, config_generator_1.generateConfigFile)(config, configPath);
75
- const content = await fs.readFile(configPath, "utf-8");
76
- (0, globals_1.expect)(content).toContain('repoUrl: "https://github.com/user/repo.git"');
77
- (0, globals_1.expect)(content).toContain('cronSchedule: "*/30 * * * *"');
78
- (0, globals_1.expect)(content).toContain("runOnce: true");
79
- });
80
- (0, globals_1.it)("should use relative paths when appropriate", async () => {
81
- const config = {
82
- repoPath: path.join(tempDir, "repo"),
83
- worktreeDir: path.join(tempDir, "worktrees"),
84
- cronSchedule: "0 * * * *",
85
- runOnce: false,
86
- };
87
- const configPath = path.join(tempDir, "config.js");
88
- await (0, config_generator_1.generateConfigFile)(config, configPath);
89
- const content = await fs.readFile(configPath, "utf-8");
90
- (0, globals_1.expect)(content).toContain('repoPath: "./repo"');
91
- (0, globals_1.expect)(content).toContain('worktreeDir: "./worktrees"');
92
- });
93
- (0, globals_1.it)("should use absolute paths for deeply nested relative paths", async () => {
94
- const config = {
95
- repoPath: "/very/deeply/nested/path/to/repo",
96
- worktreeDir: path.join(tempDir, "worktrees"),
97
- cronSchedule: "0 * * * *",
98
- runOnce: false,
99
- };
100
- const configPath = path.join(tempDir, "sub/dir/config.js");
101
- await fs.mkdir(path.dirname(configPath), { recursive: true });
102
- await (0, config_generator_1.generateConfigFile)(config, configPath);
103
- const content = await fs.readFile(configPath, "utf-8");
104
- (0, globals_1.expect)(content).toContain('repoPath: "/very/deeply/nested/path/to/repo"');
105
- });
106
- (0, globals_1.it)("should create parent directories if they don't exist", async () => {
107
- const config = {
108
- repoPath: "/path/to/repo",
109
- worktreeDir: "/path/to/worktrees",
110
- cronSchedule: "0 * * * *",
111
- runOnce: false,
112
- };
113
- const configPath = path.join(tempDir, "nested/dir/config.js");
114
- await (0, config_generator_1.generateConfigFile)(config, configPath);
115
- const exists = await fs
116
- .access(configPath)
117
- .then(() => true)
118
- .catch(() => false);
119
- (0, globals_1.expect)(exists).toBe(true);
120
- });
121
- (0, globals_1.it)("should include a timestamp in the generated file", async () => {
122
- const config = {
123
- repoPath: "/path/to/repo",
124
- worktreeDir: "/path/to/worktrees",
125
- cronSchedule: "0 * * * *",
126
- runOnce: false,
127
- };
128
- const configPath = path.join(tempDir, "test.config.js");
129
- await (0, config_generator_1.generateConfigFile)(config, configPath);
130
- const content = await fs.readFile(configPath, "utf-8");
131
- (0, globals_1.expect)(content).toMatch(/Generated on \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
132
- });
133
- });
134
- (0, globals_1.describe)("getDefaultConfigPath", () => {
135
- (0, globals_1.it)("should return sync-worktrees.config.js in current directory", () => {
136
- const configPath = (0, config_generator_1.getDefaultConfigPath)();
137
- (0, globals_1.expect)(path.basename(configPath)).toBe("sync-worktrees.config.js");
138
- (0, globals_1.expect)(path.dirname(configPath)).toBe(process.cwd());
139
- });
140
- });
141
- });
142
- //# sourceMappingURL=config-generator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-generator.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/config-generator.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=interactive.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interactive.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/interactive.test.ts"],"names":[],"mappings":""}