Implement and type validators
This commit is contained in:
parent
637bc75fc2
commit
c4ba470dc4
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
import type { PageId } from "../../bin/build-keycloak-theme/generateFtl";
|
import type { PageId } from "../../bin/build-keycloak-theme/generateFtl";
|
||||||
import type { KcLanguageTag } from "../i18n/KcLanguageTag";
|
import type { KcLanguageTag } from "../i18n/KcLanguageTag";
|
||||||
import { assert } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import type { Equals } from "tsafe";
|
import type { Equals } from "tsafe";
|
||||||
import type { MessageKey } from "../i18n/useKcMessage";
|
import type { MessageKey } from "../i18n/useKcMessage";
|
||||||
import type { LanguageLabel } from "../i18n/KcLanguageTag";
|
import type { LanguageLabel } from "../i18n/KcLanguageTag";
|
||||||
|
|
||||||
@ -135,20 +135,13 @@ export declare namespace KcContextBase {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export type RegisterUserProfile = RegisterCommon & {
|
export type RegisterUserProfile = RegisterCommon & {
|
||||||
pageId: "register-user-profile.ftl";
|
pageId: "register-user-profile.ftl";
|
||||||
profile: {
|
profile: {
|
||||||
attributes: {
|
context: "REGISTRATION_PROFILE";
|
||||||
name: string;
|
attributes: Attribute[];
|
||||||
displayName?: string;
|
attributesByName: Record<string, Attribute>;
|
||||||
required: boolean;
|
|
||||||
value?: string;
|
|
||||||
group?: string;
|
|
||||||
groupDisplayHeader?: string;
|
|
||||||
groupDisplayDescription?: string;
|
|
||||||
readOnly: boolean;
|
|
||||||
autocomplete?: string;
|
|
||||||
}[];
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -213,6 +206,61 @@ export declare namespace KcContextBase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type Attribute = {
|
||||||
|
name: string;
|
||||||
|
displayName?: string;
|
||||||
|
required: boolean;
|
||||||
|
value?: string;
|
||||||
|
group?: string;
|
||||||
|
groupDisplayHeader?: string;
|
||||||
|
groupDisplayDescription?: string;
|
||||||
|
readOnly: boolean;
|
||||||
|
autocomplete?: string;
|
||||||
|
validators: Validators;
|
||||||
|
annotations: Record<string, string>;
|
||||||
|
groupAnnotations: Record<string, string>
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Validators = Partial<{
|
||||||
|
length: Validators.DoIgnoreEmpty & Validators.Range;
|
||||||
|
double: Validators.DoIgnoreEmpty & Validators.Range;
|
||||||
|
integer: Validators.DoIgnoreEmpty & Validators.Range;
|
||||||
|
email: Validators.DoIgnoreEmpty;
|
||||||
|
'up-immutable-attribute': {};
|
||||||
|
'up-attribute-required-by-metadata-value': {};
|
||||||
|
'up-username-has-value': {};
|
||||||
|
'up-duplicate-username': {};
|
||||||
|
'up-username-mutation': {};
|
||||||
|
'up-email-exists-as-username': {};
|
||||||
|
'up-blank-attribute-value': Validators.ErrorMessage & {
|
||||||
|
'fail-on-null': boolean;
|
||||||
|
};
|
||||||
|
'up-duplicate-email': {};
|
||||||
|
'local-date': Validators.DoIgnoreEmpty;
|
||||||
|
pattern: Validators.DoIgnoreEmpty & Validators.ErrorMessage & { pattern: string; };
|
||||||
|
'person-name-prohibited-characters': Validators.DoIgnoreEmpty & Validators.ErrorMessage;
|
||||||
|
uri: Validators.DoIgnoreEmpty;
|
||||||
|
'username-prohibited-characters': Validators.DoIgnoreEmpty & Validators.ErrorMessage;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export declare namespace Validators {
|
||||||
|
|
||||||
|
export type DoIgnoreEmpty = {
|
||||||
|
'ignore.empty.value'?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ErrorMessage = {
|
||||||
|
'error-message'?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Range = {
|
||||||
|
/** "0", "1", "2"... yeah I know, don't tell me */
|
||||||
|
min?: string;
|
||||||
|
max?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
assert<Equals<KcContextBase["pageId"], PageId>>();
|
assert<Equals<KcContextBase["pageId"], PageId>>();
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
import type { KcContextBase } from "../KcContextBase";
|
import "minimal-polyfills/Object.fromEntries";
|
||||||
|
import type { KcContextBase, Attribute } from "../KcContextBase";
|
||||||
import { getEvtKcLanguage } from "../../i18n/useKcLanguageTag";
|
import { getEvtKcLanguage } from "../../i18n/useKcLanguageTag";
|
||||||
import { getKcLanguageTagLabel } from "../../i18n/KcLanguageTag";
|
import { getKcLanguageTagLabel } from "../../i18n/KcLanguageTag";
|
||||||
//NOTE: Aside because we want to be able to import them from node
|
//NOTE: Aside because we want to be able to import them from node
|
||||||
@ -25,9 +26,9 @@ export const kcContextCommonMock: KcContextBase.Common = {
|
|||||||
},
|
},
|
||||||
"messagesPerField": {
|
"messagesPerField": {
|
||||||
"printIfExists": (...[, x]) => x,
|
"printIfExists": (...[, x]) => x,
|
||||||
"existsError": ()=> true,
|
"existsError": () => true,
|
||||||
"get": key=> `Fake error for ${key}`,
|
"get": key => `Fake error for ${key}`,
|
||||||
"exists": ()=> true
|
"exists": () => true
|
||||||
},
|
},
|
||||||
"locale": {
|
"locale": {
|
||||||
"supported": [
|
"supported": [
|
||||||
@ -163,25 +164,200 @@ export const kcContextMocks: KcContextBase[] = [
|
|||||||
"registrationDisabled": false,
|
"registrationDisabled": false,
|
||||||
|
|
||||||
}),
|
}),
|
||||||
id<KcContextBase.Register>({
|
...(() => {
|
||||||
|
|
||||||
|
const registerCommon: KcContextBase.RegisterCommon = {
|
||||||
...kcContextCommonMock,
|
...kcContextCommonMock,
|
||||||
"pageId": "register.ftl",
|
|
||||||
"url": {
|
"url": {
|
||||||
...loginUrl,
|
...loginUrl,
|
||||||
"registrationAction": "http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0"
|
"registrationAction": "http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0"
|
||||||
},
|
},
|
||||||
"scripts": [],
|
"scripts": [],
|
||||||
"isAppInitiatedAction": false,
|
"isAppInitiatedAction": false,
|
||||||
"register": {
|
|
||||||
"formData": {}
|
|
||||||
},
|
|
||||||
"passwordRequired": true,
|
"passwordRequired": true,
|
||||||
"recaptchaRequired": false,
|
"recaptchaRequired": false,
|
||||||
"social": {
|
"social": {
|
||||||
"displayInfo": true
|
"displayInfo": true
|
||||||
},
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return [
|
||||||
|
id<KcContextBase.Register>({
|
||||||
|
"pageId": "register.ftl",
|
||||||
|
...registerCommon,
|
||||||
|
"register": {
|
||||||
|
"formData": {}
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
|
id<KcContextBase.RegisterUserProfile>({
|
||||||
|
"pageId": "register-user-profile.ftl",
|
||||||
|
...registerCommon,
|
||||||
|
|
||||||
|
|
||||||
|
"profile": {
|
||||||
|
"context": "REGISTRATION_PROFILE" as const,
|
||||||
|
...(() => {
|
||||||
|
|
||||||
|
const attributes: Attribute[] = [
|
||||||
|
{
|
||||||
|
"validators": {
|
||||||
|
"username-prohibited-characters": {
|
||||||
|
"ignore.empty.value": true
|
||||||
|
},
|
||||||
|
"up-username-has-value": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"length": {
|
||||||
|
"ignore.empty.value": true,
|
||||||
|
"min": "3",
|
||||||
|
"max": "255"
|
||||||
|
},
|
||||||
|
"up-duplicate-username": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"up-username-mutation": {
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "${username}",
|
||||||
|
"annotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"groupAnnotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"autocomplete": "username",
|
||||||
|
"readOnly": false,
|
||||||
|
"name": "username"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"validators": {
|
||||||
|
"up-email-exists-as-username": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"length": {
|
||||||
|
"max": "255",
|
||||||
|
"ignore.empty.value": true
|
||||||
|
},
|
||||||
|
"up-blank-attribute-value": {
|
||||||
|
"error-message": "missingEmailMessage",
|
||||||
|
"fail-on-null": false
|
||||||
|
},
|
||||||
|
"up-duplicate-email": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"ignore.empty.value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "${email}",
|
||||||
|
"annotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"groupAnnotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"autocomplete": "email",
|
||||||
|
"readOnly": false,
|
||||||
|
"name": "email"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"validators": {
|
||||||
|
"length": {
|
||||||
|
"max": "255",
|
||||||
|
"ignore.empty.value": true
|
||||||
|
},
|
||||||
|
"person-name-prohibited-characters": {
|
||||||
|
"ignore.empty.value": true
|
||||||
|
},
|
||||||
|
"up-immutable-attribute": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"up-attribute-required-by-metadata-value": {
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "${firstName}",
|
||||||
|
"annotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"groupAnnotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"readOnly": false,
|
||||||
|
"name": "firstName"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"validators": {
|
||||||
|
"length": {
|
||||||
|
"max": "255",
|
||||||
|
"ignore.empty.value": true
|
||||||
|
},
|
||||||
|
"person-name-prohibited-characters": {
|
||||||
|
"ignore.empty.value": true
|
||||||
|
},
|
||||||
|
"up-immutable-attribute": {},
|
||||||
|
"up-attribute-required-by-metadata-value": {}
|
||||||
|
},
|
||||||
|
"displayName": "${lastName}",
|
||||||
|
"annotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"groupAnnotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"readOnly": false,
|
||||||
|
"name": "lastName"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"validators": {
|
||||||
|
"length": {
|
||||||
|
"ignore.empty.value": true,
|
||||||
|
"min": "3",
|
||||||
|
"max": "9"
|
||||||
|
},
|
||||||
|
"up-immutable-attribute": {},
|
||||||
|
"up-attribute-required-by-metadata-value": {},
|
||||||
|
"email": {
|
||||||
|
"ignore.empty.value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": "${foo}",
|
||||||
|
"annotations": {
|
||||||
|
"this_is_second_key": "this_is_second_value",
|
||||||
|
"this_is_first_key": "this_is_first_value"
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"groupAnnotations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"readOnly": false,
|
||||||
|
"name": "foo"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
attributes,
|
||||||
|
"attributesByName": Object.fromEntries(
|
||||||
|
attributes.map(attribute => [attribute.name, attribute])
|
||||||
|
) as any
|
||||||
|
} as any;
|
||||||
|
|
||||||
|
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
})(),
|
||||||
id<KcContextBase.Info>({
|
id<KcContextBase.Info>({
|
||||||
...kcContextCommonMock,
|
...kcContextCommonMock,
|
||||||
"pageId": "info.ftl",
|
"pageId": "info.ftl",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user