diff --git a/src/Fallback.tsx b/src/Fallback.tsx index 9b640d55..e793ea56 100644 --- a/src/Fallback.tsx +++ b/src/Fallback.tsx @@ -1,7 +1,7 @@ import { lazy, Suspense } from "react"; -import type { KcContext } from "keycloakify/kcContext"; import type { PageProps } from "keycloakify/pages/PageProps"; import type { I18n } from "keycloakify/i18n"; +import type { KcContext } from "./kcContext"; const Login = lazy(() => import("keycloakify/pages/Login")); const Register = lazy(() => import("keycloakify/pages/Register")); diff --git a/src/Template.tsx b/src/Template.tsx index c05dbdb1..aecbd7e1 100644 --- a/src/Template.tsx +++ b/src/Template.tsx @@ -3,7 +3,7 @@ import { clsx } from "keycloakify/tools/clsx"; import { usePrepareTemplate } from "keycloakify/lib/usePrepareTemplate"; import { type TemplateProps, defaultTemplateClasses } from "keycloakify/TemplateProps"; import { useGetClassName } from "keycloakify/lib/useGetClassName"; -type KcContext = import("./kcContext/KcContext").KcContext.Common; +import type { KcContext } from "./kcContext"; import type { I18n } from "./i18n"; export default function Template(props: TemplateProps) { diff --git a/src/TemplateProps.ts b/src/TemplateProps.ts index 63ddfc4f..c89c6f58 100644 --- a/src/TemplateProps.ts +++ b/src/TemplateProps.ts @@ -1,6 +1,6 @@ import type { ReactNode } from "react"; -import type { KcContext } from "keycloakify/kcContext"; -import type { I18n } from "keycloakify/i18n"; +import type { KcContext } from "./kcContext"; +import type { I18n } from "./i18n"; export type TemplateProps = { kcContext: KcContext; diff --git a/src/i18n/i18n.tsx b/src/i18n/i18n.tsx index b368f27c..fdb043c9 100644 --- a/src/i18n/i18n.tsx +++ b/src/i18n/i18n.tsx @@ -17,7 +17,7 @@ export type KcContextLike = { assert(); -export type MessageKeyBase = keyof typeof baseMessages | keyof (typeof keycloakifyExtraMessages)[typeof fallbackLanguageTag]; +export type MessageKey = keyof typeof baseMessages | keyof (typeof keycloakifyExtraMessages)[typeof fallbackLanguageTag]; export type GenericI18n = { /** @@ -67,15 +67,15 @@ export type GenericI18n = { advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string; }; -export type I18n = GenericI18n; +export type I18n = GenericI18n; export function createUseI18n(extraMessages: { [languageTag: string]: { [key in ExtraMessageKey]: string }; }) { - function useI18n(params: { kcContext: KcContextLike }): GenericI18n | null { + function useI18n(params: { kcContext: KcContextLike }): GenericI18n | null { const { kcContext } = params; - const [i18n, setI18n] = useState | undefined>(undefined); + const [i18n, setI18n] = useState | undefined>(undefined); const refHasStartedFetching = useRef(false); diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 00000000..36a7e50a --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1 @@ +export type { I18n } from "./i18n"; diff --git a/src/i18n/index.tsx b/src/i18n/index.tsx deleted file mode 100644 index 0c4205e0..00000000 --- a/src/i18n/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export * from "./i18n"; diff --git a/src/index.ts b/src/index.ts index 5abe6890..024db711 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,6 @@ export default Fallback; export { createKeycloakAdapter } from "keycloakify/lib/keycloakJsAdapter"; export { useDownloadTerms } from "keycloakify/lib/useDownloadTerms"; export { getKcContext } from "keycloakify/kcContext/getKcContext"; -export { createUseI18n } from "keycloakify/i18n"; +export { createUseI18n } from "keycloakify/i18n/i18n"; export type { PageProps } from "keycloakify/pages/PageProps"; diff --git a/src/kcContext/KcContext.ts b/src/kcContext/KcContext.ts index a497c2fc..cc398185 100644 --- a/src/kcContext/KcContext.ts +++ b/src/kcContext/KcContext.ts @@ -1,7 +1,7 @@ import type { PageId } from "../bin/keycloakify/generateFtl"; import { assert } from "tsafe/assert"; import type { Equals } from "tsafe"; -import type { MessageKeyBase } from "../i18n"; +import type { MessageKey } from "../i18n/i18n"; type ExtractAfterStartingWith = StrEnum extends `${Prefix}${infer U}` ? U : never; @@ -160,7 +160,7 @@ export declare namespace KcContext { export type Info = Common & { pageId: "info.ftl"; messageHeader?: string; - requiredActions?: ExtractAfterStartingWith<"requiredAction.", MessageKeyBase>[]; + requiredActions?: ExtractAfterStartingWith<"requiredAction.", MessageKey>[]; skipLink: boolean; pageRedirectUri?: string; actionUri?: string; @@ -279,7 +279,7 @@ export declare namespace KcContext { credentialId: string; transports: { iconClass: string; - displayNameProperties: MessageKeyBase[]; + displayNameProperties: MessageKey[]; }; label: string; createdAt: string; diff --git a/src/kcContext/getKcContext.ts b/src/kcContext/getKcContext.ts index c0d96c36..9af33a29 100644 --- a/src/kcContext/getKcContext.ts +++ b/src/kcContext/getKcContext.ts @@ -5,7 +5,7 @@ import { deepAssign } from "../tools/deepAssign"; import { id } from "tsafe/id"; import { exclude } from "tsafe/exclude"; import { assert } from "tsafe/assert"; -import type { ExtendsKcContext } from "./getKcContextFromWindow"; +import type { ExtendKcContext } from "./getKcContextFromWindow"; import { getKcContextFromWindow } from "./getKcContextFromWindow"; import { pathJoin } from "../bin/tools/pathJoin"; import { pathBasename } from "../tools/pathBasename"; @@ -13,9 +13,9 @@ import { mockTestingResourcesCommonPath } from "../bin/mockTestingResourcesPath" import { symToStr } from "tsafe/symToStr"; export function getKcContext(params?: { - mockPageId?: ExtendsKcContext["pageId"]; - mockData?: readonly DeepPartial>[]; -}): { kcContext: ExtendsKcContext | undefined } { + mockPageId?: ExtendKcContext["pageId"]; + mockData?: readonly DeepPartial>[]; +}): { kcContext: ExtendKcContext | undefined } { const { mockPageId, mockData } = params ?? {}; const realKcContext = getKcContextFromWindow(); diff --git a/src/kcContext/getKcContextFromWindow.ts b/src/kcContext/getKcContextFromWindow.ts index 8bd73867..fec0e135 100644 --- a/src/kcContext/getKcContextFromWindow.ts +++ b/src/kcContext/getKcContextFromWindow.ts @@ -2,10 +2,10 @@ import type { KcContext } from "./KcContext"; import type { AndByDiscriminatingKey } from "../tools/AndByDiscriminatingKey"; import { ftlValuesGlobalName } from "../bin/keycloakify/ftlValuesGlobalName"; -export type ExtendsKcContext = [KcContextExtension] extends [never] +export type ExtendKcContext = [KcContextExtension] extends [never] ? KcContext : AndByDiscriminatingKey<"pageId", KcContextExtension & KcContext.Common, KcContext>; -export function getKcContextFromWindow(): ExtendsKcContext | undefined { +export function getKcContextFromWindow(): ExtendKcContext | undefined { return typeof window === "undefined" ? undefined : (window as any)[ftlValuesGlobalName]; } diff --git a/src/kcContext/index.ts b/src/kcContext/index.ts index 3afd0aff..7ecbb2f3 100644 --- a/src/kcContext/index.ts +++ b/src/kcContext/index.ts @@ -1,3 +1 @@ -export type { KcContext, Attribute, Validators } from "./KcContext"; -export type { ExtendsKcContext } from "./getKcContextFromWindow"; -export { getKcContext } from "./getKcContext"; +export type { KcContext } from "./KcContext"; diff --git a/src/lib/useDownloadTerms.ts b/src/lib/useDownloadTerms.ts index 2ffe063e..10d675eb 100644 --- a/src/lib/useDownloadTerms.ts +++ b/src/lib/useDownloadTerms.ts @@ -1,11 +1,11 @@ import { useEffect } from "react"; -import { memoize } from "../tools/memoize"; -import { fallbackLanguageTag } from "../i18n"; -import { useConst } from "../tools/useConst"; -import { useConstCallback } from "../tools/useConstCallback"; +import { memoize } from "keycloakify/tools/memoize"; +import { fallbackLanguageTag } from "keycloakify/i18n/i18n"; +import { useConst } from "keycloakify/tools/useConst"; +import { useConstCallback } from "keycloakify/tools/useConstCallback"; import { assert } from "tsafe/assert"; -import { KcContext } from "../kcContext"; import { Evt } from "evt"; +import { KcContext } from "../kcContext"; export const evtTermMarkdown = Evt.create(undefined); diff --git a/src/lib/useFormValidation.tsx b/src/lib/useFormValidation.tsx index 05dfa8f3..3e974d4d 100644 --- a/src/lib/useFormValidation.tsx +++ b/src/lib/useFormValidation.tsx @@ -1,8 +1,8 @@ import "keycloakify/tools/Array.prototype.every"; import { useMemo, useReducer, Fragment } from "react"; import { id } from "tsafe/id"; -import type { MessageKeyBase } from "keycloakify/i18n"; -import type { Attribute, Validators } from "keycloakify/kcContext"; +import type { MessageKey } from "keycloakify/i18n/i18n"; +import type { Attribute, Validators } from "keycloakify/kcContext/KcContext"; import { useConstCallback } from "keycloakify/tools/useConstCallback"; import { emailRegexp } from "keycloakify/tools/emailRegExp"; import type { KcContext } from "../kcContext"; @@ -52,7 +52,7 @@ export function useFormValidation(params: { curr, id({ "name": "password", - "displayName": id<`\${${MessageKeyBase}}`>("${password}"), + "displayName": id<`\${${MessageKey}}`>("${password}"), "required": true, "readOnly": false, "validators": passwordValidators, @@ -62,7 +62,7 @@ export function useFormValidation(params: { }), id({ "name": "password-confirm", - "displayName": id<`\${${MessageKeyBase}}`>("${passwordConfirm}"), + "displayName": id<`\${${MessageKey}}`>("${passwordConfirm}"), "required": true, "readOnly": false, "validators": { @@ -70,7 +70,7 @@ export function useFormValidation(params: { "name": "password", "ignore.empty.value": true, "shouldBe": "equal", - "error-message": id<`\${${MessageKeyBase}}`>("${invalidPasswordConfirmMessage}") + "error-message": id<`\${${MessageKey}}`>("${invalidPasswordConfirmMessage}") } }, "annotations": {}, @@ -312,7 +312,7 @@ function useGetErrors(params: { const msgArg = [ errorMessageKey ?? - id( + id( (() => { switch (shouldBe) { case "equal": @@ -353,7 +353,7 @@ function useGetErrors(params: { break scope; } - const msgArgs = [errorMessageKey ?? id("shouldMatchPattern"), pattern] as const; + const msgArgs = [errorMessageKey ?? id("shouldMatchPattern"), pattern] as const; errors.push({ validatorName, @@ -385,7 +385,7 @@ function useGetErrors(params: { break scope; } - const msgArgs = [id("invalidEmailMessage")] as const; + const msgArgs = [id("invalidEmailMessage")] as const; errors.push({ validatorName, @@ -465,7 +465,7 @@ function useGetErrors(params: { break scope; } - const msgArgs = [id("notAValidOption")] as const; + const msgArgs = [id("notAValidOption")] as const; errors.push({ validatorName, diff --git a/src/pages/WebauthnAuthenticate.tsx b/src/pages/WebauthnAuthenticate.tsx index 721eb145..2bf96911 100644 --- a/src/pages/WebauthnAuthenticate.tsx +++ b/src/pages/WebauthnAuthenticate.tsx @@ -1,6 +1,6 @@ import { useRef, useState } from "react"; import { clsx } from "keycloakify/tools/clsx"; -import type { MessageKeyBase } from "../i18n"; +import type { MessageKey } from "../i18n/i18n"; import { base64url } from "rfc4648"; import { useConstCallback } from "../tools/useConstCallback"; import { type PageProps, defaultClasses } from "keycloakify/pages/PageProps"; @@ -158,7 +158,7 @@ export default function WebauthnAuthenticate(props: PageProps {authenticator.transports.displayNameProperties.map( - (transport: MessageKeyBase, index: number) => ( + (transport: MessageKey, index: number) => ( <> {msg(transport)} {index < authenticator.transports.displayNameProperties.length - 1 && ( diff --git a/src/pages/shared/UserProfileCommons.tsx b/src/pages/shared/UserProfileCommons.tsx index e362cf60..da48175c 100644 --- a/src/pages/shared/UserProfileCommons.tsx +++ b/src/pages/shared/UserProfileCommons.tsx @@ -2,7 +2,7 @@ import { useEffect, Fragment } from "react"; import type { ClassKey } from "keycloakify/pages/PageProps"; import { clsx } from "keycloakify/tools/clsx"; import { useFormValidation } from "keycloakify/lib/useFormValidation"; -import type { Attribute } from "keycloakify/kcContext"; +import type { Attribute } from "keycloakify/kcContext/KcContext"; import type { I18n } from "../../i18n"; export type UserProfileFormFieldsProps = { diff --git a/test/lib/getKcContext.ts b/test/lib/getKcContext.ts index 1485d9bf..c4d2a2ea 100644 --- a/test/lib/getKcContext.ts +++ b/test/lib/getKcContext.ts @@ -1,6 +1,6 @@ -import { getKcContext } from "../../src/kcContext"; +import { getKcContext } from "../../src/kcContext/getKcContext"; +import type { ExtendKcContext } from "../../src/kcContext/getKcContextFromWindow"; import type { KcContext } from "../../src/kcContext"; -import type { ExtendsKcContext } from "../../src/kcContext"; import { same } from "evt/tools/inDepth"; import { assert } from "tsafe/assert"; import type { Equals } from "tsafe"; @@ -15,7 +15,7 @@ import { deepClone } from "../../src/tools/deepClone"; const aNonStandardValue1 = "a non standard value 1"; const aNonStandardValue2 = "a non standard value 2"; - type KcContextExtended = + type KcContextExtension = | { pageId: "register.ftl"; authorizedMailDomains: string[]; @@ -32,10 +32,10 @@ import { deepClone } from "../../src/tools/deepClone"; aNonStandardValue2: string; }; - const getKcContextProxy = (params: { mockPageId: ExtendsKcContext["pageId"] }) => { + const getKcContextProxy = (params: { mockPageId: ExtendKcContext["pageId"] }) => { const { mockPageId } = params; - const { kcContext } = getKcContext({ + const { kcContext } = getKcContext({ mockPageId, "mockData": [ {