csr-controller
Version: 
DB Controller for client side rendering
64 lines (63 loc) • 3.06 kB
TypeScript
import { TemplateReturn, createTemplate } from './template';
export declare const CRUDFetchMethod: readonly ["GET", "POST", "PATCH", "DELETE"];
export interface DefaultCRUDBase {
    id: string | number;
}
export interface CRUDBase extends DefaultCRUDBase {
}
/**
 * @param $url Controller API route
 * @param $protected Optional parameter to define if route is protected (must define own logic as middleware)
 * @param $parentUrl Optional parameter used by sub controllers
 */
export interface DefaultSharedControllerProps {
    $url: string;
    $protected?: boolean;
    $parentUrl?: string;
}
export interface DefaultControllerProps extends SharedControllerProps {
    $base?: string;
    $server?: string;
}
export interface SharedControllerProps extends DefaultSharedControllerProps {
}
export interface ControllerProps extends DefaultControllerProps {
}
export type BaseControllerMethods<T, ISARR = true> = {
    index: () => Promise<ISARR extends true ? T[] : T>;
    read: (data: CRUDBase) => Promise<T | Record<string, never>>;
};
export type ControllerMethods<T, C, U extends CRUDBase, ISARR = true> = {
    create: (data: C) => Promise<T | Record<string, never>>;
    update: (data: U) => Promise<T | Record<string, never>>;
    destroy: (data: CRUDBase) => Promise<T | Record<string, never>>;
    $changeServer: (server: string) => never;
    $clone: (template: TemplateReturn<T, C, U>) => never;
} & BaseControllerMethods<T, ISARR>;
export type Controller<T, C, U extends CRUDBase> = ControllerMethods<T, C, U> & ControllerProps;
export type SubController<T> = (c: ControllerProps) => BaseControllerMethods<T, false> & SharedControllerProps;
export type ControllerReturnType<T, C, U extends CRUDBase, SUB, MET> = Controller<T, C, U> & SUB & MET;
type SubControllerReturnType<T> = ReturnType<SubController<T>> & ControllerProps;
type IsEmpty<T> = [T] extends [never] | [''] ? true : false;
/**
 * Create controller
 *
 * @param data {@link ControllerProps | Configuration object} for the controller
 * @returns Function to provide template
 */
export declare const createController: <T, C, U extends CRUDBase>(data: ControllerProps) => <TEMPL extends TemplateReturn<T, C, U>>(template: TEMPL) => <ST extends (t: ReturnType<typeof createTemplate>) => SubController<unknown>, MT extends (t: Omit<ControllerMethods<T, C, U, true>, "$changeServer" | "$clone">) => unknown, KS extends keyof S, M extends {
    [k: string]: MT;
}, S extends {
    [k: string]: ST;
} = {}, KM extends keyof M = "">(config?: {
    subcontrollers?: S;
    methods?: M;
}) => ControllerReturnType<T, C, U, { [k in KS]: ReturnType<ReturnType<S[k]>>; }, IsEmpty<KM> extends true ? Record<string, never> : { [k_1 in KM]: ReturnType<M[k_1]>; }>;
/**
 * Create subcontroller
 *
 * @param data Configuration object for the subcontroller
 * @returns
 */
export declare const createSubController: <T>(data: Omit<SharedControllerProps, '$parentUrl' | '$protected'>) => (template: ReturnType<typeof createTemplate>) => (c: ControllerProps) => SubControllerReturnType<T>;
export {};