Fields
Lucent supports various field types for defining your collection schemas.
Field Types
String
typescript
name: { type: 'string', required: true, maxLength: 100 }Text (Long String)
typescript
bio: { type: 'text', maxLength: 5000 }Number
typescript
age: { type: 'number', min: 0, max: 150 }
price: { type: 'number', decimal: true }Boolean
typescript
published: { type: 'boolean', default: false }DateTime
typescript
createdAt: { type: 'datetime', default: 'now' }
publishedAt: { type: 'datetime' }Relation
typescript
author: {
type: 'relation',
collection: 'users',
required: true
}
tags: {
type: 'relation',
collection: 'tags',
multiple: true
}Select
typescript
status: {
type: 'select',
options: ['draft', 'published', 'archived'],
default: 'draft'
}JSON
typescript
metadata: {
type: "json";
}Email
typescript
email: { type: 'email', required: true, unique: true }URL
typescript
website: {
type: "url";
}File/Image
typescript
avatar: { type: 'file', multiple: false }
attachments: { type: 'file', multiple: true }Field Options
| Option | Type | Description |
|---|---|---|
type | string | Field type |
required | boolean | Make field mandatory |
default | any | Default value |
unique | boolean | Enforce uniqueness |
hidden | boolean | Hide from API responses |
readonly | boolean | Make field read-only |
min | number | Minimum value (number) |
max | number | Maximum value (number) |
minLength | number | Minimum string length |
maxLength | number | Maximum string length |
pattern | string | Regex validation pattern |
Virtual Fields
Virtual fields are computed values not stored in the database:
typescript
fields: {
// ... regular fields
fullName: {
type: 'virtual',
compute: (record) => `${record.firstName} ${record.lastName}`
}
}