ghagga 3.0.0 → 3.1.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/dist/commands/login.test.js +0 -2
- package/dist/commands/login.test.js.map +1 -1
- package/dist/commands/review-output.test.js +28 -0
- package/dist/commands/review-output.test.js.map +1 -1
- package/dist/commands/review.d.ts +12 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +225 -3
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/review.mr-exit.test.d.ts +13 -0
- package/dist/commands/review.mr-exit.test.d.ts.map +1 -0
- package/dist/commands/review.mr-exit.test.js +190 -0
- package/dist/commands/review.mr-exit.test.js.map +1 -0
- package/dist/commands/review.postback-disclosure.test.d.ts +22 -0
- package/dist/commands/review.postback-disclosure.test.d.ts.map +1 -0
- package/dist/commands/review.postback-disclosure.test.js +192 -0
- package/dist/commands/review.postback-disclosure.test.js.map +1 -0
- package/dist/commands/review.pr-exit.test.d.ts +13 -0
- package/dist/commands/review.pr-exit.test.d.ts.map +1 -0
- package/dist/commands/review.pr-exit.test.js +162 -0
- package/dist/commands/review.pr-exit.test.js.map +1 -0
- package/dist/commands/review.pr-jenkins.test.d.ts +16 -0
- package/dist/commands/review.pr-jenkins.test.d.ts.map +1 -0
- package/dist/commands/review.pr-jenkins.test.js +106 -0
- package/dist/commands/review.pr-jenkins.test.js.map +1 -0
- package/dist/commands/review.pr-nativeid-fallback.test.d.ts +15 -0
- package/dist/commands/review.pr-nativeid-fallback.test.d.ts.map +1 -0
- package/dist/commands/review.pr-nativeid-fallback.test.js +151 -0
- package/dist/commands/review.pr-nativeid-fallback.test.js.map +1 -0
- package/dist/commands/review.test.js +4 -0
- package/dist/commands/review.test.js.map +1 -1
- package/dist/index.js +39 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/cli-github-client-port.d.ts +52 -0
- package/dist/lib/cli-github-client-port.d.ts.map +1 -0
- package/dist/lib/cli-github-client-port.js +199 -0
- package/dist/lib/cli-github-client-port.js.map +1 -0
- package/dist/lib/cli-github-client-port.test.d.ts +10 -0
- package/dist/lib/cli-github-client-port.test.d.ts.map +1 -0
- package/dist/lib/cli-github-client-port.test.js +47 -0
- package/dist/lib/cli-github-client-port.test.js.map +1 -0
- package/dist/lib/cli-gitlab-client-port.d.ts +62 -0
- package/dist/lib/cli-gitlab-client-port.d.ts.map +1 -0
- package/dist/lib/cli-gitlab-client-port.js +209 -0
- package/dist/lib/cli-gitlab-client-port.js.map +1 -0
- package/dist/lib/cli-gitlab-client-port.test.d.ts +9 -0
- package/dist/lib/cli-gitlab-client-port.test.d.ts.map +1 -0
- package/dist/lib/cli-gitlab-client-port.test.js +278 -0
- package/dist/lib/cli-gitlab-client-port.test.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +9 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/forge-postback.d.ts +72 -0
- package/dist/lib/forge-postback.d.ts.map +1 -0
- package/dist/lib/forge-postback.js +39 -0
- package/dist/lib/forge-postback.js.map +1 -0
- package/dist/lib/gitlab-api.d.ts +50 -0
- package/dist/lib/gitlab-api.d.ts.map +1 -0
- package/dist/lib/gitlab-api.js +75 -0
- package/dist/lib/gitlab-api.js.map +1 -0
- package/dist/lib/gitlab-api.test.d.ts +2 -0
- package/dist/lib/gitlab-api.test.d.ts.map +1 -0
- package/dist/lib/gitlab-api.test.js +79 -0
- package/dist/lib/gitlab-api.test.js.map +1 -0
- package/dist/lib/gitlab-e2e.manual.test.d.ts +24 -0
- package/dist/lib/gitlab-e2e.manual.test.d.ts.map +1 -0
- package/dist/lib/gitlab-e2e.manual.test.js +57 -0
- package/dist/lib/gitlab-e2e.manual.test.js.map +1 -0
- package/dist/lib/gitlab-token.d.ts +17 -0
- package/dist/lib/gitlab-token.d.ts.map +1 -0
- package/dist/lib/gitlab-token.js +24 -0
- package/dist/lib/gitlab-token.js.map +1 -0
- package/dist/lib/gitlab-token.test.d.ts +2 -0
- package/dist/lib/gitlab-token.test.d.ts.map +1 -0
- package/dist/lib/gitlab-token.test.js +38 -0
- package/dist/lib/gitlab-token.test.js.map +1 -0
- package/dist/lib/oauth.test.js +0 -1
- package/dist/lib/oauth.test.js.map +1 -1
- package/dist/lib/pr-postback.d.ts +42 -0
- package/dist/lib/pr-postback.d.ts.map +1 -0
- package/dist/lib/pr-postback.js +44 -0
- package/dist/lib/pr-postback.js.map +1 -0
- package/dist/lib/pr-postback.test.d.ts +9 -0
- package/dist/lib/pr-postback.test.d.ts.map +1 -0
- package/dist/lib/pr-postback.test.js +196 -0
- package/dist/lib/pr-postback.test.js.map +1 -0
- package/dist/lib/pr-token.d.ts +15 -0
- package/dist/lib/pr-token.d.ts.map +1 -0
- package/dist/lib/pr-token.js +22 -0
- package/dist/lib/pr-token.js.map +1 -0
- package/dist/lib/pr-token.test.d.ts +2 -0
- package/dist/lib/pr-token.test.d.ts.map +1 -0
- package/dist/lib/pr-token.test.js +25 -0
- package/dist/lib/pr-token.test.js.map +1 -0
- package/package.json +8 -7
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R-CLI: the `--pr` post-back routes through the REAL GitHubForgeAdapter folding
|
|
3
|
+
* over the CLI's own GitHubClientPort. We mock ONLY `fetch` (the network seam),
|
|
4
|
+
* so this exercises the genuine adapter find→delete→post idempotency path and
|
|
5
|
+
* the genuine CLI port REST calls — a faithful simulation against a mocked
|
|
6
|
+
* GitHub.
|
|
7
|
+
*/
|
|
8
|
+
import { REVIEW_COMMENT_MARKER } from 'ghagga-core';
|
|
9
|
+
import { GitHubForgeAdapter } from 'ghagga-forge';
|
|
10
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
11
|
+
import { createCliGitHubClientPort } from './cli-github-client-port.js';
|
|
12
|
+
import { postSummaryComment } from './pr-postback.js';
|
|
13
|
+
const mockFetch = vi.fn();
|
|
14
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
15
|
+
function jsonResponse(status, body) {
|
|
16
|
+
return {
|
|
17
|
+
ok: status >= 200 && status < 300,
|
|
18
|
+
status,
|
|
19
|
+
statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : 'ERR',
|
|
20
|
+
text: () => Promise.resolve(JSON.stringify(body)),
|
|
21
|
+
json: () => Promise.resolve(body),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const MARKER = { html: REVIEW_COMMENT_MARKER };
|
|
25
|
+
const REF = {
|
|
26
|
+
repo: { kind: 'github', nativeId: 'acme/widgets', path: 'acme/widgets' },
|
|
27
|
+
iid: 42,
|
|
28
|
+
};
|
|
29
|
+
function buildAdapter(token = 'tok') {
|
|
30
|
+
return new GitHubForgeAdapter({
|
|
31
|
+
client: createCliGitHubClientPort(),
|
|
32
|
+
token,
|
|
33
|
+
owner: 'acme',
|
|
34
|
+
repo: 'widgets',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
describe('postSummaryComment via CLI port + GitHubForgeAdapter', () => {
|
|
38
|
+
beforeEach(() => mockFetch.mockReset());
|
|
39
|
+
it('posts a fresh comment when none exists (no stale to delete)', async () => {
|
|
40
|
+
// findExistingComment: empty list → null
|
|
41
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
42
|
+
// postComment → { id }
|
|
43
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 9001 }));
|
|
44
|
+
const adapter = buildAdapter();
|
|
45
|
+
const body = `${REVIEW_COMMENT_MARKER}\n## body`;
|
|
46
|
+
const result = await postSummaryComment(adapter, REF, body, MARKER);
|
|
47
|
+
expect(result.createdNativeId).toBe(9001);
|
|
48
|
+
expect(result.deletedNativeIds).toEqual([]);
|
|
49
|
+
// 1 list call + 1 post call.
|
|
50
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
51
|
+
const [listUrl] = mockFetch.mock.calls[0];
|
|
52
|
+
expect(listUrl).toContain('/repos/acme/widgets/issues/42/comments');
|
|
53
|
+
const [postUrl, postInit] = mockFetch.mock.calls[1];
|
|
54
|
+
expect(postUrl).toBe('https://api.github.com/repos/acme/widgets/issues/42/comments');
|
|
55
|
+
expect(postInit.method).toBe('POST');
|
|
56
|
+
expect(JSON.parse(postInit.body)).toEqual({ body });
|
|
57
|
+
});
|
|
58
|
+
it('finds stale → deletes ALL → reposts fresh (idempotent upsert + marker)', async () => {
|
|
59
|
+
// list returns two GHAGGA comments (with marker) + one foreign comment
|
|
60
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, [
|
|
61
|
+
{ id: 100, body: `old ${REVIEW_COMMENT_MARKER}` },
|
|
62
|
+
{ id: 200, body: 'someone else' },
|
|
63
|
+
{ id: 300, body: `newer ${REVIEW_COMMENT_MARKER}` },
|
|
64
|
+
]));
|
|
65
|
+
// deleteComment(latest=300), deleteComment(stale=100)
|
|
66
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(204, {}));
|
|
67
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(204, {}));
|
|
68
|
+
// postComment fresh
|
|
69
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 400 }));
|
|
70
|
+
const adapter = buildAdapter();
|
|
71
|
+
const result = await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
72
|
+
expect(result.createdNativeId).toBe(400);
|
|
73
|
+
// delete order: latest first, then stale.
|
|
74
|
+
expect(result.deletedNativeIds).toEqual([300, 100]);
|
|
75
|
+
const delCall1 = mockFetch.mock.calls[1];
|
|
76
|
+
const delCall2 = mockFetch.mock.calls[2];
|
|
77
|
+
expect(delCall1[0]).toContain('/issues/comments/300');
|
|
78
|
+
expect(delCall1[1].method).toBe('DELETE');
|
|
79
|
+
expect(delCall2[0]).toContain('/issues/comments/100');
|
|
80
|
+
// foreign comment (200) is never deleted.
|
|
81
|
+
const allUrls = mockFetch.mock.calls.map((c) => c[0]).join('\n');
|
|
82
|
+
expect(allUrls).not.toContain('/issues/comments/200');
|
|
83
|
+
});
|
|
84
|
+
it('a 401 with the static token is fatal (no invalidate-retry)', async () => {
|
|
85
|
+
// findExistingComment → 401
|
|
86
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(401, { message: 'bad creds' }));
|
|
87
|
+
const adapter = buildAdapter();
|
|
88
|
+
await expect(postSummaryComment(adapter, REF, 'body', MARKER)).rejects.toThrow();
|
|
89
|
+
// exactly one call — no retry loop.
|
|
90
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
91
|
+
});
|
|
92
|
+
it('passes an AbortSignal (timeout) on every fetch so CI cannot hang', async () => {
|
|
93
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
94
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 1 }));
|
|
95
|
+
const adapter = buildAdapter();
|
|
96
|
+
await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
97
|
+
// Both the list (find) and the post fetch carry an abort signal.
|
|
98
|
+
for (const call of mockFetch.mock.calls) {
|
|
99
|
+
const init = call[1];
|
|
100
|
+
expect(init.signal).toBeInstanceOf(AbortSignal);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
it('sends Bearer auth + version headers on the post', async () => {
|
|
104
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
105
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 1 }));
|
|
106
|
+
const adapter = buildAdapter('secret-token');
|
|
107
|
+
await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
108
|
+
const [, postInit] = mockFetch.mock.calls[1];
|
|
109
|
+
const headers = postInit.headers;
|
|
110
|
+
expect(headers.Authorization).toBe('Bearer secret-token');
|
|
111
|
+
expect(headers['X-GitHub-Api-Version']).toBe('2022-11-28');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('CLI GitHub port — findExistingComment pagination (backlog #6)', () => {
|
|
115
|
+
beforeEach(() => mockFetch.mockReset());
|
|
116
|
+
function makeComments(count, startId = 0, markerAt) {
|
|
117
|
+
return Array.from({ length: count }, (_, i) => ({
|
|
118
|
+
id: startId + i,
|
|
119
|
+
body: i === markerAt ? `summary ${startId + i} ${REVIEW_COMMENT_MARKER}` : `noise ${startId + i}`,
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
it('single page (< 100 comments) → exactly one list call, no extra fetch', async () => {
|
|
123
|
+
const port = createCliGitHubClientPort();
|
|
124
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(20, 0)));
|
|
125
|
+
const result = await port.findExistingComment('acme', 'widgets', 42, 'tok');
|
|
126
|
+
expect(result).toBeNull();
|
|
127
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
128
|
+
expect(mockFetch.mock.calls[0][0]).toContain('page=1');
|
|
129
|
+
});
|
|
130
|
+
it('multi-page → full page 1 forces page 2 fetch; stale-on-page-2 found + deleted (no duplicate)', async () => {
|
|
131
|
+
// page 1: 100 comments, NO marker → must fetch page 2; page 2 carries the stale marker.
|
|
132
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(100, 0)));
|
|
133
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(15, 100, 5))); // marker id 105
|
|
134
|
+
// adapter deletes the found stale (105) then reposts fresh.
|
|
135
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(204, {})); // delete 105
|
|
136
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 777 })); // repost
|
|
137
|
+
const adapter = buildAdapter();
|
|
138
|
+
const result = await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
139
|
+
expect(result.deletedNativeIds).toEqual([105]);
|
|
140
|
+
expect(result.createdNativeId).toBe(777);
|
|
141
|
+
expect(mockFetch.mock.calls[0][0]).toContain('page=1');
|
|
142
|
+
expect(mockFetch.mock.calls[1][0]).toContain('page=2');
|
|
143
|
+
const delCall = mockFetch.mock.calls[2];
|
|
144
|
+
expect(delCall[0]).toContain('/issues/comments/105');
|
|
145
|
+
expect(delCall[1].method).toBe('DELETE');
|
|
146
|
+
});
|
|
147
|
+
it('safety bound → stops at MAX_PAGES (50) and warns instead of looping forever', async () => {
|
|
148
|
+
for (let page = 0; page < 50; page++) {
|
|
149
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(100, page * 100)));
|
|
150
|
+
}
|
|
151
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
152
|
+
const port = createCliGitHubClientPort();
|
|
153
|
+
const result = await port.findExistingComment('acme', 'widgets', 42, 'tok');
|
|
154
|
+
expect(result).toBeNull();
|
|
155
|
+
expect(mockFetch).toHaveBeenCalledTimes(50);
|
|
156
|
+
expect(mockFetch.mock.calls[49][0]).toContain('page=50');
|
|
157
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('MAX_PAGES (50)'));
|
|
158
|
+
warnSpy.mockRestore();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('CLI port stub safety (read members never hit in --pr flow)', () => {
|
|
162
|
+
it('the --pr post-back never invokes any stubbed read member', async () => {
|
|
163
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
164
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 5 }));
|
|
165
|
+
const port = createCliGitHubClientPort();
|
|
166
|
+
// Spy on the stubs — if the post-back path touched them they'd throw, but
|
|
167
|
+
// assert explicitly they were never called.
|
|
168
|
+
const fetchPRDiff = vi.spyOn(port, 'fetchPRDiff');
|
|
169
|
+
const getPRFileList = vi.spyOn(port, 'getPRFileList');
|
|
170
|
+
const getPRCommitMessages = vi.spyOn(port, 'getPRCommitMessages');
|
|
171
|
+
const fetchPRDetails = vi.spyOn(port, 'fetchPRDetails');
|
|
172
|
+
const addCommentReaction = vi.spyOn(port, 'addCommentReaction');
|
|
173
|
+
const fetchGraphFromBranch = vi.spyOn(port, 'fetchGraphFromBranch');
|
|
174
|
+
const fetchGraphMetadata = vi.spyOn(port, 'fetchGraphMetadata');
|
|
175
|
+
const adapter = new GitHubForgeAdapter({ client: port, token: 't', owner: 'a', repo: 'b' });
|
|
176
|
+
await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
177
|
+
expect(fetchPRDiff).not.toHaveBeenCalled();
|
|
178
|
+
expect(getPRFileList).not.toHaveBeenCalled();
|
|
179
|
+
expect(getPRCommitMessages).not.toHaveBeenCalled();
|
|
180
|
+
expect(fetchPRDetails).not.toHaveBeenCalled();
|
|
181
|
+
expect(addCommentReaction).not.toHaveBeenCalled();
|
|
182
|
+
expect(fetchGraphFromBranch).not.toHaveBeenCalled();
|
|
183
|
+
expect(fetchGraphMetadata).not.toHaveBeenCalled();
|
|
184
|
+
});
|
|
185
|
+
it('each stubbed read member throws a clear "not supported in CLI" error', async () => {
|
|
186
|
+
const port = createCliGitHubClientPort();
|
|
187
|
+
await expect(port.fetchPRDiff('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
188
|
+
await expect(port.fetchPRDetails('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
189
|
+
await expect(port.getPRFileList('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
190
|
+
await expect(port.getPRCommitMessages('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
191
|
+
await expect(port.addCommentReaction('a', 'b', 1, '+1', 't')).rejects.toThrow(/not supported in CLI/);
|
|
192
|
+
await expect(port.fetchGraphFromBranch('a', 'b', 't')).rejects.toThrow(/not supported in CLI/);
|
|
193
|
+
await expect(port.fetchGraphMetadata('a', 'b', 't')).rejects.toThrow(/not supported in CLI/);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=pr-postback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-postback.test.js","sourceRoot":"","sources":["../../src/lib/pr-postback.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAElC,SAAS,YAAY,CAAC,MAAc,EAAE,IAAa;IACjD,OAAO;QACL,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QACjC,MAAM;QACN,UAAU,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACtE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;KACtB,CAAC;AAChB,CAAC;AAED,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;AAC/C,MAAM,GAAG,GAAG;IACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;IACjF,GAAG,EAAE,EAAE;CACR,CAAC;AAEF,SAAS,YAAY,CAAC,KAAK,GAAG,KAAK;IACjC,OAAO,IAAI,kBAAkB,CAAC;QAC5B,MAAM,EAAE,yBAAyB,EAAE;QACnC,KAAK;QACL,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IAExC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,yCAAyC;QACzC,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,uBAAuB;QACvB,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,qBAAqB,WAAW,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE5C,6BAA6B;QAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QAEpE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC;QAC7E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QACrF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,uEAAuE;QACvE,SAAS,CAAC,qBAAqB,CAC7B,YAAY,CAAC,GAAG,EAAE;YAChB,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,qBAAqB,EAAE,EAAE;YACjD,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE;YACjC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,qBAAqB,EAAE,EAAE;SACpD,CAAC,CACH,CAAC;QACF,sDAAsD;QACtD,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,oBAAoB;QACpB,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEtE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,0CAA0C;QAC1C,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC;QAClE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACtD,0CAA0C;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,4BAA4B;QAC5B,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjF,oCAAoC;QACpC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,iEAAiE;QACjE,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAgB,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC;QACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAiC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IAExC,SAAS,YAAY,CAAC,KAAa,EAAE,OAAO,GAAG,CAAC,EAAE,QAAiB;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,EAAE,EAAE,OAAO,GAAG,CAAC;YACf,IAAI,EACF,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,OAAO,GAAG,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,EAAE;SAC9F,CAAC,CAAC,CAAC;IACN,CAAC;IAED,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;QACzC,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC5G,wFAAwF;QACxF,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAC9F,4DAA4D;QAC5D,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;QACrE,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAE1E,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEtE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,CAAC;QACjE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACrC,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4DAA4D,EAAE,GAAG,EAAE;IAC1E,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;QACzC,0EAA0E;QAC1E,4CAA4C;QAC5C,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACtD,MAAM,mBAAmB,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QACxD,MAAM,kBAAkB,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAChE,MAAM,oBAAoB,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACpE,MAAM,kBAAkB,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5F,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAClD,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;QACzC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACzF,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC5F,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC3F,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACtE,sBAAsB,CACvB,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3E,sBAAsB,CACvB,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC/F,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token resolution for the CLI PR post-back (`ghagga review --pr N`).
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (CI/Jenkins-first, interactive fallback):
|
|
5
|
+
* 1. env GITHUB_TOKEN — the GitHub Actions / standard CI convention.
|
|
6
|
+
* 2. env GH_TOKEN — the `gh` CLI / alternate CI convention.
|
|
7
|
+
* 3. getStoredToken() — the interactive `ghagga login` stored token.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when no token resolves; the caller turns that into an
|
|
10
|
+
* actionable error ONLY when `--pr` was actually requested (no token is fine
|
|
11
|
+
* otherwise).
|
|
12
|
+
*/
|
|
13
|
+
/** Resolve a GitHub token: env GITHUB_TOKEN > env GH_TOKEN > stored login. */
|
|
14
|
+
export declare function resolvePrToken(env?: NodeJS.ProcessEnv, storedTokenFn?: () => string | null): string | null;
|
|
15
|
+
//# sourceMappingURL=pr-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.d.ts","sourceRoot":"","sources":["../../src/lib/pr-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,8EAA8E;AAC9E,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,aAAa,GAAE,MAAM,MAAM,GAAG,IAAqB,GAClD,MAAM,GAAG,IAAI,CAKf"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token resolution for the CLI PR post-back (`ghagga review --pr N`).
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (CI/Jenkins-first, interactive fallback):
|
|
5
|
+
* 1. env GITHUB_TOKEN — the GitHub Actions / standard CI convention.
|
|
6
|
+
* 2. env GH_TOKEN — the `gh` CLI / alternate CI convention.
|
|
7
|
+
* 3. getStoredToken() — the interactive `ghagga login` stored token.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when no token resolves; the caller turns that into an
|
|
10
|
+
* actionable error ONLY when `--pr` was actually requested (no token is fine
|
|
11
|
+
* otherwise).
|
|
12
|
+
*/
|
|
13
|
+
import { getStoredToken } from './config.js';
|
|
14
|
+
/** Resolve a GitHub token: env GITHUB_TOKEN > env GH_TOKEN > stored login. */
|
|
15
|
+
export function resolvePrToken(env = process.env, storedTokenFn = getStoredToken) {
|
|
16
|
+
const fromEnv = env.GITHUB_TOKEN?.trim() || env.GH_TOKEN?.trim();
|
|
17
|
+
if (fromEnv)
|
|
18
|
+
return fromEnv;
|
|
19
|
+
const stored = storedTokenFn();
|
|
20
|
+
return stored?.trim() ? stored : null;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=pr-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.js","sourceRoot":"","sources":["../../src/lib/pr-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG,EACpC,gBAAqC,cAAc;IAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,OAAO,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.test.d.ts","sourceRoot":"","sources":["../../src/lib/pr-token.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { resolvePrToken } from './pr-token.js';
|
|
3
|
+
describe('resolvePrToken (env GITHUB_TOKEN > GH_TOKEN > stored)', () => {
|
|
4
|
+
it('prefers GITHUB_TOKEN over GH_TOKEN and stored', () => {
|
|
5
|
+
const token = resolvePrToken({ GITHUB_TOKEN: 'gh-primary', GH_TOKEN: 'gh-secondary' }, () => 'stored');
|
|
6
|
+
expect(token).toBe('gh-primary');
|
|
7
|
+
});
|
|
8
|
+
it('falls back to GH_TOKEN when GITHUB_TOKEN is unset', () => {
|
|
9
|
+
const token = resolvePrToken({ GH_TOKEN: 'gh-secondary' }, () => 'stored');
|
|
10
|
+
expect(token).toBe('gh-secondary');
|
|
11
|
+
});
|
|
12
|
+
it('falls back to the stored login token when no env token is set', () => {
|
|
13
|
+
const token = resolvePrToken({}, () => 'stored');
|
|
14
|
+
expect(token).toBe('stored');
|
|
15
|
+
});
|
|
16
|
+
it('returns null when no token resolves anywhere', () => {
|
|
17
|
+
const token = resolvePrToken({}, () => null);
|
|
18
|
+
expect(token).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
it('treats blank/whitespace env tokens as unset and falls through', () => {
|
|
21
|
+
const token = resolvePrToken({ GITHUB_TOKEN: ' ', GH_TOKEN: '' }, () => 'stored');
|
|
22
|
+
expect(token).toBe('stored');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=pr-token.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.test.js","sourceRoot":"","sources":["../../src/lib/pr-token.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAuB,EAC7E,GAAG,EAAE,CAAC,QAAQ,CACf,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAuB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAChG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAuB,EAC1D,GAAG,EAAE,CAAC,QAAQ,CACf,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghagga",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "AI-powered code review from the command line — free with GitHub Models",
|
|
@@ -38,17 +38,18 @@
|
|
|
38
38
|
"README.md"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@clack/prompts": "^1.
|
|
41
|
+
"@clack/prompts": "^1.5.1",
|
|
42
42
|
"chalk": "^5.6.0",
|
|
43
43
|
"fts5-sql-bundle": "^1.0.2",
|
|
44
|
-
"commander": "^
|
|
44
|
+
"commander": "^15.0.0",
|
|
45
45
|
"dotenv": "^17.4.2",
|
|
46
|
-
"ghagga-core": "3.
|
|
46
|
+
"ghagga-core": "3.1.0",
|
|
47
|
+
"ghagga-forge": "3.1.0"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
49
|
-
"tsx": "^4.22.
|
|
50
|
-
"typescript": "^
|
|
51
|
-
"vitest": "^4.1.
|
|
50
|
+
"tsx": "^4.22.4",
|
|
51
|
+
"typescript": "^6.0.3",
|
|
52
|
+
"vitest": "^4.1.9",
|
|
52
53
|
"@types/node": "^25.9.1"
|
|
53
54
|
},
|
|
54
55
|
"scripts": {
|