Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ 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:
cache: pnpm
node-version: ${{ inputs.node-version }}
- name: Install dependencies
shell: bash
run: pnpm install
run: pnpm install --frozen-lockfile
32 changes: 16 additions & 16 deletions packages/lib/src/usecases/auth-github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<GithubTokenStatusEntry>): 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<GithubTokenStatusEntry> =>
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,
Expand Down Expand Up @@ -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)))
}))
Expand Down
9 changes: 5 additions & 4 deletions packages/lib/src/usecases/github-token-validation.ts
Original file line number Diff line number Diff line change
@@ -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"

Expand All @@ -23,14 +23,15 @@ export type GithubTokenValidationResult = {
const GithubUserSchema: Schema.Schema<GithubUser> = 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
})
Expand Down Expand Up @@ -72,7 +73,7 @@ export const validateGithubToken = (token: string): Effect.Effect<GithubTokenVal
} satisfies GithubTokenValidationResult
}

const body = yield* _(response.json)
const body = yield* _(response.text)
return {
status,
login: decodeGithubUserLogin(body)
Expand Down
Loading