import type { OidcSpaUtils, CreateValidateAndGetAccessTokenClaims, ParamsOfBootstrap } from "./types"; import type { DecodedAccessToken_RFC9068 as AccessTokenClaims_RFC9068 } from "../../server"; import type { Oidc as Oidc_core } from "../../core"; import { assert, type Equals } from "../../tools/tsafe/assert"; import type { ZodSchemaLike } from "../../tools/ZodSchemaLike"; import { createCreateValidateAndGetAccessTokenClaims_rfc9068 } from "./accessTokenValidation_rfc9068"; import { createOidcSpaUtils } from "./createOidcSpaUtils"; export type OidcSpaUtilsBuilder< AutoLogin extends boolean = false, DecodedIdToken extends Record = Oidc_core.Tokens.DecodedIdToken_OidcCoreSpec, AccessTokenClaims extends Record | undefined = undefined, ExcludedMethod extends | "withAutoLogin" | "withExpectedDecodedIdTokenShape" | "withAccessTokenValidation" | "createUtils" = never > = Omit< { withAutoLogin: () => OidcSpaUtilsBuilder< true, DecodedIdToken, AccessTokenClaims, ExcludedMethod | "withAutoLogin" >; withExpectedDecodedIdTokenShape: >(params: { decodedIdTokenSchema: ZodSchemaLike< Oidc_core.Tokens.DecodedIdToken_OidcCoreSpec, DecodedIdToken >; decodedIdToken_mock?: NoInfer; }) => OidcSpaUtilsBuilder< AutoLogin, DecodedIdToken, AccessTokenClaims, ExcludedMethod | "withExpectedDecodedIdTokenShape" >; withAccessTokenValidation: { = AccessTokenClaims_RFC9068>(params: { type: "RFC 9068: JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens"; accessTokenClaimsSchema?: ZodSchemaLike; accessTokenClaims_mock?: NoInfer; expectedAudience?: (params: { paramsOfBootstrap: ParamsOfBootstrap.Real; process: { env: Record }; }) => string; }): OidcSpaUtilsBuilder< AutoLogin, DecodedIdToken, AccessTokenClaims, ExcludedMethod | "withAccessTokenValidation" >; >(params: { type: "custom"; createValidateAndGetAccessTokenClaims: CreateValidateAndGetAccessTokenClaims; }): OidcSpaUtilsBuilder< AutoLogin, DecodedIdToken, AccessTokenClaims, ExcludedMethod | "withAccessTokenValidation" >; }; createUtils: () => OidcSpaUtils; }, ExcludedMethod >; function createOidcSpaUtilsBuilder< AutoLogin extends boolean = false, DecodedIdToken extends Record = Oidc_core.Tokens.DecodedIdToken_OidcCoreSpec, AccessTokenClaims extends Record | undefined = undefined >(params: { autoLogin: AutoLogin; decodedIdTokenSchema: | ZodSchemaLike | undefined; decodedIdToken_mock: DecodedIdToken | undefined; createValidateAndGetAccessTokenClaims: | CreateValidateAndGetAccessTokenClaims | undefined; }): OidcSpaUtilsBuilder { return { withAutoLogin: () => createOidcSpaUtilsBuilder({ autoLogin: true, decodedIdTokenSchema: params.decodedIdTokenSchema, decodedIdToken_mock: params.decodedIdToken_mock, createValidateAndGetAccessTokenClaims: params.createValidateAndGetAccessTokenClaims }), withExpectedDecodedIdTokenShape: ({ decodedIdTokenSchema, decodedIdToken_mock }) => createOidcSpaUtilsBuilder({ autoLogin: params.autoLogin, decodedIdTokenSchema, decodedIdToken_mock: decodedIdToken_mock, createValidateAndGetAccessTokenClaims: params.createValidateAndGetAccessTokenClaims }), withAccessTokenValidation: params_scope => createOidcSpaUtilsBuilder({ autoLogin: params.autoLogin, decodedIdTokenSchema: params.decodedIdTokenSchema, decodedIdToken_mock: params.decodedIdToken_mock, createValidateAndGetAccessTokenClaims: ((): any => { switch (params_scope.type) { case "RFC 9068: JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens": { const { accessTokenClaimsSchema, accessTokenClaims_mock, expectedAudience } = params_scope; const { createValidateAndGetAccessTokenClaims } = createCreateValidateAndGetAccessTokenClaims_rfc9068< Exclude >({ // @ts-expect-error accessTokenClaims_mock, // @ts-expect-error accessTokenClaimsSchema, expectedAudience }); return createValidateAndGetAccessTokenClaims; } case "custom": { const { createValidateAndGetAccessTokenClaims } = params_scope; return createValidateAndGetAccessTokenClaims; } default: assert>(false); } })() }), createUtils: () => createOidcSpaUtils({ autoLogin: params.autoLogin, decodedIdTokenSchema: params.decodedIdTokenSchema, decodedIdToken_mock: params.decodedIdToken_mock, createValidateAndGetAccessTokenClaims: params.createValidateAndGetAccessTokenClaims }) }; } export const oidcSpaUtilsBuilder = createOidcSpaUtilsBuilder({ autoLogin: false, createValidateAndGetAccessTokenClaims: undefined, decodedIdToken_mock: undefined, decodedIdTokenSchema: undefined });