UNPKG

csr-controller

Version:
64 lines (63 loc) 3.06 kB
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 {};