ADR-015: <table> accepts extraConfig prop mirroring Drizzle's third callback argument for composite unique constraints and other column-reference-based features. ADR-016: Adapter accepts Type.Module compiled bundle (not individual schemas). M.Import() handles ref resolution automatically, eliminating potential complications with separate schema wiring. Update FromDbTypeConfig interface to use module instead of schema, update element types table with extraConfig prop.
@alkdev/dbtype
Schema-first multi-dialect database type system. Define your schema once as a UJSX element tree, validate it with TypeBox, and render it to any Drizzle dialect.
Based on drizzle-typebox by the Drizzle Team, adapted for use with @alkdev/typebox and @alkdev/ujsx.
Install
npm install @alkdev/dbtype @alkdev/typebox @alkdev/ujsx
npm install drizzle-orm # peer dependency, only the dialects you use
Architecture
See docs/architecture/README.md for the full architecture specification.
Core Principle
The element tree is the schema. The module is the bundle. The host is the dialect.
- UJSX elements (
<table>,<column>) define schemas with composable function components Type.Moduleholds all tables, relations, and derived schemas with automaticType.RefresolutionHostConfigrenders the same tree tosqliteTable,pgTable, ormysqlTable
Quick Example
import { Type, FormatRegistry } from '@alkdev/typebox'
import { Value } from '@alkdev/typebox/value'
import { h, createComponent } from '@alkdev/ujsx'
// Register custom format validators
FormatRegistry.Set('uuid', (v) => /^[0-9a-f]{8}-[0-9a-f]{4}-...$/i.test(v))
// Composable column components
const IdColumn = createComponent('IdColumn', () =>
h('column', { name: 'id', type: 'uuid', primaryKey: true, default: 'uuid' })
)
const AuditColumns = createComponent('AuditColumns', () => [
h('column', { name: 'createdAt', type: 'timestamp', notNull: true, default: 'now' }),
h('column', { name: 'updatedAt', type: 'timestamp', notNull: true, default: 'now' }),
])
// Define a table
const UsersEl = h('table', { name: 'users' },
h(IdColumn, {}),
h('column', { name: 'name', type: 'string', notNull: true }),
h('column', { name: 'email', type: 'string', notNull: true }),
h(AuditColumns, {}),
)
// Extract to Type.Module for validation
const { name, schema } = extractTable(UsersEl)
const M = Type.Module({ Users: schema, UsersRelations: Type.Object({ tasks: Type.Array(Type.Ref('Tasks')) }) })
const Users = M.Import('Users')
Value.Check(Users, { id: '...', name: 'alice', email: 'a@b.com', createdAt: 1, updatedAt: 1 })
// → true
Current State
Phase 0: Exploration — Architecture probing complete, implementation not started.
The current src/ contains the forked drizzle-typebox code. The new architecture (UJSX elements, Type.Module, HostConfig) is designed and validated but not yet implemented.
Attribution
Based on drizzle-typebox by the Drizzle Team, licensed under Apache-2.0.
Description
Languages
TypeScript
100%