@estokad/schema
v0.1.6
Published
defineType(), defineEmbedded(), field types, JSON IR compiler.
Readme
@estokad/schema
defineType(), defineEmbedded(), all 16 field types from docs/schema-system.md § 3, and the JSON IR compiler.
Status
M1.1: package complete. 15 tests passing. Pure TypeScript, no I/O. The CLI (M1.2) wraps this with file loading; the API (M1.3) consumes the IR for content type registration and Zod-based validation.
Usage
import { defineType, defineEmbedded, compile } from '@estokad/schema'
const seo = defineEmbedded({
name: 'seo',
title: 'SEO',
fields: [
{ name: 'title', type: 'text', max: 60 },
{ name: 'description', type: 'text', max: 160 },
{ name: 'ogImage', type: 'asset' },
],
})
const author = defineType({
name: 'author',
title: 'Author',
fields: [
{ name: 'name', type: 'text', required: true },
{ name: 'role', type: 'text' },
],
})
const pressRelease = defineType({
name: 'pressRelease',
title: 'Press release',
displayField: 'title',
previewUrl: '/press/{slug}',
fields: [
{ name: 'title', type: 'text', max: 140, required: true, localized: true },
{ name: 'slug', type: 'slug', source: 'title', required: true },
{ name: 'body', type: 'richText', required: true },
{ name: 'category', type: 'enum', options: ['announcement', 'results', 'leadership'] },
{ name: 'author', type: 'reference', to: 'author' },
{ name: 'publishedAt', type: 'datetime' },
{ name: 'seo', type: 'embedded', of: seo },
],
})
const ir = compile([author, pressRelease])
// ir is an array of TypeIR — one per top-level type plus any embedded types
// hoisted from { type: 'embedded', of: ... } references.Pass a state map to preserve UUIDs across runs (rename detection):
import type { SchemaState } from '@estokad/schema'
const state: SchemaState = {
types: {
pressRelease: {
id: '<uuid from previous compile>',
fields: { title: '<uuid>', slug: '<uuid>' /* ... */ },
},
},
}
const ir = compile([pressRelease], { state })The CLI persists this map to .estokad/schema-state.json; that lands in M1.2.
Field types
All 16 from docs/schema-system.md § 3:
| type value | Notes |
| --------------- | ----------------------------------------------------------------- |
| text | max, min, multiline, pattern (RegExp or string) |
| richText | features whitelist |
| number | min, max, integer |
| boolean | — |
| datetime | min, max (ISO 8601) |
| date | min, max |
| slug | source (must point at a text field on the same type), pattern |
| asset | accept (MIME glob list), maxSize (bytes) |
| assetList | asset options + min, max count |
| reference | to (target type name), crossSpace |
| referenceList | reference options + min, max count |
| enum | options (non-empty unique strings) |
| geoPoint | { lat, lng } |
| embedded | of (an EmbeddedDefinition from defineEmbedded()) |
| json | escape hatch; discouraged |
| markdown | simpler than richText for migrated content |
Common options on every field: required, default, hint, localized, readOnly, condition, validate.
What this package does not do
- File I/O (the CLI handles
.estokad/schema-state.jsonandschemas/*.tsloading) — M1.2 - Zod schema generation for runtime data validation — M1.3
- GraphQL/REST handler registration — M2.x
- The Studio's visual schema builder UI — M1.5
Documentation
Full reference at docs.estokad.com/schema and docs.estokad.com/schema/define-type.
License
Apache-2.0. Estokad is a Samarkand Industries OÜ product.
