glm-5.1 da65f7b693 docs: resolve OQ-11 and OQ-12 with ADR-015 and ADR-016
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.
2026-05-23 13:02:23 +00:00
2026-05-22 11:34:58 +00:00

@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.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

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
No description provided
Readme 344 KiB
Languages
TypeScript 100%