Skip to content

Field Types

The field helper provides type-safe field definitions built on Zod.

Import

typescript
import { field } from '@codician-team/monch';

Basic Types

field.string()

typescript
field.string()                    // Required string
field.string().min(1)             // Minimum length
field.string().max(100)           // Maximum length
field.string().length(10)         // Exact length
field.string().trim()             // Trim whitespace
field.string().toLowerCase()      // Convert to lowercase
field.string().toUpperCase()      // Convert to uppercase
field.string().regex(/pattern/)   // Regex validation
field.string().optional()         // Optional
field.string().nullable()         // Can be null
field.string().default('value')   // Default value

field.number()

typescript
field.number()                    // Required number
field.number().int()              // Integer only
field.number().positive()         // > 0
field.number().nonnegative()      // >= 0
field.number().negative()         // < 0
field.number().nonpositive()      // <= 0
field.number().min(0)             // Minimum value
field.number().max(100)           // Maximum value
field.number().multipleOf(5)      // Multiple of
field.number().finite()           // Not Infinity

field.boolean()

typescript
field.boolean()                   // Required boolean
field.boolean().default(false)    // Default value

field.date()

typescript
field.date()                      // Required date
field.date().min(new Date())      // Minimum date
field.date().max(new Date())      // Maximum date

field.datetime()

Date with default to current time:

typescript
field.datetime()                  // Default: new Date()

ID Types

field.id()

Auto-generating ObjectId for _id fields:

typescript
field.id()

// Accepts string, converts to ObjectId
// Generates new ObjectId if not provided

field.objectId()

Required ObjectId for references:

typescript
field.objectId()

// Requires a value (string or ObjectId)
// Transforms strings to ObjectId

field.uuid()

Auto-generating UUID v4:

typescript
field.uuid()

// Generates UUID if not provided
// Result: '123e4567-e89b-12d3-a456-426614174000'

Validation Types

field.email()

Email validation:

typescript
field.email()

// Validates email format

field.url()

URL validation:

typescript
field.url()

// Validates URL format

field.enum()

Enum/union type:

typescript
field.enum(['pending', 'active', 'suspended'])
field.enum(['user', 'admin']).default('user')

Complex Types

field.array()

typescript
field.array(field.string())              // string[]
field.array(field.number()).min(1)       // At least 1 element
field.array(field.number()).max(10)      // At most 10 elements
field.array(field.number()).length(5)    // Exactly 5 elements
field.array(field.number()).nonempty()   // At least 1 element

field.object()

typescript
field.object({
  street: field.string(),
  city: field.string(),
  zip: field.string(),
})

BSON Types

field.long()

64-bit integer (MongoDB Long):

typescript
field.long()

// Usage
import { Long } from '@codician-team/monch';
{ count: Long.fromNumber(9007199254740993) }

// Serializes to number (safe range) or bigint

field.decimal()

High-precision decimal (MongoDB Decimal128):

typescript
field.decimal()

// Usage
import { Decimal128 } from '@codician-team/monch';
{ price: Decimal128.fromString('99999999999999.99') }

// Serializes to string

field.binary()

Binary data (MongoDB Binary):

typescript
field.binary()

// Usage
import { Binary } from '@codician-team/monch';
{ data: new Binary(Buffer.from('hello')) }

// Serializes to base64 string

field.timestamp()

MongoDB Timestamp:

typescript
field.timestamp()

// Usage
import { Timestamp } from '@codician-team/monch';
{ ts: new Timestamp({ t: 1234567890, i: 1 }) }

// Serializes to { t: number, i: number }

Money Type

field.money()

Currency field with formatting:

typescript
field.money()                           // Default: USD
field.money({ currency: 'EUR' })        // Euro
field.money({ currency: 'JPY' })        // Japanese Yen
field.money({ currency: 'BTC', decimals: 8 })  // Custom decimals

Result structure:

typescript
{
  amount: number,      // Value in smallest unit (cents)
  currency: string,    // Currency code
  formatted: string,   // Display string ('$19.99')
}

Supported currencies: USD, EUR, GBP, JPY, CNY, INR, AUD, CAD, CHF, HKD, SGD, SEK, KRW, NOK, NZD, MXN, TWD, ZAR, BRL, DKK, PLN, THB, ILS, IDR, CZK, AED, TRY, HUF, CLP, SAR, PHP, MYR, COP, RUB, RON, BTC

Money Helpers

typescript
import {
  getCurrencyConfig,
  formatMoney,
  toSmallestUnit,
  fromSmallestUnit,
  CURRENCY_CONFIGS,
} from '@codician-team/monch';

getCurrencyConfig('USD')
// { code: 'USD', symbol: '$', decimals: 2, ... }

formatMoney({ amount: 1999, currency: 'USD' })
// '$19.99'

toSmallestUnit(19.99, 'USD')   // 1999
fromSmallestUnit(1999, 'USD')  // 19.99

Using Zod Directly

The z export is Zod itself:

typescript
import { z } from '@codician-team/monch';

const schema = {
  _id: field.id(),
  metadata: z.record(z.string(), z.any()),
  tags: z.set(z.string()),
  data: z.union([z.string(), z.number()]),
};

Quick Reference

MethodOutput TypeDescription
field.id()ObjectIdAuto-generating ObjectId
field.objectId()ObjectIdRequired ObjectId reference
field.uuid()stringAuto-generating UUID
field.string()stringString
field.number()numberNumber
field.boolean()booleanBoolean
field.date()DateDate
field.datetime()DateDate with default to now
field.email()stringEmail validation
field.url()stringURL validation
field.enum([...])unionEnum type
field.array(type)T[]Array of type
field.object({...})objectNested object
field.long()Long64-bit integer
field.decimal()Decimal128High-precision decimal
field.binary()BinaryBinary data
field.timestamp()TimestampMongoDB timestamp
field.money(opts?)MoneyValueCurrency with formatting

Released under the MIT License.