From db0ec954df004952224a84244dcab026c0b61192 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Sun, 15 Dec 2024 11:34:41 +0100 Subject: [PATCH] Fix zod schema error --- src/bin/start-keycloak/ParsedRealmJson.ts | 123 ----------------- .../realmConfig/ParsedRealmJson.ts | 129 +++++++++--------- .../realmConfig/prepareRealmConfig.ts | 4 +- 3 files changed, 69 insertions(+), 187 deletions(-) delete mode 100644 src/bin/start-keycloak/ParsedRealmJson.ts diff --git a/src/bin/start-keycloak/ParsedRealmJson.ts b/src/bin/start-keycloak/ParsedRealmJson.ts deleted file mode 100644 index e136ae8b..00000000 --- a/src/bin/start-keycloak/ParsedRealmJson.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { z } from "zod"; -import { assert, type Equals } from "tsafe/assert"; -import { is } from "tsafe/is"; -import { id } from "tsafe/id"; -import * as fs from "fs"; -import { join as pathJoin } from "path"; -import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath"; - -export type ParsedRealmJson = { - name: string; - users: { - id: string; - email: string; - username: string; - attributes: Record; - credentials: { - type: string /* "password" or something else */; - }[]; - clientRoles: Record; - }[]; - roles: { - client: { - name: string; - containerId: string; // client id - }[]; - }; - clients: { - id: string; - clientId: string; // example: realm-management - baseUrl?: string; - redirectUris?: string[]; - webOrigins?: string[]; - attributes?: { - "post.logout.redirect.uris"?: string; - }; - protocol?: string; - protocolMappers?: unknown[]; - }[]; -}; - -export function readRealmJsonFile(params: { - realmJsonFilePath: string; -}): ParsedRealmJson { - const { realmJsonFilePath } = params; - - const parsedRealmJson = JSON.parse( - fs.readFileSync(realmJsonFilePath).toString("utf8") - ) as unknown; - - const zParsedRealmJson = (() => { - type TargetType = ParsedRealmJson; - - const zTargetType = z.object({ - name: z.string(), - users: z.array( - z.object({ - id: z.string(), - email: z.string(), - username: z.string(), - attributes: z.record(z.unknown()), - credentials: z.array( - z.object({ - type: z.string() - }) - ), - clientRoles: z.record(z.array(z.string())) - }) - ), - roles: z.object({ - client: z.array( - z.object({ - name: z.string(), - containerId: z.string() - }) - ) - }), - clients: z.array( - z.object({ - id: z.string(), - clientId: z.string(), - baseUrl: z.string().optional(), - redirectUris: z.array(z.string()).optional(), - webOrigins: z.array(z.string()).optional(), - attributes: z - .object({ - "post.logout.redirect.uris": z.string().optional() - }) - .optional(), - protocol: z.string().optional(), - protocolMappers: z.array(z.unknown()).optional() - }) - ) - }); - - type InferredType = z.infer; - - assert>; - - return id>(zTargetType); - })(); - - zParsedRealmJson.parse(parsedRealmJson); - - assert(is(parsedRealmJson)); - - return parsedRealmJson; -} - -export function getDefaultConfig(params: { - keycloakMajorVersionNumber: number; -}): ParsedRealmJson { - const { keycloakMajorVersionNumber } = params; - - const realmJsonFilePath = pathJoin( - getThisCodebaseRootDirPath(), - "src", - "bin", - "start-keycloak", - `myrealm-realm-${keycloakMajorVersionNumber}.json` - ); - - return readRealmJsonFile({ realmJsonFilePath }); -} diff --git a/src/bin/start-keycloak/realmConfig/ParsedRealmJson.ts b/src/bin/start-keycloak/realmConfig/ParsedRealmJson.ts index d92141c7..4dcbc09f 100644 --- a/src/bin/start-keycloak/realmConfig/ParsedRealmJson.ts +++ b/src/bin/start-keycloak/realmConfig/ParsedRealmJson.ts @@ -5,7 +5,7 @@ import { id } from "tsafe/id"; import * as fs from "fs"; export type ParsedRealmJson = { - name: string; + realm: string; loginTheme?: string; accountTheme?: string; adminTheme?: string; @@ -22,10 +22,13 @@ export type ParsedRealmJson = { clientRoles: Record; }[]; roles: { - client: { - name: string; - containerId: string; // client id - }[]; + client: Record< + string, + { + name: string; + containerId: string; // client id + }[] + >; }; clients: { id: string; @@ -41,6 +44,65 @@ export type ParsedRealmJson = { }[]; }; +const zParsedRealmJson = (() => { + type TargetType = ParsedRealmJson; + + const zTargetType = z.object({ + realm: z.string(), + loginTheme: z.string().optional(), + accountTheme: z.string().optional(), + adminTheme: z.string().optional(), + emailTheme: z.string().optional(), + eventsListeners: z.array(z.string()), + users: z.array( + z.object({ + id: z.string(), + email: z.string(), + username: z.string(), + attributes: z.record(z.unknown()), + credentials: z.array( + z.object({ + type: z.string() + }) + ), + clientRoles: z.record(z.array(z.string())) + }) + ), + roles: z.object({ + client: z.record( + z.array( + z.object({ + name: z.string(), + containerId: z.string() + }) + ) + ) + }), + clients: z.array( + z.object({ + id: z.string(), + clientId: z.string(), + baseUrl: z.string().optional(), + redirectUris: z.array(z.string()).optional(), + webOrigins: z.array(z.string()).optional(), + attributes: z + .object({ + "post.logout.redirect.uris": z.string().optional() + }) + .optional(), + protocol: z.string().optional(), + protocolMappers: z.array(z.unknown()).optional() + }) + ) + }); + + type InferredType = z.infer; + + assert>; + + return id>(zTargetType); +})(); + export function readRealmJsonFile(params: { realmJsonFilePath: string; }): ParsedRealmJson { @@ -50,63 +112,6 @@ export function readRealmJsonFile(params: { fs.readFileSync(realmJsonFilePath).toString("utf8") ) as unknown; - const zParsedRealmJson = (() => { - type TargetType = ParsedRealmJson; - - const zTargetType = z.object({ - name: z.string(), - loginTheme: z.string().optional(), - accountTheme: z.string().optional(), - adminTheme: z.string().optional(), - emailTheme: z.string().optional(), - eventsListeners: z.array(z.string()), - users: z.array( - z.object({ - id: z.string(), - email: z.string(), - username: z.string(), - attributes: z.record(z.unknown()), - credentials: z.array( - z.object({ - type: z.string() - }) - ), - clientRoles: z.record(z.array(z.string())) - }) - ), - roles: z.object({ - client: z.array( - z.object({ - name: z.string(), - containerId: z.string() - }) - ) - }), - clients: z.array( - z.object({ - id: z.string(), - clientId: z.string(), - baseUrl: z.string().optional(), - redirectUris: z.array(z.string()).optional(), - webOrigins: z.array(z.string()).optional(), - attributes: z - .object({ - "post.logout.redirect.uris": z.string().optional() - }) - .optional(), - protocol: z.string().optional(), - protocolMappers: z.array(z.unknown()).optional() - }) - ) - }); - - type InferredType = z.infer; - - assert>; - - return id>(zTargetType); - })(); - zParsedRealmJson.parse(parsedRealmJson); assert(is(parsedRealmJson)); diff --git a/src/bin/start-keycloak/realmConfig/prepareRealmConfig.ts b/src/bin/start-keycloak/realmConfig/prepareRealmConfig.ts index afe79572..bf1481dc 100644 --- a/src/bin/start-keycloak/realmConfig/prepareRealmConfig.ts +++ b/src/bin/start-keycloak/realmConfig/prepareRealmConfig.ts @@ -51,7 +51,7 @@ export function prepareRealmConfig(params: { } return { - realmName: parsedRealmJson.name, + realmName: parsedRealmJson.realm, clientName: clientId, username }; @@ -138,7 +138,7 @@ function addOrEditTestUser(params: { newUser.clientRoles = {}; - for (const clientRole of parsedRealmJson.roles.client) { + for (const clientRole of Object.values(parsedRealmJson.roles.client).flat()) { const clientName = nameByClientId[clientRole.containerId]; assert(clientName !== undefined);