Dynz.

Schema types

The complete reference for every schema type dynz supports — string, number, boolean, date, object, array, options, file, enum, literal, expression, and discriminated union.

Every dynz schema starts with a type builder. All builders share the same property setters (setRequired, setMutable, setIncluded, setPrivate, setDefault, setCoerce) and can be composed freely.

d.string()

Validates a Javascript string.

import * as d from 'dynz';

const schema = d.string();

// With rules
const username = d.string().min(3).max(20).regex('^[a-z0-9_]+$');
const email    = d.string().email();
const code     = d.string().isNumeric();

Available rules: min, max, email, regex, equals, oneOf, includes, notIncludes, isNumeric, custom, when


d.number()

Validates a JavaScript number.

const age      = d.number().min(0).max(120);
const price    = d.number().min(0).maxPrecision(2);   // max 2 decimal places
const quantity = d.number().min(1);

Available rules: min, max, maxPrecision, equals, custom, when


d.boolean()

Validates a true or false value.

const agreed = d.boolean();
const active = d.boolean().setDefault(false);

Available rules: equals, custom, when


d.date()

Validates a Date object. Rules accept either a static Date or a d.ref() to another date field.

const birthDate    = d.date().before(new Date());
const checkIn      = d.date().after(new Date());
const checkOut     = d.date().after(d.ref('checkIn'), 'Check-out must be after check-in');
const eventDate    = d.date().minDate(new Date('2024-01-01'))
                              .maxDate(new Date('2024-12-31'));

Available rules: before, after, minDate, maxDate, custom, when

before and after are exclusive (strict). Use minDate / maxDate for inclusive bounds.


d.object(fields)

Validates a plain object. Each value in fields is itself a schema.

const userSchema = d.object({
  id:      d.string(),
  profile: d.object({
    name:  d.string().min(1),
    bio:   d.string().optional(),
  }),
  tags:    d.array(d.string()),
});

Object schemas nest arbitrarily. Validation descends into nested objects and collects all errors before returning.

Available rules: none (use inner field schemas for rules)


d.array(itemSchema)

Validates an array where every element matches itemSchema.

const tags   = d.array(d.string().min(1));
const items  = d.array(d.object({ id: d.string(), qty: d.number() }));

// Constrain the array length
const photos = d.array(d.file()).min(1).max(10);

Available rules: min (min items), max (max items), custom, when

To constrain what can change in an existing array, use setMutable on the inner schema:

// Elements cannot be edited in place, but the array itself can grow/shrink
const readOnlyItems = d.array(d.string().setMutable(false));

d.options(values)

Validates that the value is one of a fixed set of string or number literals. This is the right type for dropdowns, radio groups, and segmented controls.

const plan    = d.options(['free', 'pro', 'enterprise'] as const);
const country = d.options(['US', 'GB', 'DE', 'FR'] as const);
const rating  = d.options([1, 2, 3, 4, 5] as const);

Options can carry a conditional enabled flag so individual choices appear or disappear based on other field values:

const shippingMethod = d.options([
  'standard',
  { value: 'express', enabled: d.eq(d.ref('country'), 'US') },
  { value: 'overnight', enabled: d.and(
      d.eq(d.ref('country'), 'US'),
      d.eq(d.ref('plan'), 'pro'),
    )
  },
]);

Available rules: equals, oneOf, custom, when


d.file()

Validates a File object (browser File API).

const avatar  = d.file().maxSize(2 * 1024 * 1024)  // 2 MB
                         .mimeType(['image/jpeg', 'image/png', 'image/webp']);

const resume  = d.file().maxSize(5 * 1024 * 1024)
                         .mimeType(['application/pdf']);

Available rules: maxSize, minSize, mimeType, custom, when


d.enum(values)

Validates a value against a TypeScript-style enum object. Use d.options() when you have a plain array of strings — d.enum() is for enum-shaped records.

const Status = { DRAFT: 'draft', PUBLISHED: 'published', ARCHIVED: 'archived' } as const;

const status = d.enum(Status);
// Valid values: 'draft' | 'published' | 'archived'

d.literal(value)

Validates that the value is exactly a specific string, number, boolean, or null.

const trueLiteral   = d.literal(true);
const versionOne    = d.literal(1);
const nullField     = d.literal(null);
const fixedVersion  = d.literal('v2');

Use a literal when a field must always be one fixed value — for example, an accepted terms field that must be true, an API version field that must be 'v2', or a constant marker in a data structure.


d.discriminatedUnion(key, members)

Validates a tagged union. The key field selects which member to validate against.

const paymentSchema = d.discriminatedUnion('method', [
  {
    method: 'card',
    cardNumber: d.string().regex('^[0-9]{16}$'),
    expiry:     d.string().regex('^(0[1-9]|1[0-2])\\/[0-9]{2}$'),
    cvv:        d.string().min(3).max(4).setPrivate(true),
  },
  {
    method: 'bank_transfer',
    iban:        d.string().min(15).max(34),
    accountName: d.string().min(1),
  },
  {
    method: 'paypal',
    paypalEmail: d.string().email(),
  },
]);

When method === 'card', only the first member is validated. The other members are ignored.


d.expression(value)

An expression schema doesn't validate input — it computes a value. Use it to derive calculated fields that should appear in the output but aren't submitted by the user.

const orderSchema = d.object({
  unitPrice: d.number().min(0),
  quantity:  d.number().min(1),
  total:     d.expression(d.multiply(d.ref('unitPrice'), d.ref('quantity'))),
});

const result = await d.validate(orderSchema, undefined, { unitPrice: 10, quantity: 3 });
// result.values.total === 30

Common properties

All schema types support these property setters:

SetterDescription
.setRequired(value)true, false, or a predicate. Defaults to true.
.optional()Shorthand for .setRequired(false).
.setMutable(value)true, false, or a predicate. Controls whether the value can change on update.
.setIncluded(value)true, false, or a predicate. Excluded fields must not have a value.
.setPrivate(true)Masks the value in the output. See private fields.
.setDefault(value)Substitutes this value when the field is empty.
.setCoerce(true)Enables automatic type coercion (e.g. "42" → 42 for number schemas).
.setUi(config)Attaches arbitrary UI metadata (labels, placeholders, etc.) for your renderer.

On this page