@camaradesuk/git-worktree-tools 1.7.0 → 1.8.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.
- package/README.md +69 -8
- package/dist/cli/cleanpr.js +11 -5
- package/dist/cli/cleanpr.js.map +1 -1
- package/dist/cli/cleanpr.test.js +10 -1
- package/dist/cli/cleanpr.test.js.map +1 -1
- package/dist/cli/newpr.js +100 -28
- package/dist/cli/newpr.js.map +1 -1
- package/dist/cli/newpr.test.js +24 -6
- package/dist/cli/newpr.test.js.map +1 -1
- package/dist/cli/prs.d.ts +22 -0
- package/dist/cli/prs.d.ts.map +1 -0
- package/dist/cli/prs.js +275 -0
- package/dist/cli/prs.js.map +1 -0
- package/dist/cli/prs.test.d.ts +8 -0
- package/dist/cli/prs.test.d.ts.map +1 -0
- package/dist/cli/prs.test.js +408 -0
- package/dist/cli/prs.test.js.map +1 -0
- package/dist/cli/wt/interactive-menu.d.ts +2 -0
- package/dist/cli/wt/interactive-menu.d.ts.map +1 -1
- package/dist/cli/wt/interactive-menu.js +17 -0
- package/dist/cli/wt/interactive-menu.js.map +1 -1
- package/dist/cli/wt/interactive-menu.test.js +25 -0
- package/dist/cli/wt/interactive-menu.test.js.map +1 -1
- package/dist/cli/wt/prs.d.ts +21 -0
- package/dist/cli/wt/prs.d.ts.map +1 -0
- package/dist/cli/wt/prs.js +251 -0
- package/dist/cli/wt/prs.js.map +1 -0
- package/dist/cli/wt/prs.test.d.ts +5 -0
- package/dist/cli/wt/prs.test.d.ts.map +1 -0
- package/dist/cli/wt/prs.test.js +410 -0
- package/dist/cli/wt/prs.test.js.map +1 -0
- package/dist/cli/wt.d.ts +1 -0
- package/dist/cli/wt.d.ts.map +1 -1
- package/dist/cli/wt.js +5 -0
- package/dist/cli/wt.js.map +1 -1
- package/dist/cli/wtconfig.test.js +3 -0
- package/dist/cli/wtconfig.test.js.map +1 -1
- package/dist/cli/wtlink.d.ts +2 -1
- package/dist/cli/wtlink.d.ts.map +1 -1
- package/dist/cli/wtlink.js +41 -2
- package/dist/cli/wtlink.js.map +1 -1
- package/dist/e2e/cli.e2e.test.js +6 -2
- package/dist/e2e/cli.e2e.test.js.map +1 -1
- package/dist/e2e/helpers/cli-runner.d.ts.map +1 -1
- package/dist/e2e/helpers/cli-runner.js +1 -0
- package/dist/e2e/helpers/cli-runner.js.map +1 -1
- package/dist/e2e/helpers/gh-mock.d.ts.map +1 -1
- package/dist/e2e/helpers/gh-mock.js +55 -1
- package/dist/e2e/helpers/gh-mock.js.map +1 -1
- package/dist/e2e/helpers/pty-wrapper.d.ts +15 -0
- package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -1
- package/dist/e2e/helpers/pty-wrapper.js +65 -0
- package/dist/e2e/helpers/pty-wrapper.js.map +1 -1
- package/dist/e2e/newpr-full-flow.e2e.test.js +1 -0
- package/dist/e2e/newpr-full-flow.e2e.test.js.map +1 -1
- package/dist/e2e/prs/prs.e2e.test.d.ts +7 -0
- package/dist/e2e/prs/prs.e2e.test.d.ts.map +1 -0
- package/dist/e2e/prs/prs.e2e.test.js +606 -0
- package/dist/e2e/prs/prs.e2e.test.js.map +1 -0
- package/dist/e2e/wt/interactive-menu.e2e.test.d.ts +8 -0
- package/dist/e2e/wt/interactive-menu.e2e.test.d.ts.map +1 -0
- package/dist/e2e/wt/interactive-menu.e2e.test.js +583 -0
- package/dist/e2e/wt/interactive-menu.e2e.test.js.map +1 -0
- package/dist/e2e/wt/wt.e2e.test.js +217 -4
- package/dist/e2e/wt/wt.e2e.test.js.map +1 -1
- package/dist/integration/prs.integration.test.d.ts +8 -0
- package/dist/integration/prs.integration.test.d.ts.map +1 -0
- package/dist/integration/prs.integration.test.js +478 -0
- package/dist/integration/prs.integration.test.js.map +1 -0
- package/dist/lib/config-validation.d.ts.map +1 -1
- package/dist/lib/config-validation.js +56 -0
- package/dist/lib/config-validation.js.map +1 -1
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/git.d.ts +32 -0
- package/dist/lib/git.d.ts.map +1 -1
- package/dist/lib/git.js +95 -1
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/git.test.js +118 -1
- package/dist/lib/git.test.js.map +1 -1
- package/dist/lib/github.d.ts +41 -0
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +109 -0
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/global-check.d.ts +2 -2
- package/dist/lib/global-check.js +3 -3
- package/dist/lib/global-check.js.map +1 -1
- package/dist/lib/global-check.test.js +3 -6
- package/dist/lib/global-check.test.js.map +1 -1
- package/dist/lib/json-output.d.ts +1 -0
- package/dist/lib/json-output.d.ts.map +1 -1
- package/dist/lib/json-output.js +2 -0
- package/dist/lib/json-output.js.map +1 -1
- package/dist/lib/lswt/action-executors.d.ts.map +1 -1
- package/dist/lib/lswt/action-executors.js +2 -1
- package/dist/lib/lswt/action-executors.js.map +1 -1
- package/dist/lib/lswt/action-executors.test.js +1 -0
- package/dist/lib/lswt/action-executors.test.js.map +1 -1
- package/dist/lib/lswt/actions.d.ts +1 -0
- package/dist/lib/lswt/actions.d.ts.map +1 -1
- package/dist/lib/lswt/actions.js +38 -10
- package/dist/lib/lswt/actions.js.map +1 -1
- package/dist/lib/lswt/actions.test.js +34 -22
- package/dist/lib/lswt/actions.test.js.map +1 -1
- package/dist/lib/lswt/interactive.js +8 -8
- package/dist/lib/lswt/interactive.js.map +1 -1
- package/dist/lib/prompts.d.ts.map +1 -1
- package/dist/lib/prompts.js +16 -12
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/prs/actions.d.ts +70 -0
- package/dist/lib/prs/actions.d.ts.map +1 -0
- package/dist/lib/prs/actions.js +444 -0
- package/dist/lib/prs/actions.js.map +1 -0
- package/dist/lib/prs/actions.test.d.ts +5 -0
- package/dist/lib/prs/actions.test.d.ts.map +1 -0
- package/dist/lib/prs/actions.test.js +313 -0
- package/dist/lib/prs/actions.test.js.map +1 -0
- package/dist/lib/prs/data.d.ts +48 -0
- package/dist/lib/prs/data.d.ts.map +1 -0
- package/dist/lib/prs/data.js +171 -0
- package/dist/lib/prs/data.js.map +1 -0
- package/dist/lib/prs/data.test.d.ts +5 -0
- package/dist/lib/prs/data.test.d.ts.map +1 -0
- package/dist/lib/prs/data.test.js +417 -0
- package/dist/lib/prs/data.test.js.map +1 -0
- package/dist/lib/prs/details.d.ts +57 -0
- package/dist/lib/prs/details.d.ts.map +1 -0
- package/dist/lib/prs/details.js +246 -0
- package/dist/lib/prs/details.js.map +1 -0
- package/dist/lib/prs/details.test.d.ts +5 -0
- package/dist/lib/prs/details.test.d.ts.map +1 -0
- package/dist/lib/prs/details.test.js +325 -0
- package/dist/lib/prs/details.test.js.map +1 -0
- package/dist/lib/prs/filters.d.ts +56 -0
- package/dist/lib/prs/filters.d.ts.map +1 -0
- package/dist/lib/prs/filters.js +171 -0
- package/dist/lib/prs/filters.js.map +1 -0
- package/dist/lib/prs/filters.test.d.ts +5 -0
- package/dist/lib/prs/filters.test.d.ts.map +1 -0
- package/dist/lib/prs/filters.test.js +312 -0
- package/dist/lib/prs/filters.test.js.map +1 -0
- package/dist/lib/prs/formatters.d.ts +83 -0
- package/dist/lib/prs/formatters.d.ts.map +1 -0
- package/dist/lib/prs/formatters.js +389 -0
- package/dist/lib/prs/formatters.js.map +1 -0
- package/dist/lib/prs/formatters.test.d.ts +2 -0
- package/dist/lib/prs/formatters.test.d.ts.map +1 -0
- package/dist/lib/prs/formatters.test.js +387 -0
- package/dist/lib/prs/formatters.test.js.map +1 -0
- package/dist/lib/prs/interactive.d.ts +50 -0
- package/dist/lib/prs/interactive.d.ts.map +1 -0
- package/dist/lib/prs/interactive.js +453 -0
- package/dist/lib/prs/interactive.js.map +1 -0
- package/dist/lib/prs/interactive.test.d.ts +5 -0
- package/dist/lib/prs/interactive.test.d.ts.map +1 -0
- package/dist/lib/prs/interactive.test.js +364 -0
- package/dist/lib/prs/interactive.test.js.map +1 -0
- package/dist/lib/prs/types.d.ts +152 -0
- package/dist/lib/prs/types.d.ts.map +1 -0
- package/dist/lib/prs/types.js +17 -0
- package/dist/lib/prs/types.js.map +1 -0
- package/dist/lib/wtlink/config-manifest.d.ts +101 -0
- package/dist/lib/wtlink/config-manifest.d.ts.map +1 -0
- package/dist/lib/wtlink/config-manifest.js +219 -0
- package/dist/lib/wtlink/config-manifest.js.map +1 -0
- package/dist/lib/wtlink/config-manifest.test.d.ts +2 -0
- package/dist/lib/wtlink/config-manifest.test.d.ts.map +1 -0
- package/dist/lib/wtlink/config-manifest.test.js +460 -0
- package/dist/lib/wtlink/config-manifest.test.js.map +1 -0
- package/dist/lib/wtlink/link-configs.d.ts.map +1 -1
- package/dist/lib/wtlink/link-configs.js +36 -11
- package/dist/lib/wtlink/link-configs.js.map +1 -1
- package/dist/lib/wtlink/main-menu.d.ts.map +1 -1
- package/dist/lib/wtlink/main-menu.js +58 -50
- package/dist/lib/wtlink/main-menu.js.map +1 -1
- package/dist/lib/wtlink/main-menu.test.js +42 -40
- package/dist/lib/wtlink/main-menu.test.js.map +1 -1
- package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
- package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -1
- package/dist/lib/wtlink/manage-manifest.js +346 -25
- package/dist/lib/wtlink/manage-manifest.js.map +1 -1
- package/dist/lib/wtlink/manage-manifest.test.js +52 -1
- package/dist/lib/wtlink/manage-manifest.test.js.map +1 -1
- package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
- package/dist/lib/wtlink/validate-manifest.js +27 -6
- package/dist/lib/wtlink/validate-manifest.js.map +1 -1
- package/package.json +1 -1
- package/schemas/worktreerc.schema.json +26 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for PR action handlers
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
+
import { createWorktreeForPr, openWorktree, openInBrowser, openWorktreeInEditor, openWorktreeInTerminal, copyPrUrl, copyPrNumber, executePrAction, createDefaultActionDeps, } from './actions.js';
|
|
6
|
+
// Helper to create mock PR display items
|
|
7
|
+
function createMockPr(overrides = {}) {
|
|
8
|
+
return {
|
|
9
|
+
number: 42,
|
|
10
|
+
title: 'Add dark mode toggle',
|
|
11
|
+
state: 'OPEN',
|
|
12
|
+
isDraft: false,
|
|
13
|
+
url: 'https://github.com/test/repo/pull/42',
|
|
14
|
+
headBranch: 'feat/dark-mode',
|
|
15
|
+
baseBranch: 'main',
|
|
16
|
+
author: 'testuser',
|
|
17
|
+
createdAt: new Date().toISOString(),
|
|
18
|
+
updatedAt: new Date().toISOString(),
|
|
19
|
+
labels: [],
|
|
20
|
+
reviewDecision: null,
|
|
21
|
+
approvalCount: 0,
|
|
22
|
+
reviewCount: 0,
|
|
23
|
+
checksStatus: null,
|
|
24
|
+
additions: 10,
|
|
25
|
+
deletions: 5,
|
|
26
|
+
changedFiles: 2,
|
|
27
|
+
hasWorktree: false,
|
|
28
|
+
worktreePath: null,
|
|
29
|
+
...overrides,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Create mock deps
|
|
33
|
+
function createMockDeps(overrides = {}) {
|
|
34
|
+
return {
|
|
35
|
+
execCommand: vi.fn().mockReturnValue(''),
|
|
36
|
+
spawnCommand: vi.fn(),
|
|
37
|
+
copyToClipboard: vi.fn().mockReturnValue(true),
|
|
38
|
+
openUrl: vi.fn().mockReturnValue(true),
|
|
39
|
+
getRepoRoot: vi.fn().mockReturnValue('/home/user/repo'),
|
|
40
|
+
log: vi.fn(),
|
|
41
|
+
gitFetch: vi.fn(),
|
|
42
|
+
gitAddWorktree: vi.fn(),
|
|
43
|
+
...overrides,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
describe('actions', () => {
|
|
47
|
+
describe('createWorktreeForPr', () => {
|
|
48
|
+
it('should fetch branch and create worktree', async () => {
|
|
49
|
+
const pr = createMockPr({ number: 123, headBranch: 'feat/test' });
|
|
50
|
+
const deps = createMockDeps();
|
|
51
|
+
const result = await createWorktreeForPr(pr, deps);
|
|
52
|
+
expect(result.success).toBe(true);
|
|
53
|
+
expect(result.shouldRefresh).toBe(true);
|
|
54
|
+
expect(deps.gitFetch).toHaveBeenCalledWith('origin', '/home/user/repo');
|
|
55
|
+
expect(deps.gitAddWorktree).toHaveBeenCalledWith(expect.stringContaining('repo.pr123'), 'pr-123', expect.objectContaining({
|
|
56
|
+
createBranch: true,
|
|
57
|
+
startPoint: 'origin/feat/test',
|
|
58
|
+
cwd: '/home/user/repo',
|
|
59
|
+
}));
|
|
60
|
+
});
|
|
61
|
+
it('should handle fetch errors gracefully', async () => {
|
|
62
|
+
const pr = createMockPr();
|
|
63
|
+
const deps = createMockDeps({
|
|
64
|
+
gitFetch: vi.fn().mockImplementation(() => {
|
|
65
|
+
throw new Error('Branch not found');
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
// Should still try to create worktree even if fetch fails
|
|
69
|
+
const result = await createWorktreeForPr(pr, deps);
|
|
70
|
+
expect(result.success).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
it('should return error if worktree creation fails', async () => {
|
|
73
|
+
const pr = createMockPr();
|
|
74
|
+
const deps = createMockDeps({
|
|
75
|
+
gitAddWorktree: vi.fn().mockImplementation(() => {
|
|
76
|
+
throw new Error('Worktree already exists');
|
|
77
|
+
}),
|
|
78
|
+
});
|
|
79
|
+
const result = await createWorktreeForPr(pr, deps);
|
|
80
|
+
expect(result.success).toBe(false);
|
|
81
|
+
expect(result.message).toContain('Worktree already exists');
|
|
82
|
+
});
|
|
83
|
+
it('should fall back to existing branch if create fails', async () => {
|
|
84
|
+
const pr = createMockPr({ number: 42 });
|
|
85
|
+
let callCount = 0;
|
|
86
|
+
const deps = createMockDeps({
|
|
87
|
+
gitAddWorktree: vi.fn().mockImplementation((_path, _branch, options) => {
|
|
88
|
+
callCount++;
|
|
89
|
+
if (options?.createBranch) {
|
|
90
|
+
throw new Error('Branch already exists');
|
|
91
|
+
}
|
|
92
|
+
// Second call with createBranch: false succeeds
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
const result = await createWorktreeForPr(pr, deps);
|
|
96
|
+
expect(result.success).toBe(true);
|
|
97
|
+
expect(callCount).toBe(2);
|
|
98
|
+
expect(deps.gitAddWorktree).toHaveBeenLastCalledWith(expect.any(String), 'pr-42', expect.objectContaining({
|
|
99
|
+
createBranch: false,
|
|
100
|
+
cwd: '/home/user/repo',
|
|
101
|
+
}));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('openWorktree', () => {
|
|
105
|
+
it('should return error if no worktree path', async () => {
|
|
106
|
+
const pr = createMockPr({ hasWorktree: false, worktreePath: null });
|
|
107
|
+
const deps = createMockDeps();
|
|
108
|
+
const result = await openWorktree(pr, deps);
|
|
109
|
+
expect(result.success).toBe(false);
|
|
110
|
+
expect(result.message).toContain('No worktree path');
|
|
111
|
+
});
|
|
112
|
+
it('should open worktree in editor', async () => {
|
|
113
|
+
const pr = createMockPr({
|
|
114
|
+
hasWorktree: true,
|
|
115
|
+
worktreePath: '/path/to/worktree',
|
|
116
|
+
});
|
|
117
|
+
const deps = createMockDeps();
|
|
118
|
+
const result = await openWorktree(pr, deps);
|
|
119
|
+
// Note: This may fail if no editor is available in test environment
|
|
120
|
+
// We're mainly testing the flow here
|
|
121
|
+
expect(result.message).toBeDefined();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('openInBrowser', () => {
|
|
125
|
+
it('should open PR URL in browser', async () => {
|
|
126
|
+
const pr = createMockPr({ number: 99, url: 'https://github.com/test/repo/pull/99' });
|
|
127
|
+
const deps = createMockDeps();
|
|
128
|
+
const result = await openInBrowser(pr, deps);
|
|
129
|
+
expect(result.success).toBe(true);
|
|
130
|
+
expect(result.message).toContain('#99');
|
|
131
|
+
expect(deps.openUrl).toHaveBeenCalledWith('https://github.com/test/repo/pull/99');
|
|
132
|
+
});
|
|
133
|
+
it('should return error if browser fails to open', async () => {
|
|
134
|
+
const pr = createMockPr();
|
|
135
|
+
const deps = createMockDeps({
|
|
136
|
+
openUrl: vi.fn().mockReturnValue(false),
|
|
137
|
+
});
|
|
138
|
+
const result = await openInBrowser(pr, deps);
|
|
139
|
+
expect(result.success).toBe(false);
|
|
140
|
+
expect(result.message).toContain('Failed to open browser');
|
|
141
|
+
expect(result.message).toContain(pr.url);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('openWorktreeInEditor', () => {
|
|
145
|
+
it('should return error if no worktree', async () => {
|
|
146
|
+
const pr = createMockPr({ hasWorktree: false, worktreePath: null });
|
|
147
|
+
const deps = createMockDeps();
|
|
148
|
+
const result = await openWorktreeInEditor(pr, deps);
|
|
149
|
+
expect(result.success).toBe(false);
|
|
150
|
+
expect(result.message).toContain('No worktree available');
|
|
151
|
+
});
|
|
152
|
+
it('should try to open worktree in editor', async () => {
|
|
153
|
+
const pr = createMockPr({
|
|
154
|
+
hasWorktree: true,
|
|
155
|
+
worktreePath: '/path/to/worktree',
|
|
156
|
+
});
|
|
157
|
+
const deps = createMockDeps();
|
|
158
|
+
const result = await openWorktreeInEditor(pr, deps);
|
|
159
|
+
expect(result.message).toBeDefined();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('openWorktreeInTerminal', () => {
|
|
163
|
+
it('should return error if no worktree', async () => {
|
|
164
|
+
const pr = createMockPr({ hasWorktree: false, worktreePath: null });
|
|
165
|
+
const deps = createMockDeps();
|
|
166
|
+
const result = await openWorktreeInTerminal(pr, deps);
|
|
167
|
+
expect(result.success).toBe(false);
|
|
168
|
+
expect(result.message).toContain('No worktree available');
|
|
169
|
+
});
|
|
170
|
+
it('should try to open terminal', async () => {
|
|
171
|
+
const pr = createMockPr({
|
|
172
|
+
hasWorktree: true,
|
|
173
|
+
worktreePath: '/path/to/worktree',
|
|
174
|
+
});
|
|
175
|
+
const deps = createMockDeps();
|
|
176
|
+
const result = await openWorktreeInTerminal(pr, deps);
|
|
177
|
+
expect(result.message).toBeDefined();
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe('copyPrUrl', () => {
|
|
181
|
+
it('should copy URL to clipboard', async () => {
|
|
182
|
+
const pr = createMockPr({ url: 'https://github.com/test/repo/pull/42' });
|
|
183
|
+
const deps = createMockDeps();
|
|
184
|
+
const result = await copyPrUrl(pr, deps);
|
|
185
|
+
expect(result.success).toBe(true);
|
|
186
|
+
expect(result.message).toContain('Copied URL');
|
|
187
|
+
expect(result.message).toContain('github.com');
|
|
188
|
+
expect(deps.copyToClipboard).toHaveBeenCalledWith('https://github.com/test/repo/pull/42');
|
|
189
|
+
});
|
|
190
|
+
it('should return error if clipboard fails', async () => {
|
|
191
|
+
const pr = createMockPr();
|
|
192
|
+
const deps = createMockDeps({
|
|
193
|
+
copyToClipboard: vi.fn().mockReturnValue(false),
|
|
194
|
+
});
|
|
195
|
+
const result = await copyPrUrl(pr, deps);
|
|
196
|
+
expect(result.success).toBe(false);
|
|
197
|
+
expect(result.message).toContain('Failed to copy');
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('copyPrNumber', () => {
|
|
201
|
+
it('should copy PR number to clipboard', async () => {
|
|
202
|
+
const pr = createMockPr({ number: 99 });
|
|
203
|
+
const deps = createMockDeps();
|
|
204
|
+
const result = await copyPrNumber(pr, deps);
|
|
205
|
+
expect(result.success).toBe(true);
|
|
206
|
+
expect(result.message).toContain('#99');
|
|
207
|
+
expect(deps.copyToClipboard).toHaveBeenCalledWith('#99');
|
|
208
|
+
});
|
|
209
|
+
it('should return error if clipboard fails', async () => {
|
|
210
|
+
const pr = createMockPr();
|
|
211
|
+
const deps = createMockDeps({
|
|
212
|
+
copyToClipboard: vi.fn().mockReturnValue(false),
|
|
213
|
+
});
|
|
214
|
+
const result = await copyPrNumber(pr, deps);
|
|
215
|
+
expect(result.success).toBe(false);
|
|
216
|
+
expect(result.message).toContain('Failed to copy');
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
describe('executePrAction', () => {
|
|
220
|
+
it('should handle create_worktree action', async () => {
|
|
221
|
+
const pr = createMockPr();
|
|
222
|
+
const deps = createMockDeps();
|
|
223
|
+
const result = await executePrAction('create_worktree', pr, deps);
|
|
224
|
+
expect(result.shouldRefresh).toBe(true);
|
|
225
|
+
});
|
|
226
|
+
it('should handle open_browser action', async () => {
|
|
227
|
+
const pr = createMockPr();
|
|
228
|
+
const deps = createMockDeps();
|
|
229
|
+
const result = await executePrAction('open_browser', pr, deps);
|
|
230
|
+
expect(result.success).toBe(true);
|
|
231
|
+
});
|
|
232
|
+
it('should handle copy_url action', async () => {
|
|
233
|
+
const pr = createMockPr();
|
|
234
|
+
const deps = createMockDeps();
|
|
235
|
+
const result = await executePrAction('copy_url', pr, deps);
|
|
236
|
+
expect(result.success).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
it('should handle copy_number action', async () => {
|
|
239
|
+
const pr = createMockPr();
|
|
240
|
+
const deps = createMockDeps();
|
|
241
|
+
const result = await executePrAction('copy_number', pr, deps);
|
|
242
|
+
expect(result.success).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
it('should handle show_details action', async () => {
|
|
245
|
+
const pr = createMockPr();
|
|
246
|
+
const deps = createMockDeps();
|
|
247
|
+
const result = await executePrAction('show_details', pr, deps);
|
|
248
|
+
expect(result.success).toBe(true);
|
|
249
|
+
});
|
|
250
|
+
it('should handle refresh action', async () => {
|
|
251
|
+
const pr = createMockPr();
|
|
252
|
+
const deps = createMockDeps();
|
|
253
|
+
const result = await executePrAction('refresh', pr, deps);
|
|
254
|
+
expect(result.success).toBe(true);
|
|
255
|
+
expect(result.shouldRefresh).toBe(true);
|
|
256
|
+
});
|
|
257
|
+
it('should handle back action', async () => {
|
|
258
|
+
const pr = createMockPr();
|
|
259
|
+
const deps = createMockDeps();
|
|
260
|
+
const result = await executePrAction('back', pr, deps);
|
|
261
|
+
expect(result.success).toBe(true);
|
|
262
|
+
expect(result.shouldExit).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
it('should handle exit action', async () => {
|
|
265
|
+
const pr = createMockPr();
|
|
266
|
+
const deps = createMockDeps();
|
|
267
|
+
const result = await executePrAction('exit', pr, deps);
|
|
268
|
+
expect(result.success).toBe(true);
|
|
269
|
+
expect(result.shouldExit).toBe(true);
|
|
270
|
+
});
|
|
271
|
+
it('should handle open_worktree action', async () => {
|
|
272
|
+
const pr = createMockPr({ hasWorktree: true, worktreePath: '/path/to/worktree' });
|
|
273
|
+
const deps = createMockDeps();
|
|
274
|
+
const result = await executePrAction('open_worktree', pr, deps);
|
|
275
|
+
expect(result.message).toBeDefined();
|
|
276
|
+
});
|
|
277
|
+
it('should handle open_editor action', async () => {
|
|
278
|
+
const pr = createMockPr({ hasWorktree: true, worktreePath: '/path/to/worktree' });
|
|
279
|
+
const deps = createMockDeps();
|
|
280
|
+
const result = await executePrAction('open_editor', pr, deps);
|
|
281
|
+
expect(result.message).toBeDefined();
|
|
282
|
+
});
|
|
283
|
+
it('should handle open_terminal action', async () => {
|
|
284
|
+
const pr = createMockPr({ hasWorktree: true, worktreePath: '/path/to/worktree' });
|
|
285
|
+
const deps = createMockDeps();
|
|
286
|
+
const result = await executePrAction('open_terminal', pr, deps);
|
|
287
|
+
expect(result.message).toBeDefined();
|
|
288
|
+
});
|
|
289
|
+
it('should handle unknown action', async () => {
|
|
290
|
+
const pr = createMockPr();
|
|
291
|
+
const deps = createMockDeps();
|
|
292
|
+
// Cast to any to test unknown action
|
|
293
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
294
|
+
const result = await executePrAction('unknown_action', pr, deps);
|
|
295
|
+
expect(result.success).toBe(false);
|
|
296
|
+
expect(result.message).toContain('Unknown action');
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe('createDefaultActionDeps', () => {
|
|
300
|
+
it('should return deps object with required functions', () => {
|
|
301
|
+
const deps = createDefaultActionDeps();
|
|
302
|
+
expect(deps).toHaveProperty('execCommand');
|
|
303
|
+
expect(deps).toHaveProperty('spawnCommand');
|
|
304
|
+
expect(deps).toHaveProperty('copyToClipboard');
|
|
305
|
+
expect(deps).toHaveProperty('openUrl');
|
|
306
|
+
expect(deps).toHaveProperty('getRepoRoot');
|
|
307
|
+
expect(deps).toHaveProperty('log');
|
|
308
|
+
expect(deps).toHaveProperty('gitFetch');
|
|
309
|
+
expect(deps).toHaveProperty('gitAddWorktree');
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
//# sourceMappingURL=actions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.test.js","sourceRoot":"","sources":["../../../src/lib/prs/actions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR data layer - fetching, caching, and worktree correlation
|
|
3
|
+
*/
|
|
4
|
+
import type { PrListItem, PrDisplayItem, PrFilterState, ListPrsExtendedOptions, PrDataDeps } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create default dependencies for PR data operations
|
|
7
|
+
*/
|
|
8
|
+
export declare function createDefaultDataDeps(): PrDataDeps;
|
|
9
|
+
/**
|
|
10
|
+
* Clear the PR cache
|
|
11
|
+
*/
|
|
12
|
+
export declare function clearPrCache(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Check if cache is valid
|
|
15
|
+
*/
|
|
16
|
+
export declare function isCacheValid(deps?: PrDataDeps): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Get cached PRs if available and valid
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCachedPrs(deps?: PrDataDeps): PrListItem[] | null;
|
|
21
|
+
/**
|
|
22
|
+
* Fetch PRs from GitHub with caching
|
|
23
|
+
*/
|
|
24
|
+
export declare function fetchPrList(options: ListPrsExtendedOptions, deps?: PrDataDeps, forceRefresh?: boolean, cwd?: string): PrListItem[];
|
|
25
|
+
/**
|
|
26
|
+
* Correlate PRs with existing worktrees
|
|
27
|
+
* Matches by:
|
|
28
|
+
* 1. Branch name match (pr.headBranch === worktree.branch)
|
|
29
|
+
* 2. Worktree path pattern match (*.prN where N is PR number)
|
|
30
|
+
*/
|
|
31
|
+
export declare function correlatePrsWithWorktrees(prs: PrListItem[], deps?: PrDataDeps, cwd?: string): PrDisplayItem[];
|
|
32
|
+
/**
|
|
33
|
+
* Apply client-side filters to PR list
|
|
34
|
+
*/
|
|
35
|
+
export declare function applyFilters(prs: PrDisplayItem[], filters: PrFilterState): PrDisplayItem[];
|
|
36
|
+
/**
|
|
37
|
+
* Fetch and correlate PRs with worktrees in one call
|
|
38
|
+
*/
|
|
39
|
+
export declare function fetchPrsWithWorktrees(options: ListPrsExtendedOptions, deps?: PrDataDeps, forceRefresh?: boolean, cwd?: string): PrDisplayItem[];
|
|
40
|
+
/**
|
|
41
|
+
* Get cache age in milliseconds (or null if no cache)
|
|
42
|
+
*/
|
|
43
|
+
export declare function getCacheAge(deps?: PrDataDeps): number | null;
|
|
44
|
+
/**
|
|
45
|
+
* Format cache age for display
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatCacheAge(deps?: PrDataDeps): string;
|
|
48
|
+
//# sourceMappingURL=data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/lib/prs/data.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,UAAU,EAEX,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAYlD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,UAAoC,GAAG,OAAO,CAIhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,UAAoC,GAAG,UAAU,EAAE,GAAG,IAAI,CAK5F;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,sBAAsB,EAC/B,IAAI,GAAE,UAAoC,EAC1C,YAAY,UAAQ,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,UAAU,EAAE,CAoBd;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EAAE,EACjB,IAAI,GAAE,UAAoC,EAC1C,GAAG,CAAC,EAAE,MAAM,GACX,aAAa,EAAE,CAmBjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAsD1F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,EAC/B,IAAI,GAAE,UAAoC,EAC1C,YAAY,UAAQ,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,aAAa,EAAE,CAGjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,UAAoC,GAAG,MAAM,GAAG,IAAI,CAGrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,UAAoC,GAAG,MAAM,CASjF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR data layer - fetching, caching, and worktree correlation
|
|
3
|
+
*/
|
|
4
|
+
import * as git from '../git.js';
|
|
5
|
+
import { listPrsExtended } from '../github.js';
|
|
6
|
+
/** Default cache TTL in milliseconds (60 seconds) */
|
|
7
|
+
const DEFAULT_CACHE_TTL = 60 * 1000;
|
|
8
|
+
/** In-memory PR cache */
|
|
9
|
+
let prCache = null;
|
|
10
|
+
/**
|
|
11
|
+
* Create default dependencies for PR data operations
|
|
12
|
+
*/
|
|
13
|
+
export function createDefaultDataDeps() {
|
|
14
|
+
return {
|
|
15
|
+
fetchPrs: listPrsExtended,
|
|
16
|
+
getWorktrees: (cwd) => {
|
|
17
|
+
const worktrees = git.listWorktrees(cwd);
|
|
18
|
+
return worktrees.map((wt) => ({
|
|
19
|
+
path: wt.path,
|
|
20
|
+
branch: wt.branch,
|
|
21
|
+
}));
|
|
22
|
+
},
|
|
23
|
+
now: () => Date.now(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Clear the PR cache
|
|
28
|
+
*/
|
|
29
|
+
export function clearPrCache() {
|
|
30
|
+
prCache = null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if cache is valid
|
|
34
|
+
*/
|
|
35
|
+
export function isCacheValid(deps = createDefaultDataDeps()) {
|
|
36
|
+
if (!prCache)
|
|
37
|
+
return false;
|
|
38
|
+
const age = deps.now() - prCache.timestamp;
|
|
39
|
+
return age < prCache.ttl;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get cached PRs if available and valid
|
|
43
|
+
*/
|
|
44
|
+
export function getCachedPrs(deps = createDefaultDataDeps()) {
|
|
45
|
+
if (prCache && isCacheValid(deps)) {
|
|
46
|
+
return prCache.prs;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fetch PRs from GitHub with caching
|
|
52
|
+
*/
|
|
53
|
+
export function fetchPrList(options, deps = createDefaultDataDeps(), forceRefresh = false, cwd) {
|
|
54
|
+
// Check cache first (unless force refresh)
|
|
55
|
+
if (!forceRefresh && prCache) {
|
|
56
|
+
const age = deps.now() - prCache.timestamp;
|
|
57
|
+
if (age < prCache.ttl) {
|
|
58
|
+
return prCache.prs;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Fetch from GitHub
|
|
62
|
+
const prs = deps.fetchPrs(options, cwd);
|
|
63
|
+
// Update cache
|
|
64
|
+
prCache = {
|
|
65
|
+
prs,
|
|
66
|
+
timestamp: deps.now(),
|
|
67
|
+
ttl: DEFAULT_CACHE_TTL,
|
|
68
|
+
};
|
|
69
|
+
return prs;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Correlate PRs with existing worktrees
|
|
73
|
+
* Matches by:
|
|
74
|
+
* 1. Branch name match (pr.headBranch === worktree.branch)
|
|
75
|
+
* 2. Worktree path pattern match (*.prN where N is PR number)
|
|
76
|
+
*/
|
|
77
|
+
export function correlatePrsWithWorktrees(prs, deps = createDefaultDataDeps(), cwd) {
|
|
78
|
+
const worktrees = deps.getWorktrees(cwd);
|
|
79
|
+
return prs.map((pr) => {
|
|
80
|
+
// Check for branch name match
|
|
81
|
+
let matchingWorktree = worktrees.find((wt) => wt.branch === pr.headBranch);
|
|
82
|
+
// If no branch match, check for path pattern match (*.prN)
|
|
83
|
+
if (!matchingWorktree) {
|
|
84
|
+
const prPattern = new RegExp(`\\.pr${pr.number}(?:[/\\\\]|$)`);
|
|
85
|
+
matchingWorktree = worktrees.find((wt) => prPattern.test(wt.path));
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
...pr,
|
|
89
|
+
hasWorktree: !!matchingWorktree,
|
|
90
|
+
worktreePath: matchingWorktree?.path ?? null,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Apply client-side filters to PR list
|
|
96
|
+
*/
|
|
97
|
+
export function applyFilters(prs, filters) {
|
|
98
|
+
return prs.filter((pr) => {
|
|
99
|
+
// Filter by state
|
|
100
|
+
if (!filters.states.has(pr.state)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// Filter by draft status
|
|
104
|
+
if (filters.showDrafts === false && pr.isDraft) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
if (filters.showDrafts === 'only' && !pr.isDraft) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Filter by labels (OR logic - must have at least one)
|
|
111
|
+
if (filters.labels.length > 0) {
|
|
112
|
+
const hasMatchingLabel = filters.labels.some((filterLabel) => pr.labels.some((prLabel) => prLabel.toLowerCase() === filterLabel.toLowerCase()));
|
|
113
|
+
if (!hasMatchingLabel) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Filter by author
|
|
118
|
+
if (filters.author !== null) {
|
|
119
|
+
const authorMatch = pr.author.toLowerCase() === filters.author.toLowerCase() ||
|
|
120
|
+
pr.author.toLowerCase() === filters.author.replace(/^@/, '').toLowerCase();
|
|
121
|
+
if (!authorMatch) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Filter by worktree presence
|
|
126
|
+
if (filters.hasWorktree === true && !pr.hasWorktree) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
if (filters.hasWorktree === false && pr.hasWorktree) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
// Filter by search query (fuzzy match on title, number, author)
|
|
133
|
+
if (filters.searchQuery.length > 0) {
|
|
134
|
+
const query = filters.searchQuery.toLowerCase();
|
|
135
|
+
const searchable = `#${pr.number} ${pr.title} @${pr.author}`.toLowerCase();
|
|
136
|
+
if (!searchable.includes(query)) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Fetch and correlate PRs with worktrees in one call
|
|
145
|
+
*/
|
|
146
|
+
export function fetchPrsWithWorktrees(options, deps = createDefaultDataDeps(), forceRefresh = false, cwd) {
|
|
147
|
+
const prs = fetchPrList(options, deps, forceRefresh, cwd);
|
|
148
|
+
return correlatePrsWithWorktrees(prs, deps, cwd);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get cache age in milliseconds (or null if no cache)
|
|
152
|
+
*/
|
|
153
|
+
export function getCacheAge(deps = createDefaultDataDeps()) {
|
|
154
|
+
if (!prCache)
|
|
155
|
+
return null;
|
|
156
|
+
return deps.now() - prCache.timestamp;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Format cache age for display
|
|
160
|
+
*/
|
|
161
|
+
export function formatCacheAge(deps = createDefaultDataDeps()) {
|
|
162
|
+
const age = getCacheAge(deps);
|
|
163
|
+
if (age === null)
|
|
164
|
+
return 'not cached';
|
|
165
|
+
const seconds = Math.floor(age / 1000);
|
|
166
|
+
if (seconds < 60)
|
|
167
|
+
return `${seconds}s ago`;
|
|
168
|
+
const minutes = Math.floor(seconds / 60);
|
|
169
|
+
return `${minutes}m ago`;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/lib/prs/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.test.d.ts","sourceRoot":"","sources":["../../../src/lib/prs/data.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|