@ascribed/review 0.1.2-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +183 -0
  3. package/dist/github/index.d.ts +7 -0
  4. package/dist/github/index.js +8 -0
  5. package/dist/github/index.js.map +1 -0
  6. package/dist/github/marker.d.ts +63 -0
  7. package/dist/github/marker.js +156 -0
  8. package/dist/github/marker.js.map +1 -0
  9. package/dist/github/queries.d.ts +16 -0
  10. package/dist/github/queries.js +174 -0
  11. package/dist/github/queries.js.map +1 -0
  12. package/dist/github/read.d.ts +84 -0
  13. package/dist/github/read.js +141 -0
  14. package/dist/github/read.js.map +1 -0
  15. package/dist/github/repository.d.ts +30 -0
  16. package/dist/github/repository.js +77 -0
  17. package/dist/github/repository.js.map +1 -0
  18. package/dist/github/requests.d.ts +65 -0
  19. package/dist/github/requests.js +274 -0
  20. package/dist/github/requests.js.map +1 -0
  21. package/dist/github/session.d.ts +143 -0
  22. package/dist/github/session.js +581 -0
  23. package/dist/github/session.js.map +1 -0
  24. package/dist/github/transport.d.ts +33 -0
  25. package/dist/github/transport.js +206 -0
  26. package/dist/github/transport.js.map +1 -0
  27. package/dist/marks/index.d.ts +92 -0
  28. package/dist/marks/index.js +766 -0
  29. package/dist/marks/index.js.map +1 -0
  30. package/dist/overlay/index.d.ts +4 -0
  31. package/dist/overlay/index.js +7 -0
  32. package/dist/overlay/index.js.map +1 -0
  33. package/dist/overlay/markdown.d.ts +4 -0
  34. package/dist/overlay/markdown.js +368 -0
  35. package/dist/overlay/markdown.js.map +1 -0
  36. package/dist/overlay/overlay.d.ts +47 -0
  37. package/dist/overlay/overlay.js +1710 -0
  38. package/dist/overlay/overlay.js.map +1 -0
  39. package/dist/overlay/style.d.ts +1 -0
  40. package/dist/overlay/style.js +570 -0
  41. package/dist/overlay/style.js.map +1 -0
  42. package/dist/overlay/text.d.ts +33 -0
  43. package/dist/overlay/text.js +200 -0
  44. package/dist/overlay/text.js.map +1 -0
  45. package/dist/overlay/types.d.ts +60 -0
  46. package/dist/overlay/types.js +2 -0
  47. package/dist/overlay/types.js.map +1 -0
  48. package/dist/place/anchor.d.ts +23 -0
  49. package/dist/place/anchor.js +49 -0
  50. package/dist/place/anchor.js.map +1 -0
  51. package/dist/place/index.d.ts +4 -0
  52. package/dist/place/index.js +6 -0
  53. package/dist/place/index.js.map +1 -0
  54. package/dist/place/lines.d.ts +56 -0
  55. package/dist/place/lines.js +280 -0
  56. package/dist/place/lines.js.map +1 -0
  57. package/dist/place/place.d.ts +77 -0
  58. package/dist/place/place.js +182 -0
  59. package/dist/place/place.js.map +1 -0
  60. package/dist/shared/errors.d.ts +40 -0
  61. package/dist/shared/errors.js +22 -0
  62. package/dist/shared/errors.js.map +1 -0
  63. package/dist/shared/git.d.ts +4 -0
  64. package/dist/shared/git.js +29 -0
  65. package/dist/shared/git.js.map +1 -0
  66. package/dist/shared/types.d.ts +56 -0
  67. package/dist/shared/types.js +3 -0
  68. package/dist/shared/types.js.map +1 -0
  69. package/package.json +61 -0
  70. package/src/marks/marks.css +361 -0
@@ -0,0 +1,581 @@
1
+ // A review session: one pull request's threads, placed on pages, and the
2
+ // viewer's pending review that new comments go into.
3
+ import { readFileSync, realpathSync, statSync } from "node:fs";
4
+ import path from "node:path";
5
+ import { parse } from "smol-toml";
6
+ import { formatSource, parseSource } from "../place/anchor.js";
7
+ import { lineMap, parseHunks } from "../place/lines.js";
8
+ import { locateThreads, placeOnPage, } from "../place/place.js";
9
+ import { ReviewError } from "../shared/errors.js";
10
+ import { gitMaybe } from "../shared/git.js";
11
+ import { formatSection, joinSections, PLACEHOLDER, withoutPlaceholder } from "./marker.js";
12
+ import { ADD_REPLY, ADD_REVIEW, ADD_THREAD, DELETE_COMMENT, DELETE_REVIEW, FIND_PULL_REQUEST, RESOLVE, SUBMIT_REVIEW, UNRESOLVE, UPDATE_REVIEW, VIEWER, } from "./queries.js";
13
+ import { markedThreads, readConversation, readFiles, readRestOfComments, readReviews, readReviewThreads, toComment, toThread, } from "./read.js";
14
+ import { readCheckout } from "./repository.js";
15
+ import { ghTransport } from "./transport.js";
16
+ /**
17
+ * Opens a review of the pull request for the project's checkout: the open
18
+ * pull request whose head is the current branch. Resolves with `undefined`
19
+ * when there's none, or `HEAD` is detached.
20
+ */
21
+ export async function openReview(options) {
22
+ const checkout = await readCheckout(options.projectDir);
23
+ const transportFor = options.transport ?? ((host) => ghTransport({ host }));
24
+ const found = await findPullRequest(checkout, transportFor);
25
+ if (found === undefined)
26
+ return undefined;
27
+ const contentPrefix = options.contentPrefix ?? contentPrefixOf(checkout.root, options.projectDir);
28
+ return createSession({
29
+ root: checkout.root,
30
+ contentPrefix,
31
+ pullRequest: found,
32
+ transport: transportFor(found.repository.host),
33
+ mutationInterval: options.mutationInterval ?? 1000,
34
+ });
35
+ }
36
+ /** The content root's path in the repository, from the project's `ascribe.toml`. */
37
+ export function contentPrefixOf(root, projectDir) {
38
+ const configPath = path.join(projectDir, "ascribe.toml");
39
+ let contentRoot = "docs";
40
+ try {
41
+ const table = parse(readFileSync(configPath, "utf8"));
42
+ const project = table["project"];
43
+ if (typeof project === "object" && project !== null && !Array.isArray(project)) {
44
+ const value = project["content-root"];
45
+ if (typeof value === "string")
46
+ contentRoot = value;
47
+ }
48
+ }
49
+ catch (error) {
50
+ throw new ReviewError("not-found", `Couldn't read ${configPath}.`, { cause: error });
51
+ }
52
+ const real = (p) => {
53
+ try {
54
+ return realpathSync.native(p);
55
+ }
56
+ catch {
57
+ return path.resolve(p);
58
+ }
59
+ };
60
+ const relative = path.relative(real(root), real(path.resolve(projectDir, contentRoot)));
61
+ if (relative === "")
62
+ return "";
63
+ return `${relative.split(path.sep).join("/")}/`;
64
+ }
65
+ /**
66
+ * The open pull request whose head is the checkout's branch, looked for in an
67
+ * `upstream` remote's repository and then in the one the branch is pushed to.
68
+ */
69
+ export async function findPullRequest(checkout, transportFor) {
70
+ const head = checkout.head;
71
+ if (checkout.headRef === undefined || head === undefined)
72
+ return undefined;
73
+ for (const base of checkout.bases) {
74
+ const data = await transportFor(base.host).graphql(FIND_PULL_REQUEST, {
75
+ owner: base.owner,
76
+ name: base.name,
77
+ head: checkout.headRef,
78
+ });
79
+ const match = data.repository?.pullRequests.nodes.find((node) => node !== null &&
80
+ node.headRepositoryOwner?.login.toLowerCase() === head.owner.toLowerCase() &&
81
+ node.headRepository?.name.toLowerCase() === head.name.toLowerCase());
82
+ if (match === undefined || match === null)
83
+ continue;
84
+ return {
85
+ id: match.id,
86
+ number: match.number,
87
+ url: match.url,
88
+ repository: base,
89
+ baseRefName: match.baseRefName,
90
+ baseOid: match.baseRefOid,
91
+ headRefName: match.headRefName,
92
+ headOid: match.headRefOid,
93
+ local: await localState(checkout.root, checkout.headOid, match.headRefOid),
94
+ };
95
+ }
96
+ return undefined;
97
+ }
98
+ async function localState(root, local, head) {
99
+ if (local === head)
100
+ return "same";
101
+ if ((await gitMaybe(root, ["cat-file", "-e", `${head}^{commit}`])) === undefined) {
102
+ return "missing";
103
+ }
104
+ if ((await gitMaybe(root, ["merge-base", "--is-ancestor", local, head])) !== undefined) {
105
+ return "behind";
106
+ }
107
+ if ((await gitMaybe(root, ["merge-base", "--is-ancestor", head, local])) !== undefined) {
108
+ return "ahead";
109
+ }
110
+ return "diverged";
111
+ }
112
+ // GitHub's generic failure, which it gives for a moment after some changes
113
+ // (deleting a pending review): worth one more try.
114
+ const TRANSIENT = /something went wrong/i;
115
+ /** The most of a block's shown text a held comment quotes: a review's body can't be longer than 65,536 characters. */
116
+ const QUOTE_LIMIT = 2000;
117
+ // GitHub's errors when a line can't take a review comment.
118
+ const CANT_ANCHOR = /could not be resolved|must be part of the diff|is not part of the diff|line.*outside/i;
119
+ /**
120
+ * When each file the threads are on last changed in the working tree, as one
121
+ * string: a different one means the threads need locating again.
122
+ */
123
+ function worktreeStamp(root, threads) {
124
+ const files = [...new Set(threads.map((thread) => thread.repositoryPath))].sort();
125
+ return files
126
+ .map((file) => {
127
+ try {
128
+ const stat = statSync(path.join(root, ...file.split("/")));
129
+ return `${file}\0${stat.mtimeMs}\0${stat.size}`;
130
+ }
131
+ catch {
132
+ return `${file}\0-`;
133
+ }
134
+ })
135
+ .join("\n");
136
+ }
137
+ /** A session for a pull request already found. */
138
+ export function createSession(options) {
139
+ const { root, contentPrefix, pullRequest, transport } = options;
140
+ const key = {
141
+ owner: pullRequest.repository.owner,
142
+ name: pullRequest.repository.name,
143
+ number: pullRequest.number,
144
+ };
145
+ let state;
146
+ let files;
147
+ // The pending review this session made or wrote to, until a read shows it.
148
+ let known;
149
+ let viewer;
150
+ let lastMutation = 0;
151
+ let queue = Promise.resolve();
152
+ // The pending review just discarded. For a moment after, GitHub can still
153
+ // list it and its comments; reads leave them out until one doesn't.
154
+ let discarded;
155
+ const retryDelay = options.retryDelay ?? 2000;
156
+ /** A read, tried once more after a wait when GitHub fails it with its generic error. */
157
+ const read = async (run) => {
158
+ try {
159
+ return await run();
160
+ }
161
+ catch (error) {
162
+ if (!(error instanceof ReviewError &&
163
+ error.code === "refused" &&
164
+ TRANSIENT.test(error.message))) {
165
+ throw error;
166
+ }
167
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
168
+ return run();
169
+ }
170
+ };
171
+ const load = () => {
172
+ state ??= (async () => {
173
+ let [raw, conversation, reviews] = await Promise.all([
174
+ read(() => readReviewThreads(transport, key)),
175
+ read(() => readConversation(transport, key)),
176
+ read(() => readReviews(transport, key)),
177
+ ]);
178
+ if (discarded !== undefined) {
179
+ const gone = discarded;
180
+ const stale = reviews.some((review) => review.id === gone) ||
181
+ raw.some((thread) => thread.comments.nodes.some((c) => c?.state === "PENDING"));
182
+ if (stale) {
183
+ // The viewer has one pending review at most, so every pending
184
+ // comment was in the one discarded.
185
+ reviews = reviews.filter((review) => review.id !== gone);
186
+ raw = raw
187
+ .map((thread) => ({
188
+ ...thread,
189
+ comments: {
190
+ ...thread.comments,
191
+ nodes: thread.comments.nodes.filter((c) => c !== null && c.state !== "PENDING"),
192
+ },
193
+ }))
194
+ .filter((thread) => thread.comments.nodes.length > 0);
195
+ }
196
+ else {
197
+ discarded = undefined;
198
+ }
199
+ }
200
+ const pendingReview = reviews.find((review) => review.state === "PENDING" && review.viewerDidAuthor);
201
+ const threads = raw.map(toThread);
202
+ for (const comment of conversation) {
203
+ threads.push(...markedThreads(comment, contentPrefix, false));
204
+ }
205
+ for (const review of reviews) {
206
+ threads.push(...markedThreads(review, contentPrefix, review.state === "PENDING"));
207
+ }
208
+ const stamp = worktreeStamp(root, threads);
209
+ const first = locate(threads);
210
+ await first;
211
+ return { raw, reviews, threads, located: first, stamp, pendingReview };
212
+ })();
213
+ state.catch(() => {
214
+ state = undefined;
215
+ });
216
+ return state;
217
+ };
218
+ const locate = (threads) => locateThreads(threads, { root, contentPrefix, headOid: pullRequest.headOid });
219
+ // The threads located in the working tree: again once one of their files
220
+ // changed (saved), so they follow edits without reading GitHub again.
221
+ const located = async () => {
222
+ const current = await load();
223
+ const stamp = worktreeStamp(root, current.threads);
224
+ if (stamp !== current.stamp) {
225
+ current.stamp = stamp;
226
+ current.located = locate(current.threads);
227
+ }
228
+ return current.located;
229
+ };
230
+ // One change at a time, spaced out to stay under the secondary rate limit.
231
+ const mutate = (query, variables) => {
232
+ const run = queue.then(async () => {
233
+ const wait = lastMutation + options.mutationInterval - Date.now();
234
+ if (wait > 0)
235
+ await new Promise((resolve) => setTimeout(resolve, wait));
236
+ lastMutation = Date.now();
237
+ try {
238
+ return await transport.graphql(query, variables);
239
+ }
240
+ finally {
241
+ lastMutation = Date.now();
242
+ }
243
+ });
244
+ queue = run.catch(() => undefined);
245
+ return run;
246
+ };
247
+ const changed = () => {
248
+ state = undefined;
249
+ };
250
+ // After a change to one review thread, the cached threads take GitHub's
251
+ // answer instead of reading every comment again. When a read started
252
+ // since `before`, or the thread isn't in it, the next call reads again.
253
+ const patch = async (before, threadId, update) => {
254
+ if (before === undefined || state !== before)
255
+ return changed();
256
+ const current = await before;
257
+ const index = current.raw.findIndex((thread) => thread.id === threadId);
258
+ const raw = update(current.raw[index]);
259
+ if (raw === undefined || state !== before)
260
+ return changed();
261
+ const thread = toThread(raw);
262
+ if (index === -1) {
263
+ current.raw.push(raw);
264
+ current.threads.push(thread);
265
+ }
266
+ else {
267
+ current.raw[index] = raw;
268
+ const at = current.threads.findIndex((t) => t.id === threadId);
269
+ if (at === -1)
270
+ return changed();
271
+ current.threads[at] = thread;
272
+ }
273
+ current.stamp = worktreeStamp(root, current.threads);
274
+ current.located = locate(current.threads);
275
+ current.located.catch(() => {
276
+ if (state === before)
277
+ state = undefined;
278
+ });
279
+ };
280
+ const ensureReview = async () => {
281
+ const pendingReview = (await load()).pendingReview;
282
+ if (pendingReview !== undefined)
283
+ return pendingReview;
284
+ if (known !== undefined)
285
+ return known;
286
+ const data = await mutate(ADD_REVIEW, { pullRequestId: pullRequest.id, commit: pullRequest.headOid, body: PLACEHOLDER });
287
+ changed();
288
+ // A new pending review: the discarded one is gone from GitHub by now.
289
+ discarded = undefined;
290
+ known = { id: data.addPullRequestReview.pullRequestReview.id, body: PLACEHOLDER };
291
+ return known;
292
+ };
293
+ const findThread = async (threadId) => (await located()).find((thread) => thread.id === threadId);
294
+ const requireReviewThread = async (threadId) => {
295
+ const state = await load();
296
+ if (state.raw.some((thread) => thread.id === threadId))
297
+ return;
298
+ const thread = await findThread(threadId);
299
+ throw thread?.kind === "conversation"
300
+ ? new ReviewError("refused", "This is a comment on the pull request's conversation; GitHub can't reply to or resolve it as a thread.")
301
+ : new ReviewError("not-found", "That thread isn't in the pull request.");
302
+ };
303
+ // A block's lines at the head commit: every one of them has to be there, unchanged.
304
+ const atHead = async (anchor) => {
305
+ const range = parseSource(anchor.source);
306
+ if (range === undefined) {
307
+ throw new ReviewError("not-found", `${anchor.source} isn't a block's source.`);
308
+ }
309
+ const repositoryPath = `${contentPrefix}${range.path}`;
310
+ const map = await lineMap(root, pullRequest.headOid, repositoryPath, "to-commit");
311
+ const lines = [];
312
+ for (let line = range.first; line <= range.last; line++) {
313
+ const mapped = map.map(line);
314
+ if (mapped !== undefined && !mapped.replaced)
315
+ lines.push(mapped.line);
316
+ }
317
+ const first = lines[0];
318
+ const last = lines.at(-1);
319
+ if (first === undefined ||
320
+ last === undefined ||
321
+ lines.length !== range.last - range.first + 1) {
322
+ throw new ReviewError("push-first", pullRequest.local === "missing"
323
+ ? "The pull request's latest commit isn't in this checkout. Fetch it, then comment."
324
+ : "This block has changes that aren't in the pull request. Push them, then comment.");
325
+ }
326
+ return { range, repositoryPath, first, last };
327
+ };
328
+ const changedFiles = () => {
329
+ files ??= readFiles(transport, key);
330
+ files.catch(() => {
331
+ files = undefined;
332
+ });
333
+ return files;
334
+ };
335
+ // The lines of each file GitHub shows in the pull request's diff, and so
336
+ // takes comments on: its changes and three lines around them.
337
+ const shown = new Map();
338
+ const shownLines = (repositoryPath) => {
339
+ let hunks = shown.get(repositoryPath);
340
+ if (hunks === undefined) {
341
+ hunks = gitMaybe(root, [
342
+ "diff",
343
+ "--no-color",
344
+ "--no-ext-diff",
345
+ "--no-renames",
346
+ "--unified=3",
347
+ `${pullRequest.baseOid}...${pullRequest.headOid}`,
348
+ "--",
349
+ `:(literal)${repositoryPath}`,
350
+ ]).then((diff) => (diff === undefined ? undefined : parseHunks(diff)));
351
+ shown.set(repositoryPath, hunks);
352
+ }
353
+ return hunks;
354
+ };
355
+ return {
356
+ pullRequest,
357
+ async threads(page) {
358
+ return placeOnPage(page, await located());
359
+ },
360
+ async allThreads() {
361
+ return located();
362
+ },
363
+ async viewer() {
364
+ viewer ??= transport
365
+ .graphql(VIEWER, {})
366
+ .then((data) => data.viewer.login);
367
+ viewer.catch(() => {
368
+ viewer = undefined;
369
+ });
370
+ return viewer;
371
+ },
372
+ async commentTarget(anchor) {
373
+ let lines;
374
+ try {
375
+ lines = await atHead(anchor);
376
+ }
377
+ catch (error) {
378
+ if (error instanceof ReviewError && error.code === "push-first") {
379
+ return { kind: "push-first", message: error.message };
380
+ }
381
+ throw error;
382
+ }
383
+ if (!(await changedFiles()).has(lines.repositoryPath)) {
384
+ return { kind: "summary", reason: "file" };
385
+ }
386
+ const hunks = await shownLines(lines.repositoryPath);
387
+ // Without the base commit there's no telling: try, and hold it if GitHub refuses.
388
+ if (hunks === undefined)
389
+ return { kind: "thread" };
390
+ const inOne = hunks.some((hunk) => lines.first >= hunk.newStart && lines.last < hunk.newStart + hunk.newCount);
391
+ return inOne ? { kind: "thread" } : { kind: "summary", reason: "lines" };
392
+ },
393
+ async comment(anchor, body, page, shown) {
394
+ const { range, repositoryPath, first, last } = await atHead(anchor);
395
+ if ((await changedFiles()).has(repositoryPath)) {
396
+ const review = await ensureReview();
397
+ const before = state;
398
+ try {
399
+ const data = await mutate(ADD_THREAD, {
400
+ reviewId: review.id,
401
+ path: repositoryPath,
402
+ body,
403
+ line: last,
404
+ startLine: first === last ? null : first,
405
+ });
406
+ // GitHub answers a line away from the diff's changes with no thread
407
+ // and no error: it can't anchor the comment there.
408
+ const thread = data.addPullRequestReviewThread.thread;
409
+ if (thread !== null) {
410
+ try {
411
+ await readRestOfComments(transport, thread);
412
+ }
413
+ catch (error) {
414
+ // The thread is on GitHub: read it with the rest next time.
415
+ changed();
416
+ throw error;
417
+ }
418
+ // The pending review the cache read is the one the thread is in.
419
+ const cached = before && (await before).pendingReview?.id === review.id;
420
+ await patch(cached ? before : undefined, thread.id, (raw) => raw === undefined ? thread : undefined);
421
+ return toThread(thread);
422
+ }
423
+ changed();
424
+ }
425
+ catch (error) {
426
+ if (!(error instanceof ReviewError &&
427
+ error.code === "refused" &&
428
+ CANT_ANCHOR.test(error.message))) {
429
+ throw error;
430
+ }
431
+ }
432
+ }
433
+ // GitHub can't anchor it: hold it in the pending review's body, which
434
+ // goes on the conversation when the review is submitted.
435
+ const review = await ensureReview();
436
+ const text = shown?.trim();
437
+ const quote = text === undefined || text === ""
438
+ ? readFileSync(path.join(root, ...repositoryPath.split("/")), "utf8")
439
+ .split(/\r?\n/)
440
+ .slice(range.first - 1, range.last)
441
+ .join("\n")
442
+ : text.length > QUOTE_LIMIT
443
+ ? `${text.slice(0, QUOTE_LIMIT).trimEnd()}…`
444
+ : text;
445
+ const source = formatSource(range);
446
+ const section = formatSection({
447
+ source,
448
+ build: page.build,
449
+ body,
450
+ quote,
451
+ shown: text !== undefined && text !== "",
452
+ link: {
453
+ label: `${range.path}, line${range.first === range.last ? ` ${range.first}` : `s ${range.first}–${range.last}`}`,
454
+ url: blobUrl(pullRequest, repositoryPath, first, last),
455
+ },
456
+ });
457
+ const held = joinSections([withoutPlaceholder(review.body), section], undefined);
458
+ try {
459
+ await mutate(UPDATE_REVIEW, { reviewId: review.id, body: held });
460
+ }
461
+ catch (error) {
462
+ if (error instanceof ReviewError && /missing body/i.test(error.message)) {
463
+ throw new ReviewError("cant-hold", "You have unsent comments started on GitHub, and GitHub can't add this comment to them. Submit or discard them on GitHub, then comment again.", { cause: error });
464
+ }
465
+ throw error;
466
+ }
467
+ changed();
468
+ known = { id: review.id, body: held };
469
+ const [thread] = markedThreads({
470
+ id: review.id,
471
+ body: section,
472
+ createdAt: new Date().toISOString(),
473
+ url: pullRequest.url,
474
+ author: null,
475
+ }, contentPrefix, true);
476
+ if (thread === undefined)
477
+ throw new ReviewError("refused", "Couldn't write the comment.");
478
+ return thread;
479
+ },
480
+ async reply(threadId, body, when) {
481
+ await requireReviewThread(threadId);
482
+ const reviewId = when === "withReview" ? (await ensureReview()).id : undefined;
483
+ const before = state;
484
+ const data = await mutate(ADD_REPLY, { threadId, body, reviewId: reviewId ?? null });
485
+ const raw = data.addPullRequestReviewThreadReply.comment;
486
+ if (raw === null) {
487
+ changed();
488
+ throw new ReviewError("refused", "GitHub didn't add the reply.");
489
+ }
490
+ if (when === "now" && raw.state === "PENDING") {
491
+ // GitHub put the reply in the viewer's pending review instead of
492
+ // sending it. Take it back out, so nothing changes without asking.
493
+ changed();
494
+ await mutate(DELETE_COMMENT, { id: raw.id });
495
+ throw new ReviewError("reply-held", "GitHub adds replies to your unsent review while you have one. Add the reply to the review, or submit or discard the review first.");
496
+ }
497
+ // A pending reply counts only once the cache has the review it's in.
498
+ const cached = raw.state !== "PENDING" || (before && (await before).pendingReview?.id === reviewId);
499
+ await patch(cached ? before : undefined, threadId, (thread) => thread === undefined
500
+ ? undefined
501
+ : { ...thread, comments: { ...thread.comments, nodes: [...thread.comments.nodes, raw] } });
502
+ return toComment(raw);
503
+ },
504
+ async resolve(threadId, resolved) {
505
+ await requireReviewThread(threadId);
506
+ const before = state;
507
+ const data = await mutate(resolved ? RESOLVE : UNRESOLVE, { threadId });
508
+ const answer = data[resolved ? "resolveReviewThread" : "unresolveReviewThread"]?.thread;
509
+ await patch(answer ? before : undefined, threadId, (thread) => thread === undefined || answer == null
510
+ ? undefined
511
+ : {
512
+ ...thread,
513
+ isResolved: answer.isResolved ?? resolved,
514
+ viewerCanResolve: answer.viewerCanResolve ?? !resolved,
515
+ viewerCanUnresolve: answer.viewerCanUnresolve ?? resolved,
516
+ });
517
+ },
518
+ async pending() {
519
+ const state = await load();
520
+ if (state.pendingReview === undefined) {
521
+ return { id: undefined, threads: [], replies: [], conversation: [], count: 0 };
522
+ }
523
+ const threads = [];
524
+ const replies = [];
525
+ for (const raw of state.raw) {
526
+ const thread = toThread(raw);
527
+ if (thread.comments.length > 0 && thread.comments.every((c) => c.pending)) {
528
+ threads.push(thread);
529
+ }
530
+ else {
531
+ for (const comment of thread.comments) {
532
+ if (comment.pending)
533
+ replies.push({ threadId: thread.id, comment });
534
+ }
535
+ }
536
+ }
537
+ const conversation = markedThreads(state.pendingReview, contentPrefix, true);
538
+ return {
539
+ id: state.pendingReview.id,
540
+ threads,
541
+ replies,
542
+ conversation,
543
+ count: threads.reduce((sum, thread) => sum + thread.comments.length, 0) +
544
+ replies.length +
545
+ conversation.length,
546
+ };
547
+ },
548
+ async submit(event, body) {
549
+ const review = await ensureReview();
550
+ await mutate(SUBMIT_REVIEW, {
551
+ reviewId: review.id,
552
+ event,
553
+ body: joinSections([withoutPlaceholder(review.body)], body) || null,
554
+ });
555
+ changed();
556
+ known = undefined;
557
+ },
558
+ async discard() {
559
+ const pendingReview = (await load()).pendingReview ?? known;
560
+ if (pendingReview === undefined)
561
+ return;
562
+ await mutate(DELETE_REVIEW, { reviewId: pendingReview.id });
563
+ changed();
564
+ known = undefined;
565
+ discarded = pendingReview.id;
566
+ },
567
+ async refresh() {
568
+ state = undefined;
569
+ files = undefined;
570
+ shown.clear();
571
+ },
572
+ };
573
+ }
574
+ /** A link to lines of a file at the pull request's head commit. */
575
+ function blobUrl(pr, file, first, last) {
576
+ const { host, owner, name } = pr.repository;
577
+ const encoded = file.split("/").map(encodeURIComponent).join("/");
578
+ const lines = first === last ? `L${first}` : `L${first}-L${last}`;
579
+ return `https://${host}/${owner}/${name}/blob/${pr.headOid}/${encoded}#${lines}`;
580
+ }
581
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/github/session.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,qDAAqD;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,aAAa,EACb,WAAW,GAIZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,SAAS,EACT,aAAa,EACb,MAAM,GACP,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,QAAQ,GAIT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAyC,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAwB,MAAM,gBAAgB,CAAC;AA4GnE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B;IACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAClG,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,aAAa;QACb,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;KACnD,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,UAAkB;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,WAAW,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/E,MAAM,KAAK,GAAI,OAAmC,CAAC,cAAc,CAAC,CAAC;YACnE,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,WAAW,GAAG,KAAK,CAAC;QACrD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,iBAAiB,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClD,CAAC;AAcD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAsB,EACtB,YAA+C;IAE/C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3E,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,GAEN,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAC3D,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,QAAQ,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CACpD,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,KAAK,IAAI;YACb,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1E,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CACtE,CAAC;QACF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,UAAU;YACzB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,UAAU;YACzB,KAAK,EAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC;SAC3E,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY;IACjE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACjF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACvF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACvF,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AA0BD,2EAA2E;AAC3E,mDAAmD;AACnD,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAE1C,sHAAsH;AACtH,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,2DAA2D;AAC3D,MAAM,WAAW,GACf,uFAAuF,CAAC;AAE1F;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,OAA0B;IAC7D,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,KAAK,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,GAAG,GAAmB;QAC1B,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,KAAK;QACnC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI;QACjC,MAAM,EAAE,WAAW,CAAC,MAAM;KAC3B,CAAC;IACF,IAAI,KAAiC,CAAC;IACtC,IAAI,KAAuC,CAAC;IAC5C,2EAA2E;IAC3E,IAAI,KAA+C,CAAC;IACpD,IAAI,MAAmC,CAAC;IACxC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,KAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAChD,0EAA0E;IAC1E,oEAAoE;IACpE,IAAI,SAA6B,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IAE9C,wFAAwF;IACxF,MAAM,IAAI,GAAG,KAAK,EAAK,GAAqB,EAAc,EAAE;QAC1D,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CACH,KAAK,YAAY,WAAW;gBAC5B,KAAK,CAAC,IAAI,KAAK,SAAS;gBACxB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC9B,EAAE,CAAC;gBACF,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;YAChE,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAmB,EAAE;QAChC,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACnD,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC7C,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC5C,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;aACxC,CAAC,CAAC;YACH,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,SAAS,CAAC;gBACvB,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;oBAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;gBAClF,IAAI,KAAK,EAAE,CAAC;oBACV,8DAA8D;oBAC9D,oCAAoC;oBACpC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;oBACzD,GAAG,GAAG,GAAG;yBACN,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBAChB,GAAG,MAAM;wBACT,QAAQ,EAAE;4BACR,GAAG,MAAM,CAAC,QAAQ;4BAClB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;yBAChF;qBACF,CAAC,CAAC;yBACF,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAChC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,CACjE,CAAC;YACF,MAAM,OAAO,GAAa,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC5C,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,KAAK,CAAC;YACZ,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QACzE,CAAC,CAAC,EAAE,CAAC;QACL,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACf,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,OAA0B,EAA4B,EAAE,CACtE,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhF,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,OAAO,GAAG,KAAK,IAA8B,EAAE;QACnD,MAAM,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YACtB,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC,CAAC;IAEF,2EAA2E;IAC3E,MAAM,MAAM,GAAG,CAAI,KAAa,EAAE,SAAkC,EAAc,EAAE;QAClF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAClE,IAAI,IAAI,GAAG,CAAC;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACxE,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,CAAC,OAAO,CAAI,KAAK,EAAE,SAAS,CAAC,CAAC;YACtD,CAAC;oBAAS,CAAC;gBACT,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC,CAAC;IAEF,wEAAwE;IACxE,qEAAqE;IACrE,wEAAwE;IACxE,MAAM,KAAK,GAAG,KAAK,EACjB,MAAkC,EAClC,QAAgB,EAChB,MAA6D,EAC9C,EAAE;QACjB,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,OAAO,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,OAAO,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACzB,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YAC/D,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;YACzB,IAAI,KAAK,KAAK,MAAM;gBAAE,KAAK,GAAG,SAAS,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,IAA2C,EAAE;QACrE,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;QACnD,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,aAAa,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,UAAU,EACV,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAClF,CAAC;QACF,OAAO,EAAE,CAAC;QACV,sEAAsE;QACtE,SAAS,GAAG,SAAS,CAAC;QACtB,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,QAAgB,EAAsC,EAAE,CAChF,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAE7D,MAAM,mBAAmB,GAAG,KAAK,EAAE,QAAgB,EAAiB,EAAE;QACpE,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC;YAAE,OAAO;QAC/D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,EAAE,IAAI,KAAK,cAAc;YACnC,CAAC,CAAC,IAAI,WAAW,CACb,SAAS,EACT,wGAAwG,CACzG;YACH,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE,wCAAwC,CAAC,CAAC;IAC7E,CAAC,CAAC;IAEF,oFAAoF;IACpF,MAAM,MAAM,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,0BAA0B,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,cAAc,GAAG,GAAG,aAAa,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAClF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IACE,KAAK,KAAK,SAAS;YACnB,IAAI,KAAK,SAAS;YAClB,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,EAC7C,CAAC;YACD,MAAM,IAAI,WAAW,CACnB,YAAY,EACZ,WAAW,CAAC,KAAK,KAAK,SAAS;gBAC7B,CAAC,CAAC,kFAAkF;gBACpF,CAAC,CAAC,kFAAkF,CACvF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAyB,EAAE;QAC9C,KAAK,KAAK,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACf,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,yEAAyE;IACzE,8DAA8D;IAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuC,CAAC;IAC7D,MAAM,UAAU,GAAG,CAAC,cAAsB,EAA+B,EAAE;QACzE,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE;gBACrB,MAAM;gBACN,YAAY;gBACZ,eAAe;gBACf,cAAc;gBACd,aAAa;gBACb,GAAG,WAAW,CAAC,OAAO,MAAM,WAAW,CAAC,OAAO,EAAE;gBACjD,IAAI;gBACJ,aAAa,cAAc,EAAE;aAC9B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvE,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO;QACL,WAAW;QAEX,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,UAAU;YACd,OAAO,OAAO,EAAE,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,KAAK,SAAS;iBACjB,OAAO,CAAgC,MAAM,EAAE,EAAE,CAAC;iBAClD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,MAAM;YACxB,IAAI,KAAyC,CAAC;YAC9C,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAChE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxD,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC7C,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrD,kFAAkF;YAClF,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CACrF,CAAC;YACF,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;YACrC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,UAAU,EACV;wBACE,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,IAAI,EAAE,cAAc;wBACpB,IAAI;wBACJ,IAAI,EAAE,IAAI;wBACV,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;qBACzC,CACF,CAAC;oBACF,oEAAoE;oBACpE,mDAAmD;oBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC;oBACtD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBACpB,IAAI,CAAC;4BACH,MAAM,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC9C,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,4DAA4D;4BAC5D,OAAO,EAAE,CAAC;4BACV,MAAM,KAAK,CAAC;wBACd,CAAC;wBACD,iEAAiE;wBACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;wBACxE,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAC1D,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;wBACF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC1B,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CACH,KAAK,YAAY,WAAW;wBAC5B,KAAK,CAAC,IAAI,KAAK,SAAS;wBACxB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAChC,EAAE,CAAC;wBACF,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YACD,sEAAsE;YACtE,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;YAC3B,MAAM,KAAK,GACT,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;gBAC/B,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;qBAChE,KAAK,CAAC,OAAO,CAAC;qBACd,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;qBAClC,IAAI,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW;oBACzB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG;oBAC5C,CAAC,CAAC,IAAI,CAAC;YACb,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,aAAa,CAAC;gBAC5B,MAAM;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI;gBACJ,KAAK;gBACL,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;gBACxC,IAAI,EAAE;oBACJ,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;oBAChH,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC;iBACvD;aACF,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;YACjF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,WAAW,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxE,MAAM,IAAI,WAAW,CACnB,WAAW,EACX,8IAA8I,EAC9I,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,EAAE,CAAC;YACV,KAAK,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,aAAa,CAC5B;gBACE,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,MAAM,EAAE,IAAI;aACb,EACD,aAAa,EACb,IAAI,CACL,CAAC;YACF,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;YAC1F,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI;YAC9B,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAEtB,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAAC;YACzD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;gBACV,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9C,iEAAiE;gBACjE,mEAAmE;gBACnE,OAAO,EAAE,CAAC;gBACV,MAAM,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7C,MAAM,IAAI,WAAW,CACnB,YAAY,EACZ,mIAAmI,CACpI,CAAC;YACJ,CAAC;YACD,qEAAqE;YACrE,MAAM,MAAM,GACV,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC;YACvF,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAC5D,MAAM,KAAK,SAAS;gBAClB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAC5F,CAAC;YACF,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ;YAC9B,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC9B,EAAE,QAAQ,EAAE,CACb,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;YACxF,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAC5D,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,IAAI;gBACpC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,GAAG,MAAM;oBACT,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;oBACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,CAAC,QAAQ;oBACtD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,QAAQ;iBAC1D,CACN,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACjF,CAAC;YACD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,OAAO,GAA6B,EAAE,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtC,IAAI,OAAO,CAAC,OAAO;4BAAE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtE,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;YAC7E,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE;gBAC1B,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,KAAK,EACH,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;oBAChE,OAAO,CAAC,MAAM;oBACd,YAAY,CAAC,MAAM;aACtB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI;YACtB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;YACpC,MAAM,MAAM,CAAC,aAAa,EAAE;gBAC1B,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK;gBACL,IAAI,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI;aACpE,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;YACV,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,IAAI,KAAK,CAAC;YAC5D,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO;YACxC,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC;YACV,KAAK,GAAG,SAAS,CAAC;YAClB,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,OAAO;YACX,KAAK,GAAG,SAAS,CAAC;YAClB,KAAK,GAAG,SAAS,CAAC;YAClB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,SAAS,OAAO,CAAC,EAAmB,EAAE,IAAY,EAAE,KAAa,EAAE,IAAY;IAC7E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;IAClE,OAAO,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,EAAE,CAAC,OAAO,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;AACnF,CAAC"}
@@ -0,0 +1,33 @@
1
+ /** Sends one GraphQL request and resolves with its `data`. */
2
+ export interface GitHubTransport {
3
+ graphql<T>(query: string, variables: Record<string, unknown>): Promise<T>;
4
+ }
5
+ /** The oldest `gh` this package runs. */
6
+ export declare const MIN_GH_VERSION = "2.0.0";
7
+ /** Options for `ghTransport`. */
8
+ export interface GhTransportOptions {
9
+ /** The GitHub host: `github.com`, or a GitHub Enterprise Server host. */
10
+ host?: string;
11
+ /** The command to run. Defaults to `gh`, found on the path. */
12
+ command?: string;
13
+ }
14
+ /**
15
+ * A transport that runs `gh api graphql` with a fixed argument list: the
16
+ * query on standard input, each variable as an argument. `gh` uses its own
17
+ * sign-in for the host.
18
+ */
19
+ export declare function ghTransport(options?: GhTransportOptions): GitHubTransport;
20
+ /** Options for `tokenTransport`. */
21
+ export interface TokenTransportOptions {
22
+ /** The GitHub host: `github.com`, or a GitHub Enterprise Server host. */
23
+ host?: string;
24
+ /** The `fetch` to use. Defaults to the global one. */
25
+ fetch?: typeof fetch;
26
+ }
27
+ /**
28
+ * A transport that posts to the GraphQL API with `fetch`, using a token from
29
+ * `getToken`, which is called for each request so the host can refresh it.
30
+ */
31
+ export declare function tokenTransport(getToken: () => Promise<string | undefined> | string | undefined, options?: TokenTransportOptions): GitHubTransport;
32
+ /** The GraphQL endpoint for a host. */
33
+ export declare function graphqlUrl(host: string): string;