bknd
Version:
Lightweight Firebase/Supabase alternative built to run anywhere — incl. Next.js, React Router, Astro, Cloudflare, Bun, Node, AWS Lambda & more.
162 lines (161 loc) • 5.8 kB
TypeScript
import type { CreateUserPayload } from "./auth/AppAuth";
import { McpClient } from "bknd/utils";
import { Event } from "./core/events";
import type { em as prototypeEm } from "./data/prototype";
import { Connection } from "./data/connection/Connection";
import type { Hono } from "hono";
import { type ModuleConfigs, type Modules, ModuleManager, type ModuleBuildContext, type ModuleManagerOptions } from "./modules/ModuleManager";
import { AdminController, type AdminControllerOptions } from "./modules/server/AdminController";
import type { MaybePromise, PartialRec } from "./core/types";
import type { ServerEnv } from "./modules/Controller";
import type { IEmailDriver, ICacheDriver } from "./core/drivers";
import { Api, type ApiOptions } from "./Api";
export type AppPluginConfig = {
/**
* The name of the plugin.
*/
name: string;
/**
* The schema of the plugin.
*/
schema?: () => MaybePromise<ReturnType<typeof prototypeEm> | void>;
/**
* Called before the app is built.
*/
beforeBuild?: () => MaybePromise<void>;
/**
* Called after the app is built.
*/
onBuilt?: () => MaybePromise<void>;
/**
* Called when the server is initialized.
*/
onServerInit?: (server: Hono<ServerEnv>) => MaybePromise<void>;
/**
* Called when the app is booted.
*/
onBoot?: () => MaybePromise<void>;
/**
* Called when the app is first booted.
*/
onFirstBoot?: () => MaybePromise<void>;
};
export type AppPlugin = (app: App) => AppPluginConfig;
declare abstract class AppEvent<A = {}> extends Event<{
app: App;
} & A> {
}
export declare class AppConfigUpdatedEvent extends AppEvent<{
module: string;
config: ModuleConfigs[keyof ModuleConfigs];
}> {
static slug: string;
}
/**
* @type {Event<{ app: App }>}
*/
export declare class AppBuiltEvent extends AppEvent {
static slug: string;
}
export declare class AppFirstBoot extends AppEvent {
static slug: string;
}
export declare class AppRequest extends AppEvent<{
request: Request;
}> {
static slug: string;
}
export declare class AppBeforeResponse extends AppEvent<{
request: Request;
response: Response;
}> {
static slug: string;
}
export declare const AppEvents: {
readonly AppConfigUpdatedEvent: typeof AppConfigUpdatedEvent;
readonly AppBuiltEvent: typeof AppBuiltEvent;
readonly AppFirstBoot: typeof AppFirstBoot;
readonly AppRequest: typeof AppRequest;
readonly AppBeforeResponse: typeof AppBeforeResponse;
};
export type AppOptions = {
plugins?: AppPlugin[];
seed?: (ctx: ModuleBuildContext & {
app: App;
}) => Promise<void>;
manager?: Omit<ModuleManagerOptions, "initial" | "onUpdated" | "seed">;
asyncEventsMode?: "sync" | "async" | "none";
drivers?: {
email?: IEmailDriver;
cache?: ICacheDriver;
};
mode?: "db" | "code";
readonly?: boolean;
};
export type CreateAppConfig = {
connection?: Connection | {
url: string;
};
config?: PartialRec<ModuleConfigs>;
options?: AppOptions;
};
export type AppConfig = {
version: number;
} & ModuleConfigs;
export type LocalApiOptions = Request | ApiOptions;
export declare class App<C extends Connection = Connection, Config extends PartialRec<ModuleConfigs> = PartialRec<ModuleConfigs>, Options extends AppOptions = AppOptions> {
connection: C;
options?: Options | undefined;
static readonly Events: {
readonly AppConfigUpdatedEvent: typeof AppConfigUpdatedEvent;
readonly AppBuiltEvent: typeof AppBuiltEvent;
readonly AppFirstBoot: typeof AppFirstBoot;
readonly AppRequest: typeof AppRequest;
readonly AppBeforeResponse: typeof AppBeforeResponse;
};
modules: ModuleManager;
adminController?: AdminController;
_id: string;
plugins: Map<string, AppPluginConfig>;
drivers: Options["drivers"];
private trigger_first_boot;
private _building;
private _systemController;
constructor(connection: C, _config?: Config, options?: Options | undefined);
get mode(): "db" | "code";
isReadOnly(): boolean;
get emgr(): import(".").EventManager<any>;
protected runPlugins<Key extends keyof AppPluginConfig>(key: Key, ...args: any[]): Promise<{
name: string;
result: any;
}[]>;
build(options?: {
sync?: boolean;
forceBuild?: boolean;
[key: string]: any;
}): Promise<void>;
get server(): Hono<ServerEnv, import("hono/types").BlankSchema, "/">;
get em(): import(".").EntityManager<import(".").DB>;
get mcp(): import("jsonv-ts/mcp").McpServer<{}, import("jsonv-ts/mcp").Tool<any, any, any, any>[], import("jsonv-ts/mcp").Resource<any, any, any, any>[]> | null | undefined;
get fetch(): Hono["fetch"];
get module(): Modules;
getSchema(): {
version: number;
} & import(".").ModuleSchemas;
version(): number;
isBuilt(): boolean;
registerAdminController(config?: AdminControllerOptions): this;
toJSON(secrets?: boolean): {
version: number;
} & ModuleConfigs;
static create(config: CreateAppConfig): App<Connection<unknown>, PartialRec<ModuleConfigs>, AppOptions>;
createUser(p: CreateUserPayload): Promise<import(".").Users>;
getApi(options?: LocalApiOptions): Api;
getMcpClient(): McpClient;
onUpdated<Module extends keyof Modules>(module: Module, config: ModuleConfigs[Module]): Promise<void>;
protected onFirstBoot(): Promise<void>;
protected onServerInit(server: Hono<ServerEnv>): Promise<void>;
protected onModulesBuilt(ctx: ModuleBuildContext): Promise<void>;
}
export declare function createApp(config?: CreateAppConfig): App<Connection<unknown>, PartialRec<ModuleConfigs>, AppOptions>;
export {};