dd2ec9df3cbb0aafbbac9036726b93a7183a5b03
Phase 0 architecture specification following the alkdev documentation pattern from @alkdev/flowgraph. Documents the validated architecture (UJSX elements → Type.Module → Drizzle hosts) based on e2e probe results. Docs added: - README: Project overview, architecture, current state - architecture/README: Index, design decisions, relationships - architecture/schema: Type.Module as bundle, construction, serialization - architecture/hosts: HostConfig per dialect, column mapping, symbolic defaults - architecture/elements: UJSX element types, props, function components - architecture/module: Module mechanics, format registration, diffing - architecture/repo-adapter: from-dbtype operations adapter (phase 2) - architecture/build-distribution: Package structure, exports - architecture/open-questions: 10 open questions across all topics - ADRs 001-005: UJSX as IR, Type.Module, HostConfig, format, repo adapter
@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%