UNPKG

bknd

Version:

Lightweight Firebase/Supabase alternative built to run anywhere — incl. Next.js, React Router, Astro, Cloudflare, Bun, Node, AWS Lambda & more.

854 lines 108 kB
import { Guard } from "../auth"; import { EventManager } from "../core/events"; import { type Static } from "../core/utils"; import { type Connection, EntityManager, type Schema } from "../data"; import { Hono } from "hono"; import { AppServer } from "../modules/server/AppServer"; import { AppAuth } from "../auth/AppAuth"; import { AppData } from "../data/AppData"; import { AppFlows } from "../flows/AppFlows"; import { AppMedia } from "../media/AppMedia"; import type { ServerEnv } from "./Controller"; import { type ModuleBuildContext } from "./Module"; import * as tbbox from "@sinclair/typebox"; export type { ModuleBuildContext }; export declare const MODULES: { readonly server: typeof AppServer; readonly data: typeof AppData; readonly auth: typeof AppAuth; readonly media: typeof AppMedia; readonly flows: typeof AppFlows; }; export declare const MODULE_NAMES: ModuleKey[]; export type ModuleKey = keyof typeof MODULES; export type Modules = { [K in keyof typeof MODULES]: InstanceType<(typeof MODULES)[K]>; }; export type ModuleSchemas = { [K in keyof typeof MODULES]: ReturnType<(typeof MODULES)[K]["prototype"]["getSchema"]>; }; export type ModuleConfigs = { [K in keyof ModuleSchemas]: Static<ModuleSchemas[K]>; }; type PartialRec<T> = { [P in keyof T]?: PartialRec<T[P]>; }; export type InitialModuleConfigs = ({ version: number; } & ModuleConfigs) | PartialRec<ModuleConfigs>; declare enum Verbosity { silent = 0, error = 1, log = 2 } export type ModuleManagerOptions = { initial?: InitialModuleConfigs; eventManager?: EventManager<any>; onUpdated?: <Module extends keyof Modules>(module: Module, config: ModuleConfigs[Module]) => Promise<void>; onFirstBoot?: () => Promise<void>; basePath?: string; onServerInit?: (server: Hono<ServerEnv>) => void; trustFetched?: boolean; seed?: (ctx: ModuleBuildContext) => Promise<void>; /** @deprecated */ verbosity?: Verbosity; }; export type ConfigTable<Json = ModuleConfigs> = { id?: number; version: number; type: "config" | "diff" | "backup"; json: Json; created_at?: Date; updated_at?: Date; }; export declare const __bknd: import("../data").Entity<"__bknd", { version: import("../data").NumberField<true>; type: import("../data").EnumField<true, string>; json: import("../data").JsonSchemaField<true, object>; created_at: import("../data").DateField<false> & { required: () => import("../data").DateField<true>; }; updated_at: import("../data").DateField<false> & { required: () => import("../data").DateField<true>; }; }>; type ConfigTable2 = Schema<typeof __bknd>; interface T_INTERNAL_EM { __bknd: ConfigTable2; } export declare class ModuleManager { private readonly connection; private options?; protected modules: Modules; __em: EntityManager<T_INTERNAL_EM>; em: EntityManager; server: Hono<ServerEnv>; emgr: EventManager; guard: Guard; private _version; private _built; private readonly _booted_with?; private _stable_configs; private logger; constructor(connection: Connection, options?: Partial<ModuleManagerOptions> | undefined); private createModules; private get verbosity(); isBuilt(): boolean; /** * This is set through module's setListener * It's called everytime a module's config is updated in SchemaObject * Needs to rebuild modules and save to database */ private onModuleConfigUpdated; private repo; private mutator; private get db(); syncConfigTable(): Promise<{ sql: string; parameters: readonly unknown[]; }[]>; private rebuildServer; ctx(rebuild?: boolean): ModuleBuildContext; private fetch; save(): Promise<this>; private revertModules; /** * Validates received diffs for an additional security control. * Checks: * - check if module is registered * - run modules onBeforeUpdate() for added protection * * **Important**: Throw `Error` so it won't get catched. * * @param diffs * @private */ private validateDiffs; private setConfigs; build(opts?: { fetch?: boolean; }): Promise<this>; private buildModules; protected setupInitial(): Promise<void>; mutateConfigSafe<Module extends keyof Modules>(name: Module): Pick<ReturnType<Modules[Module]["schema"]>, "set" | "patch" | "overwrite" | "remove">; get<K extends keyof Modules>(key: K): Modules[K]; version(): number; built(): boolean; configs(): ModuleConfigs; getSchema(): { server: tbbox.TObject<{ enabled: tbbox.TBoolean; basepath: tbbox.TString; entity_name: tbbox.TString; storage: tbbox.TObject<{ body_max_size: tbbox.TOptional<tbbox.TNumber>; }>; adapter: tbbox.TOptional<tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<string>; config: tbbox.TObject<tbbox.TProperties>; }>[]>>; }> | tbbox.TObject<{ enabled: tbbox.TBoolean; basepath: tbbox.TString; entity_name: tbbox.TString; allow_register: tbbox.TOptional<tbbox.TBoolean>; jwt: tbbox.TObject<{ secret: tbbox.TString; alg: tbbox.TOptional<tbbox.TUnsafe<"HS256" | "HS384" | "HS512">>; expires: tbbox.TOptional<tbbox.TNumber>; issuer: tbbox.TOptional<tbbox.TString>; fields: tbbox.TArray<tbbox.TString>; }>; cookie: tbbox.TObject<{ path: tbbox.TOptional<tbbox.TString>; sameSite: tbbox.TOptional<tbbox.TUnsafe<"strict" | "lax" | "none">>; secure: tbbox.TOptional<tbbox.TBoolean>; httpOnly: tbbox.TOptional<tbbox.TBoolean>; expires: tbbox.TOptional<tbbox.TNumber>; renew: tbbox.TOptional<tbbox.TBoolean>; pathSuccess: tbbox.TOptional<tbbox.TString>; pathLoggedOut: tbbox.TOptional<tbbox.TString>; }>; strategies: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ enabled: tbbox.TOptional<tbbox.TBoolean>; type: tbbox.TLiteral<"password"> | tbbox.TLiteral<"oauth"> | tbbox.TLiteral<"custom_oauth">; config: tbbox.TObject<{ hashing: tbbox.TUnsafe<"plain" | "sha256" | "bcrypt">; rounds: tbbox.TOptional<tbbox.TNumber>; }> | tbbox.TObject<{ name: tbbox.TUnsafe<"google" | "github">; type: tbbox.TUnsafe<"oidc" | "oauth2">; client: tbbox.TObject<{ client_id: tbbox.TString; client_secret: tbbox.TString; }>; }> | tbbox.TObject<{ type: tbbox.TUnsafe<"oidc" | "oauth2">; name: tbbox.TString; client: tbbox.TObject<{ client_id: tbbox.TString; client_secret: tbbox.TString; token_endpoint_auth_method: tbbox.TUnsafe<"client_secret_basic">; }>; as: tbbox.TObject<{ issuer: tbbox.TString; code_challenge_methods_supported: tbbox.TOptional<tbbox.TUnsafe<"S256">>; scopes_supported: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; scope_separator: tbbox.TOptional<tbbox.TString>; authorization_endpoint: tbbox.TOptional<tbbox.TString>; token_endpoint: tbbox.TOptional<tbbox.TString>; userinfo_endpoint: tbbox.TOptional<tbbox.TString>; }>; }>; }>[]>>>; guard: tbbox.TOptional<tbbox.TObject<{ enabled: tbbox.TOptional<tbbox.TBoolean>; }>>; roles: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ permissions: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; is_default: tbbox.TOptional<tbbox.TBoolean>; implicit_allow: tbbox.TOptional<tbbox.TBoolean>; }>>>; }> | tbbox.TObject<{ cors: tbbox.TObject<{ origin: tbbox.TString; allow_methods: tbbox.TArray<tbbox.TUnsafe<string>>; allow_headers: tbbox.TArray<tbbox.TString>; }>; }> | tbbox.TObject<{ basepath: tbbox.TOptional<tbbox.TString>; default_primary_format: tbbox.TOptional<tbbox.TUnsafe<"uuid" | "integer">>; entities: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ type: tbbox.TOptional<tbbox.TString>; config: tbbox.TOptional<tbbox.TObject<{ name: tbbox.TOptional<tbbox.TString>; name_singular: tbbox.TOptional<tbbox.TString>; description: tbbox.TOptional<tbbox.TString>; sort_field: tbbox.TOptional<tbbox.TString>; sort_dir: tbbox.TOptional<tbbox.TUnsafe<"asc" | "desc">>; primary_format: tbbox.TOptional<tbbox.TUnsafe<"uuid" | "integer">>; }>>; fields: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<"number"> | tbbox.TLiteral<"boolean"> | tbbox.TLiteral<"json"> | tbbox.TLiteral<"text"> | tbbox.TLiteral<"media"> | tbbox.TLiteral<"enum"> | tbbox.TLiteral<"date"> | tbbox.TLiteral<"primary"> | tbbox.TLiteral<"relation"> | tbbox.TLiteral<"jsonschema">; config: tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TString, tbbox.TAny]>>; minLength: tbbox.TOptional<tbbox.TNumber>; maxLength: tbbox.TOptional<tbbox.TNumber>; pattern: tbbox.TOptional<tbbox.TString>; html_config: tbbox.TOptional<tbbox.TObject<{ element: tbbox.TOptional<tbbox.TString>; props: tbbox.TOptional<tbbox.TObject<{}>>; }>>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TBoolean, tbbox.TAny]>>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TNumber, tbbox.TAny]>>; minimum: tbbox.TOptional<tbbox.TNumber>; maximum: tbbox.TOptional<tbbox.TNumber>; exclusiveMinimum: tbbox.TOptional<tbbox.TNumber>; exclusiveMaximum: tbbox.TOptional<tbbox.TNumber>; multipleOf: tbbox.TOptional<tbbox.TNumber>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ type: tbbox.TUnsafe<"date" | "week" | "datetime">; timezone: tbbox.TOptional<tbbox.TString>; min_date: tbbox.TOptional<tbbox.TString>; max_date: tbbox.TOptional<tbbox.TString>; default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; reference: tbbox.TString; target: tbbox.TString; target_field: tbbox.TOptional<tbbox.TString>; target_field_type: tbbox.TOptional<tbbox.TUnsafe<"text" | "integer">>; on_delete: tbbox.TOptional<tbbox.TUnsafe<"no action" | "restrict" | "cascade" | "set null" | "set default">>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TAny>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; required: tbbox.TOptional<tbbox.TLiteral<false>>; format: tbbox.TOptional<tbbox.TUnsafe<"uuid" | "integer">>; }>> | tbbox.TOptional<tbbox.TObject<{ entity: tbbox.TString; min_items: tbbox.TOptional<tbbox.TNumber>; max_items: tbbox.TOptional<tbbox.TNumber>; mime_types: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TString, tbbox.TAny]>>; options: tbbox.TOptional<tbbox.TUnion<[tbbox.TObject<{ type: tbbox.TLiteral<"strings">; values: tbbox.TArray<tbbox.TString>; }>, tbbox.TObject<{ type: tbbox.TLiteral<"objects">; values: tbbox.TArray<tbbox.TObject<{ label: tbbox.TString; value: tbbox.TString; }>>; }>]>>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ schema: tbbox.TObject<{}>; ui_schema: tbbox.TOptional<tbbox.TObject<{}>>; default_from_schema: tbbox.TOptional<tbbox.TBoolean>; default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>>; }>[]>>>; }>>>; relations: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<string>; source: tbbox.TString; target: tbbox.TString; config: tbbox.TOptional<tbbox.TObject<{ required: tbbox.TOptional<tbbox.TBoolean>; mappedBy: tbbox.TOptional<tbbox.TString>; inversedBy: tbbox.TOptional<tbbox.TString>; connectionTable: tbbox.TOptional<tbbox.TString>; connectionTableMappedName: tbbox.TOptional<tbbox.TString>; }>> | tbbox.TOptional<tbbox.TObject<{ required: tbbox.TOptional<tbbox.TBoolean>; mappedBy: tbbox.TOptional<tbbox.TString>; inversedBy: tbbox.TOptional<tbbox.TString>; sourceCardinality: tbbox.TOptional<tbbox.TNumber>; with_limit: tbbox.TOptional<tbbox.TNumber>; fieldConfig: tbbox.TOptional<tbbox.TObject<{ label: tbbox.TString; }>>; }>> | tbbox.TOptional<tbbox.TObject<{ required: tbbox.TOptional<tbbox.TBoolean>; mappedBy: tbbox.TOptional<tbbox.TString>; inversedBy: tbbox.TOptional<tbbox.TString>; targetCardinality: tbbox.TOptional<tbbox.TNumber>; }>>; }>[]>>>; indices: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ entity: tbbox.TString; fields: tbbox.TArray<tbbox.TString>; unique: tbbox.TOptional<tbbox.TBoolean>; }>>>; }> | tbbox.TObject<{ basepath: tbbox.TString; flows: tbbox.TRecord<tbbox.TString, tbbox.TObject<{ trigger: tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<"manual" | "event" | "http">; config: tbbox.TObject<{ mode: tbbox.TUnsafe<"sync" | "async">; }> | tbbox.TObject<{ mode: tbbox.TUnsafe<"sync" | "async">; event: tbbox.TString; }> | tbbox.TObject<{ mode: tbbox.TUnsafe<"sync" | "async">; path: tbbox.TString; method: tbbox.TUnsafe<"GET" | "POST" | "PATCH" | "PUT" | "DELETE">; response_type: tbbox.TUnsafe<"json" | "text" | "html">; }>; }>[]>; tasks: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<"log" | "fetch" | "render" | "subflow">; params: tbbox.TObject<{ url: tbbox.TString; method: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TUnsafe<string>, tbbox.TString]>, string>>; headers: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TArray<tbbox.TObject<{ key: tbbox.TString; value: tbbox.TString; }>>, tbbox.TString]>, { key: string; value: string; }[]>>; body: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TString, tbbox.TString]>, string>>; normal: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TNumber, tbbox.TString]>, number>>; }> | tbbox.TObject<{ delay: tbbox.TNumber; }> | tbbox.TObject<{ render: tbbox.TString; }> | tbbox.TObject<{ flow: tbbox.TAny; input: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TAny, tbbox.TString]>, any>>; loop: tbbox.TOptional<tbbox.TBoolean>; }>; }>[]>>>; connections: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ source: tbbox.TString; target: tbbox.TString; config: tbbox.TObject<{ condition: tbbox.TOptional<tbbox.TUnion<[tbbox.TObject<{ type: tbbox.TLiteral<"success">; }>, tbbox.TObject<{ type: tbbox.TLiteral<"error">; }>, tbbox.TObject<{ type: tbbox.TLiteral<"matches">; path: tbbox.TString; value: tbbox.TString; }>]>>; max_retries: tbbox.TOptional<tbbox.TNumber>; }>; }>>>; start_task: tbbox.TOptional<tbbox.TString>; responding_task: tbbox.TOptional<tbbox.TString>; }>>; }>; data: tbbox.TObject<{ enabled: tbbox.TBoolean; basepath: tbbox.TString; entity_name: tbbox.TString; storage: tbbox.TObject<{ body_max_size: tbbox.TOptional<tbbox.TNumber>; }>; adapter: tbbox.TOptional<tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<string>; config: tbbox.TObject<tbbox.TProperties>; }>[]>>; }> | tbbox.TObject<{ enabled: tbbox.TBoolean; basepath: tbbox.TString; entity_name: tbbox.TString; allow_register: tbbox.TOptional<tbbox.TBoolean>; jwt: tbbox.TObject<{ secret: tbbox.TString; alg: tbbox.TOptional<tbbox.TUnsafe<"HS256" | "HS384" | "HS512">>; expires: tbbox.TOptional<tbbox.TNumber>; issuer: tbbox.TOptional<tbbox.TString>; fields: tbbox.TArray<tbbox.TString>; }>; cookie: tbbox.TObject<{ path: tbbox.TOptional<tbbox.TString>; sameSite: tbbox.TOptional<tbbox.TUnsafe<"strict" | "lax" | "none">>; secure: tbbox.TOptional<tbbox.TBoolean>; httpOnly: tbbox.TOptional<tbbox.TBoolean>; expires: tbbox.TOptional<tbbox.TNumber>; renew: tbbox.TOptional<tbbox.TBoolean>; pathSuccess: tbbox.TOptional<tbbox.TString>; pathLoggedOut: tbbox.TOptional<tbbox.TString>; }>; strategies: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ enabled: tbbox.TOptional<tbbox.TBoolean>; type: tbbox.TLiteral<"password"> | tbbox.TLiteral<"oauth"> | tbbox.TLiteral<"custom_oauth">; config: tbbox.TObject<{ hashing: tbbox.TUnsafe<"plain" | "sha256" | "bcrypt">; rounds: tbbox.TOptional<tbbox.TNumber>; }> | tbbox.TObject<{ name: tbbox.TUnsafe<"google" | "github">; type: tbbox.TUnsafe<"oidc" | "oauth2">; client: tbbox.TObject<{ client_id: tbbox.TString; client_secret: tbbox.TString; }>; }> | tbbox.TObject<{ type: tbbox.TUnsafe<"oidc" | "oauth2">; name: tbbox.TString; client: tbbox.TObject<{ client_id: tbbox.TString; client_secret: tbbox.TString; token_endpoint_auth_method: tbbox.TUnsafe<"client_secret_basic">; }>; as: tbbox.TObject<{ issuer: tbbox.TString; code_challenge_methods_supported: tbbox.TOptional<tbbox.TUnsafe<"S256">>; scopes_supported: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; scope_separator: tbbox.TOptional<tbbox.TString>; authorization_endpoint: tbbox.TOptional<tbbox.TString>; token_endpoint: tbbox.TOptional<tbbox.TString>; userinfo_endpoint: tbbox.TOptional<tbbox.TString>; }>; }>; }>[]>>>; guard: tbbox.TOptional<tbbox.TObject<{ enabled: tbbox.TOptional<tbbox.TBoolean>; }>>; roles: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ permissions: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; is_default: tbbox.TOptional<tbbox.TBoolean>; implicit_allow: tbbox.TOptional<tbbox.TBoolean>; }>>>; }> | tbbox.TObject<{ cors: tbbox.TObject<{ origin: tbbox.TString; allow_methods: tbbox.TArray<tbbox.TUnsafe<string>>; allow_headers: tbbox.TArray<tbbox.TString>; }>; }> | tbbox.TObject<{ basepath: tbbox.TOptional<tbbox.TString>; default_primary_format: tbbox.TOptional<tbbox.TUnsafe<"uuid" | "integer">>; entities: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ type: tbbox.TOptional<tbbox.TString>; config: tbbox.TOptional<tbbox.TObject<{ name: tbbox.TOptional<tbbox.TString>; name_singular: tbbox.TOptional<tbbox.TString>; description: tbbox.TOptional<tbbox.TString>; sort_field: tbbox.TOptional<tbbox.TString>; sort_dir: tbbox.TOptional<tbbox.TUnsafe<"asc" | "desc">>; primary_format: tbbox.TOptional<tbbox.TUnsafe<"uuid" | "integer">>; }>>; fields: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<"number"> | tbbox.TLiteral<"boolean"> | tbbox.TLiteral<"json"> | tbbox.TLiteral<"text"> | tbbox.TLiteral<"media"> | tbbox.TLiteral<"enum"> | tbbox.TLiteral<"date"> | tbbox.TLiteral<"primary"> | tbbox.TLiteral<"relation"> | tbbox.TLiteral<"jsonschema">; config: tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TString, tbbox.TAny]>>; minLength: tbbox.TOptional<tbbox.TNumber>; maxLength: tbbox.TOptional<tbbox.TNumber>; pattern: tbbox.TOptional<tbbox.TString>; html_config: tbbox.TOptional<tbbox.TObject<{ element: tbbox.TOptional<tbbox.TString>; props: tbbox.TOptional<tbbox.TObject<{}>>; }>>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TBoolean, tbbox.TAny]>>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TNumber, tbbox.TAny]>>; minimum: tbbox.TOptional<tbbox.TNumber>; maximum: tbbox.TOptional<tbbox.TNumber>; exclusiveMinimum: tbbox.TOptional<tbbox.TNumber>; exclusiveMaximum: tbbox.TOptional<tbbox.TNumber>; multipleOf: tbbox.TOptional<tbbox.TNumber>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ type: tbbox.TUnsafe<"date" | "week" | "datetime">; timezone: tbbox.TOptional<tbbox.TString>; min_date: tbbox.TOptional<tbbox.TString>; max_date: tbbox.TOptional<tbbox.TString>; default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; reference: tbbox.TString; target: tbbox.TString; target_field: tbbox.TOptional<tbbox.TString>; target_field_type: tbbox.TOptional<tbbox.TUnsafe<"text" | "integer">>; on_delete: tbbox.TOptional<tbbox.TUnsafe<"no action" | "restrict" | "cascade" | "set null" | "set default">>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TAny>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; required: tbbox.TOptional<tbbox.TLiteral<false>>; format: tbbox.TOptional<tbbox.TUnsafe<"uuid" | "integer">>; }>> | tbbox.TOptional<tbbox.TObject<{ entity: tbbox.TString; min_items: tbbox.TOptional<tbbox.TNumber>; max_items: tbbox.TOptional<tbbox.TNumber>; mime_types: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ default_value: tbbox.TOptional<tbbox.TIntersect<[tbbox.TString, tbbox.TAny]>>; options: tbbox.TOptional<tbbox.TUnion<[tbbox.TObject<{ type: tbbox.TLiteral<"strings">; values: tbbox.TArray<tbbox.TString>; }>, tbbox.TObject<{ type: tbbox.TLiteral<"objects">; values: tbbox.TArray<tbbox.TObject<{ label: tbbox.TString; value: tbbox.TString; }>>; }>]>>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>> | tbbox.TOptional<tbbox.TObject<{ schema: tbbox.TObject<{}>; ui_schema: tbbox.TOptional<tbbox.TObject<{}>>; default_from_schema: tbbox.TOptional<tbbox.TBoolean>; default_value: tbbox.TOptional<tbbox.TAny>; required: tbbox.TOptional<tbbox.TBoolean>; description: tbbox.TOptional<tbbox.TString>; label: tbbox.TOptional<tbbox.TString>; fillable: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"create" | "read" | "update" | "delete">>]>>; hidden: tbbox.TOptional<tbbox.TUnion<[tbbox.TBoolean, tbbox.TArray<tbbox.TUnsafe<"form" | "table" | "create" | "read" | "update" | "delete" | "submit">>]>>; virtual: tbbox.TOptional<tbbox.TBoolean>; }>>; }>[]>>>; }>>>; relations: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<string>; source: tbbox.TString; target: tbbox.TString; config: tbbox.TOptional<tbbox.TObject<{ required: tbbox.TOptional<tbbox.TBoolean>; mappedBy: tbbox.TOptional<tbbox.TString>; inversedBy: tbbox.TOptional<tbbox.TString>; connectionTable: tbbox.TOptional<tbbox.TString>; connectionTableMappedName: tbbox.TOptional<tbbox.TString>; }>> | tbbox.TOptional<tbbox.TObject<{ required: tbbox.TOptional<tbbox.TBoolean>; mappedBy: tbbox.TOptional<tbbox.TString>; inversedBy: tbbox.TOptional<tbbox.TString>; sourceCardinality: tbbox.TOptional<tbbox.TNumber>; with_limit: tbbox.TOptional<tbbox.TNumber>; fieldConfig: tbbox.TOptional<tbbox.TObject<{ label: tbbox.TString; }>>; }>> | tbbox.TOptional<tbbox.TObject<{ required: tbbox.TOptional<tbbox.TBoolean>; mappedBy: tbbox.TOptional<tbbox.TString>; inversedBy: tbbox.TOptional<tbbox.TString>; targetCardinality: tbbox.TOptional<tbbox.TNumber>; }>>; }>[]>>>; indices: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ entity: tbbox.TString; fields: tbbox.TArray<tbbox.TString>; unique: tbbox.TOptional<tbbox.TBoolean>; }>>>; }> | tbbox.TObject<{ basepath: tbbox.TString; flows: tbbox.TRecord<tbbox.TString, tbbox.TObject<{ trigger: tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<"manual" | "event" | "http">; config: tbbox.TObject<{ mode: tbbox.TUnsafe<"sync" | "async">; }> | tbbox.TObject<{ mode: tbbox.TUnsafe<"sync" | "async">; event: tbbox.TString; }> | tbbox.TObject<{ mode: tbbox.TUnsafe<"sync" | "async">; path: tbbox.TString; method: tbbox.TUnsafe<"GET" | "POST" | "PATCH" | "PUT" | "DELETE">; response_type: tbbox.TUnsafe<"json" | "text" | "html">; }>; }>[]>; tasks: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<"log" | "fetch" | "render" | "subflow">; params: tbbox.TObject<{ url: tbbox.TString; method: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TUnsafe<string>, tbbox.TString]>, string>>; headers: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TArray<tbbox.TObject<{ key: tbbox.TString; value: tbbox.TString; }>>, tbbox.TString]>, { key: string; value: string; }[]>>; body: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TString, tbbox.TString]>, string>>; normal: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TNumber, tbbox.TString]>, number>>; }> | tbbox.TObject<{ delay: tbbox.TNumber; }> | tbbox.TObject<{ render: tbbox.TString; }> | tbbox.TObject<{ flow: tbbox.TAny; input: tbbox.TOptional<tbbox.TTransform<tbbox.TUnion<[{ title: string; } & tbbox.TAny, tbbox.TString]>, any>>; loop: tbbox.TOptional<tbbox.TBoolean>; }>; }>[]>>>; connections: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ source: tbbox.TString; target: tbbox.TString; config: tbbox.TObject<{ condition: tbbox.TOptional<tbbox.TUnion<[tbbox.TObject<{ type: tbbox.TLiteral<"success">; }>, tbbox.TObject<{ type: tbbox.TLiteral<"error">; }>, tbbox.TObject<{ type: tbbox.TLiteral<"matches">; path: tbbox.TString; value: tbbox.TString; }>]>>; max_retries: tbbox.TOptional<tbbox.TNumber>; }>; }>>>; start_task: tbbox.TOptional<tbbox.TString>; responding_task: tbbox.TOptional<tbbox.TString>; }>>; }>; auth: tbbox.TObject<{ enabled: tbbox.TBoolean; basepath: tbbox.TString; entity_name: tbbox.TString; storage: tbbox.TObject<{ body_max_size: tbbox.TOptional<tbbox.TNumber>; }>; adapter: tbbox.TOptional<tbbox.TUnion<tbbox.TObject<{ type: tbbox.TLiteral<string>; config: tbbox.TObject<tbbox.TProperties>; }>[]>>; }> | tbbox.TObject<{ enabled: tbbox.TBoolean; basepath: tbbox.TString; entity_name: tbbox.TString; allow_register: tbbox.TOptional<tbbox.TBoolean>; jwt: tbbox.TObject<{ secret: tbbox.TString; alg: tbbox.TOptional<tbbox.TUnsafe<"HS256" | "HS384" | "HS512">>; expires: tbbox.TOptional<tbbox.TNumber>; issuer: tbbox.TOptional<tbbox.TString>; fields: tbbox.TArray<tbbox.TString>; }>; cookie: tbbox.TObject<{ path: tbbox.TOptional<tbbox.TString>; sameSite: tbbox.TOptional<tbbox.TUnsafe<"strict" | "lax" | "none">>; secure: tbbox.TOptional<tbbox.TBoolean>; httpOnly: tbbox.TOptional<tbbox.TBoolean>; expires: tbbox.TOptional<tbbox.TNumber>; renew: tbbox.TOptional<tbbox.TBoolean>; pathSuccess: tbbox.TOptional<tbbox.TString>; pathLoggedOut: tbbox.TOptional<tbbox.TString>; }>; strategies: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TUnion<tbbox.TObject<{ enabled: tbbox.TOptional<tbbox.TBoolean>; type: tbbox.TLiteral<"password"> | tbbox.TLiteral<"oauth"> | tbbox.TLiteral<"custom_oauth">; config: tbbox.TObject<{ hashing: tbbox.TUnsafe<"plain" | "sha256" | "bcrypt">; rounds: tbbox.TOptional<tbbox.TNumber>; }> | tbbox.TObject<{ name: tbbox.TUnsafe<"google" | "github">; type: tbbox.TUnsafe<"oidc" | "oauth2">; client: tbbox.TObject<{ client_id: tbbox.TString; client_secret: tbbox.TString; }>; }> | tbbox.TObject<{ type: tbbox.TUnsafe<"oidc" | "oauth2">; name: tbbox.TString; client: tbbox.TObject<{ client_id: tbbox.TString; client_secret: tbbox.TString; token_endpoint_auth_method: tbbox.TUnsafe<"client_secret_basic">; }>; as: tbbox.TObject<{ issuer: tbbox.TString; code_challenge_methods_supported: tbbox.TOptional<tbbox.TUnsafe<"S256">>; scopes_supported: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; scope_separator: tbbox.TOptional<tbbox.TString>; authorization_endpoint: tbbox.TOptional<tbbox.TString>; token_endpoint: tbbox.TOptional<tbbox.TString>; userinfo_endpoint: tbbox.TOptional<tbbox.TString>; }>; }>; }>[]>>>; guard: tbbox.TOptional<tbbox.TObject<{ enabled: tbbox.TOptional<tbbox.TBoolean>; }>>; roles: tbbox.TOptional<tbbox.TRecord<tbbox.TString, tbbox.TObject<{ permissions: tbbox.TOptional<tbbox.TArray<tbbox.TString>>; is_default: tbbox.TOptional<tbbox.TBoolean>; implicit_allow: tbbox.TOptional<tbbox.TBoolean>; }>>>; }> | tbbox.TObject<{ cors: tbbox.TObject<{ origin: tbbox.TString; allow_methods: tbbox.TArray<tbbox.TUnsafe<string>>; allow_headers: tbbox.TArray<tbbox.TString>; }>; }> | tbbo