Plugin Overview
Extend ctrodb with lifecycle hooks
Plugins hook into database and collection lifecycle events.
Plugin interface
interface CtroDBPlugin {
name: string
version?: string
onDatabaseInit?(db: Database): void
onCollectionInit?(collection: Collection): void
onBeforeCreate?(collection: string, data: unknown): unknown
onAfterCreate?(collection: string, record: unknown): void
onBeforeUpdate?(collection: string, id: ID, changes: unknown): unknown
onAfterUpdate?(collection: string, id: ID, record: unknown, oldRecord?: unknown): void
onBeforeDelete?(collection: string, id: ID): void
onAfterDelete?(collection: string, id: ID, oldRecord?: unknown): void
}
Hook execution order
For a create() call:
onBeforeCreate— plugins run in order, each can modify data- Schema defaults applied
- Schema validation
- Adapter creates record
onAfterCreate— plugins run in order
For update():
onBeforeUpdate— plugins can modify changes- Schema validation (merged with existing)
- Adapter updates record
onAfterUpdate
For delete():
onBeforeDelete- Adapter deletes record
onAfterDelete
Return values
For onBeforeCreate and onBeforeUpdate, the return value replaces the data
if not undefined. This lets plugins transform data before it is stored.
Using plugins
import { Database } from "ctrodb"
import { ftsPlugin, relationsPlugin, validationPlugin } from "ctrodb"
const db = new Database({
schema: { ... },
plugins: [
ftsPlugin(),
relationsPlugin(),
validationPlugin(),
],
})How is this guide?
Last updated on Jun 20, 2026