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
TypeScript
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