1
0
forked from baron/baron-sso

chore(devfront): fix biome formatting and lints

This commit is contained in:
2026-04-02 17:43:45 +09:00
parent 81d70c87f1
commit ec42739764
2 changed files with 132 additions and 121 deletions

View File

@@ -73,7 +73,10 @@ const HEADLESS_LOGIN_ALLOWED_ALGORITHM_SET = new Set<string>(
HEADLESS_LOGIN_ALLOWED_ALGORITHMS, HEADLESS_LOGIN_ALLOWED_ALGORITHMS,
); );
function formatHeadlessParsedKeyLabel(kid: string | undefined, index: number): string { function formatHeadlessParsedKeyLabel(
kid: string | undefined,
index: number,
): string {
const trimmedKid = kid?.trim(); const trimmedKid = kid?.trim();
if (trimmedKid) { if (trimmedKid) {
return trimmedKid; return trimmedKid;
@@ -302,7 +305,7 @@ function ClientGeneralPage() {
headlessLoginEnabled && headlessLoginEnabled &&
trimmedJwksUri !== "" && trimmedJwksUri !== "" &&
currentHeadlessJwksCache?.jwksUri === trimmedJwksUri currentHeadlessJwksCache?.jwksUri === trimmedJwksUri
? currentHeadlessJwksCache.parsedKeys ?? [] ? (currentHeadlessJwksCache.parsedKeys ?? [])
: []; : [];
const unsupportedParsedAlgorithms = parsedKeysForCurrentJwksUri const unsupportedParsedAlgorithms = parsedKeysForCurrentJwksUri
.map((key, index) => ({ .map((key, index) => ({
@@ -463,8 +466,7 @@ function ClientGeneralPage() {
? tokenEndpointAuthMethod ? tokenEndpointAuthMethod
: undefined, : undefined,
headless_jwks_uri: headless_jwks_uri:
clientType === "pkce" && clientType === "pkce" && headlessLoginEnabled
headlessLoginEnabled
? trimmedJwksUri ? trimmedJwksUri
: undefined, : undefined,
}, },
@@ -1148,9 +1150,7 @@ function ClientGeneralPage() {
type="button" type="button"
size="sm" size="sm"
variant="outline" variant="outline"
onClick={() => onClick={() => refreshHeadlessJwksCacheMutation.mutate()}
refreshHeadlessJwksCacheMutation.mutate()
}
disabled={refreshHeadlessJwksCacheMutation.isPending} disabled={refreshHeadlessJwksCacheMutation.isPending}
> >
{refreshHeadlessJwksCacheMutation.isPending {refreshHeadlessJwksCacheMutation.isPending
@@ -1202,10 +1202,7 @@ function ClientGeneralPage() {
"Status", "Status",
)} )}
</p> </p>
<Badge <Badge variant="info" className="w-fit capitalize">
variant="info"
className="w-fit capitalize"
>
{currentHeadlessJwksCache.lastRefreshStatus || {currentHeadlessJwksCache.lastRefreshStatus ||
t("ui.common.unknown", "Unknown")} t("ui.common.unknown", "Unknown")}
</Badge> </Badge>
@@ -1237,7 +1234,9 @@ function ClientGeneralPage() {
"Expires At", "Expires At",
)} )}
</p> </p>
<p>{formatDateTime(currentHeadlessJwksCache.expiresAt)}</p> <p>
{formatDateTime(currentHeadlessJwksCache.expiresAt)}
</p>
</div> </div>
<div className="space-y-1"> <div className="space-y-1">
<p className="text-xs font-semibold uppercase text-muted-foreground"> <p className="text-xs font-semibold uppercase text-muted-foreground">
@@ -1247,9 +1246,7 @@ function ClientGeneralPage() {
)} )}
</p> </p>
<p> <p>
{formatDateTime( {formatDateTime(currentHeadlessJwksCache.lastCheckedAt)}
currentHeadlessJwksCache.lastCheckedAt,
)}
</p> </p>
</div> </div>
<div className="space-y-1"> <div className="space-y-1">
@@ -1272,9 +1269,7 @@ function ClientGeneralPage() {
"Consecutive Failures", "Consecutive Failures",
)} )}
</p> </p>
<p> <p>{currentHeadlessJwksCache.consecutiveFailures ?? 0}</p>
{currentHeadlessJwksCache.consecutiveFailures ?? 0}
</p>
</div> </div>
<div className="space-y-1"> <div className="space-y-1">
<p className="text-xs font-semibold uppercase text-muted-foreground"> <p className="text-xs font-semibold uppercase text-muted-foreground">
@@ -1346,7 +1341,8 @@ function ClientGeneralPage() {
</div> </div>
{currentHeadlessJwksCache.parsedKeys?.length ? ( {currentHeadlessJwksCache.parsedKeys?.length ? (
<div className="space-y-3"> <div className="space-y-3">
{currentHeadlessJwksCache.parsedKeys.map((key, index) => { {currentHeadlessJwksCache.parsedKeys.map(
(key, index) => {
const normalizedAlgorithm = key.alg?.trim() ?? ""; const normalizedAlgorithm = key.alg?.trim() ?? "";
const isMissingAlgorithm = const isMissingAlgorithm =
normalizedAlgorithm === ""; normalizedAlgorithm === "";
@@ -1398,7 +1394,8 @@ function ClientGeneralPage() {
<p <p
className={cn( className={cn(
"break-all rounded-lg border bg-background px-3 py-2 font-mono text-[11px]", "break-all rounded-lg border bg-background px-3 py-2 font-mono text-[11px]",
isUnsupportedAlgorithm || isMissingAlgorithm isUnsupportedAlgorithm ||
isMissingAlgorithm
? "border-destructive/50 text-destructive" ? "border-destructive/50 text-destructive"
: "border-border", : "border-border",
)} )}
@@ -1440,7 +1437,8 @@ function ClientGeneralPage() {
</div> </div>
</div> </div>
); );
})} },
)}
</div> </div>
) : ( ) : (
<div className="rounded-lg border border-dashed border-border px-4 py-5 text-sm text-muted-foreground"> <div className="rounded-lg border border-dashed border-border px-4 py-5 text-sm text-muted-foreground">

View File

@@ -152,8 +152,7 @@ test.describe("DevFront clients lifecycle", () => {
kty: "RSA", kty: "RSA",
use: "sig", use: "sig",
alg: "RS256", alg: "RS256",
n: n: "voVbHlo_UHkjtT7Q_8owyjZ2omE8n8mbGlpraZziStHPfe08q_RGiEXO6Pyiz42NVi-Yo0c7qiaqRwB4h9s5phpT2wwcUxnkrQeRhe7BpigInZPzpwq1hsaB2zyhE7zTRCC3hinGtFdVpNzTVKYKGPbXfeEXaRL3P838vi-_iB4IN3WQk_pAakUQvajL2H-vcWSMSNslMGPDZxobqE9MHSWocNXemrcmtCeE7ruUND0qHZOb8k-hHUBqsNoJ63WKdapzGYF6e2qgDRveYrjgOCBigZPi8npN0xStQ0YcrH_RxeTogsdRZ8SuXmLqavryVDnrT8czPkkJ-EHb8PiTCQ",
"voVbHlo_UHkjtT7Q_8owyjZ2omE8n8mbGlpraZziStHPfe08q_RGiEXO6Pyiz42NVi-Yo0c7qiaqRwB4h9s5phpT2wwcUxnkrQeRhe7BpigInZPzpwq1hsaB2zyhE7zTRCC3hinGtFdVpNzTVKYKGPbXfeEXaRL3P838vi-_iB4IN3WQk_pAakUQvajL2H-vcWSMSNslMGPDZxobqE9MHSWocNXemrcmtCeE7ruUND0qHZOb8k-hHUBqsNoJ63WKdapzGYF6e2qgDRveYrjgOCBigZPi8npN0xStQ0YcrH_RxeTogsdRZ8SuXmLqavryVDnrT8czPkkJ-EHb8PiTCQ",
}, },
], ],
}, },
@@ -162,11 +161,13 @@ test.describe("DevFront clients lifecycle", () => {
consents: [] as Consent[], consents: [] as Consent[],
auditLogsByCursor: undefined, auditLogsByCursor: undefined,
onRefreshHeadlessJwks(clientId: string) { onRefreshHeadlessJwks(clientId: string) {
if (this.clients[0].headlessJwksCache) {
this.clients[0].headlessJwksCache = { this.clients[0].headlessJwksCache = {
...this.clients[0].headlessJwksCache!, ...this.clients[0].headlessJwksCache,
lastRefreshStatus: "success", lastRefreshStatus: "success",
lastCheckedAt: "2026-04-01T00:00:00.000Z", lastCheckedAt: "2026-04-01T00:00:00.000Z",
}; };
}
expect(clientId).toBe("client-headless-login"); expect(clientId).toBe("client-headless-login");
}, },
onRevokeHeadlessJwksCache(clientId: string) { onRevokeHeadlessJwksCache(clientId: string) {
@@ -184,13 +185,17 @@ test.describe("DevFront clients lifecycle", () => {
.click(); .click();
await expect( await expect(
page.getByRole("heading", { name: /공개키 등록|Public Key Registration/i }), page.getByRole("heading", {
name: /공개키 등록|Public Key Registration/i,
}),
).toBeVisible(); ).toBeVisible();
await expect( await expect(
page.getByText(/Request Object Signing Algorithm/i), page.getByText(/Request Object Signing Algorithm/i),
).toHaveCount(0); ).toHaveCount(0);
await expect(page.getByText(/Allowed algorithms|허용 알고리즘/i)).toHaveCount(0); await expect(
page.getByText(/Allowed algorithms|허용 알고리즘/i),
).toHaveCount(0);
await page await page
.getByPlaceholder(/https:\/\/rp\.example\.com\/\.well-known\/jwks\.json/i) .getByPlaceholder(/https:\/\/rp\.example\.com\/\.well-known\/jwks\.json/i)
.fill(jwksUri); .fill(jwksUri);
@@ -256,7 +261,9 @@ test.describe("DevFront clients lifecycle", () => {
name: /공개키 등록|Public Key Registration/i, name: /공개키 등록|Public Key Registration/i,
}), }),
).toBeVisible(); ).toBeVisible();
await expect(page.getByRole("textbox", { name: /JWKS URI|JWKS URI/i })).toHaveValue(jwksUri); await expect(
page.getByRole("textbox", { name: /JWKS URI|JWKS URI/i }),
).toHaveValue(jwksUri);
}); });
test("pkce headless login blocks save when parsed jwks algorithm is unsupported", async ({ test("pkce headless login blocks save when parsed jwks algorithm is unsupported", async ({
@@ -306,9 +313,13 @@ test.describe("DevFront clients lifecycle", () => {
.fill(jwksUri); .fill(jwksUri);
await expect( await expect(
page.getByText("지원하지 않는 알고리즘이 감지되었습니다.", { exact: true }), page.getByText("지원하지 않는 알고리즘이 감지되었습니다.", {
exact: true,
}),
).toBeVisible(); ).toBeVisible();
await expect(page.getByRole("button", { name: /^저장$|^Save$/i })).toBeDisabled(); await expect(
page.getByRole("button", { name: /^저장$|^Save$/i }),
).toBeDisabled();
}); });
test("pkce headless login blocks save when parsed jwks algorithm is missing", async ({ test("pkce headless login blocks save when parsed jwks algorithm is missing", async ({
@@ -356,6 +367,8 @@ test.describe("DevFront clients lifecycle", () => {
await expect( await expect(
page.getByText(/알고리즘이 선언되지 않았습니다|algorithm is missing/i), page.getByText(/알고리즘이 선언되지 않았습니다|algorithm is missing/i),
).toBeVisible(); ).toBeVisible();
await expect(page.getByRole("button", { name: /^저장$|^Save$/i })).toBeDisabled(); await expect(
page.getByRole("button", { name: /^저장$|^Save$/i }),
).toBeDisabled();
}); });
}); });