gcb-client 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.
@@ -1,225 +0,0 @@
1
- /**
2
- * `issue` — catalogued create/edit/comment actions, with person routes through the host broker.
3
- *
4
- * Without `--as-user` these run app identity. Bare `--as-user` keeps the catalog action with the user
5
- * identity. `--as-user <login>` writes a typed request for the host broker, which is also the route for
6
- * a repository the app is not installed on.
7
- */
8
- import { readFileSync } from 'node:fs';
9
- import { LOGIN } from 'gcb-core';
10
- import { fail, parseArgs, say, validateArgs } from 'gcb-core';
11
- import { runGh } from './gh.js';
12
- import { remoteRepo } from './remotes.js';
13
- import { submitToHostBroker } from './host-submit.js';
14
- /** Every flag the `--as-user` create path understands. */
15
- const KNOWN_FLAGS = new Set([
16
- 'help', 'h', 'title', 'body', 'body-file', 'repo', 'host', 'as-user', 'proxy', 'no-proxy',
17
- ]);
18
- /** Usage text for the host broker create path. */
19
- export const ISSUE_USAGE = `Usage: gcb issue create|edit|comment [--as-user] [options]
20
-
21
- Create, edit or comment on an issue. Without --as-user it runs through the app broker; bare
22
- --as-user uses the broker's authorized person; --as-user <login> writes a request for the host
23
- broker. issue edit <number> and issue comment <number> take the issue number as a positional.
24
-
25
- --title <text> The title (create/edit)
26
- --body <text> The body, inline, or use --body-file
27
- --body-file <path> The body, read from a file
28
- --repo <owner/name> The repository; with --as-user <login> it must be in the
29
- broker allowlist and needs no checkout of its own
30
- --as-user Use the broker's authorized person
31
- --as-user <login> Use ~/.config/gh-<login> on the host
32
- --proxy <url> Use this proxy for the host broker's gh call
33
- --no-proxy Reach GitHub directly for the host broker's gh call
34
- -h, --help Show this help
35
-
36
- The broker route (no --as-user or bare) takes --body/--body-file and catalogued flags such as
37
- --label/--assignee; the host route takes --body/--body-file, plus --title for edit.
38
- `;
39
- /** Drop one value-taking flag and its value, in either spelling. */
40
- function dropFlag(argv, name) {
41
- const out = [];
42
- for (let index = 0; index < argv.length; index += 1) {
43
- const argument = argv[index];
44
- if (argument === `--${name}` || argument === `-${name}`) {
45
- const next = argv[index + 1];
46
- if (next !== undefined && !next.startsWith('--'))
47
- index += 1;
48
- continue;
49
- }
50
- if (argument?.startsWith(`--${name}=`) || argument?.startsWith(`-${name}=`))
51
- continue;
52
- if (argument !== undefined)
53
- out.push(argument);
54
- }
55
- return out;
56
- }
57
- /** Translate --body-file into the catalogued --body value. */
58
- function forwardBodyFile(argv, bodyFile) {
59
- let body;
60
- try {
61
- body = readFileSync(bodyFile, 'utf8');
62
- }
63
- catch (error) {
64
- fail(`cannot read ${bodyFile}: ${error.message}`);
65
- }
66
- const rest = dropFlag(dropFlag(argv, 'body-file'), 'body');
67
- rest.push(`--body=${body}`);
68
- return rest;
69
- }
70
- /**
71
- * Run one `issue` command.
72
- *
73
- * @param argv - arguments after `issue`.
74
- * @returns the process exit code.
75
- */
76
- export async function runIssue(argv) {
77
- const args = parseArgs(argv, { booleans: ['help', 'no-proxy'], optionalValues: ['as-user'] });
78
- if (args.values('as-user').length > 1)
79
- fail('--as-user may only be given once');
80
- if (args.has('as-user') && args.values('as-user').length > 0) {
81
- fail('--as-user cannot be both bare and given a login');
82
- }
83
- if (args.has('no-proxy') && (args.has('proxy') || args.values('proxy').length > 0)) {
84
- fail('--proxy and --no-proxy are mutually exclusive');
85
- }
86
- const account = args.values('as-user')[0];
87
- const command = args.positionals[0];
88
- if (validateArgs(args, argv, account === undefined ? undefined : KNOWN_FLAGS, account === undefined || command === undefined ? undefined : `gcb issue ${command} --as-user`)) {
89
- if (command === undefined || command === 'create') {
90
- say(ISSUE_USAGE);
91
- return 0;
92
- }
93
- return runGh(['issue', command, '--help']);
94
- }
95
- if (command !== 'create') {
96
- if (account !== undefined) {
97
- if (command !== 'edit' && command !== 'comment') {
98
- fail('--as-user <login> only creates, edits or comments on an issue');
99
- }
100
- if (!LOGIN.test(account))
101
- fail(`--as-user must be a GitHub login, got ${JSON.stringify(account)}`);
102
- if (command === 'edit' &&
103
- args.value('title') === undefined &&
104
- args.value('body') === undefined &&
105
- args.value('body-file') === undefined) {
106
- fail('issue edit needs --title, --body or --body-file');
107
- }
108
- if (args.positionals.length > 2) {
109
- fail('unexpected argument ' + JSON.stringify(args.positionals[2]));
110
- }
111
- const number = args.positionals[1];
112
- if (number === undefined || !/^[1-9][0-9]*$/.test(number) || !Number.isSafeInteger(Number(number))) {
113
- fail('gcb issue ' + command + ' needs a safe positive issue number');
114
- }
115
- let repo = args.value('repo');
116
- const host = args.value('host');
117
- let requestHost = host;
118
- if ((args.has('repo') || args.values('repo').length > 0) && (repo === undefined || repo.trim() === '')) {
119
- fail('--repo needs a value');
120
- }
121
- if (repo === undefined) {
122
- const found = remoteRepo('origin', process.cwd());
123
- if (found === undefined)
124
- fail('--as-user <login> needs --repo for issue edit or comment');
125
- if (host !== undefined && found.host !== host.toLowerCase()) {
126
- fail(`the checkout's remote is on ${found.host}, but --host is ${host}; pass --repo or --host`);
127
- }
128
- repo = `${found.owner}/${found.repo}`;
129
- requestHost = host ?? found.host;
130
- }
131
- requestHost ??= 'github.com';
132
- let body = args.value('body');
133
- const bodyFile = args.value('body-file');
134
- if (bodyFile !== undefined) {
135
- try {
136
- body = readFileSync(bodyFile, 'utf8');
137
- }
138
- catch (error) {
139
- fail(`cannot read ${bodyFile}: ${error.message}`);
140
- }
141
- }
142
- if (command === 'comment' && args.value('title') !== undefined) {
143
- fail('--title is only supported for issue edit');
144
- }
145
- if (command === 'edit' && body === undefined && args.value('title') === undefined) {
146
- fail('issue edit needs --title, --body or --body-file');
147
- }
148
- const common = {
149
- repo,
150
- host: requestHost,
151
- number: Number(number),
152
- account,
153
- proxy: args.has('no-proxy') ? null : args.value('proxy'),
154
- session: 'issue',
155
- pid: process.pid,
156
- };
157
- const success = (answer) => (command === 'edit' ? 'edited issue #' : 'commented on issue #') +
158
- `${answer.number ?? '?'} as ${account}${answer.url === undefined ? '' : `: ${answer.url}`}`;
159
- if (command === 'edit') {
160
- return submitToHostBroker({
161
- kind: 'issue-edit',
162
- ...common,
163
- ...(args.value('title') === undefined ? {} : { title: args.value('title') }),
164
- ...(body === undefined ? {} : { body }),
165
- }, success);
166
- }
167
- return submitToHostBroker({ kind: 'issue-comment', ...common, body: body ?? '' }, success);
168
- }
169
- if (args.has('as-user') && command !== 'edit' && command !== 'comment') {
170
- fail('--as-user without a login only creates, edits or comments on an issue');
171
- }
172
- let rest = args.has('as-user') ? argv.filter((argument) => argument !== '--as-user' && argument !== '-as-user') : [...argv];
173
- const bodyFile = args.value('body-file');
174
- if (bodyFile !== undefined)
175
- rest = forwardBodyFile(rest, bodyFile);
176
- return runGh(['issue', ...rest], args.has('as-user') ? { identity: 'user' } : {});
177
- }
178
- if (args.has('as-user')) {
179
- // Bare --as-user is the broker's authorized person; the action decides which token to use.
180
- let rest = argv.filter((argument) => argument !== '--as-user' && argument !== '-as-user');
181
- const bodyFile = args.value('body-file');
182
- if (bodyFile !== undefined)
183
- rest = forwardBodyFile(rest, bodyFile);
184
- return runGh(['issue', ...rest], { identity: 'user' });
185
- }
186
- if (account === undefined) {
187
- const bodyFile = args.value('body-file');
188
- return runGh(['issue', ...(bodyFile === undefined ? argv : forwardBodyFile(argv, bodyFile))]);
189
- }
190
- if (!LOGIN.test(account))
191
- fail(`--as-user must be a GitHub login, got ${JSON.stringify(account)}`);
192
- if (args.has('host') || args.value('host') !== undefined) {
193
- fail('--host is not supported for issue create; use the checkout remote');
194
- }
195
- if (args.positionals.length > 1)
196
- fail('unexpected argument ' + JSON.stringify(args.positionals[1]));
197
- const repo = args.value('repo');
198
- if ((args.has('repo') || args.values('repo').length > 0) && (repo === undefined || repo.trim() === '')) {
199
- fail('--repo needs a value (e.g. owner/name)');
200
- }
201
- const title = args.value('title');
202
- if (title === undefined)
203
- fail('--title is required to create an issue');
204
- const bodyFile = args.value('body-file');
205
- let body = args.value('body') ?? '';
206
- if (bodyFile !== undefined) {
207
- try {
208
- body = readFileSync(bodyFile, 'utf8');
209
- }
210
- catch (error) {
211
- fail(`cannot read ${bodyFile}: ${error.message}`);
212
- }
213
- }
214
- return submitToHostBroker({
215
- kind: 'issue',
216
- ...(repo === undefined ? {} : { repo }),
217
- title,
218
- body,
219
- account,
220
- proxy: args.has('no-proxy') ? null : args.value('proxy'),
221
- session: 'issue',
222
- pid: process.pid,
223
- }, (answer) => `opened issue #${answer.number ?? '?'} as ${account}: ${answer.url ?? '(no url)'}`);
224
- }
225
- //# sourceMappingURL=issue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"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"}