Skip to main content

Fields

Fields define the properties of your entities. Archetype provides four primary field types with a fluent API for validation and constraints.

Field Types

text()

String fields with optional validation:

import { text } from 'archetype-engine'

// Basic text field
name: text().required()

// With validations
email: text().required().email()
website: text().optional().url()
slug: text().required().regex(/^[a-z0-9-]+$/)
role: text().required().oneOf(['admin', 'user', 'guest'])

// With transformations
username: text().required().trim().lowercase()
code: text().required().uppercase()

// With length constraints
bio: text().optional().min(10).max(500)
title: text().required().length(100) // max length

number()

Numeric fields:

import { number } from 'archetype-engine'

// Basic number
quantity: number().required()

// With constraints
age: number().required().integer().min(0).max(120)
price: number().required().positive()
rating: number().optional().min(1).max(5)

boolean()

Boolean fields:

import { boolean } from 'archetype-engine'

isActive: boolean().default(true)
isVerified: boolean().default(false)
acceptedTerms: boolean().required()

date()

Date/timestamp fields:

import { date } from 'archetype-engine'

birthDate: date().required()
publishedAt: date().optional()
expiresAt: date().default('now') // current timestamp

Common Methods

All field types support these methods:

MethodDescription
.required()Field must have a value
.optional()Field can be null/undefined
.unique()Value must be unique in table
.default(value)Default value if not provided
.label(string)Human-readable label for UI/errors

Text-Specific Methods

MethodDescription
.email()Must be valid email format
.url()Must be valid URL
.regex(pattern)Must match regex pattern
.oneOf(values)Must be one of the provided values
.trim()Trim whitespace
.lowercase()Convert to lowercase
.uppercase()Convert to uppercase
.min(n)Minimum length
.max(n)Maximum length
.length(n)Alias for .max(n)

Number-Specific Methods

MethodDescription
.integer()Must be a whole number
.positive()Must be greater than 0
.min(n)Minimum value
.max(n)Maximum value

Date-Specific Methods

MethodDescription
.default('now')Default to current timestamp

Examples

User Profile

export const User = defineEntity('User', {
fields: {
email: text().required().unique().email(),
username: text().required().unique().min(3).max(20).lowercase().trim(),
displayName: text().required().min(1).max(50),
bio: text().optional().max(500),
age: number().optional().integer().min(13).max(120),
isVerified: boolean().default(false),
lastLoginAt: date().optional(),
createdAt: date().default('now'),
},
})

Product

export const Product = defineEntity('Product', {
fields: {
sku: text().required().unique().uppercase(),
name: text().required().min(1).max(200),
description: text().optional(),
price: number().required().positive(),
compareAtPrice: number().optional().positive(),
quantity: number().required().integer().min(0),
isActive: boolean().default(true),
publishedAt: date().optional(),
},
})

Generated Validation

Fields generate Zod schemas automatically:

// Input definition
email: text().required().email()
age: number().optional().integer().min(0)

// Generated Zod schema
z.object({
email: z.string().email(),
age: z.number().int().min(0).optional(),
})