@usine/github 0.0.1 → 0.1.1

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/README.md +117 -2
  2. package/dist/access.d.ts +48 -0
  3. package/dist/access.d.ts.map +1 -0
  4. package/dist/access.js +53 -0
  5. package/dist/access.js.map +1 -0
  6. package/dist/credentials.d.ts +28 -0
  7. package/dist/credentials.d.ts.map +1 -0
  8. package/dist/credentials.js +22 -0
  9. package/dist/credentials.js.map +1 -0
  10. package/dist/error.d.ts +36 -0
  11. package/dist/error.d.ts.map +1 -0
  12. package/dist/error.js +48 -0
  13. package/dist/error.js.map +1 -0
  14. package/dist/github-app.d.ts +30 -0
  15. package/dist/github-app.d.ts.map +1 -0
  16. package/dist/github-app.js +184 -0
  17. package/dist/github-app.js.map +1 -0
  18. package/dist/http.d.ts +18 -0
  19. package/dist/http.d.ts.map +1 -0
  20. package/dist/http.js +68 -0
  21. package/dist/http.js.map +1 -0
  22. package/dist/installation.d.ts +48 -0
  23. package/dist/installation.d.ts.map +1 -0
  24. package/dist/installation.js +40 -0
  25. package/dist/installation.js.map +1 -0
  26. package/dist/item-writer.d.ts +23 -0
  27. package/dist/item-writer.d.ts.map +1 -0
  28. package/dist/item-writer.js +67 -0
  29. package/dist/item-writer.js.map +1 -0
  30. package/dist/jwt.d.ts +11 -0
  31. package/dist/jwt.d.ts.map +1 -0
  32. package/dist/jwt.js +72 -0
  33. package/dist/jwt.js.map +1 -0
  34. package/dist/label-writer.d.ts +23 -0
  35. package/dist/label-writer.d.ts.map +1 -0
  36. package/dist/label-writer.js +54 -0
  37. package/dist/label-writer.js.map +1 -0
  38. package/dist/local-secrets.d.ts +28 -0
  39. package/dist/local-secrets.d.ts.map +1 -0
  40. package/dist/local-secrets.js +56 -0
  41. package/dist/local-secrets.js.map +1 -0
  42. package/dist/polling/content.d.ts +3 -0
  43. package/dist/polling/content.d.ts.map +1 -0
  44. package/dist/polling/content.js +24 -0
  45. package/dist/polling/content.js.map +1 -0
  46. package/dist/polling/detection.d.ts +55 -0
  47. package/dist/polling/detection.d.ts.map +1 -0
  48. package/dist/polling/detection.js +49 -0
  49. package/dist/polling/detection.js.map +1 -0
  50. package/dist/polling/labels.d.ts +31 -0
  51. package/dist/polling/labels.d.ts.map +1 -0
  52. package/dist/polling/labels.js +29 -0
  53. package/dist/polling/labels.js.map +1 -0
  54. package/dist/polling/payload.d.ts +565 -0
  55. package/dist/polling/payload.d.ts.map +1 -0
  56. package/dist/polling/payload.js +128 -0
  57. package/dist/polling/payload.js.map +1 -0
  58. package/dist/polling/polling.d.ts +24 -0
  59. package/dist/polling/polling.d.ts.map +1 -0
  60. package/dist/polling/polling.js +325 -0
  61. package/dist/polling/polling.js.map +1 -0
  62. package/dist/polling/queries.d.ts +3 -0
  63. package/dist/polling/queries.d.ts.map +1 -0
  64. package/dist/polling/queries.js +125 -0
  65. package/dist/polling/queries.js.map +1 -0
  66. package/package.json +32 -6
  67. package/dist/index.d.ts +0 -8
  68. package/dist/index.d.ts.map +0 -1
  69. package/dist/index.js +0 -8
  70. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/polling/payload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { RepositoryName } from "@usine/core/repository";
2
+ import { Context, Crypto, Effect, Layer, Option } from "effect";
3
+ import { HttpClient } from "effect/unstable/http";
4
+ import { GitHubApp } from "../github-app.ts";
5
+ import { type GitHubAppError } from "../error.ts";
6
+ import { EntityTag, PollCursor, type ChangeDetection, type ChangedItem } from "./detection.ts";
7
+ import { type PayloadSnapshot } from "./payload.ts";
8
+ import { RepositoryLabelCatalog, RepositoryLabelsNotModified } from "./labels.ts";
9
+ declare const GitHubPolling_base: Context.ServiceClass<GitHubPolling, "@usine/github/GitHubPolling", {
10
+ /** Finds issue and PR updates since the saved cursor; persist the returned cursor after processing the detected Items. */
11
+ readonly changes: (repository: RepositoryName, cursor: PollCursor) => Effect.Effect<ChangeDetection, GitHubAppError>;
12
+ /** Reads the repository's label catalog, or confirms the catalog named by `entityTag` is unchanged. */
13
+ readonly labels: (repository: RepositoryName, entityTag: Option.Option<EntityTag>) => Effect.Effect<RepositoryLabelCatalog | RepositoryLabelsNotModified, GitHubAppError>;
14
+ /** Fetches an Item's selection and prompt payload together with its timestamp-independent content hash. */
15
+ readonly snapshot: (repository: RepositoryName, item: ChangedItem) => Effect.Effect<PayloadSnapshot, GitHubAppError>;
16
+ }>;
17
+ /** Finds changed GitHub Items and fetches the snapshots used to select work for Loops. */
18
+ export declare class GitHubPolling extends GitHubPolling_base {
19
+ static readonly layer: Layer.Layer<GitHubPolling, never, Crypto.Crypto | GitHubApp | HttpClient.HttpClient>;
20
+ }
21
+ export { EntityTag, PollCursor, ChangedIssue, ChangedPullRequest, ChangedItem, RepositoryNotModified, RepositoryChanges, ChangeDetection, } from "./detection.ts";
22
+ export { RepositoryLabelName, RepositoryLabelColor, RepositoryLabel, RepositoryLabelCatalog, RepositoryLabelsNotModified, RepositoryLabelDetection, } from "./labels.ts";
23
+ export { ContentHash, IssuePayload, PullRequestPayload, IssueSnapshot, PullRequestSnapshot, PayloadSnapshot, } from "./payload.ts";
24
+ //# sourceMappingURL=polling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/polling/polling.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAS,OAAO,EAAE,MAAM,EAAY,MAAM,EAAE,KAAK,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACzF,OAAO,EAAE,UAAU,EAAyC,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY7C,OAAO,EAAwB,KAAK,cAAc,EAAwB,MAAM,aAAa,CAAC;AAC9F,OAAO,EAGL,SAAS,EACT,UAAU,EAGV,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,sBAAsB,EAEtB,2BAA2B,EAE5B,MAAM,aAAa,CAAC;;IAkJjB,0HAA0H;sBACxG,CAChB,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,UAAU,KACf,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;IACnD,uGAAuG;qBACtF,CACf,UAAU,EAAE,cAAc,EAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,sBAAsB,GAAG,2BAA2B,EAAE,cAAc,CAAC;IACxF,2GAA2G;uBACxF,CACjB,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,WAAW,KACd,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;;AAlBvD,0FAA0F;AAC1F,qBAAa,aAAc,SAAQ,kBAmBD;IAChC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAChC,aAAa,EACb,KAAK,EACL,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,UAAU,CAClD,CAsTC;CACH;AAED,OAAO,EACL,SAAS,EACT,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,325 @@
1
+ import { canonicalContent } from "./content.js";
2
+ import { RepositoryName, splitRepositoryName } from "@usine/core/repository";
3
+ import { Clock, Context, Crypto, DateTime, Effect, Layer, Option, Schema } from "effect";
4
+ import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
5
+ import { GitHubApp } from "../github-app.js";
6
+ import { API_ROOT, authorized, invalidResponse, pollIntervalMillis, rateLimitResetMillis, rateLimitRetryEpoch, retryAfterMillis, statusError, transportError, } from "../http.js";
7
+ import { GitHubRateLimitError } from "../error.js";
8
+ import { ChangedIssue, ChangedPullRequest, EntityTag, PollCursor, RepositoryChanges, RepositoryNotModified, } from "./detection.js";
9
+ import { ContentHash, IssuePayload, IssueSnapshot, PullRequestPayload, PullRequestSnapshot, } from "./payload.js";
10
+ import { RepositoryLabel, RepositoryLabelCatalog, RepositoryLabelColor, RepositoryLabelsNotModified, RepositoryLabelName, } from "./labels.js";
11
+ import { ISSUE_PAYLOAD_QUERY, PULL_REQUEST_PAYLOAD_QUERY } from "./queries.js";
12
+ const WATERMARK_OVERLAP_MS = 5_000;
13
+ const RATE_LIMIT_PRESSURE_THRESHOLD = 100;
14
+ /** Caps one cycle's REST walk. The watermark resumes the remainder next cycle. */
15
+ const MAX_CHANGE_PAGES = 10;
16
+ /** Caps one repository's label walk so a pathological catalog cannot run unbounded. */
17
+ const MAX_LABEL_PAGES = 100;
18
+ /** GraphQL rate limiting sometimes omits reset headers. Wait at least this long then. */
19
+ const GRAPHQL_RATE_LIMIT_FALLBACK_MS = 60_000;
20
+ const RestChangedItem = Schema.Struct({
21
+ number: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),
22
+ updatedAt: Schema.DateTimeUtcFromString,
23
+ pullRequest: Schema.optionalKey(Schema.Unknown),
24
+ }).pipe(Schema.encodeKeys({ updatedAt: "updated_at", pullRequest: "pull_request" }));
25
+ const RestChangedItems = Schema.Array(RestChangedItem);
26
+ const RestRepositoryLabels = Schema.Array(Schema.Struct({
27
+ name: RepositoryLabelName,
28
+ color: RepositoryLabelColor,
29
+ description: Schema.NullOr(Schema.String),
30
+ }));
31
+ const catalogLabel = ({ name, color, description, }) => new RepositoryLabel({ name, color, description: Option.fromNullishOr(description) });
32
+ /** The GraphQL transport envelope. `errors` arrives on HTTP 200 and must be read. */
33
+ const GraphqlEnvelope = Schema.Struct({
34
+ data: Schema.optionalKey(Schema.Unknown),
35
+ errors: Schema.optionalKey(Schema.Array(Schema.Struct({
36
+ message: Schema.String,
37
+ type: Schema.optionalKey(Schema.String),
38
+ }))),
39
+ });
40
+ const IssueData = Schema.Struct({
41
+ repository: Schema.OptionFromNullOr(Schema.Struct({ issue: Schema.OptionFromNullOr(IssuePayload) })),
42
+ });
43
+ const PullRequestData = Schema.Struct({
44
+ repository: Schema.OptionFromNullOr(Schema.Struct({ pullRequest: Schema.OptionFromNullOr(PullRequestPayload) })),
45
+ });
46
+ const dateTimeAt = (epochMillis) => DateTime.make(epochMillis);
47
+ const toChangedItems = (decoded) => decoded.map((item) => item.pullRequest === undefined
48
+ ? new ChangedIssue({ number: item.number, updatedAt: item.updatedAt })
49
+ : new ChangedPullRequest({ number: item.number, updatedAt: item.updatedAt }));
50
+ const latestDateTime = (candidates) => {
51
+ const epochs = candidates.flatMap((candidate) => Option.match(candidate, { onNone: () => [], onSome: (value) => [value] }));
52
+ if (epochs.length === 0)
53
+ return Option.none();
54
+ return dateTimeAt(Math.max(...epochs));
55
+ };
56
+ const requestBackoff = (headers, now) => latestDateTime([
57
+ retryAfterMillis(headers["retry-after"], now),
58
+ rateLimitResetMillis(headers, RATE_LIMIT_PRESSURE_THRESHOLD),
59
+ ]);
60
+ const nextPollAt = (headers, now) => latestDateTime([
61
+ pollIntervalMillis(headers, now),
62
+ retryAfterMillis(headers["retry-after"], now),
63
+ rateLimitResetMillis(headers, RATE_LIMIT_PRESSURE_THRESHOLD),
64
+ ]);
65
+ /** The `rel="next"` URL from a Link header when GitHub has more pages. */
66
+ const nextPageUrl = (link) => {
67
+ if (link === undefined)
68
+ return Option.none();
69
+ const match = /<(?<url>[^>]+)>;\s*rel="next"/u.exec(link);
70
+ return Option.fromNullishOr(match?.groups?.["url"]);
71
+ };
72
+ const sinceParameter = (watermark) => {
73
+ const epoch = DateTime.toEpochMillis(watermark) - WATERMARK_OVERLAP_MS;
74
+ return `${new Date(epoch - (epoch % 1_000)).toISOString().slice(0, 19)}Z`;
75
+ };
76
+ const changesUrl = (repository, cursor) => {
77
+ const { name, owner } = splitRepositoryName(repository);
78
+ const url = new URL(`${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues`);
79
+ url.searchParams.set("state", "all");
80
+ url.searchParams.set("sort", "updated");
81
+ url.searchParams.set("direction", "asc");
82
+ url.searchParams.set("per_page", "100");
83
+ if (Option.isSome(cursor.watermark)) {
84
+ url.searchParams.set("since", sinceParameter(cursor.watermark.value));
85
+ }
86
+ return url.toString();
87
+ };
88
+ const labelsUrl = (repository) => {
89
+ const { name, owner } = splitRepositoryName(repository);
90
+ const url = new URL(`${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/labels`);
91
+ url.searchParams.set("per_page", "100");
92
+ return url.toString();
93
+ };
94
+ const itemLabelsUrl = (repository, item) => {
95
+ const { name, owner } = splitRepositoryName(repository);
96
+ const url = new URL(`${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues/${item}/labels`);
97
+ url.searchParams.set("per_page", "100");
98
+ return url.toString();
99
+ };
100
+ const newerWatermark = (cursor, items) => {
101
+ const epochs = items.map(({ updatedAt }) => DateTime.toEpochMillis(updatedAt));
102
+ if (Option.isSome(cursor.watermark)) {
103
+ epochs.push(DateTime.toEpochMillis(cursor.watermark.value));
104
+ }
105
+ return epochs.length === 0 ? Option.none() : dateTimeAt(Math.max(...epochs));
106
+ };
107
+ /** Finds changed GitHub Items and fetches the snapshots used to select work for Loops. */
108
+ export class GitHubPolling extends Context.Service()("@usine/github/GitHubPolling") {
109
+ static layer = Layer.effect(GitHubPolling, Effect.gen(function* () {
110
+ const app = yield* GitHubApp;
111
+ const crypto = yield* Crypto.Crypto;
112
+ const http = yield* HttpClient.HttpClient;
113
+ const contentHash = makeContentHash(crypto);
114
+ const execute = Effect.fn("GitHubPolling.execute")(function* (operation, request) {
115
+ return yield* http
116
+ .execute(request)
117
+ .pipe(Effect.mapError((error) => transportError(operation, error)));
118
+ });
119
+ const changesPage = Effect.fn("GitHubPolling.changesPage")(function* (url) {
120
+ const token = yield* app.installationToken();
121
+ const request = HttpClientRequest.get(url).pipe(authorized(token.value));
122
+ const response = yield* execute("poll-repository-changes", request);
123
+ const now = yield* Clock.currentTimeMillis;
124
+ if (response.status !== 200) {
125
+ return yield* statusError("poll-repository-changes", response, now);
126
+ }
127
+ const decoded = yield* HttpClientResponse.schemaBodyJson(RestChangedItems)(response).pipe(Effect.mapError((error) => invalidResponse("poll-repository-changes", error.message)));
128
+ return {
129
+ items: toChangedItems(decoded),
130
+ next: nextPageUrl(response.headers.link),
131
+ };
132
+ });
133
+ const labelsPage = Effect.fn("GitHubPolling.labelsPage")(function* (operation, url) {
134
+ const token = yield* app.installationToken();
135
+ const request = HttpClientRequest.get(url).pipe(authorized(token.value));
136
+ const response = yield* execute(operation, request);
137
+ const now = yield* Clock.currentTimeMillis;
138
+ if (response.status !== 200) {
139
+ return yield* statusError(operation, response, now);
140
+ }
141
+ const decoded = yield* HttpClientResponse.schemaBodyJson(RestRepositoryLabels)(response).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
142
+ return {
143
+ labels: decoded.map(catalogLabel),
144
+ next: nextPageUrl(response.headers.link),
145
+ };
146
+ });
147
+ /** Walks the label pages after an already-fetched first page, under the label page cap. */
148
+ const remainingLabelPages = Effect.fn("GitHubPolling.remainingLabelPages")(function* (operation, firstPage) {
149
+ const catalog = [...firstPage.labels];
150
+ let next = firstPage.next;
151
+ let pages = 1;
152
+ while (Option.isSome(next) && pages < MAX_LABEL_PAGES) {
153
+ const page = yield* labelsPage(operation, next.value);
154
+ catalog.push(...page.labels);
155
+ next = page.next;
156
+ pages += 1;
157
+ }
158
+ if (Option.isSome(next)) {
159
+ return yield* invalidResponse(operation, `GitHub label list exceeded ${MAX_LABEL_PAGES} pages`);
160
+ }
161
+ return catalog.sort((left, right) => left.name.localeCompare(right.name));
162
+ });
163
+ const allLabels = Effect.fn("GitHubPolling.allLabels")(function* (operation, initialUrl) {
164
+ return yield* remainingLabelPages(operation, yield* labelsPage(operation, initialUrl));
165
+ });
166
+ const labels = Effect.fn("GitHubPolling.labels")(function* (repository, entityTag) {
167
+ yield* Effect.annotateCurrentSpan({ repository });
168
+ const token = yield* app.installationToken();
169
+ let request = HttpClientRequest.get(labelsUrl(repository)).pipe(authorized(token.value));
170
+ if (Option.isSome(entityTag)) {
171
+ request = HttpClientRequest.setHeader(request, "if-none-match", entityTag.value);
172
+ }
173
+ const response = yield* execute("list-repository-labels", request);
174
+ const now = yield* Clock.currentTimeMillis;
175
+ if (response.status === 304)
176
+ return new RepositoryLabelsNotModified();
177
+ if (response.status !== 200) {
178
+ return yield* statusError("list-repository-labels", response, now);
179
+ }
180
+ const firstPage = yield* HttpClientResponse.schemaBodyJson(RestRepositoryLabels)(response).pipe(Effect.mapError((error) => invalidResponse("list-repository-labels", error.message)));
181
+ const catalog = yield* remainingLabelPages("list-repository-labels", {
182
+ labels: firstPage.map(catalogLabel),
183
+ next: nextPageUrl(response.headers.link),
184
+ });
185
+ const catalogEntityTag = Schema.decodeUnknownOption(EntityTag)(response.headers.etag);
186
+ if (Option.isNone(catalogEntityTag)) {
187
+ yield* Effect.logWarning("GitHub omitted the label catalog ETag; next poll is unconditional", {
188
+ repository,
189
+ });
190
+ }
191
+ return new RepositoryLabelCatalog({ entityTag: catalogEntityTag, labels: catalog });
192
+ });
193
+ const changes = Effect.fn("GitHubPolling.changes")(function* (repository, cursor) {
194
+ const token = yield* app.installationToken();
195
+ let request = HttpClientRequest.get(changesUrl(repository, cursor)).pipe(authorized(token.value));
196
+ if (Option.isSome(cursor.entityTag)) {
197
+ request = HttpClientRequest.setHeader(request, "if-none-match", cursor.entityTag.value);
198
+ }
199
+ const response = yield* execute("poll-repository-changes", request);
200
+ const now = yield* Clock.currentTimeMillis;
201
+ const recommended = nextPollAt(response.headers, now);
202
+ if (response.status === 304) {
203
+ return new RepositoryNotModified({
204
+ cursor,
205
+ nextPollAt: recommended,
206
+ backoffUntil: requestBackoff(response.headers, now),
207
+ });
208
+ }
209
+ if (response.status !== 200) {
210
+ return yield* statusError("poll-repository-changes", response, now);
211
+ }
212
+ const decoded = yield* HttpClientResponse.schemaBodyJson(RestChangedItems)(response).pipe(Effect.mapError((error) => invalidResponse("poll-repository-changes", error.message)));
213
+ const items = toChangedItems(decoded);
214
+ // The ETag is efficiency only: a page without one costs conditional requests next cycle, never correctness.
215
+ // Only the first page's tag matches the canonical URL the next cycle re-requests.
216
+ const entityTag = Schema.decodeUnknownOption(EntityTag)(response.headers.etag);
217
+ if (Option.isNone(entityTag)) {
218
+ yield* Effect.logWarning("GitHub omitted the changes ETag; next poll is unconditional", {
219
+ repository,
220
+ });
221
+ }
222
+ const allItems = [...items];
223
+ let next = nextPageUrl(response.headers.link);
224
+ let pages = 1;
225
+ while (Option.isSome(next) && pages < MAX_CHANGE_PAGES) {
226
+ const page = yield* changesPage(next.value);
227
+ allItems.push(...page.items);
228
+ next = page.next;
229
+ pages += 1;
230
+ }
231
+ const backlog = Option.isSome(next);
232
+ if (backlog) {
233
+ yield* Effect.logInfo("GitHub changes walk hit the page cap; backlog remains", {
234
+ repository,
235
+ pages,
236
+ items: allItems.length,
237
+ });
238
+ }
239
+ return new RepositoryChanges({
240
+ cursor: new PollCursor({ entityTag, watermark: newerWatermark(cursor, allItems) }),
241
+ items: allItems,
242
+ backlog,
243
+ nextPollAt: recommended,
244
+ backoffUntil: requestBackoff(response.headers, now),
245
+ });
246
+ });
247
+ const graphql = Effect.fn("GitHubPolling.graphql")(function* (operation, repository, number, query, dataSchema) {
248
+ const token = yield* app.installationToken();
249
+ const { name, owner } = splitRepositoryName(repository);
250
+ const request = HttpClientRequest.post(`${API_ROOT}/graphql`).pipe(HttpClientRequest.bodyJsonUnsafe({ query, variables: { owner, name, number } }), authorized(token.value));
251
+ const response = yield* execute(operation, request);
252
+ const now = yield* Clock.currentTimeMillis;
253
+ if (response.status !== 200)
254
+ return yield* statusError(operation, response, now);
255
+ const envelope = yield* HttpClientResponse.schemaBodyJson(GraphqlEnvelope)(response).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
256
+ // GraphQL reports failures on HTTP 200. Rate limiting becomes a typed wait, and anything else keeps its messages for diagnosis.
257
+ if (envelope.errors !== undefined && envelope.errors.length > 0) {
258
+ const rateLimited = envelope.errors.some((error) => error.type === "RATE_LIMITED");
259
+ if (rateLimited) {
260
+ const retryAt = Option.getOrElse(rateLimitRetryEpoch(response.headers, now), () => now + GRAPHQL_RATE_LIMIT_FALLBACK_MS);
261
+ return yield* new GitHubRateLimitError({
262
+ operation,
263
+ retryAt: DateTime.makeUnsafe(retryAt),
264
+ message: "GitHub GraphQL asked the poller to wait before retrying",
265
+ });
266
+ }
267
+ return yield* invalidResponse(operation, `GraphQL errors: ${envelope.errors.map((error) => error.message).join("; ")}`);
268
+ }
269
+ return yield* Schema.decodeUnknownEffect(dataSchema)(envelope.data).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
270
+ });
271
+ const snapshot = Effect.fn("GitHubPolling.snapshot")((repository, item) => Effect.gen(function* () {
272
+ const completeLabels = Effect.fn("GitHubPolling.completeItemLabels")(function* (payload) {
273
+ if (payload.labels.nodes.length >= payload.labels.totalCount)
274
+ return payload.labels;
275
+ yield* Effect.logDebug("Completing truncated Item label connection for Board matching", {
276
+ repository,
277
+ item: item.number,
278
+ listedLabels: payload.labels.nodes.length,
279
+ totalLabels: payload.labels.totalCount,
280
+ });
281
+ const names = yield* allLabels("fetch-item-labels", itemLabelsUrl(repository, item.number));
282
+ return { totalCount: names.length, nodes: names.map(({ name }) => ({ name })) };
283
+ });
284
+ if (item._tag === "ChangedIssue") {
285
+ const data = yield* graphql("fetch-issue-snapshot", repository, item.number, ISSUE_PAYLOAD_QUERY, IssueData);
286
+ const payload = Option.flatMap(data.repository, ({ issue }) => issue);
287
+ if (Option.isNone(payload)) {
288
+ return yield* invalidResponse("fetch-issue-snapshot", `issue ${item.number} came back null — deleted, transferred, or access lost`);
289
+ }
290
+ const completePayload = {
291
+ ...payload.value,
292
+ labels: yield* completeLabels(payload.value),
293
+ };
294
+ return new IssueSnapshot({
295
+ payload: completePayload,
296
+ contentHash: yield* contentHash(completePayload),
297
+ });
298
+ }
299
+ const data = yield* graphql("fetch-pull-request-snapshot", repository, item.number, PULL_REQUEST_PAYLOAD_QUERY, PullRequestData);
300
+ const payload = Option.flatMap(data.repository, ({ pullRequest }) => pullRequest);
301
+ if (Option.isNone(payload)) {
302
+ return yield* invalidResponse("fetch-pull-request-snapshot", `pull request ${item.number} came back null — deleted or access lost`);
303
+ }
304
+ const completePayload = {
305
+ ...payload.value,
306
+ labels: yield* completeLabels(payload.value),
307
+ };
308
+ return new PullRequestSnapshot({
309
+ payload: completePayload,
310
+ contentHash: yield* contentHash(completePayload),
311
+ });
312
+ }));
313
+ return { changes, labels, snapshot };
314
+ }));
315
+ }
316
+ export { EntityTag, PollCursor, ChangedIssue, ChangedPullRequest, ChangedItem, RepositoryNotModified, RepositoryChanges, ChangeDetection, } from "./detection.js";
317
+ export { RepositoryLabelName, RepositoryLabelColor, RepositoryLabel, RepositoryLabelCatalog, RepositoryLabelsNotModified, RepositoryLabelDetection, } from "./labels.js";
318
+ export { ContentHash, IssuePayload, PullRequestPayload, IssueSnapshot, PullRequestSnapshot, PayloadSnapshot, } from "./payload.js";
319
+ const makeContentHash = (crypto) => Effect.fn("GitHubPolling.contentHash")(function* (payload) {
320
+ const encoded = new TextEncoder().encode(JSON.stringify(canonicalContent(payload)));
321
+ // An in-memory SHA-256 digest fails only on a broken platform, so a failure here is a defect.
322
+ const digest = yield* crypto.digest("SHA-256", encoded).pipe(Effect.orDie);
323
+ return ContentHash.make(Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join(""));
324
+ });
325
+ //# sourceMappingURL=polling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/polling/polling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,QAAQ,EACR,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAA6C,MAAM,aAAa,CAAC;AAC9F,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,qBAAqB,GAGtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE/E,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,kFAAkF;AAClF,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,uFAAuF;AACvF,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,yFAAyF;AACzF,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAE9C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC,qBAAqB;IACvC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;CAChD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AACrF,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACvD,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CACvC,MAAM,CAAC,MAAM,CAAC;IACZ,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;CAC1C,CAAC,CACH,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,EACpB,IAAI,EACJ,KAAK,EACL,WAAW,GACgC,EAAmB,EAAE,CAChE,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAEvF,qFAAqF;AACrF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;KACxC,CAAC,CACH,CACF;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,gBAAgB,CACjC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,CAChE;CACF,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,gBAAgB,CACjC,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAC5E;CACF,CAAC,CAAC;AAIH,MAAM,UAAU,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAEvE,MAAM,cAAc,GAAG,CAAC,OAAqC,EAAsB,EAAE,CACnF,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnB,IAAI,CAAC,WAAW,KAAK,SAAS;IAC5B,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACtE,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAC/E,CAAC;AAEJ,MAAM,cAAc,GAAG,CAAC,UAAgD,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9C,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAC1E,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,EAAgB,CAAC;IAC5D,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,GAAW,EAAE,EAAE,CACvD,cAAc,CAAC;IACb,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC;IAC7C,oBAAoB,CAAC,OAAO,EAAE,6BAA6B,CAAC;CAC7D,CAAC,CAAC;AAEL,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,GAAW,EAAE,EAAE,CACnD,cAAc,CAAC;IACb,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC;IAChC,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC;IAC7C,oBAAoB,CAAC,OAAO,EAAE,6BAA6B,CAAC;CAC7D,CAAC,CAAC;AAEL,0EAA0E;AAC1E,MAAM,WAAW,GAAG,CAAC,IAAwB,EAAyB,EAAE;IACtE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAAuB,EAAU,EAAE;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,oBAAoB,CAAC;IACvE,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,UAA0B,EAAE,MAAkB,EAAU,EAAE;IAC5E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,GAAG,QAAQ,UAAU,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CACpF,CAAC;IACF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,UAA0B,EAAU,EAAE;IACvD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,GAAG,QAAQ,UAAU,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CACpF,CAAC;IACF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,UAA0B,EAAE,IAAY,EAAU,EAAE;IACzE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,GAAG,QAAQ,UAAU,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CACnG,CAAC;IACF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAE,KAAiC,EAAE,EAAE;IAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF,0FAA0F;AAC1F,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,OAAO,EAmB/C,CAAC,6BAA6B,CAAC;IAChC,MAAM,CAAU,KAAK,GAIjB,KAAK,CAAC,MAAM,CACd,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAC1D,SAA0B,EAC1B,OAA4C;YAE5C,OAAO,KAAK,CAAC,CAAC,IAAI;iBACf,OAAO,CAAC,OAAO,CAAC;iBAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAW;YAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,yBAAyB,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CACvF,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACtF,CAAC;YACF,OAAO;gBACL,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC;gBAC9B,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;aAChC,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,EAChE,SAA0B,EAC1B,GAAW;YAEX,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAC5E,QAAQ,CACT,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9E,OAAO;gBACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;gBACjC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;aACzC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,2FAA2F;QAC3F,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EAClF,SAA0B,EAC1B,SAGC;YAED,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;YAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;gBACtD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACjB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,SAAS,EACT,8BAA8B,eAAe,QAAQ,CACtD,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAC9D,SAA0B,EAC1B,UAAkB;YAElB,OAAO,KAAK,CAAC,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EACxD,UAA0B,EAC1B,SAAmC;YAEnC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7C,IAAI,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzF,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YACnF,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,IAAI,2BAA2B,EAAE,CAAC;YACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,wBAAwB,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAC9E,QAAQ,CACT,CAAC,IAAI,CACJ,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACrF,CAAC;YACF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,wBAAwB,EAAE;gBACnE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;gBACnC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;aACzC,CAAC,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtF,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,mEAAmE,EACnE;oBACE,UAAU;iBACX,CACF,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,sBAAsB,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAC1D,UAA0B,EAC1B,MAAkB;YAElB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7C,IAAI,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CACtE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CACxB,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1F,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,IAAI,qBAAqB,CAAC;oBAC/B,MAAM;oBACN,UAAU,EAAE,WAAW;oBACvB,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;iBACpD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,yBAAyB,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CACvF,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACtF,CAAC;YACF,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACtC,4GAA4G;YAC5G,kFAAkF;YAClF,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,6DAA6D,EAAE;oBACtF,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YAC5B,IAAI,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;gBACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACjB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,uDAAuD,EAAE;oBAC7E,UAAU;oBACV,KAAK;oBACL,KAAK,EAAE,QAAQ,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,iBAAiB,CAAC;gBAC3B,MAAM,EAAE,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClF,KAAK,EAAE,QAAQ;gBACf,OAAO;gBACP,UAAU,EAAE,WAAW;gBACvB,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;aACpD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAG1D,SAA0B,EAC1B,UAA0B,EAC1B,MAAc,EACd,KAAa,EACb,UAAa;YAEb,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,IAAI,CAChE,iBAAiB,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAC/E,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CACxB,CAAC;YACF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACjF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CACvF,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACtE,CAAC;YACF,gIAAgI;YAChI,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;gBACnF,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAC9B,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,EAC1C,GAAG,EAAE,CAAC,GAAG,GAAG,8BAA8B,CAC3C,CAAC;oBACF,OAAO,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC;wBACrC,SAAS;wBACT,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;wBACrC,OAAO,EAAE,yDAAyD;qBACnE,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,SAAS,EACT,mBAAmB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACtE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAClD,CACE,UAA0B,EAC1B,IAAiB,EAC+B,EAAE,CAClD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAC5E,OAA0C;gBAE1C,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU;oBAAE,OAAO,OAAO,CAAC,MAAM,CAAC;gBACpF,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACpB,+DAA+D,EAC/D;oBACE,UAAU;oBACV,IAAI,EAAE,IAAI,CAAC,MAAM;oBACjB,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;oBACzC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU;iBACvC,CACF,CAAC;gBACF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAC5B,mBAAmB,EACnB,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CACvC,CAAC;gBACF,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAClF,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CACzB,sBAAsB,EACtB,UAAU,EACV,IAAI,CAAC,MAAM,EACX,mBAAmB,EACnB,SAAS,CACV,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACtE,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,sBAAsB,EACtB,SAAS,IAAI,CAAC,MAAM,wDAAwD,CAC7E,CAAC;gBACJ,CAAC;gBACD,MAAM,eAAe,GAAG;oBACtB,GAAG,OAAO,CAAC,KAAK;oBAChB,MAAM,EAAE,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;iBAC7C,CAAC;gBACF,OAAO,IAAI,aAAa,CAAC;oBACvB,OAAO,EAAE,eAAe;oBACxB,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC;iBACjD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CACzB,6BAA6B,EAC7B,UAAU,EACV,IAAI,CAAC,MAAM,EACX,0BAA0B,EAC1B,eAAe,CAChB,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;YAClF,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,6BAA6B,EAC7B,gBAAgB,IAAI,CAAC,MAAM,0CAA0C,CACtE,CAAC;YACJ,CAAC;YACD,MAAM,eAAe,GAAG;gBACtB,GAAG,OAAO,CAAC,KAAK;gBAChB,MAAM,EAAE,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;aAC7C,CAAC;YACF,OAAO,IAAI,mBAAmB,CAAC;gBAC7B,OAAO,EAAE,eAAe;gBACxB,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC;aACjD,CAAC,CAAC;QACL,CAAC,CAAC,CACL,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC,CACH,CAAC;CACH;AAED,OAAO,EACL,SAAS,EACT,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,eAAe,GAAG,CAAC,MAAqB,EAAE,EAAE,CAChD,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAoB;IACpE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpF,8FAA8F;IAC9F,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3E,OAAO,WAAW,CAAC,IAAI,CACrB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC1E,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const ISSUE_PAYLOAD_QUERY = "\n query UsineIssuePayload($owner: String!, $name: String!, $number: Int!) {\n repository(owner: $owner, name: $name) {\n issue(number: $number) {\n number\n title\n body\n url\n state\n stateReason\n createdAt\n updatedAt\n closedAt\n author { login }\n issueType { name }\n milestone { title }\n labels(first: 50) {\n totalCount\n nodes { name }\n }\n assignees(first: 10) {\n totalCount\n nodes { login }\n }\n comments(last: 20) {\n totalCount\n nodes {\n author { login }\n body\n createdAt\n }\n }\n closedByPullRequestsReferences(first: 10, includeClosedPrs: true) {\n totalCount\n nodes {\n number\n state\n isDraft\n url\n }\n }\n }\n }\n }\n";
2
+ export declare const PULL_REQUEST_PAYLOAD_QUERY = "\n query UsinePullRequestPayload($owner: String!, $name: String!, $number: Int!) {\n repository(owner: $owner, name: $name) {\n pullRequest(number: $number) {\n number\n title\n body\n url\n state\n isDraft\n merged\n createdAt\n updatedAt\n mergedAt\n author { login }\n baseRefName\n headRefName\n headRefOid\n additions\n deletions\n changedFiles\n reviewDecision\n statusCheckRollup { state }\n labels(first: 50) {\n totalCount\n nodes { name }\n }\n reviewRequests(first: 10) {\n totalCount\n nodes {\n requestedReviewer {\n ... on User { login }\n }\n }\n }\n reviews(last: 20) {\n totalCount\n nodes {\n author { login }\n state\n body\n submittedAt\n commit { oid }\n }\n }\n reviewThreads(first: 50) {\n totalCount\n nodes {\n isResolved\n isOutdated\n path\n comments(first: 10) {\n totalCount\n nodes {\n author { login }\n body\n }\n }\n }\n }\n comments(last: 20) {\n totalCount\n nodes {\n author { login }\n body\n createdAt\n }\n }\n closingIssuesReferences(first: 10) {\n totalCount\n nodes {\n number\n state\n }\n }\n }\n }\n }\n";
3
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/polling/queries.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,q9BA4C/B,CAAC;AAEF,eAAO,MAAM,0BAA0B,8qDA8EtC,CAAC"}
@@ -0,0 +1,125 @@
1
+ export const ISSUE_PAYLOAD_QUERY = `
2
+ query UsineIssuePayload($owner: String!, $name: String!, $number: Int!) {
3
+ repository(owner: $owner, name: $name) {
4
+ issue(number: $number) {
5
+ number
6
+ title
7
+ body
8
+ url
9
+ state
10
+ stateReason
11
+ createdAt
12
+ updatedAt
13
+ closedAt
14
+ author { login }
15
+ issueType { name }
16
+ milestone { title }
17
+ labels(first: 50) {
18
+ totalCount
19
+ nodes { name }
20
+ }
21
+ assignees(first: 10) {
22
+ totalCount
23
+ nodes { login }
24
+ }
25
+ comments(last: 20) {
26
+ totalCount
27
+ nodes {
28
+ author { login }
29
+ body
30
+ createdAt
31
+ }
32
+ }
33
+ closedByPullRequestsReferences(first: 10, includeClosedPrs: true) {
34
+ totalCount
35
+ nodes {
36
+ number
37
+ state
38
+ isDraft
39
+ url
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ `;
46
+ export const PULL_REQUEST_PAYLOAD_QUERY = `
47
+ query UsinePullRequestPayload($owner: String!, $name: String!, $number: Int!) {
48
+ repository(owner: $owner, name: $name) {
49
+ pullRequest(number: $number) {
50
+ number
51
+ title
52
+ body
53
+ url
54
+ state
55
+ isDraft
56
+ merged
57
+ createdAt
58
+ updatedAt
59
+ mergedAt
60
+ author { login }
61
+ baseRefName
62
+ headRefName
63
+ headRefOid
64
+ additions
65
+ deletions
66
+ changedFiles
67
+ reviewDecision
68
+ statusCheckRollup { state }
69
+ labels(first: 50) {
70
+ totalCount
71
+ nodes { name }
72
+ }
73
+ reviewRequests(first: 10) {
74
+ totalCount
75
+ nodes {
76
+ requestedReviewer {
77
+ ... on User { login }
78
+ }
79
+ }
80
+ }
81
+ reviews(last: 20) {
82
+ totalCount
83
+ nodes {
84
+ author { login }
85
+ state
86
+ body
87
+ submittedAt
88
+ commit { oid }
89
+ }
90
+ }
91
+ reviewThreads(first: 50) {
92
+ totalCount
93
+ nodes {
94
+ isResolved
95
+ isOutdated
96
+ path
97
+ comments(first: 10) {
98
+ totalCount
99
+ nodes {
100
+ author { login }
101
+ body
102
+ }
103
+ }
104
+ }
105
+ }
106
+ comments(last: 20) {
107
+ totalCount
108
+ nodes {
109
+ author { login }
110
+ body
111
+ createdAt
112
+ }
113
+ }
114
+ closingIssuesReferences(first: 10) {
115
+ totalCount
116
+ nodes {
117
+ number
118
+ state
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ `;
125
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/polling/queries.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ClC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EzC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@usine/github",
3
- "version": "0.0.1",
4
- "description": "GitHub integration for usine: polling change detection, per-stream GraphQL slice fetchers, App auth and token minting.",
3
+ "version": "0.1.1",
4
+ "description": "GitHub App authentication, installation discovery, project coverage, and scoped token minting for usine.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -14,16 +14,39 @@
14
14
  "type": "module",
15
15
  "sideEffects": false,
16
16
  "exports": {
17
- ".": {
18
- "types": "./dist/index.d.ts",
19
- "default": "./dist/index.js"
17
+ "./item-writer": {
18
+ "types": "./dist/item-writer.d.ts",
19
+ "default": "./dist/item-writer.js"
20
+ },
21
+ "./label-writer": {
22
+ "types": "./dist/label-writer.d.ts",
23
+ "default": "./dist/label-writer.js"
24
+ },
25
+ "./local-secrets": {
26
+ "types": "./dist/local-secrets.d.ts",
27
+ "default": "./dist/local-secrets.js"
28
+ },
29
+ "./polling": {
30
+ "types": "./dist/polling/polling.d.ts",
31
+ "default": "./dist/polling/polling.js"
32
+ },
33
+ "./github-app": {
34
+ "types": "./dist/github-app.d.ts",
35
+ "default": "./dist/github-app.js"
20
36
  }
21
37
  },
22
38
  "publishConfig": {
23
39
  "access": "public"
24
40
  },
41
+ "dependencies": {
42
+ "@usine/core": "0.2.0"
43
+ },
25
44
  "devDependencies": {
45
+ "@effect/platform-node": "4.0.0-rc.111",
46
+ "@effect/vitest": "4.0.0-rc.111",
47
+ "effect": "4.0.0-rc.111",
26
48
  "typescript": "7.0.2",
49
+ "vitest": "4.1.11",
27
50
  "@usine/tsconfig": "0.0.0"
28
51
  },
29
52
  "peerDependencies": {
@@ -33,6 +56,9 @@
33
56
  "node": ">=22"
34
57
  },
35
58
  "scripts": {
36
- "build": "tsc -b"
59
+ "build": "tsc -b",
60
+ "check": "tsc -p tsconfig.check.json",
61
+ "test": "vitest run --exclude 'test/integration/**'",
62
+ "test:integration": "vitest run test/integration/github-app.test.ts"
37
63
  }
38
64
  }
package/dist/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * @usine/github — GitHub integration for usine: polling change detection, per-stream GraphQL slice fetchers, App auth and token minting.
3
- *
4
- * Not implemented yet: this 0.0.x release reserves the block's seam while the
5
- * engine grows.
6
- */
7
- export {};
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC"}
package/dist/index.js DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * @usine/github — GitHub integration for usine: polling change detection, per-stream GraphQL slice fetchers, App auth and token minting.
3
- *
4
- * Not implemented yet: this 0.0.x release reserves the block's seam while the
5
- * engine grows.
6
- */
7
- export {};
8
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC"}