@arki/contracts
archivefor @arki/[email protected] · Tier 1: the stack
Shared Zod schemas and Drizzle contract helpers — branded ID-aware select / insert / update schemas with auto-applied column refinements.
Install
bun add @arki/[email protected]Other package managers
npm install @arki/[email protected]
pnpm add @arki/[email protected]
yarn add @arki/[email protected]Release health for @arki/[email protected]
Doc examples
No example report was recorded for this version.
Open gaps
3 release checks fail
- check
file-agents-md - check
readme-h2-order - check
pkg-engines
Used by demos
No demo uses this package yet.
Runtimes
No engines field, so no runtime requirement is declared.
Benchmarks
No benchmarks are published for this version.
README
Shared Zod schemas and Drizzle contract helpers — branded ID-aware select / insert / update schemas with auto-applied column refinements.
Installation
npm install @arki/contracts
# or
bun add @arki/contracts
# or
pnpm add @arki/contractsPeer-installs:
drizzle-ormzod(v4)zod-form-data
Why
drizzle-zod's createSelectSchema walks Drizzle's dataType strings to infer Zod shapes. That mechanism loses three things:
- Branded ID types declared via
varchar('id').$type<\usr_${string}`>()collapse to plainstring`. jsonb('col').$type<Shape>()shapes collapse tounknown.- Runtime validation schemas stashed on a column by an ID-factory side-channel are not applied automatically.
@arki/contracts wraps drizzle-zod's factories so the output schema preserves the branded type and auto-applies any column-stashed runtime schema, with user-provided refines still winning.
Usage
Re-exported Zod surface
import { z } from '@arki/contracts';
const Email = z.email();The package re-exports everything from zod/v4, so you do not need a direct zod import alongside it.
Form data helpers
import { formData } from '@arki/contracts';
const schema = formData.zfd.formData({
name: formData.zfd.text(),
age: formData.zfd.numeric(),
});Branded select / insert / update schemas
import { jsonb, pgTable, varchar } from 'drizzle-orm/pg-core';
import { createInsertSchema, createSelectSchema } from '@arki/contracts';
const users = pgTable('users', {
id: varchar('id').$type<`usr_${string}`>().primaryKey(),
email: varchar('email').notNull(),
profile: jsonb('profile').$type<{ displayName: string }>(),
});
const userSelect = createSelectSchema(users);
type User = z.infer<typeof userSelect>;
// { id: `usr_${string}`; email: string; profile: { displayName: string } | null }If an ID-factory stashed a Zod schema on a column via COLUMN_ZOD_SCHEMA, parsing rejects values with the wrong prefix:
userSelect.parse({ id: 'org_42', email: '[email protected]', profile: null });
// throws: id must start with "usr_"User-provided refines override the auto-applied schema:
const strictSelect = createSelectSchema(users, {
email: schema => schema.email(),
});API
createSelectSchema(table, refine?)— branded select schema.createInsertSchema(table, refine?)— branded insert schema.createUpdateSchema(table, refine?)— every field optional, otherwise like insert.COLUMN_ZOD_SCHEMA—Symbol.for('@arki/contracts/columnZodSchema')side-channel for ID factories.bufferSchema,jsonSchema,literalSchema,createSchemaFactory— re-exported fromdrizzle-orm/zod.formData— re-exportedzod-form-datanamespace.z,ZodError, every Zod export — re-exported fromzod/v4.
Documentation
@arki/contracts is framework-agnostic and works on its own. When you
compose it with the @arki/dot
application framework, see packages/dot/docs/ for plugin authoring,
lifecycle, and diagnostics.
License
MIT. See LICENSE.
Public imports
This version has no API index.