import { HttpError } from "../types"; type TypeMap = { "string": string, "string[]": string[], "boolean": boolean, "boolean[]": boolean[], "number": number, "number[]": number[], "integer": number, "integer[]": number[] } type ValidTypeKeys = keyof TypeMap; type ValOf = TypeMap[T] type StringEndsWithQm = `${string}?`; type JsSchema = { [key: PropertyKey]: ValidTypeKeys | JsSchema | ArraySchema } type ArraySchema = [JsSchema] type TypedArraySchema = TypedSchema type RemoveQuestionMark = T extends `${infer Prefix}?` ? Prefix : T; type TypedSchema = { [key in keyof T as `${RemoveQuestionMark}`]: key extends StringEndsWithQm ? T[key] extends ValidTypeKeys ? ValOf | null : T[key] extends ArraySchema ? TypedSchema[] | null : TypedSchema | null : (T[key] extends ValidTypeKeys ? ValOf : T[key] extends ArraySchema ? TypedSchema[] : TypedSchema) } export function getOrThrow, E extends HttpError>(data: T, error: E): K; export function getOrElse(data: T, defaultValue: E): E extends NonNullable ? E : T | E; export function schema(schema: T): TypedSchema; interface ExtendedTypeMap extends TypeMap { "string?": string | null, "string[]?": string[] | null, "boolean?": boolean | null, "boolean[]?": boolean[] | null, "number?": number | null, "number[]?": number[] | null, "integer?": number | null, "integer[]?": number[] | null } type ExtendedTypeKeys = keyof ExtendedTypeMap; type ExtValOf = ExtendedTypeMap[T]; type ErrorVariableConfiguration = { errorVariableName?: string }; type ErrorTemplateConfiguration = { messageTemplate?: string }; type ErrorConfiguration = ErrorVariableConfiguration & ErrorTemplateConfiguration; export function as(o: any, type: T, config?: ErrorConfiguration): T extends ExtendedTypeKeys ? ExtValOf : TypedSchema; export function asStrict(o: any, type: T, config?: ErrorConfiguration): T extends ExtendedTypeKeys ? ExtValOf : TypedSchema; type Log = { fatal: (message: any) => void, error: (message: any) => void, warn: (message: any) => void, info: (message: any) => void, debug: (message: any) => void, trace: (message: any) => void, } export const log: Log; export function setLogger(logger: Log): void;