# @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](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-typebox) by the Drizzle Team, adapted for use with `@alkdev/typebox` and `@alkdev/ujsx`. ## Install ```bash 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](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 (``, ``) define schemas with composable function components - `Type.Module` holds all tables, relations, and derived schemas with automatic `Type.Ref` resolution - `HostConfig` renders the same tree to `sqliteTable`, `pgTable`, or `mysqlTable` ### Quick Example ```tsx 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](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-typebox) by the Drizzle Team, licensed under Apache-2.0.