UNPKG

3.39 kBTypeScriptView Raw
1import { ActionCreator, ActionCreatorProps, Creator, FunctionWithParametersType, NotAllowedCheck, TypedAction } from './models';
2declare type Join<Str extends string, Separator extends string = ' '> = Str extends `${infer First}${Separator}${infer Rest}` ? Join<`${First}${Rest}`, Separator> : Str;
3declare type Trim<Str extends string> = Str extends ` ${infer S}` ? Trim<S> : Str extends `${infer S} ` ? Trim<S> : Str;
4declare type TitleCase<Str extends string> = Str extends `${infer First} ${infer Rest}` ? `${Capitalize<First>} ${TitleCase<Rest>}` : Capitalize<Str>;
5declare type ForbiddenCharactersStr = '/ \\ | < > [ ] { } ( ) . , ! ? # % ^ & * + - ~ \' " `';
6declare type ForbiddenCharacters<Str extends string = ForbiddenCharactersStr> = Str extends `${infer First} ${infer Rest}` ? First | ForbiddenCharacters<Rest> : Str extends '' ? never : Str;
7declare type ForbiddenCharactersCheck<Str extends string, Name extends string> = Str extends `${infer _}${ForbiddenCharacters}${infer _}` ? `${Name} cannot contain the following characters: ${ForbiddenCharactersStr}` : unknown;
8declare type EmptyStringCheck<Str extends string, Name extends string> = Trim<Str> extends '' ? `${Name} cannot be an empty string or contain only spaces` : unknown;
9declare type StringLiteralCheck<Str extends string, Name extends string> = string extends Str ? `${Name} must be a string literal type` : unknown;
10declare type UniqueEventNameCheck<EventNames extends string, EventName extends string> = ActionName<EventName> extends ActionName<Exclude<EventNames, EventName>> ? `${ActionName<EventName>} action is already defined` : unknown;
11declare type NotAllowedEventPropsCheck<PropsCreator extends ActionCreatorProps<unknown> | Creator> = PropsCreator extends ActionCreatorProps<infer Props> ? Props extends void ? unknown : NotAllowedCheck<Props & object> : PropsCreator extends Creator<any, infer Result> ? NotAllowedCheck<Result> : unknown;
12declare type EventCreator<PropsCreator extends ActionCreatorProps<unknown> | Creator, Type extends string> = PropsCreator extends ActionCreatorProps<infer Props> ? void extends Props ? ActionCreator<Type, () => TypedAction<Type>> : ActionCreator<Type, (props: Props & NotAllowedCheck<Props & object>) => Props & TypedAction<Type>> : PropsCreator extends Creator<infer Props, infer Result> ? FunctionWithParametersType<Props, Result & NotAllowedCheck<Result> & TypedAction<Type>> & TypedAction<Type> : never;
13export declare type ActionName<EventName extends string> = Uncapitalize<Join<TitleCase<Lowercase<Trim<EventName>>>>>;
14export interface ActionGroupConfig<Source extends string, Events extends Record<string, ActionCreatorProps<unknown> | Creator>> {
15 source: Source & StringLiteralCheck<Source, 'source'>;
16 events: {
17 [EventName in keyof Events]: Events[EventName] & EmptyStringCheck<EventName & string, 'event name'> & StringLiteralCheck<EventName & string, 'event name'> & ForbiddenCharactersCheck<EventName & string, 'event name'> & UniqueEventNameCheck<keyof Events & string, EventName & string> & NotAllowedEventPropsCheck<Events[EventName]>;
18 };
19}
20export declare type ActionGroup<Source extends string, Events extends Record<string, ActionCreatorProps<unknown> | Creator>> = {
21 [EventName in keyof Events as ActionName<EventName & string>]: EventCreator<Events[EventName], `[${Source}] ${EventName & string}`>;
22};
23export {};