@usine/github 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -21
- package/README.md +35 -56
- package/dist/access.d.ts +30 -8
- package/dist/access.d.ts.map +1 -1
- package/dist/access.js +31 -8
- package/dist/access.js.map +1 -1
- package/dist/credentials.d.ts +6 -6
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +6 -6
- package/dist/credentials.js.map +1 -1
- package/dist/error.d.ts +28 -10
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +34 -7
- package/dist/error.js.map +1 -1
- package/dist/github-app.d.ts +19 -10
- package/dist/github-app.d.ts.map +1 -1
- package/dist/github-app.js +69 -30
- package/dist/github-app.js.map +1 -1
- package/dist/graphql.d.ts +11 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +47 -0
- package/dist/graphql.js.map +1 -0
- package/dist/http.d.ts +11 -5
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +27 -9
- package/dist/http.js.map +1 -1
- package/dist/installation.d.ts +17 -9
- package/dist/installation.d.ts.map +1 -1
- package/dist/installation.js +17 -9
- package/dist/installation.js.map +1 -1
- package/dist/item-history.d.ts +57 -0
- package/dist/item-history.d.ts.map +1 -0
- package/dist/item-history.js +190 -0
- package/dist/item-history.js.map +1 -0
- package/dist/item-writer.d.ts +3 -3
- package/dist/item-writer.d.ts.map +1 -1
- package/dist/item-writer.js +2 -2
- package/dist/item-writer.js.map +1 -1
- package/dist/jwt.d.ts +3 -3
- package/dist/jwt.d.ts.map +1 -1
- package/dist/jwt.js +4 -4
- package/dist/jwt.js.map +1 -1
- package/dist/label-writer.d.ts +3 -3
- package/dist/label-writer.d.ts.map +1 -1
- package/dist/label-writer.js +3 -3
- package/dist/label-writer.js.map +1 -1
- package/dist/local-secrets.d.ts +2 -2
- package/dist/local-secrets.d.ts.map +1 -1
- package/dist/local-secrets.js +6 -6
- package/dist/local-secrets.js.map +1 -1
- package/dist/polling/content.js +2 -2
- package/dist/polling/detection.d.ts +21 -10
- package/dist/polling/detection.d.ts.map +1 -1
- package/dist/polling/detection.js +20 -10
- package/dist/polling/detection.js.map +1 -1
- package/dist/polling/labels.d.ts +5 -5
- package/dist/polling/labels.d.ts.map +1 -1
- package/dist/polling/labels.js +5 -5
- package/dist/polling/labels.js.map +1 -1
- package/dist/polling/payload.d.ts +12 -8
- package/dist/polling/payload.d.ts.map +1 -1
- package/dist/polling/payload.js +17 -12
- package/dist/polling/payload.js.map +1 -1
- package/dist/polling/polling.d.ts +27 -9
- package/dist/polling/polling.d.ts.map +1 -1
- package/dist/polling/polling.js +94 -56
- package/dist/polling/polling.js.map +1 -1
- package/dist/polling/queries.d.ts +6 -1
- package/dist/polling/queries.d.ts.map +1 -1
- package/dist/polling/queries.js +16 -0
- package/dist/polling/queries.js.map +1 -1
- package/package.json +14 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../src/installation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../src/installation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,6DAA6D;AAC7D,eAAO,MAAM,cAAc,kDAAyD,CAAC;AACrF,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAC;AAExD,4EAA4E;AAC5E,eAAO,MAAM,YAAY,gDAAuD,CAAC;AACjF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,OAAO,sDAA4D,CAAC;AACjF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;;;;;;AAE1C,mEAAmE;AACnE,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;;AAEL,sEAAsE;AACtE,qBAAa,gBAAiB,SAAQ,qBAEb;CAAG;;;;;;AAE5B,yHAAyH;AACzH,qBAAa,gBAAiB,SAAQ,qBAMpC;CAAG;AAEL,yEAAyE;AACzE,eAAO,MAAM,UAAU,2EAAqD,CAAC;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAC;;;;;;AAEhD,0EAA0E;AAC1E,qBAAa,iBAAkB,SAAQ,sBAMrC;CAAG;AAEL,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,gEAAwD,CAAC;AACjG,MAAM,MAAM,2BAA2B,GAAG,OAAO,2BAA2B,CAAC,IAAI,CAAC;;;;;AAElF,gEAAgE;AAChE,qBAAa,0BAA2B,SAAQ,+BAK9C;CAAG"}
|
package/dist/installation.js
CHANGED
|
@@ -1,37 +1,45 @@
|
|
|
1
|
+
import { LoopPermissions } from "@usine/core/loop";
|
|
1
2
|
import { RepositoryName } from "@usine/core/repository";
|
|
2
3
|
import { Schema } from "effect";
|
|
3
4
|
const PositiveInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1));
|
|
4
|
-
/** The
|
|
5
|
+
/** The ID of an installation of the factory's GitHub App. */
|
|
5
6
|
export const InstallationId = PositiveInt.pipe(Schema.brand("GitHubInstallationId"));
|
|
6
|
-
/** GitHub's numeric repository
|
|
7
|
+
/** GitHub's numeric repository ID, used to restrict installation tokens. */
|
|
7
8
|
export const RepositoryId = PositiveInt.pipe(Schema.brand("GitHubRepositoryId"));
|
|
8
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* The App's URL name. GitHub's GraphQL API reports the App's own changes with a `Bot` actor
|
|
11
|
+
* whose login is this slug; the REST login adds `[bot]`.
|
|
12
|
+
*/
|
|
13
|
+
export const AppSlug = Schema.NonEmptyString.pipe(Schema.brand("GitHubAppSlug"));
|
|
14
|
+
/** The App installation, its owner account, and the App's slug. */
|
|
9
15
|
export class Installation extends Schema.Class("@usine/github/Installation")({
|
|
10
16
|
id: InstallationId,
|
|
11
17
|
accountLogin: Schema.NonEmptyString,
|
|
18
|
+
appSlug: AppSlug,
|
|
12
19
|
}) {
|
|
13
20
|
}
|
|
14
|
-
/**
|
|
21
|
+
/** A token scope that covers every repository of the installation. */
|
|
15
22
|
export class InstallationWide extends Schema.TaggedClass("@usine/github/TokenScope/InstallationWide")("InstallationWide", {}) {
|
|
16
23
|
}
|
|
17
|
-
/**
|
|
24
|
+
/** A token scope restricted to one Attempt's repository, at the Loop's permission level (`WORKER_TOKEN_PERMISSIONS`). */
|
|
18
25
|
export class SingleRepository extends Schema.TaggedClass("@usine/github/TokenScope/SingleRepository")("SingleRepository", {
|
|
19
26
|
repository: RepositoryName,
|
|
20
27
|
repositoryId: RepositoryId,
|
|
28
|
+
permissions: LoopPermissions,
|
|
21
29
|
}) {
|
|
22
30
|
}
|
|
23
|
-
/** The repository
|
|
31
|
+
/** The repository scope requested when minting an installation token. */
|
|
24
32
|
export const TokenScope = Schema.Union([InstallationWide, SingleRepository]);
|
|
25
|
-
/** A redacted installation
|
|
33
|
+
/** A redacted installation token with its expiry and repository scope. */
|
|
26
34
|
export class InstallationToken extends Schema.Class("@usine/github/InstallationToken")({
|
|
27
35
|
value: Schema.Redacted(Schema.NonEmptyString, { disallowJsonEncode: true }),
|
|
28
36
|
expiresAt: Schema.DateTimeUtc,
|
|
29
37
|
scope: TokenScope,
|
|
30
38
|
}) {
|
|
31
39
|
}
|
|
32
|
-
/**
|
|
40
|
+
/** The reason installation discovery couldn't select one usable installation. */
|
|
33
41
|
export const InstallationDiscoveryReason = Schema.Literals(["missing", "multiple", "suspended"]);
|
|
34
|
-
/** The App has no
|
|
42
|
+
/** The error when the App has no single active installation. */
|
|
35
43
|
export class InstallationDiscoveryError extends Schema.TaggedError("@usine/github/InstallationDiscoveryError")("InstallationDiscoveryError", {
|
|
36
44
|
reason: InstallationDiscoveryReason,
|
|
37
45
|
message: Schema.NonEmptyString,
|
package/dist/installation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../src/installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvE,
|
|
1
|
+
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../src/installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAGrF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAGjF;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;AAGjF,mEAAmE;AACnE,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,KAAK,CAAe,4BAA4B,CAAC,CAAC;IACzF,EAAE,EAAE,cAAc;IAClB,YAAY,EAAE,MAAM,CAAC,cAAc;IACnC,OAAO,EAAE,OAAO;CACjB,CAAC;CAAG;AAEL,sEAAsE;AACtE,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,CACtD,2CAA2C,CAC5C,CAAC,kBAAkB,EAAE,EAAE,CAAC;CAAG;AAE5B,yHAAyH;AACzH,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,CACtD,2CAA2C,CAC5C,CAAC,kBAAkB,EAAE;IACpB,UAAU,EAAE,cAAc;IAC1B,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,eAAe;CAC7B,CAAC;CAAG;AAEL,yEAAyE;AACzE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAG7E,0EAA0E;AAC1E,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,KAAK,CACjD,iCAAiC,CAClC,CAAC;IACA,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3E,SAAS,EAAE,MAAM,CAAC,WAAW;IAC7B,KAAK,EAAE,UAAU;CAClB,CAAC;CAAG;AAEL,iFAAiF;AACjF,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AAGjG,gEAAgE;AAChE,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,CAChE,0CAA0C,CAC3C,CAAC,4BAA4B,EAAE;IAC9B,MAAM,EAAE,2BAA2B;IACnC,OAAO,EAAE,MAAM,CAAC,cAAc;CAC/B,CAAC;CAAG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ItemNumber } from "@usine/core/item";
|
|
2
|
+
import { RepositoryName } from "@usine/core/repository";
|
|
3
|
+
import { Context, DateTime, Effect, Layer, Schema } from "effect";
|
|
4
|
+
import { HttpClient } from "effect/http";
|
|
5
|
+
import { GitHubItemNotFoundError, type GitHubAppError } from "./error.ts";
|
|
6
|
+
import { GitHubApp } from "./github-app.ts";
|
|
7
|
+
import { RepositoryLabel } from "./polling/labels.ts";
|
|
8
|
+
declare const LabelAdded_base: Schema.Class<LabelAdded, Schema.TaggedStruct<"LabelAdded", {
|
|
9
|
+
readonly at: Schema.DateTimeUtc;
|
|
10
|
+
readonly label: typeof RepositoryLabel;
|
|
11
|
+
}>, {}>;
|
|
12
|
+
/** A label the App added to the Item; `label` is its current GitHub definition. */
|
|
13
|
+
export declare class LabelAdded extends LabelAdded_base {
|
|
14
|
+
}
|
|
15
|
+
declare const LabelRemoved_base: Schema.Class<LabelRemoved, Schema.TaggedStruct<"LabelRemoved", {
|
|
16
|
+
readonly at: Schema.DateTimeUtc;
|
|
17
|
+
readonly label: typeof RepositoryLabel;
|
|
18
|
+
}>, {}>;
|
|
19
|
+
/** A label the App removed from the Item; `label` is its current GitHub definition. */
|
|
20
|
+
export declare class LabelRemoved extends LabelRemoved_base {
|
|
21
|
+
}
|
|
22
|
+
declare const Commented_base: Schema.Class<Commented, Schema.TaggedStruct<"Commented", {
|
|
23
|
+
readonly at: Schema.DateTimeUtc;
|
|
24
|
+
readonly url: Schema.NonEmptyString;
|
|
25
|
+
}>, {}>;
|
|
26
|
+
/** A comment the App posted on the Item; `url` links to it. */
|
|
27
|
+
export declare class Commented extends Commented_base {
|
|
28
|
+
}
|
|
29
|
+
/** The state of a submitted pull request review. */
|
|
30
|
+
export declare const ReviewState: Schema.Literals<readonly ["APPROVED", "CHANGES_REQUESTED", "COMMENTED", "DISMISSED"]>;
|
|
31
|
+
export type ReviewState = typeof ReviewState.Type;
|
|
32
|
+
declare const Reviewed_base: Schema.Class<Reviewed, Schema.TaggedStruct<"Reviewed", {
|
|
33
|
+
readonly at: Schema.DateTimeUtc;
|
|
34
|
+
readonly url: Schema.NonEmptyString;
|
|
35
|
+
readonly state: Schema.Literals<readonly ["APPROVED", "CHANGES_REQUESTED", "COMMENTED", "DISMISSED"]>;
|
|
36
|
+
}>, {}>;
|
|
37
|
+
/** A review the App submitted on the pull request; `url` links to it. */
|
|
38
|
+
export declare class Reviewed extends Reviewed_base {
|
|
39
|
+
}
|
|
40
|
+
/** A change the App made on an issue or pull request, with GitHub's timestamp. */
|
|
41
|
+
export declare const ItemChange: Schema.Union<readonly [typeof LabelAdded, typeof LabelRemoved, typeof Commented, typeof Reviewed]>;
|
|
42
|
+
export type ItemChange = typeof ItemChange.Type;
|
|
43
|
+
declare const GitHubItemHistory_base: Context.ServiceClass<GitHubItemHistory, "@usine/github/GitHubItemHistory", {
|
|
44
|
+
/**
|
|
45
|
+
* Returns the labels the App added or removed, its comments, and its submitted reviews on one
|
|
46
|
+
* issue or pull request at or after `since`, oldest first. Labels have their current name,
|
|
47
|
+
* color, and description. Fails with `GitHubItemNotFoundError` if the repository responds but
|
|
48
|
+
* has no such Item.
|
|
49
|
+
*/
|
|
50
|
+
readonly appChanges: (repository: RepositoryName, item: ItemNumber, since: DateTime.Utc) => Effect.Effect<ReadonlyArray<ItemChange>, GitHubAppError | GitHubItemNotFoundError>;
|
|
51
|
+
}>;
|
|
52
|
+
/** The App's changes on an Item, read from the Item's GitHub timeline. */
|
|
53
|
+
export declare class GitHubItemHistory extends GitHubItemHistory_base {
|
|
54
|
+
static readonly layer: Layer.Layer<GitHubItemHistory, never, GitHubApp | HttpClient.HttpClient>;
|
|
55
|
+
}
|
|
56
|
+
export { GitHubItemNotFoundError } from "./error.ts";
|
|
57
|
+
//# sourceMappingURL=item-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-history.d.ts","sourceRoot":"","sources":["../src/item-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,eAAe,EAA6C,MAAM,qBAAqB,CAAC;;;;;AAKjG,mFAAmF;AACnF,qBAAa,UAAW,SAAQ,eAG/B;CAAG;;;;;AAEJ,uFAAuF;AACvF,qBAAa,YAAa,SAAQ,iBAGjC;CAAG;;;;;AAEJ,+DAA+D;AAC/D,qBAAa,SAAU,SAAQ,cAG9B;CAAG;AAEJ,oDAAoD;AACpD,eAAO,MAAM,WAAW,uFAKtB,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;;;;;;AAElD,yEAAyE;AACzE,qBAAa,QAAS,SAAQ,aAI5B;CAAG;AAEL,kFAAkF;AAClF,eAAO,MAAM,UAAU,oGAAgE,CAAC;AACxF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAC;;IAoH5C;;;;;OAKG;yBACkB,CACnB,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,QAAQ,CAAC,GAAG,KAChB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,cAAc,GAAG,uBAAuB,CAAC;;AAd3F,0EAA0E;AAC1E,qBAAa,iBAAkB,SAAQ,sBAeD;IACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CAiF3F;CACL;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { ItemNumber } from "@usine/core/item";
|
|
2
|
+
import { RepositoryName, splitRepositoryName } from "@usine/core/repository";
|
|
3
|
+
import { Context, DateTime, Effect, Layer, Option, Schema } from "effect";
|
|
4
|
+
import { HttpClient } from "effect/http";
|
|
5
|
+
import { GitHubItemNotFoundError } from "./error.js";
|
|
6
|
+
import { GitHubApp } from "./github-app.js";
|
|
7
|
+
import { queryGraphql } from "./graphql.js";
|
|
8
|
+
import { invalidResponse } from "./http.js";
|
|
9
|
+
import { RepositoryLabel, RepositoryLabelColor, RepositoryLabelName } from "./polling/labels.js";
|
|
10
|
+
/** The maximum timeline pages per walk; more changes since `since` fail instead of returning partial results. */
|
|
11
|
+
const MAX_TIMELINE_PAGES = 10;
|
|
12
|
+
/** A label the App added to the Item; `label` is its current GitHub definition. */
|
|
13
|
+
export class LabelAdded extends Schema.TaggedClass("@usine/github/LabelAdded")("LabelAdded", { at: Schema.DateTimeUtc, label: RepositoryLabel }) {
|
|
14
|
+
}
|
|
15
|
+
/** A label the App removed from the Item; `label` is its current GitHub definition. */
|
|
16
|
+
export class LabelRemoved extends Schema.TaggedClass("@usine/github/LabelRemoved")("LabelRemoved", { at: Schema.DateTimeUtc, label: RepositoryLabel }) {
|
|
17
|
+
}
|
|
18
|
+
/** A comment the App posted on the Item; `url` links to it. */
|
|
19
|
+
export class Commented extends Schema.TaggedClass("@usine/github/Commented")("Commented", { at: Schema.DateTimeUtc, url: Schema.NonEmptyString }) {
|
|
20
|
+
}
|
|
21
|
+
/** The state of a submitted pull request review. */
|
|
22
|
+
export const ReviewState = Schema.Literals([
|
|
23
|
+
"APPROVED",
|
|
24
|
+
"CHANGES_REQUESTED",
|
|
25
|
+
"COMMENTED",
|
|
26
|
+
"DISMISSED",
|
|
27
|
+
]);
|
|
28
|
+
/** A review the App submitted on the pull request; `url` links to it. */
|
|
29
|
+
export class Reviewed extends Schema.TaggedClass("@usine/github/Reviewed")("Reviewed", {
|
|
30
|
+
at: Schema.DateTimeUtc,
|
|
31
|
+
url: Schema.NonEmptyString,
|
|
32
|
+
state: ReviewState,
|
|
33
|
+
}) {
|
|
34
|
+
}
|
|
35
|
+
/** A change the App made on an issue or pull request, with GitHub's timestamp. */
|
|
36
|
+
export const ItemChange = Schema.Union([LabelAdded, LabelRemoved, Commented, Reviewed]);
|
|
37
|
+
const LABEL_AND_COMMENT_NODES = `
|
|
38
|
+
__typename
|
|
39
|
+
... on LabeledEvent { createdAt actor { __typename login } label { name color description } }
|
|
40
|
+
... on UnlabeledEvent { createdAt actor { __typename login } label { name color description } }
|
|
41
|
+
... on IssueComment { createdAt url author { __typename login } }`;
|
|
42
|
+
const ITEM_TIMELINE_QUERY = `
|
|
43
|
+
query UsineItemTimeline($owner: String!, $name: String!, $number: Int!, $since: DateTime!, $after: String) {
|
|
44
|
+
repository(owner: $owner, name: $name) {
|
|
45
|
+
issueOrPullRequest(number: $number) {
|
|
46
|
+
... on Issue {
|
|
47
|
+
timelineItems(first: 100, after: $after, since: $since, itemTypes: [LABELED_EVENT, UNLABELED_EVENT, ISSUE_COMMENT]) {
|
|
48
|
+
pageInfo { hasNextPage endCursor }
|
|
49
|
+
nodes {${LABEL_AND_COMMENT_NODES}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
... on PullRequest {
|
|
54
|
+
timelineItems(first: 100, after: $after, since: $since, itemTypes: [LABELED_EVENT, UNLABELED_EVENT, ISSUE_COMMENT, PULL_REQUEST_REVIEW]) {
|
|
55
|
+
pageInfo { hasNextPage endCursor }
|
|
56
|
+
nodes {${LABEL_AND_COMMENT_NODES}
|
|
57
|
+
... on PullRequestReview { createdAt submittedAt url state author { __typename login } }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
`;
|
|
65
|
+
const Actor = Schema.NullOr(Schema.Struct({ __typename: Schema.String, login: Schema.String }));
|
|
66
|
+
const TimelineLabel = Schema.Struct({
|
|
67
|
+
name: RepositoryLabelName,
|
|
68
|
+
color: RepositoryLabelColor,
|
|
69
|
+
description: Schema.NullOr(Schema.String),
|
|
70
|
+
});
|
|
71
|
+
const LabelEventNode = (tag) => Schema.Struct({
|
|
72
|
+
__typename: Schema.Literal(tag),
|
|
73
|
+
createdAt: Schema.DateTimeUtcFromString,
|
|
74
|
+
actor: Actor,
|
|
75
|
+
label: TimelineLabel,
|
|
76
|
+
});
|
|
77
|
+
const TimelineNode = Schema.Union([
|
|
78
|
+
LabelEventNode("LabeledEvent"),
|
|
79
|
+
LabelEventNode("UnlabeledEvent"),
|
|
80
|
+
Schema.Struct({
|
|
81
|
+
__typename: Schema.Literal("IssueComment"),
|
|
82
|
+
createdAt: Schema.DateTimeUtcFromString,
|
|
83
|
+
url: Schema.NonEmptyString,
|
|
84
|
+
author: Actor,
|
|
85
|
+
}),
|
|
86
|
+
Schema.Struct({
|
|
87
|
+
__typename: Schema.Literal("PullRequestReview"),
|
|
88
|
+
createdAt: Schema.DateTimeUtcFromString,
|
|
89
|
+
submittedAt: Schema.NullOr(Schema.DateTimeUtcFromString),
|
|
90
|
+
url: Schema.NonEmptyString,
|
|
91
|
+
state: Schema.Literals([...ReviewState.literals, "PENDING"]),
|
|
92
|
+
author: Actor,
|
|
93
|
+
}),
|
|
94
|
+
]);
|
|
95
|
+
const TimelineData = Schema.Struct({
|
|
96
|
+
repository: Schema.OptionFromNullOr(Schema.Struct({
|
|
97
|
+
issueOrPullRequest: Schema.OptionFromNullOr(Schema.Struct({
|
|
98
|
+
timelineItems: Schema.Struct({
|
|
99
|
+
pageInfo: Schema.Struct({
|
|
100
|
+
hasNextPage: Schema.Boolean,
|
|
101
|
+
endCursor: Schema.NullOr(Schema.String),
|
|
102
|
+
}),
|
|
103
|
+
nodes: Schema.Array(Schema.NullOr(TimelineNode)),
|
|
104
|
+
}),
|
|
105
|
+
})),
|
|
106
|
+
})),
|
|
107
|
+
});
|
|
108
|
+
const appChange = (slug, node) => {
|
|
109
|
+
const byApp = (actor) => actor !== null && actor.__typename === "Bot" && actor.login === slug;
|
|
110
|
+
const label = (from) => new RepositoryLabel({
|
|
111
|
+
name: from.name,
|
|
112
|
+
color: from.color,
|
|
113
|
+
description: Option.fromNullishOr(from.description),
|
|
114
|
+
});
|
|
115
|
+
switch (node.__typename) {
|
|
116
|
+
case "LabeledEvent":
|
|
117
|
+
return byApp(node.actor)
|
|
118
|
+
? [new LabelAdded({ at: node.createdAt, label: label(node.label) })]
|
|
119
|
+
: [];
|
|
120
|
+
case "UnlabeledEvent":
|
|
121
|
+
return byApp(node.actor)
|
|
122
|
+
? [new LabelRemoved({ at: node.createdAt, label: label(node.label) })]
|
|
123
|
+
: [];
|
|
124
|
+
case "IssueComment":
|
|
125
|
+
return byApp(node.author) ? [new Commented({ at: node.createdAt, url: node.url })] : [];
|
|
126
|
+
case "PullRequestReview": {
|
|
127
|
+
const state = node.state;
|
|
128
|
+
// A pending review is a draft visible only to its author and hasn't changed anything on GitHub.
|
|
129
|
+
if (!byApp(node.author) || state === "PENDING")
|
|
130
|
+
return [];
|
|
131
|
+
return [new Reviewed({ at: node.submittedAt ?? node.createdAt, url: node.url, state })];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
/** The App's changes on an Item, read from the Item's GitHub timeline. */
|
|
136
|
+
export class GitHubItemHistory extends Context.Service()("@usine/github/GitHubItemHistory") {
|
|
137
|
+
static layer = Layer.effect(GitHubItemHistory, Effect.gen(function* () {
|
|
138
|
+
const app = yield* GitHubApp;
|
|
139
|
+
const http = yield* HttpClient.HttpClient;
|
|
140
|
+
const timelinePage = Effect.fn("GitHubItemHistory.timelinePage")(function* (repository, item, since, after) {
|
|
141
|
+
const token = yield* app.installationToken();
|
|
142
|
+
const { name, owner } = splitRepositoryName(repository);
|
|
143
|
+
const data = yield* queryGraphql(http, token, "fetch-item-timeline", ITEM_TIMELINE_QUERY, { owner, name, number: item, since, after }, TimelineData);
|
|
144
|
+
if (Option.isNone(data.repository))
|
|
145
|
+
return yield* invalidResponse("fetch-item-timeline", `repository "${repository}" is null: deleted, renamed, or no longer accessible`);
|
|
146
|
+
const found = data.repository.value.issueOrPullRequest;
|
|
147
|
+
if (Option.isNone(found))
|
|
148
|
+
return yield* new GitHubItemNotFoundError({
|
|
149
|
+
operation: "fetch-item-timeline",
|
|
150
|
+
item,
|
|
151
|
+
message: `Issue or pull request ${repository}#${item} was not found on GitHub. It was deleted or transferred, or the GitHub App can no longer read it.`,
|
|
152
|
+
});
|
|
153
|
+
const { pageInfo, nodes } = found.value.timelineItems;
|
|
154
|
+
if (!pageInfo.hasNextPage)
|
|
155
|
+
return { nodes, next: Option.none() };
|
|
156
|
+
if (pageInfo.endCursor === null)
|
|
157
|
+
return yield* invalidResponse("fetch-item-timeline", "GitHub returned hasNextPage for the timeline without an endCursor");
|
|
158
|
+
return { nodes, next: Option.some(pageInfo.endCursor) };
|
|
159
|
+
});
|
|
160
|
+
const appChanges = Effect.fn("GitHubItemHistory.appChanges")(function* (repository, item, since) {
|
|
161
|
+
yield* Effect.annotateCurrentSpan({ repository, item });
|
|
162
|
+
const { appSlug } = yield* app.installation();
|
|
163
|
+
const sinceIso = DateTime.formatIso(since);
|
|
164
|
+
const nodes = [];
|
|
165
|
+
let next = Option.none();
|
|
166
|
+
let pages = 0;
|
|
167
|
+
do {
|
|
168
|
+
const page = yield* timelinePage(repository, item, sinceIso, Option.getOrNull(next));
|
|
169
|
+
nodes.push(...page.nodes);
|
|
170
|
+
next = page.next;
|
|
171
|
+
pages += 1;
|
|
172
|
+
} while (Option.isSome(next) && pages < MAX_TIMELINE_PAGES);
|
|
173
|
+
if (Option.isSome(next))
|
|
174
|
+
return yield* invalidResponse("fetch-item-timeline", `the timeline of ${repository}#${item} since ${sinceIso} has more than ${MAX_TIMELINE_PAGES} pages`);
|
|
175
|
+
const changes = nodes.flatMap((node) => (node === null ? [] : appChange(appSlug, node)));
|
|
176
|
+
yield* Effect.logDebug("Read the App's changes from an Item timeline", {
|
|
177
|
+
repository,
|
|
178
|
+
item,
|
|
179
|
+
since: sinceIso,
|
|
180
|
+
pages,
|
|
181
|
+
timelineItems: nodes.length,
|
|
182
|
+
appChanges: changes.length,
|
|
183
|
+
});
|
|
184
|
+
return changes;
|
|
185
|
+
});
|
|
186
|
+
return { appChanges };
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
export { GitHubItemNotFoundError } from "./error.js";
|
|
190
|
+
//# sourceMappingURL=item-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-history.js","sourceRoot":"","sources":["../src/item-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAuB,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEjG,iHAAiH;AACjH,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,mFAAmF;AACnF,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,WAAW,CAAa,0BAA0B,CAAC,CACxF,YAAY,EACZ,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CACnD;CAAG;AAEJ,uFAAuF;AACvF,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,CAAe,4BAA4B,CAAC,CAC9F,cAAc,EACd,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CACnD;CAAG;AAEJ,+DAA+D;AAC/D,MAAM,OAAO,SAAU,SAAQ,MAAM,CAAC,WAAW,CAAY,yBAAyB,CAAC,CACrF,WAAW,EACX,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,CACvD;CAAG;AAEJ,oDAAoD;AACpD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;IACzC,UAAU;IACV,mBAAmB;IACnB,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AAGH,yEAAyE;AACzE,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,WAAW,CAAW,wBAAwB,CAAC,CAAC,UAAU,EAAE;IAC/F,EAAE,EAAE,MAAM,CAAC,WAAW;IACtB,GAAG,EAAE,MAAM,CAAC,cAAc;IAC1B,KAAK,EAAE,WAAW;CACnB,CAAC;CAAG;AAEL,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAGxF,MAAM,uBAAuB,GAAG;;;;wEAIwC,CAAC;AAEzE,MAAM,mBAAmB,GAAG;;;;;;;qBAOP,uBAAuB;;;;;;;qBAOvB,uBAAuB;;;;;;;;CAQ3C,CAAC;AAEF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAChG,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;CAC1C,CAAC,CAAC;AACH,MAAM,cAAc,GAAG,CAAgD,GAAQ,EAAE,EAAE,CACjF,MAAM,CAAC,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,qBAAqB;IACvC,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,aAAa;CACrB,CAAC,CAAC;AACL,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;IAChC,cAAc,CAAC,cAAc,CAAC;IAC9B,cAAc,CAAC,gBAAgB,CAAC;IAChC,MAAM,CAAC,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QAC1C,SAAS,EAAE,MAAM,CAAC,qBAAqB;QACvC,GAAG,EAAE,MAAM,CAAC,cAAc;QAC1B,MAAM,EAAE,KAAK;KACd,CAAC;IACF,MAAM,CAAC,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC,qBAAqB;QACvC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;QACxD,GAAG,EAAE,MAAM,CAAC,cAAc;QAC1B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,EAAE,KAAK;KACd,CAAC;CACH,CAAC,CAAC;AAGH,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,gBAAgB,CACjC,MAAM,CAAC,MAAM,CAAC;QACZ,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CACzC,MAAM,CAAC,MAAM,CAAC;YACZ,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;oBACtB,WAAW,EAAE,MAAM,CAAC,OAAO;oBAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;iBACxC,CAAC;gBACF,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;aACjD,CAAC;SACH,CAAC,CACH;KACF,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,IAAa,EAAE,IAAkB,EAA6B,EAAE;IACjF,MAAM,KAAK,GAAG,CAAC,KAAwB,EAAE,EAAE,CACzC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,IAA+B,EAAE,EAAE,CAChD,IAAI,eAAe,CAAC;QAClB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;KACpD,CAAC,CAAC;IACL,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,cAAc;YACjB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBACtB,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpE,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,gBAAgB;YACnB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBACtB,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtE,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,cAAc;YACjB,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,KAAK,mBAAmB,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,gGAAgG;YAChG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,OAAO,iBAAkB,SAAQ,OAAO,CAAC,OAAO,EAenD,CAAC,iCAAiC,CAAC;IACpC,MAAM,CAAU,KAAK,GACnB,KAAK,CAAC,MAAM,CACV,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAE1C,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC,QAAQ,CAAC,EACxE,UAA0B,EAC1B,IAAgB,EAChB,KAAa,EACb,KAAoB;YAEpB,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,IAAI,GAAG,KAAK,CAAC,CAAC,YAAY,CAC9B,IAAI,EACJ,KAAK,EACL,qBAAqB,EACrB,mBAAmB,EACnB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAC3C,YAAY,CACb,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,qBAAqB,EACrB,eAAe,UAAU,sDAAsD,CAChF,CAAC;YACJ,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACvD,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBACtB,OAAO,KAAK,CAAC,CAAC,IAAI,uBAAuB,CAAC;oBACxC,SAAS,EAAE,qBAAqB;oBAChC,IAAI;oBACJ,OAAO,EAAE,yBAAyB,UAAU,IAAI,IAAI,mGAAmG;iBACxJ,CAAC,CAAC;YACL,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,WAAW;gBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAU,EAAE,CAAC;YACzE,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI;gBAC7B,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,qBAAqB,EACrB,mEAAmE,CACpE,CAAC;YACJ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,QAAQ,CAAC,EACpE,UAA0B,EAC1B,IAAgB,EAChB,KAAmB;YAEnB,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,KAAK,GAA+B,EAAE,CAAC;YAC7C,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,EAAU,CAAC;YACjC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,GAAG,CAAC;gBACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACjB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,kBAAkB,EAAE;YAC5D,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrB,OAAO,KAAK,CAAC,CAAC,eAAe,CAC3B,qBAAqB,EACrB,mBAAmB,UAAU,IAAI,IAAI,UAAU,QAAQ,kBAAkB,kBAAkB,QAAQ,CACpG,CAAC;YACJ,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACzF,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,8CAA8C,EAAE;gBACrE,UAAU;gBACV,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,KAAK;gBACL,aAAa,EAAE,KAAK,CAAC,MAAM;gBAC3B,UAAU,EAAE,OAAO,CAAC,MAAM;aAC3B,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;CACL;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/item-writer.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { RepositoryName } from "@usine/core/repository";
|
|
2
2
|
import { ItemNumber } from "@usine/core/item";
|
|
3
3
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
4
|
-
import { HttpClient } from "effect/
|
|
4
|
+
import { HttpClient } from "effect/http";
|
|
5
5
|
import { GitHubApp } from "./github-app.ts";
|
|
6
6
|
import type { GitHubAppError } from "./error.ts";
|
|
7
7
|
declare const ItemLabelMutation_base: Schema.Class<ItemLabelMutation, Schema.Struct<{
|
|
8
8
|
readonly add: Schema.$Array<Schema.NonEmptyString>;
|
|
9
9
|
readonly remove: Schema.$Array<Schema.NonEmptyString>;
|
|
10
10
|
}>, {}>;
|
|
11
|
-
/**
|
|
11
|
+
/** The labels to add and remove on one Item; other labels are unchanged. */
|
|
12
12
|
export declare class ItemLabelMutation extends ItemLabelMutation_base {
|
|
13
13
|
}
|
|
14
14
|
declare const GitHubItemWriter_base: Context.ServiceClass<GitHubItemWriter, "@usine/github/GitHubItemWriter", {
|
|
15
|
-
/** Adds and removes only the
|
|
15
|
+
/** Adds and removes only the listed labels and keeps every other applied label. */
|
|
16
16
|
readonly updateLabels: (repository: RepositoryName, item: ItemNumber, mutation: ItemLabelMutation) => Effect.Effect<ReadonlyArray<string>, GitHubAppError>;
|
|
17
17
|
}>;
|
|
18
18
|
/** Label writes on GitHub Items, used when the Board moves a card between lanes. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-writer.d.ts","sourceRoot":"","sources":["../src/item-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAyC,MAAM,
|
|
1
|
+
{"version":3,"file":"item-writer.d.ts","sourceRoot":"","sources":["../src/item-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAyC,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;;;;;AAKjD,4EAA4E;AAC5E,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;;IAcD,mFAAmF;2BAC5D,CACrB,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,KACxB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;;AAT7D,oFAAoF;AACpF,qBAAa,gBAAiB,SAAQ,qBAUD;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CA4E1F;CACL"}
|
package/dist/item-writer.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { RepositoryName, splitRepositoryName } from "@usine/core/repository";
|
|
2
2
|
import { ItemNumber } from "@usine/core/item";
|
|
3
3
|
import { Clock, Context, Effect, Layer, Schema } from "effect";
|
|
4
|
-
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/
|
|
4
|
+
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http";
|
|
5
5
|
import { GitHubApp } from "./github-app.js";
|
|
6
6
|
import { API_ROOT, authorized, invalidResponse, statusError, transportError } from "./http.js";
|
|
7
7
|
const LabelResponse = Schema.Array(Schema.Struct({ name: Schema.NonEmptyString }));
|
|
8
8
|
const LabelNames = Schema.Array(Schema.NonEmptyString).check(Schema.isUnique());
|
|
9
|
-
/**
|
|
9
|
+
/** The labels to add and remove on one Item; other labels are unchanged. */
|
|
10
10
|
export class ItemLabelMutation extends Schema.Class("@usine/github/ItemLabelMutation")({
|
|
11
11
|
add: LabelNames.check(Schema.isNonEmpty()),
|
|
12
12
|
remove: LabelNames,
|
package/dist/item-writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-writer.js","sourceRoot":"","sources":["../src/item-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"item-writer.js","sourceRoot":"","sources":["../src/item-writer.ts"],"names":[],"mappings":"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"}
|
package/dist/jwt.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Effect, Redacted } from "effect";
|
|
2
2
|
import { AppAuthenticationError, type AppCredentials } from "./credentials.ts";
|
|
3
|
-
/**
|
|
3
|
+
/** A function that signs an App JWT with `iat` one minute in the past for clock skew and `exp` under GitHub's ten-minute limit. */
|
|
4
4
|
type AppJwtSigner = () => Effect.Effect<Redacted.Redacted<string>>;
|
|
5
5
|
/**
|
|
6
|
-
* Imports the App private key once with WebCrypto RS256.
|
|
7
|
-
*
|
|
6
|
+
* Imports the App private key once with WebCrypto RS256. Fails when the layer is built if the
|
|
7
|
+
* key can't be imported.
|
|
8
8
|
*/
|
|
9
9
|
export declare const appJwtSigner: (credentials: AppCredentials) => Effect.Effect<AppJwtSigner, AppAuthenticationError, never>;
|
|
10
10
|
export {};
|
package/dist/jwt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoE/E,
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoE/E,mIAAmI;AACnI,KAAK,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,YAAY,6FA6BvB,CAAC"}
|
package/dist/jwt.js
CHANGED
|
@@ -22,7 +22,7 @@ const derLength = (length) => {
|
|
|
22
22
|
return new Uint8Array([0x80 | bytes.length, ...bytes]);
|
|
23
23
|
};
|
|
24
24
|
const der = (tag, value) => concat(new Uint8Array([tag]), derLength(value.length), value);
|
|
25
|
-
/**
|
|
25
|
+
/** Wraps a PKCS#1 key as PKCS#8, because WebCrypto imports only PKCS#8 and GitHub provides PKCS#1. */
|
|
26
26
|
const wrapPkcs1AsPkcs8 = (pkcs1) => der(0x30, concat(new Uint8Array([0x02, 0x01, 0x00]), RSA_ALGORITHM_IDENTIFIER, der(0x04, pkcs1)));
|
|
27
27
|
const decodePem = (pem) => {
|
|
28
28
|
const pkcs1 = pem.includes("-----BEGIN RSA PRIVATE KEY-----");
|
|
@@ -47,14 +47,14 @@ const toArrayBuffer = (value) => {
|
|
|
47
47
|
return buffer;
|
|
48
48
|
};
|
|
49
49
|
/**
|
|
50
|
-
* Imports the App private key once with WebCrypto RS256.
|
|
51
|
-
*
|
|
50
|
+
* Imports the App private key once with WebCrypto RS256. Fails when the layer is built if the
|
|
51
|
+
* key can't be imported.
|
|
52
52
|
*/
|
|
53
53
|
export const appJwtSigner = Effect.fn("AppJwt.import")(function* (credentials) {
|
|
54
54
|
const key = yield* Effect.tryPromise({
|
|
55
55
|
try: async () => crypto.subtle.importKey("pkcs8", toArrayBuffer(decodePem(Redacted.value(credentials.privateKey))), { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, false, ["sign"]),
|
|
56
56
|
catch: () => new AppAuthenticationError({
|
|
57
|
-
message: "
|
|
57
|
+
message: "Could not import the GitHub App private key as an RSA private key",
|
|
58
58
|
}),
|
|
59
59
|
});
|
|
60
60
|
const sign = Effect.fn("AppJwt.sign")(function* () {
|
package/dist/jwt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,kBAAkB,CAAC;AAa/E,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,wBAAwB,GAAG,IAAI,UAAU,CAAC;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CACzF,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,GAAG,MAAiC,EAAc,EAAE;IAClE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACtF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,MAAc,EAAc,EAAE;IAC/C,IAAI,MAAM,GAAG,IAAI;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,IAAI,SAAS,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,MAAM,CAAC;QAAE,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC9F,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,KAAiB,EAAc,EAAE,CACzD,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAEhE,
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
|
package/dist/label-writer.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RepositoryName } from "@usine/core/repository";
|
|
2
2
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
3
|
-
import { HttpClient } from "effect/
|
|
3
|
+
import { HttpClient } from "effect/http";
|
|
4
4
|
import { GitHubApp } from "./github-app.ts";
|
|
5
5
|
import type { GitHubAppError } from "./error.ts";
|
|
6
6
|
import { RepositoryLabel } from "./polling/labels.ts";
|
|
@@ -9,13 +9,13 @@ declare const NewRepositoryLabel_base: Schema.Class<NewRepositoryLabel, Schema.S
|
|
|
9
9
|
readonly color: Schema.Option<Schema.brand<Schema.String, "GitHubRepositoryLabelColor">>;
|
|
10
10
|
readonly description: Schema.Option<Schema.String>;
|
|
11
11
|
}>, {}>;
|
|
12
|
-
/**
|
|
12
|
+
/** A label definition in the format of GitHub's create-label endpoint. */
|
|
13
13
|
export declare class NewRepositoryLabel extends NewRepositoryLabel_base {
|
|
14
14
|
}
|
|
15
15
|
declare const GitHubLabelWriter_base: Context.ServiceClass<GitHubLabelWriter, "@usine/github/GitHubLabelWriter", {
|
|
16
16
|
readonly create: (repository: RepositoryName, label: NewRepositoryLabel) => Effect.Effect<RepositoryLabel, GitHubAppError>;
|
|
17
17
|
}>;
|
|
18
|
-
/**
|
|
18
|
+
/** The service that creates repository labels with the App installation token. */
|
|
19
19
|
export declare class GitHubLabelWriter extends GitHubLabelWriter_base {
|
|
20
20
|
static readonly layer: Layer.Layer<GitHubLabelWriter, never, GitHubApp | HttpClient.HttpClient>;
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label-writer.d.ts","sourceRoot":"","sources":["../src/label-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,UAAU,EAAyC,MAAM,
|
|
1
|
+
{"version":3,"file":"label-writer.d.ts","sourceRoot":"","sources":["../src/label-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,UAAU,EAAyC,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,eAAe,EAA6C,MAAM,qBAAqB,CAAC;;;;;;AAEjG,0EAA0E;AAC1E,qBAAa,kBAAmB,SAAQ,uBAMtC;CAAG;;qBAuBgB,CACf,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,kBAAkB,KACtB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;;AAPvD,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,sBAQD;IACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CA4C3F;CACL"}
|
package/dist/label-writer.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { RepositoryName, splitRepositoryName } from "@usine/core/repository";
|
|
2
2
|
import { Clock, Context, Effect, Layer, Option, Schema } from "effect";
|
|
3
|
-
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/
|
|
3
|
+
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http";
|
|
4
4
|
import { GitHubApp } from "./github-app.js";
|
|
5
5
|
import { API_ROOT, authorized, invalidResponse, statusError, transportError } from "./http.js";
|
|
6
6
|
import { RepositoryLabel, RepositoryLabelColor, RepositoryLabelName } from "./polling/labels.js";
|
|
7
|
-
/**
|
|
7
|
+
/** A label definition in the format of GitHub's create-label endpoint. */
|
|
8
8
|
export class NewRepositoryLabel extends Schema.Class("@usine/github/NewRepositoryLabel")({
|
|
9
9
|
name: RepositoryLabelName,
|
|
10
10
|
color: Schema.Option(RepositoryLabelColor),
|
|
@@ -20,7 +20,7 @@ const labelsUrl = (repository) => {
|
|
|
20
20
|
const { name, owner } = splitRepositoryName(repository);
|
|
21
21
|
return `${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/labels`;
|
|
22
22
|
};
|
|
23
|
-
/**
|
|
23
|
+
/** The service that creates repository labels with the App installation token. */
|
|
24
24
|
export class GitHubLabelWriter extends Context.Service()("@usine/github/GitHubLabelWriter") {
|
|
25
25
|
static layer = Layer.effect(GitHubLabelWriter, Effect.gen(function* () {
|
|
26
26
|
const app = yield* GitHubApp;
|
package/dist/label-writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label-writer.js","sourceRoot":"","sources":["../src/label-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"label-writer.js","sourceRoot":"","sources":["../src/label-writer.ts"],"names":[],"mappings":"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"}
|
package/dist/local-secrets.d.ts
CHANGED
|
@@ -19,8 +19,8 @@ export declare class SecretsFileError extends SecretsFileError_base {
|
|
|
19
19
|
export declare const LocalSecretsError: Schema.Union<readonly [typeof EnvironmentCredentialsError, typeof SecretsFileError]>;
|
|
20
20
|
export type LocalSecretsError = typeof LocalSecretsError.Type;
|
|
21
21
|
/**
|
|
22
|
-
* Loads the orchestrator's App credentials. An environment variable
|
|
23
|
-
*
|
|
22
|
+
* Loads the orchestrator's App credentials. An environment variable overrides its file field,
|
|
23
|
+
* and the file isn't read if both variables are set.
|
|
24
24
|
*/
|
|
25
25
|
export declare const loadLocalCredentials: (root: string & import("effect/Brand").Brand<"InstanceDirectory">) => Effect.Effect<AppCredentials, EnvironmentCredentialsError | SecretsFileError, FileSystem.FileSystem | Path.Path>;
|
|
26
26
|
export declare const localSecretsLayer: (root: InstanceDirectory) => Layer.Layer<GitHubCredentials, LocalSecretsError, FileSystem.FileSystem | Path.Path>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-secrets.d.ts","sourceRoot":"","sources":["../src/local-secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAU,MAAM,EAAE,UAAU,EAAE,KAAK,EAAU,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjF,OAAO,EAAE,cAAc,EAAS,iBAAiB,EAAsB,MAAM,kBAAkB,CAAC;AAEhG,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;;;;AAEhE,qBAAa,2BAA4B,SAAQ,gCAI/C;CAAG;AAEL,eAAO,MAAM,iBAAiB,4DAAoD,CAAC;AACnF,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAC;;;;;;AAE9D,qBAAa,gBAAiB,SAAQ,qBAMpC;CAAG;AAEL,eAAO,MAAM,iBAAiB,sFAAgE,CAAC;AAC/F,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"local-secrets.d.ts","sourceRoot":"","sources":["../src/local-secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAU,MAAM,EAAE,UAAU,EAAE,KAAK,EAAU,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjF,OAAO,EAAE,cAAc,EAAS,iBAAiB,EAAsB,MAAM,kBAAkB,CAAC;AAEhG,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;;;;AAEhE,qBAAa,2BAA4B,SAAQ,gCAI/C;CAAG;AAEL,eAAO,MAAM,iBAAiB,4DAAoD,CAAC;AACnF,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAC;;;;;;AAE9D,qBAAa,gBAAiB,SAAQ,qBAMpC;CAAG;AAEL,eAAO,MAAM,iBAAiB,sFAAgE,CAAC;AAC/F,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAC;AA0C9D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,wLAoB/B,CAAC;AAEH,eAAO,MAAM,iBAAiB,SACtB,iBAAiB,KACtB,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CACzB,CAAC"}
|
package/dist/local-secrets.js
CHANGED
|
@@ -15,7 +15,7 @@ export class SecretsFileError extends Schema.TaggedError("@usine/github/SecretsF
|
|
|
15
15
|
}
|
|
16
16
|
export const LocalSecretsError = Schema.Union([EnvironmentCredentialsError, SecretsFileError]);
|
|
17
17
|
const AppIdFromString = Schema.FiniteFromString.pipe(Schema.decodeTo(AppId));
|
|
18
|
-
/** Each variable
|
|
18
|
+
/** Each variable is optional; a set but invalid one is an error, not a fallback to the file. */
|
|
19
19
|
const environment = Config.all({
|
|
20
20
|
appId: Config.option(Config.schema(AppIdFromString, "USINE_GITHUB_APP_ID")),
|
|
21
21
|
privateKey: Config.option(Config.schema(RedactedPrivateKey, "USINE_GITHUB_PRIVATE_KEY")),
|
|
@@ -30,18 +30,18 @@ const readSecretsFile = Effect.fn("GitHubCredentials.readSecretsFile")(function*
|
|
|
30
30
|
const unreadable = () => fail("read", `Could not read GitHub App secrets at ${secretsPath}`);
|
|
31
31
|
const info = yield* fileSystem.stat(secretsPath).pipe(Effect.mapError(unreadable));
|
|
32
32
|
if (info.type !== "File" || (info.mode & 0o777) !== 0o600) {
|
|
33
|
-
return yield* fail("permissions",
|
|
33
|
+
return yield* fail("permissions", `${secretsPath} must be a regular file with mode 0600. Run chmod 600 ${secretsPath}.`);
|
|
34
34
|
}
|
|
35
35
|
const source = yield* fileSystem.readFileString(secretsPath).pipe(Effect.mapError(unreadable));
|
|
36
|
-
return yield* decodeCredentialsFile(source, { onExcessProperty: "error" }).pipe(Effect.mapError(() => fail("parse",
|
|
36
|
+
return yield* decodeCredentialsFile(source, { onExcessProperty: "error" }).pipe(Effect.mapError(() => fail("parse", `${secretsPath} is invalid. It must be JSON with only app_id and private_key.`)));
|
|
37
37
|
});
|
|
38
38
|
/**
|
|
39
|
-
* Loads the orchestrator's App credentials. An environment variable
|
|
40
|
-
*
|
|
39
|
+
* Loads the orchestrator's App credentials. An environment variable overrides its file field,
|
|
40
|
+
* and the file isn't read if both variables are set.
|
|
41
41
|
*/
|
|
42
42
|
export const loadLocalCredentials = Effect.fn("GitHubCredentials.loadLocal")(function* (root) {
|
|
43
43
|
const env = yield* environment.pipe(Effect.mapError(() => new EnvironmentCredentialsError({
|
|
44
|
-
message: "USINE_GITHUB_APP_ID
|
|
44
|
+
message: "USINE_GITHUB_APP_ID or USINE_GITHUB_PRIVATE_KEY is invalid. Set USINE_GITHUB_APP_ID to the numeric App ID and USINE_GITHUB_PRIVATE_KEY to the App's PEM private key.",
|
|
45
45
|
})));
|
|
46
46
|
if (Option.isSome(env.appId) && Option.isSome(env.privateKey)) {
|
|
47
47
|
return new AppCredentials({ appId: env.appId.value, privateKey: env.privateKey.value });
|