Skip to content

Commit 3c203f6

Browse files
committed
fix(auth): satisfy ci lint checks
1 parent b81f280 commit 3c203f6

12 files changed

Lines changed: 310 additions & 244 deletions
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { PlatformError } from "@effect/platform/Error"
2+
import type * as FileSystem from "@effect/platform/FileSystem"
3+
import { Effect } from "effect"
4+
5+
type FilePredicate = (
6+
fs: FileSystem.FileSystem,
7+
filePath: string
8+
) => Effect.Effect<boolean, PlatformError>
9+
10+
export const hasFileAtPath: FilePredicate = (fs, filePath) =>
11+
fs.stat(filePath).pipe(
12+
Effect.map((info) => info.type === "File"),
13+
Effect.orElseSucceed(() => false)
14+
)
15+
16+
export const hasNonEmptyFile: FilePredicate = (fs, filePath) =>
17+
hasFileAtPath(fs, filePath).pipe(
18+
Effect.flatMap((hasFile) => {
19+
if (!hasFile) {
20+
return Effect.succeed(false)
21+
}
22+
return fs.readFileString(filePath).pipe(
23+
Effect.orElseSucceed(() => ""),
24+
Effect.map((content) => content.trim().length > 0)
25+
)
26+
})
27+
)

packages/app/src/docker-git/menu-auth-helpers.ts

Lines changed: 51 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,34 @@ import type * as FileSystem from "@effect/platform/FileSystem"
33
import type * as Path from "@effect/platform/Path"
44
import { Effect } from "effect"
55

6+
import { hasNonEmptyFile } from "./menu-auth-file-helpers.js"
7+
68
type HasCredentials = (
79
fs: FileSystem.FileSystem,
810
accountPath: string
911
) => Effect.Effect<boolean, PlatformError>
1012

13+
type CredentialDirectoryCounterInput = {
14+
readonly fs: FileSystem.FileSystem
15+
readonly hasCredentials: HasCredentials
16+
readonly path: Path.Path
17+
readonly root: string
18+
}
19+
1120
const ignoredAuthAccountEntries: ReadonlySet<string> = new Set([".image"])
1221

13-
const hasFileAtPath = (
22+
export const hasCodexAccountCredentials = (
1423
fs: FileSystem.FileSystem,
15-
filePath: string
16-
): Effect.Effect<boolean, PlatformError> =>
17-
Effect.gen(function*(_) {
18-
const exists = yield* _(fs.exists(filePath))
19-
if (!exists) {
20-
return false
21-
}
22-
const info = yield* _(fs.stat(filePath))
23-
return info.type === "File"
24-
})
24+
accountPath: string
25+
): Effect.Effect<boolean, PlatformError> => hasNonEmptyFile(fs, `${accountPath}/auth.json`)
2526

26-
const hasNonEmptyFile = (
27-
fs: FileSystem.FileSystem,
28-
filePath: string
29-
): Effect.Effect<boolean, PlatformError> =>
27+
const countCredentialDirectories = ({
28+
fs,
29+
hasCredentials,
30+
path,
31+
root
32+
}: CredentialDirectoryCounterInput): Effect.Effect<number, PlatformError> =>
3033
Effect.gen(function*(_) {
31-
const hasFile = yield* _(hasFileAtPath(fs, filePath))
32-
if (!hasFile) {
33-
return false
34-
}
35-
const content = yield* _(fs.readFileString(filePath), Effect.orElseSucceed(() => ""))
36-
return content.trim().length > 0
37-
})
38-
39-
export const countAuthCredentialAccounts = (
40-
fs: FileSystem.FileSystem,
41-
path: Path.Path,
42-
root: string,
43-
hasCredentials: HasCredentials
44-
): Effect.Effect<number, PlatformError> =>
45-
Effect.gen(function*(_) {
46-
const exists = yield* _(fs.exists(root))
47-
if (!exists) {
48-
return 0
49-
}
5034
const entries = yield* _(fs.readDirectory(root))
5135
let count = 0
5236
for (const entry of entries) {
@@ -66,38 +50,44 @@ export const countAuthCredentialAccounts = (
6650
return count
6751
})
6852

69-
export const hasCodexAccountCredentials = (
53+
const countExistingCredentialDirectories = (
54+
input: CredentialDirectoryCounterInput
55+
): Effect.Effect<number, PlatformError> =>
56+
input.fs.exists(input.root).pipe(
57+
Effect.flatMap((exists) =>
58+
exists
59+
? countCredentialDirectories(input)
60+
: Effect.succeed(0)
61+
)
62+
)
63+
64+
export const countAuthCredentialAccounts = (
7065
fs: FileSystem.FileSystem,
71-
accountPath: string
72-
): Effect.Effect<boolean, PlatformError> =>
73-
hasNonEmptyFile(fs, `${accountPath}/auth.json`)
66+
path: Path.Path,
67+
root: string,
68+
hasCredentials: HasCredentials
69+
): Effect.Effect<number, PlatformError> => countExistingCredentialDirectories({ fs, hasCredentials, path, root })
7470

7571
export const countCodexCredentialAccounts = (
7672
fs: FileSystem.FileSystem,
7773
path: Path.Path,
7874
root: string
7975
): Effect.Effect<number, PlatformError> =>
80-
Effect.gen(function*(_) {
81-
const exists = yield* _(fs.exists(root))
82-
if (!exists) {
83-
return 0
84-
}
85-
86-
let count = yield* _(hasCodexAccountCredentials(fs, root), Effect.map((connected) => connected ? 1 : 0))
87-
const entries = yield* _(fs.readDirectory(root))
88-
for (const entry of entries) {
89-
if (ignoredAuthAccountEntries.has(entry)) {
90-
continue
76+
fs.exists(root).pipe(
77+
Effect.flatMap((exists) => {
78+
if (!exists) {
79+
return Effect.succeed(0)
9180
}
92-
const accountPath = path.join(root, entry)
93-
const info = yield* _(fs.stat(accountPath))
94-
if (info.type !== "Directory") {
95-
continue
96-
}
97-
const connected = yield* _(hasCodexAccountCredentials(fs, accountPath), Effect.orElseSucceed(() => false))
98-
if (connected) {
99-
count += 1
100-
}
101-
}
102-
return count
103-
})
81+
return Effect.all({
82+
directoryCount: countCredentialDirectories({
83+
fs,
84+
hasCredentials: hasCodexAccountCredentials,
85+
path,
86+
root
87+
}),
88+
rootConnected: hasCodexAccountCredentials(fs, root).pipe(Effect.orElseSucceed(() => false))
89+
}).pipe(
90+
Effect.map(({ directoryCount, rootConnected }) => directoryCount + (rootConnected ? 1 : 0))
91+
)
92+
})
93+
)

packages/app/src/docker-git/menu-auth-snapshot-builder.ts

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,38 @@ export type AuthAccountCounts = {
1515
readonly grokAuthEntries: number
1616
}
1717

18+
export type AuthAccountCountPaths = {
19+
readonly claudeAuthPath: string
20+
readonly codexAuthPath: string
21+
readonly geminiAuthPath: string
22+
readonly grokAuthPath: string
23+
}
24+
1825
export const countAuthAccountEntries = (
1926
fs: FileSystem.FileSystem,
2027
path: Path.Path,
21-
claudeAuthPath: string,
22-
codexAuthPath: string,
23-
geminiAuthPath: string,
24-
grokAuthPath: string
28+
authPaths: AuthAccountCountPaths
2529
): Effect.Effect<AuthAccountCounts, PlatformError> =>
2630
pipe(
2731
Effect.all({
28-
claudeAuthEntries: countAuthCredentialAccounts(fs, path, claudeAuthPath, hasClaudeAccountCredentials),
29-
codexAuthEntries: countCodexCredentialAccounts(fs, path, codexAuthPath),
30-
geminiAuthEntries: countAuthCredentialAccounts(fs, path, geminiAuthPath, hasGeminiAccountCredentials),
31-
grokAuthEntries: countAuthCredentialAccounts(fs, path, grokAuthPath, hasGrokAccountCredentials)
32+
claudeAuthEntries: countAuthCredentialAccounts(
33+
fs,
34+
path,
35+
authPaths.claudeAuthPath,
36+
hasClaudeAccountCredentials
37+
),
38+
codexAuthEntries: countCodexCredentialAccounts(fs, path, authPaths.codexAuthPath),
39+
geminiAuthEntries: countAuthCredentialAccounts(
40+
fs,
41+
path,
42+
authPaths.geminiAuthPath,
43+
hasGeminiAccountCredentials
44+
),
45+
grokAuthEntries: countAuthCredentialAccounts(
46+
fs,
47+
path,
48+
authPaths.grokAuthPath,
49+
hasGrokAccountCredentials
50+
)
3251
})
3352
)

packages/app/src/docker-git/menu-project-auth-helpers.ts

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,16 @@ import type { PlatformError } from "@effect/platform/Error"
22
import type * as FileSystem from "@effect/platform/FileSystem"
33
import { Effect } from "effect"
44

5+
import { hasFileAtPath, hasNonEmptyFile } from "./menu-auth-file-helpers.js"
6+
7+
export { hasFileAtPath, hasNonEmptyFile } from "./menu-auth-file-helpers.js"
8+
59
type AccountCredentialSpec = {
610
readonly apiKeyFileName: string
711
readonly envFileName: string
812
readonly envKeys: ReadonlyArray<string>
913
}
1014

11-
export const hasFileAtPath = (
12-
fs: FileSystem.FileSystem,
13-
filePath: string
14-
): Effect.Effect<boolean, PlatformError> =>
15-
fs.stat(filePath).pipe(
16-
Effect.map((info) => info.type === "File"),
17-
Effect.catchAll(() => Effect.succeed(false))
18-
)
19-
20-
export const hasNonEmptyFile = (
21-
fs: FileSystem.FileSystem,
22-
filePath: string
23-
): Effect.Effect<boolean, PlatformError> =>
24-
fs.readFileString(filePath).pipe(
25-
Effect.map((content) => content.trim().length > 0),
26-
Effect.catchAll(() => Effect.succeed(false))
27-
)
28-
2915
export const hasNonEmptyEnvValue = (
3016
fs: FileSystem.FileSystem,
3117
envFilePath: string,

packages/app/src/docker-git/program-auth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
import { type ControllerRuntime, ensureControllerReady } from "./controller.js"
2222
import type { Command } from "./frontend-lib/core/domain.js"
2323
import type { ApiRequestError, CliError } from "./host-errors.js"
24-
import { terminalAuthTitle, type TerminalAuthFlow } from "./menu-auth-shared.js"
24+
import { type TerminalAuthFlow, terminalAuthTitle } from "./menu-auth-shared.js"
2525
import { attachTerminalSession } from "./terminal-session-client.js"
2626

2727
type OperationalCommand = Exclude<Command, { readonly _tag: "Help" }>

0 commit comments

Comments
 (0)