diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 353687ac..34acd633 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -10,7 +10,7 @@ runs: using: composite steps: - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v5 - name: Install node uses: actions/setup-node@v6 with: @@ -18,4 +18,4 @@ runs: node-version: ${{ inputs.node-version }} - name: Install dependencies shell: bash - run: pnpm install + run: pnpm install --frozen-lockfile diff --git a/packages/lib/src/usecases/auth-github.ts b/packages/lib/src/usecases/auth-github.ts index c72149d9..90c8f1f9 100644 --- a/packages/lib/src/usecases/auth-github.ts +++ b/packages/lib/src/usecases/auth-github.ts @@ -125,15 +125,27 @@ const renderGithubTokenStatusLine = (entry: GithubTokenStatusEntry): string => Match.when("valid", () => entry.login === null ? `- ${entry.label}: valid (owner unavailable)` - : `- ${entry.label}: valid (owner: ${entry.login})` - ), + : `- ${entry.label}: valid (owner: ${entry.login})`), Match.when("invalid", () => `- ${entry.label}: invalid`), Match.when("unknown", () => `- ${entry.label}: unknown (validation unavailable)`), Match.exhaustive ) const renderGithubTokenStatusReport = (entries: ReadonlyArray): string => - [`GitHub tokens (${entries.length}):`, ...entries.map(renderGithubTokenStatusLine)].join("\n") + [`GitHub tokens (${entries.length}):`, ...entries.map((entry) => renderGithubTokenStatusLine(entry))].join("\n") + +const validateGithubTokenEntry = ( + entry: GithubTokenEntry +): Effect.Effect => + validateGithubToken(entry.token).pipe( + Effect.map((validation) => ({ + key: entry.key, + label: entry.label, + token: entry.token, + status: validation.status, + login: validation.login + })) + ) const resolveGithubTokenFromGh = ( cwd: string, @@ -291,19 +303,7 @@ export const authGithubStatus = ( return } - const statuses = yield* _( - Effect.forEach(tokens, (entry) => - validateGithubToken(entry.token).pipe( - Effect.map((validation) => ({ - key: entry.key, - label: entry.label, - token: entry.token, - status: validation.status, - login: validation.login - })) - ) - ) - ) + const statuses = yield* _(Effect.all(tokens.map((entry) => validateGithubTokenEntry(entry)))) yield* _(Effect.log(renderGithubTokenStatusReport(statuses))) })) diff --git a/packages/lib/src/usecases/github-token-validation.ts b/packages/lib/src/usecases/github-token-validation.ts index e80ced59..f3517626 100644 --- a/packages/lib/src/usecases/github-token-validation.ts +++ b/packages/lib/src/usecases/github-token-validation.ts @@ -1,7 +1,7 @@ import { FetchHttpClient, HttpClient } from "@effect/platform" import * as ParseResult from "@effect/schema/ParseResult" import * as Schema from "@effect/schema/Schema" -import { Either, Effect } from "effect" +import { Effect, Either } from "effect" const githubTokenValidationUrl = "https://api.github.com/user" @@ -23,14 +23,15 @@ export type GithubTokenValidationResult = { const GithubUserSchema: Schema.Schema = Schema.Struct({ login: Schema.String }) +const GithubUserJsonSchema = Schema.parseJson(GithubUserSchema) const unknownGithubTokenValidationResult = (): GithubTokenValidationResult => ({ status: "unknown", login: null }) -const decodeGithubUserLogin = (input: unknown): string | null => - Either.match(ParseResult.decodeUnknownEither(GithubUserSchema)(input), { +const decodeGithubUserLogin = (input: string): string | null => + Either.match(ParseResult.decodeUnknownEither(GithubUserJsonSchema)(input), { onLeft: () => null, onRight: (user) => user.login }) @@ -72,7 +73,7 @@ export const validateGithubToken = (token: string): Effect.Effect