@whatsaaaa/form-builder-schema 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ type AnyObjectSchema = v.ObjectSchema<v.ObjectEntries, v.ErrorMessage<v.ObjectIs
|
|
|
8
8
|
interface KindDef {
|
|
9
9
|
/** True when the input means "no value". */
|
|
10
10
|
isEmpty(input: unknown): boolean;
|
|
11
|
-
/** Extra check for required
|
|
11
|
+
/** Extra check for required fields after normalize rules ran. Omit it when isEmpty is enough. */
|
|
12
12
|
required?(message: string): AnyAction | null;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
@@ -32,7 +32,7 @@ interface JsonField {
|
|
|
32
32
|
rules?: readonly JsonRule[];
|
|
33
33
|
/** For renderers. This package never reads or checks it. */
|
|
34
34
|
ui?: Record<string, unknown>;
|
|
35
|
-
/** Validated by the field type's props schema
|
|
35
|
+
/** Validated by the field type's props schema. */
|
|
36
36
|
[prop: string]: unknown;
|
|
37
37
|
}
|
|
38
38
|
interface JsonRule {
|
|
@@ -42,7 +42,7 @@ interface JsonRule {
|
|
|
42
42
|
}
|
|
43
43
|
/** Where something is in a definition, e.g. `['fields', 0, 'rules', 1]`. */
|
|
44
44
|
type DefinitionPath = readonly (string | number)[];
|
|
45
|
-
/** Public API: adding a code is a minor change, renaming one is breaking
|
|
45
|
+
/** Public API: adding a code is a minor change, renaming one is breaking. */
|
|
46
46
|
type DefinitionIssueCode = 'invalid_shape' | 'unsupported_version' | 'unknown_key' | 'unknown_type' | 'missing_name' | 'duplicate_name' | 'invalid_props' | 'unknown_rule' | 'unknown_param' | 'invalid_params' | 'kind_mismatch';
|
|
47
47
|
interface DefinitionIssue {
|
|
48
48
|
code: DefinitionIssueCode;
|
|
@@ -678,7 +678,7 @@ export declare const textUnitRules: {
|
|
|
678
678
|
*/
|
|
679
679
|
export declare const RESERVED_FIELD_KEYS: readonly ["name", "type", "label", "description", "placeholder", "default", "required", "rules", "ui"];
|
|
680
680
|
/**
|
|
681
|
-
* Rule keys this package
|
|
681
|
+
* Rule keys this package owns. A rule's params can't use them.
|
|
682
682
|
*/
|
|
683
683
|
export declare const RESERVED_RULE_KEYS: readonly ["rule", "message"];
|
|
684
684
|
export type { AnyAction, AnyObjectSchema, AnySchema, BuildContext, DefinitionIssue, DefinitionIssueCode, DefinitionPath, FieldTypeDef, FieldWithProps, JsonField, JsonForm, JsonRule, KindDef, KindOf, MessageContext, RuleCategory, RuleDef, RuleMeta, RuleStage, SchemaBuilderOptions, ValidateResult, ValueKind };
|
package/dist/index.js
CHANGED
|
@@ -824,7 +824,7 @@ const RESERVED_FIELD_KEYS = [
|
|
|
824
824
|
"ui"
|
|
825
825
|
];
|
|
826
826
|
/**
|
|
827
|
-
* Rule keys this package
|
|
827
|
+
* Rule keys this package owns. A rule's params can't use them.
|
|
828
828
|
*/
|
|
829
829
|
const RESERVED_RULE_KEYS = ["rule", "message"];
|
|
830
830
|
const fieldKeys = new Set(RESERVED_FIELD_KEYS);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["meta","meta","kinds","meta","kinds","meta","meta","kinds","meta"],"sources":["../src/shared/each-item.ts","../src/builder/build-field-schema.ts","../src/field-types/basic-types.ts","../src/field-types/define-field-type.ts","../src/field-types/choice-types.ts","../src/field-types/date-types.ts","../src/field-types/display-types.ts","../src/field-types/file-type.ts","../src/field-types/default-field-types.ts","../src/kinds/default-kinds.ts","../src/rules/define-rule.ts","../src/rules/param-schemas.ts","../src/rules/comparison-rules.ts","../src/rules/content-rules.ts","../src/rules/date-rules.ts","../src/rules/file-rules.ts","../src/rules/format-rules.ts","../src/rules/length-rules.ts","../src/rules/normalize-rules.ts","../src/rules/number-rules.ts","../src/rules/text-unit-rules.ts","../src/rules/default-rules.ts","../src/builder/registry.ts","../src/errors/definition-error.ts","../src/rules/rule-params.ts","../src/shared/reserved-keys.ts","../src/builder/validate-definition.ts","../src/builder/create-schema-builder.ts"],"sourcesContent":["import * as v from 'valibot'\nimport type { AnyAction, AnySchema } from './valibot-types'\n\n/**\n * Checks every item of an array with `schema` and reports the issues on the array itself.\n * Formisch keeps no field for each item of an array value, so an issue with an item's index in\n * its path would show nowhere.\n */\nexport function eachItem(schema: AnySchema): AnyAction {\n return v.rawCheck(({ dataset, config, addIssue }) => {\n if (!dataset.typed || !Array.isArray(dataset.value)) return\n for (const item of dataset.value as unknown[]) {\n const result = v.safeParse(schema, item, config as v.Config<v.BaseIssue<unknown>>)\n for (const issue of result.issues ?? []) {\n addIssue({\n message: issue.message,\n input: item,\n expected: issue.expected ?? undefined,\n received: issue.received,\n })\n }\n }\n })\n}\n","import * as v from 'valibot'\nimport type { JsonField } from '../definition/json-form-schema'\nimport type { DefinitionPath } from '../errors/definition-error'\nimport type { RuleStage } from '../rules/rule-def'\nimport type { CheckedField } from './validate-definition'\nimport { eachItem } from '../shared/each-item'\nimport type { AnyAction, AnySchema } from '../shared/valibot-types'\n\nexport interface MessageContext {\n field: JsonField\n rule?: string\n path: DefinitionPath\n}\n\nexport interface Messages {\n required: string\n resolve(text: string, ctx: MessageContext): string\n}\n\n/**\n * The schema runs in this order: empty check, base schema, normalize rules, required check,\n * then the type's default rules and the field's rules, and last the type's `finalize()`.\n */\nexport function buildFieldSchema(checked: CheckedField, messages: Messages): AnySchema {\n const { field, path, type, kind } = checked\n const required = !!field.required\n const requiredMessage = messages.resolve(\n (typeof field.required === 'object' && field.required.message) || messages.required,\n { field, path },\n )\n\n // Rules for a whole value, and rules that run on each item of an array value.\n const whole: Record<RuleStage, PipeItem[]> = { normalize: [], validate: [] }\n const each: Record<RuleStage, AnyAction[]> = { normalize: [], validate: [] }\n\n for (const rule of checked.rules) {\n const message =\n rule.message === undefined\n ? undefined\n : messages.resolve(rule.message, { field, rule: rule.name, path })\n const action = rule.def.create(rule.params, message)\n const stage = rule.def.stage ?? 'validate'\n if (rule.each) {\n each[stage].push(action)\n } else {\n whole[stage].push(action)\n }\n }\n\n // Item rules run before the rules for the whole array.\n if (each.normalize.length) {\n whole.normalize.unshift(v.array(pipe(v.unknown(), each.normalize)))\n }\n if (each.validate.length) {\n whole.validate.unshift(eachItem(pipe(v.unknown(), each.validate)))\n }\n\n const finalize = type.finalize?.(field)\n if (finalize) whole.validate.push(finalize)\n\n const base = (type.schema as NonNullable<typeof type.schema>)(field, { path })\n // The type can replace the kind's required check, e.g. a yes/no radio accepts false.\n const requiredCheck = !required\n ? undefined\n : type.required\n ? type.required(requiredMessage)\n : kind.required?.(requiredMessage)\n const head = pipe(base, requiredCheck ? [...whole.normalize, requiredCheck] : whole.normalize)\n\n const empty = required\n ? v.never(requiredMessage)\n : v.pipe(\n v.unknown(),\n v.transform(() => undefined),\n )\n\n const whenFilled = (schema: AnySchema): AnySchema =>\n v.lazy((input) => (kind.isEmpty(input) ? empty : schema))\n\n const schema = whenFilled(v.pipe(head, whenFilled(pipe(v.unknown(), whole.validate))))\n\n return required ? schema : v.optional(schema)\n}\n\n/** An action, or a schema that runs on the value so far, e.g. on each item of an array. */\ntype PipeItem = AnyAction | AnySchema\n\nconst pipe = (schema: AnySchema, items: readonly PipeItem[]): AnySchema =>\n items.reduce<AnySchema>((acc, item) => v.pipe(acc, item), schema)\n","import * as v from 'valibot'\nimport type { FieldTypeDef } from './field-type-def'\n\n/** Types with one plain value and no props. Each maps to a native input. */\nexport const basicTypes = {\n text: { kind: 'string', schema: () => v.string() },\n textarea: { kind: 'string', schema: () => v.string() },\n email: { kind: 'string', schema: () => v.string(), defaultRules: [{ rule: 'email' }] },\n password: { kind: 'string', schema: () => v.string() },\n url: { kind: 'string', schema: () => v.string(), defaultRules: [{ rule: 'url' }] },\n // Phone formats differ per country, so there is no default rule. Add a regex rule for yours.\n tel: { kind: 'string', schema: () => v.string() },\n number: { kind: 'number', schema: () => v.number() },\n // Required means \"must be ticked\", e.g. accepting terms.\n checkbox: { kind: 'boolean', schema: () => v.boolean() },\n} satisfies Record<string, FieldTypeDef>\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { FieldTypeDef } from './field-type-def'\n\nexport const defineFieldType = <T extends AnyObjectSchema>(def: FieldTypeDef<T>): FieldTypeDef<T> =>\n def\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\ntype OptionValue = string | number | boolean\ntype Option = { value: OptionValue; label: string }\n\nconst options = <TValue extends v.GenericSchema<OptionValue>>(value: TValue) =>\n v.pipe(\n v.array(v.object({ value, label: v.string() })),\n v.minLength(1, 'Give at least one option'),\n v.check(\n (items) => new Set(items.map((item) => typeof item.value)).size <= 1,\n 'Give every option a value of the same type',\n ),\n v.check(\n (items) => new Set(items.map((item) => item.value)).size === items.length,\n 'Give every option a different value',\n ),\n )\n\nconst stringOrNumber = v.union([v.string(), v.number()])\nconst anyValue = v.union([v.string(), v.number(), v.boolean()])\n\n/** The options' value type. Every option has the same one. */\nconst kindOf = (items: readonly Option[]): ValueKind => {\n const [first] = items\n return first ? typeof first.value : 'string'\n}\n\n/** One of the option values. `v.picklist` can't hold booleans, so this is a union of literals. */\nconst oneOf = (items: readonly Option[]) => v.union(items.map((item) => v.literal(item.value)))\n\nexport const choiceTypes = {\n select: defineFieldType({\n kind: (field) => (field.options ? kindOf(field.options) : (field.valueType ?? 'string')),\n props: v.object({\n options: v.optional(options(stringOrNumber)),\n /** The value's type while `options` is missing, e.g. until they load from an API. */\n valueType: v.optional(v.picklist(['string', 'number'])),\n }),\n schema: (field) => {\n if (field.options) return oneOf(field.options)\n return field.valueType === 'number' ? v.number() : v.string()\n },\n }),\n radio: defineFieldType({\n kind: (field) => kindOf(field.options),\n props: v.object({ options: options(anyValue) }),\n schema: (field) => oneOf(field.options),\n // Any option counts as an answer, so a required yes/no radio accepts \"no\". The empty check\n // already rejects a radio with nothing picked.\n required: () => null,\n }),\n // A checkbox group is a multiselect with `ui: { widget: 'checkboxes' }`.\n multiselect: defineFieldType({\n kind: 'array',\n itemKind: (field) => kindOf(field.options),\n props: v.object({ options: options(stringOrNumber) }),\n schema: (field) => v.array(oneOf(field.options)),\n }),\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\nconst outputProps = v.object({\n /** `'date'` turns the ISO string into a `Date`. Defaults to `'string'`. */\n output: v.optional(v.picklist(['string', 'date'])),\n})\n\n// Runs after every rule, so comparison rules like minValue still compare ISO strings.\nconst finalize = (field: v.InferOutput<typeof outputProps>) =>\n field.output === 'date' ? v.toDate() : undefined\n\n/**\n * Dates and times are ISO strings, the values of <input type=\"date|time|datetime-local\">.\n * The format is part of the type rather than a default rule, so these types don't depend on\n * `dateRules` being registered.\n */\nexport const dateTypes = {\n date: defineFieldType({\n kind: 'date',\n props: outputProps,\n schema: () => v.pipe(v.string(), v.isoDate()),\n finalize,\n }),\n time: { kind: 'date', schema: () => v.pipe(v.string(), v.isoTime()) },\n // A local date and time without a time zone, e.g. 2026-10-28T14:30.\n datetime: defineFieldType({\n kind: 'date',\n props: outputProps,\n schema: () => v.pipe(v.string(), v.isoDateTime()),\n finalize,\n }),\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\n/**\n * Elements without a value. They need no name and add no output key. Their `text` can be an\n * i18n key: renderers resolve it with the same function they pass as `resolveMessage`.\n */\nexport const displayTypes = {\n heading: defineFieldType({\n kind: 'none',\n props: v.object({\n text: v.string(),\n /** 1 to 6. Defaults to 2. */\n level: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(6))),\n }),\n }),\n // Plain text. Whether to render markdown is up to the renderer.\n paragraph: defineFieldType({ kind: 'none', props: v.object({ text: v.string() }) }),\n divider: { kind: 'none' },\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport { eachItem } from '../shared/each-item'\nimport { defineFieldType } from './define-field-type'\n\ntype MimeType = `${string}/${string}`\n\nconst mimeTypes = (accept: string) => accept.split(',').map((type) => type.trim()) as MimeType[]\n\nconst fileProps = v.object({\n multiple: v.optional(v.boolean()),\n // A File only carries its MIME type, so extensions (.pdf) and wildcards (image/*) can't be\n // checked against it.\n accept: v.optional(\n v.pipe(\n v.string(),\n v.check(\n (input) => mimeTypes(input).every((type) => /^[\\w.+-]+\\/[\\w.+-]+$/.test(type)),\n 'Use MIME types separated by commas, such as image/png,image/jpeg',\n ),\n ),\n ),\n})\n\n/**\n * A File, or an array of them with `multiple`. Rules for files, like `maxSize`, run on each one;\n * rules for arrays, like `maxLength`, limit the count.\n */\nexport const fileType = defineFieldType({\n kind: (field) => (field.multiple ? 'array' : 'file'),\n itemKind: 'file',\n props: fileProps,\n // The schema is created per field and v.file() only reads the File global while parsing, so\n // the package still loads where File doesn't exist.\n schema: (field) => {\n const file = field.accept ? v.pipe(v.file(), v.mimeType(mimeTypes(field.accept))) : v.file()\n if (!field.multiple) return file\n // Checking each file after the array keeps the issues on the field, not on its items.\n return field.accept ? v.pipe(v.array(v.file()), eachItem(file)) : v.array(file)\n },\n})\n","import { basicTypes } from './basic-types'\nimport { choiceTypes } from './choice-types'\nimport { dateTypes } from './date-types'\nimport { displayTypes } from './display-types'\nimport { fileType } from './file-type'\nimport type { FieldTypeDef } from './field-type-def'\n\n/** Every built-in field type. */\nexport const defaultFieldTypes = {\n ...basicTypes,\n ...dateTypes,\n ...choiceTypes,\n file: fileType,\n ...displayTypes,\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport type { KindDef } from './kind-def'\n\nconst isNil = (input: unknown) => input === undefined || input === null\n\nexport const defaultKinds = {\n string: {\n isEmpty: (input) => isNil(input) || input === '',\n required: (message) => v.nonEmpty(message),\n },\n // A cleared <input type=\"number\"/> holds '' or NaN, depending on the adapter.\n number: {\n isEmpty: (input) => isNil(input) || input === '' || Number.isNaN(input),\n },\n // Required means \"must be ticked\", e.g accepting terms.\n boolean: {\n isEmpty: isNil,\n required: (message) => v.value(true, message),\n },\n date: {\n isEmpty: (input) => isNil(input) || input === '',\n required: (message) => v.nonEmpty(message),\n },\n array: {\n isEmpty: (input) => isNil(input) || (Array.isArray(input) && input.length === 0),\n required: (message) => v.minLength(1, message),\n },\n file: { isEmpty: isNil },\n object: { isEmpty: isNil },\n // Display elements (headings, dividers) have no value, so the builder never calls this.\n none: { isEmpty: () => true },\n} satisfies Record<string, KindDef>\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { RuleDef } from './rule-def'\n\nexport const defineRule = <T extends AnyObjectSchema>(def: RuleDef<T>): RuleDef<T> => def\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\n\n/** A length, count or size: a whole number from 0. */\nexport const count = v.pipe(v.number(), v.integer(), v.minValue(0))\n\nexport const countParams = v.object({ value: count })\n\nconst isIsoValue = (input: string) =>\n v.ISO_DATE_REGEX.test(input) || v.ISO_DATE_TIME_REGEX.test(input) || v.ISO_TIME_REGEX.test(input)\n\n/** Valibot compares dates as ISO strings, so the param must be one too. */\nexport const isoValue = v.pipe(\n v.string(),\n v.check(isIsoValue, 'Use an ISO date, date-time or time, such as 2026-01-01'),\n)\n\nexport const valueSchema = (kind: ValueKind) => {\n switch (kind) {\n case 'date':\n return isoValue\n case 'string':\n return v.string()\n case 'boolean':\n return v.boolean()\n default:\n return v.number()\n }\n}\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineRule } from './define-rule'\nimport { valueSchema } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\ntype Value = string | number | boolean\n\nconst ordered = ['number', 'date'] as const\nconst any = ['number', 'date', 'string', 'boolean'] as const\nconst meta = (label: string) => ({ label, category: 'comparison' }) as const\n\n// The param has the field's type: a number on a number field, an ISO string on a date field.\nconst valueParams = (kind: ValueKind) => v.object({ value: valueSchema(kind) })\nconst valuesParams = (kind: ValueKind) =>\n v.object({\n values: v.pipe(v.array(valueSchema(kind)), v.minLength(1, 'Give at least one value')),\n })\n\n/** Compares the value with a param of the same type. */\nexport const comparisonRules = {\n minValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Minimum'),\n create: (p, m) => v.minValue(p.value as Value, m) as AnyAction,\n }),\n maxValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Maximum'),\n create: (p, m) => v.maxValue(p.value as Value, m) as AnyAction,\n }),\n gtValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Greater than'),\n create: (p, m) => v.gtValue(p.value as Value, m) as AnyAction,\n }),\n ltValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Less than'),\n create: (p, m) => v.ltValue(p.value as Value, m) as AnyAction,\n }),\n value: defineRule({\n kinds: any,\n params: valueParams,\n meta: meta('Equals'),\n create: (p, m) => v.value(p.value as Value, m) as AnyAction,\n }),\n notValue: defineRule({\n kinds: any,\n params: valueParams,\n meta: meta('Does not equal'),\n create: (p, m) => v.notValue(p.value as Value, m) as AnyAction,\n }),\n values: defineRule({\n kinds: ordered,\n params: valuesParams,\n meta: meta('One of'),\n create: (p, m) => v.values(p.values as Value[], m) as AnyAction,\n }),\n notValues: defineRule({\n kinds: ordered,\n params: valuesParams,\n meta: meta('None of'),\n create: (p, m) => v.notValues(p.values as Value[], m) as AnyAction,\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineRule } from './define-rule'\nimport type { AnyAction } from '../shared/valibot-types'\nimport type { RuleDef } from './rule-def'\n\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'content' }) as const\n\nconst regexError = (pattern: string, flags = '') => {\n try {\n new RegExp(pattern, flags)\n return undefined\n } catch (error) {\n return (error as Error).message\n }\n}\n\nconst FLAGS = /^[dgimsuvy]*$/\n\nconst regexParams = v.pipe(\n v.object({\n pattern: v.string(),\n flags: v.optional(v.pipe(v.string(), v.regex(FLAGS, 'Flags can be d, g, i, m, s, u, v and y'))),\n }),\n v.forward(\n v.check(\n (p) => !FLAGS.test(p.flags ?? '') || regexError(p.pattern, p.flags) === undefined,\n (issue) => regexError(issue.input.pattern, issue.input.flags) ?? 'Invalid pattern',\n ),\n ['pattern'],\n ),\n)\n\nconst item = v.union([v.string(), v.number(), v.boolean()])\nconst stringParams = v.object({ value: v.string() })\nconst contentParams = (kind: ValueKind) => v.object({ value: kind === 'array' ? item : v.string() })\n\nexport const contentRules = {\n regex: defineRule({\n kinds: ['string'],\n params: regexParams,\n meta: meta('Matches pattern', 'A JavaScript regular expression, without the slashes.'),\n create: (p, m) => v.regex(new RegExp(p.pattern, p.flags?.replace(/[gy]/g, '')), m),\n }),\n startsWith: defineRule({\n kinds: ['string'],\n params: stringParams,\n meta: meta('Starts with'),\n create: (p, m) => v.startsWith(p.value, m),\n }),\n endsWith: defineRule({\n kinds: ['string'],\n params: stringParams,\n meta: meta('Ends with'),\n create: (p, m) => v.endsWith(p.value, m),\n }),\n includes: defineRule({\n kinds: ['string', 'array'],\n params: contentParams,\n meta: meta('Contains'),\n create: (p, m) => v.includes(p.value, m) as AnyAction,\n }),\n excludes: defineRule({\n kinds: ['string', 'array'],\n params: contentParams,\n meta: meta('Does not contain'),\n create: (p, m) => v.excludes(p.value, m) as AnyAction,\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst iso = (label: string, description: string, create: (message?: string) => AnyAction) =>\n defineRule({\n kinds: ['string', 'date'],\n meta: { label, description, category: 'date' },\n create: (_, message) => create(message),\n })\n\nexport const dateRules = {\n isoDate: iso('ISO date', 'Like 2026-10-28', (m) => v.isoDate(m)),\n isoDateTime: iso('ISO date and time', 'Like 2026-10-28T14:30', (m) => v.isoDateTime(m)),\n isoTime: iso('ISO time', 'Like 14:30', (m) => v.isoTime(m)),\n isoTimeSecond: iso('ISO time with seconds', 'Like 14:30:15', (m) => v.isoTimeSecond(m)),\n isoTimestamp: iso('ISO timestamp', 'Like 2026-10-28T14:30:15.000z', (m) => v.isoTimestamp(m)),\n isoWeek: iso('ISO week', 'Like 2026-W44', (m) => v.isoWeek(m)),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport { countParams } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['file'] as const\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'file' }) as const\nconst bytes = 'In bytes, e.g. 1048576 for 1 MiB.'\n\ntype MimeType = `${string}/${string}`\n\n// A File only carries its MIME type, and Valibot compares it exactly, so image/* can't work.\nconst mimeTypeParams = v.object({\n types: v.pipe(\n v.array(\n v.pipe(v.string(), v.regex(/^[\\w.+-]+\\/[\\w.+-]+$/, 'Use a MIME type, such as image/png')),\n ),\n v.minLength(1, 'Give at least one MIME type'),\n ),\n})\n\n/** Size and type of a File or Blob. */\nexport const fileRules = {\n minSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum size', bytes),\n create: (p, m) => v.minSize(p.value, m),\n }),\n maxSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum size', bytes),\n create: (p, m) => v.maxSize(p.value, m),\n }),\n size: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact size', bytes),\n create: (p, m) => v.size(p.value, m),\n }),\n notSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this size', bytes),\n create: (p, m) => v.notSize(p.value, m),\n }),\n mimeType: defineRule({\n kinds,\n params: mimeTypeParams,\n meta: meta('File type'),\n create: (p, m) => v.mimeType(p.types as MimeType[], m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\n/** A string format without params. */\nconst format = (label: string, create: (message?: string) => AnyAction) =>\n defineRule({\n kinds: ['string'],\n meta: { label, category: 'format' },\n create: (_, message) => create(message),\n })\n\n/** Valibot's hash types. Valibot doesn't export the list, only the type. */\nconst HASH_TYPES = [\n 'md4',\n 'md5',\n 'sha1',\n 'sha256',\n 'sha384',\n 'sha512',\n 'ripemd128',\n 'ripemd160',\n 'tiger128',\n 'tiger160',\n 'tiger192',\n 'crc32',\n 'crc32b',\n 'adler32',\n] as const satisfies readonly v.HashType[]\n\nconst hashParams = v.object({\n types: v.pipe(v.array(v.picklist(HASH_TYPES)), v.minLength(1, 'Pick at least one hash type')),\n})\n\n/** Formats Valibot can check on a string. */\nexport const formatRules = {\n email: format('Email', (m) => v.email(m)),\n rfcEmail: format('Email (RFC 5322)', (m) => v.rfcEmail(m)),\n url: format('URL', (m) => v.url(m)),\n domain: format('Domain', (m) => v.domain(m)),\n slug: format('Slug', (m) => v.slug(m)),\n uuid: format('UUID', (m) => v.uuid(m)),\n ulid: format('ULID', (m) => v.ulid(m)),\n cuid2: format('CUID2', (m) => v.cuid2(m)),\n nanoid: format('Nano ID', (m) => v.nanoid(m)),\n ip: format('IP address', (m) => v.ip(m)),\n ipv4: format('IPv4 address', (m) => v.ipv4(m)),\n ipv6: format('IPv6 address', (m) => v.ipv6(m)),\n mac: format('MAC address', (m) => v.mac(m)),\n mac48: format('MAC-48 address', (m) => v.mac48(m)),\n mac64: format('MAC-64 address', (m) => v.mac64(m)),\n hexColor: format('Hex colour', (m) => v.hexColor(m)),\n hexadecimal: format('Hexadecimal', (m) => v.hexadecimal(m)),\n octal: format('Octal', (m) => v.octal(m)),\n decimal: format('Decimal number', (m) => v.decimal(m)),\n digits: format('Digits only', (m) => v.digits(m)),\n base64: format('Base64', (m) => v.base64(m)),\n bic: format('BIC (SWIFT code)', (m) => v.bic(m)),\n creditCard: format('Credit card number', (m) => v.creditCard(m)),\n imei: format('IMEI', (m) => v.imei(m)),\n isbn: format('ISBN', (m) => v.isbn(m)),\n isrc: format('ISRC', (m) => v.isrc(m)),\n emoji: format('Emoji', (m) => v.emoji(m)),\n hash: defineRule({\n kinds: ['string'],\n params: hashParams,\n meta: { label: 'Hash', category: 'format' },\n create: (p, m) => v.hash(p.types as [v.HashType, ...v.HashType[]], m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport { countParams } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['string', 'array'] as const\nconst meta = (label: string) => ({ label, category: 'length' }) as const\n\n/** Characters of a string, or items of an array */\nexport const lengthRules = {\n length: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact length'),\n create: (p, m) => v.length(p.value, m),\n }),\n minLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum length'),\n create: (p, m) => v.minLength(p.value, m),\n }),\n maxLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum length'),\n create: (p, m) => v.maxLength(p.value, m),\n }),\n notLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this length'),\n create: (p, m) => v.notLength(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst stage = 'normalize'\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'normalize' }) as const\nconst limit = v.object({ value: v.number() })\n\n/**\n * Rules that change the value instead of checking it. They run before the required check, so\n * `' '` with `trim` is empty. Their `message` is never shown.\n */\nexport const normalizeRules = {\n trim: defineRule({ kinds: ['string'], stage, meta: meta('Trim'), create: () => v.trim() }),\n trimStart: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Trim start'),\n create: () => v.trimStart(),\n }),\n trimEnd: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Trim end'),\n create: () => v.trimEnd(),\n }),\n toLowerCase: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Lowercase'),\n create: () => v.toLowerCase(),\n }),\n toUpperCase: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Uppercase'),\n create: () => v.toUpperCase(),\n }),\n normalize: defineRule({\n kinds: ['string'],\n stage,\n params: v.object({ form: v.optional(v.picklist(['NFC', 'NFD', 'NFKC', 'NFKD'])) }),\n meta: meta('Unicode normalize', 'Defaults to NFC.'),\n create: (p) => v.normalize(p.form),\n }),\n toMinValue: defineRule({\n kinds: ['number'],\n stage,\n params: limit,\n meta: meta('Raise to minimum', 'Replaces a smaller number with the minimum.'),\n create: (p) => v.toMinValue(p.value),\n }),\n toMaxValue: defineRule({\n kinds: ['number'],\n stage,\n params: limit,\n meta: meta('Lower to maximum', 'Replaces a larger number with the maximum.'),\n create: (p) => v.toMaxValue(p.value),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['number'] as const\nconst meta = (label: string) => ({ label, category: 'number' }) as const\n\nconst divisor = v.pipe(v.number(), v.finite(), v.notValue(0, \"Can't be 0\"))\n\n/** Checks only numbers have. */\nexport const numberRules = {\n integer: defineRule({ kinds, meta: meta('Whole number'), create: (_, m) => v.integer(m) }),\n safeInteger: defineRule({\n kinds,\n meta: meta('Safe whole number'),\n create: (_, m) => v.safeInteger(m),\n }),\n finite: defineRule({ kinds, meta: meta('Finite number'), create: (_, m) => v.finite(m) }),\n multipleOf: defineRule({\n kinds,\n params: v.object({ value: divisor }),\n meta: meta('Multiple of'),\n create: (p, m) => v.multipleOf(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { count, countParams } from './param-schemas'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['string'] as const\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'text' }) as const\n\nconst isLocale = (input: string) => {\n try {\n return Intl.getCanonicalLocales(input).length === 1\n } catch {\n return false\n }\n}\n\nconst wordsParams = v.object({\n locale: v.optional(\n v.pipe(v.string(), v.check(isLocale, 'Use a language tag, such as en or sr-Latn')),\n ),\n value: count,\n})\n\nconst graphemesInfo = 'Counts characters as people see them, so an emoji is one.'\nconst bytesInfo = 'Counts UTF-8 bytes, e.g. to fit a database column,'\n\nexport const textUnitRules = {\n graphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact characters', graphemesInfo),\n create: (p, m) => v.graphemes(p.value, m),\n }),\n minGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum characters', graphemesInfo),\n create: (p, m) => v.minGraphemes(p.value, m),\n }),\n maxGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum characters', graphemesInfo),\n create: (p, m) => v.maxGraphemes(p.value, m),\n }),\n notGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this many characters', graphemesInfo),\n create: (p, m) => v.notGraphemes(p.value, m),\n }),\n words: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Exact words'),\n create: (p, m) => v.words(p.locale, p.value, m),\n }),\n minWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Minimum words'),\n create: (p, m) => v.minWords(p.locale, p.value, m),\n }),\n maxWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Maximum words'),\n create: (p, m) => v.maxWords(p.locale, p.value, m),\n }),\n notWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Not this many words'),\n create: (p, m) => v.notWords(p.locale, p.value, m),\n }),\n bytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact bytes', bytesInfo),\n create: (p, m) => v.bytes(p.value, m),\n }),\n minBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum bytes', bytesInfo),\n create: (p, m) => v.minBytes(p.value, m),\n }),\n maxBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum bytes', bytesInfo),\n create: (p, m) => v.maxBytes(p.value, m),\n }),\n notBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this many bytes', bytesInfo),\n create: (p, m) => v.notBytes(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import { comparisonRules } from './comparison-rules'\nimport { contentRules } from './content-rules'\nimport { dateRules } from './date-rules'\nimport { fileRules } from './file-rules'\nimport { formatRules } from './format-rules'\nimport { lengthRules } from './length-rules'\nimport { normalizeRules } from './normalize-rules'\nimport { numberRules } from './number-rules'\nimport { textUnitRules } from './text-unit-rules'\n\n/** Every built-in rule. Register single families with `includeDefaultRules: false`. */\nexport const defaultRules = {\n ...lengthRules,\n ...textUnitRules,\n ...contentRules,\n ...formatRules,\n ...dateRules,\n ...comparisonRules,\n ...numberRules,\n ...fileRules,\n ...normalizeRules,\n}\n","import { defaultFieldTypes } from '../field-types/default-field-types'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport { defaultKinds } from '../kinds/default-kinds'\nimport type { KindDef } from '../kinds/kind-def'\nimport { defaultRules } from '../rules/default-rules'\nimport type { RuleDef } from '../rules/rule-def'\n\nexport interface Registry {\n readonly kinds: Readonly<Record<string, KindDef>>\n readonly fieldTypes: Readonly<Record<string, FieldTypeDef>>\n readonly rules: Readonly<Record<string, RuleDef>>\n}\n\nexport interface RegistryOptions extends Partial<Registry> {\n /** With false, only the consumer's own rules are registered. Defaults to true. */\n includeDefaultRules?: boolean\n}\n\n/** Consumer entries replace defaults with the same key. */\nexport function mergeRegistry(custom: RegistryOptions): Registry {\n const rules = custom.includeDefaultRules === false ? {} : defaultRules\n return {\n kinds: Object.freeze({ ...defaultKinds, ...custom.kinds }),\n fieldTypes: Object.freeze({ ...defaultFieldTypes, ...custom.fieldTypes }),\n rules: Object.freeze({ ...rules, ...custom.rules }),\n }\n}\n\nexport function lookup<T>(record: Readonly<Record<string, T>>, key: string): T | undefined {\n return Object.hasOwn(record, key) ? record[key] : undefined\n}\n","/** Where something is in a definition, e.g. `['fields', 0, 'rules', 1]`. */\nexport type DefinitionPath = readonly (string | number)[]\n\n/** Public API: adding a code is a minor change, renaming one is breaking, */\nexport type DefinitionIssueCode =\n | 'invalid_shape'\n | 'unsupported_version'\n | 'unknown_key'\n | 'unknown_type'\n | 'missing_name'\n | 'duplicate_name'\n | 'invalid_props'\n | 'unknown_rule'\n | 'unknown_param'\n | 'invalid_params'\n | 'kind_mismatch'\n\nexport interface DefinitionIssue {\n code: DefinitionIssueCode\n path: DefinitionPath\n message: string\n}\n\nexport type ValidateResult =\n | { success: true; issues: [] }\n | { success: false; issues: DefinitionIssue[] }\n\nexport function formatPath(path: DefinitionPath): string {\n return path.reduce<string>((out, key) => {\n if (typeof key === 'number') return `${out}[${key}]`\n return out ? `${out}.${key}` : key\n }, '')\n}\n\n/** Thrown by `build()` when the definition has issues. Lists all of them. */\nexport class DefinitionError extends Error {\n readonly issues: readonly DefinitionIssue[]\n\n constructor(issues: readonly DefinitionIssue[]) {\n const lines = issues.map(\n (issue) => ` ${formatPath(issue.path) || '(root)'}: ${issue.message}`,\n )\n super(`Invalid form definition:\\n${lines.join('\\n')}`)\n this.name = 'DefinitionError'\n this.issues = issues\n }\n}\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { ValueKind } from '../shared/value-kind'\nimport type { RuleDef } from './rule-def'\n\nconst cache = new WeakMap<RuleDef, Map<ValueKind, AnyObjectSchema>>()\n\nexport function paramsFor(def: RuleDef, kind: ValueKind): AnyObjectSchema | undefined {\n if (typeof def.params !== 'function') return def.params\n\n let byKind = cache.get(def)\n\n if (!byKind) {\n byKind = new Map()\n cache.set(def, byKind)\n }\n\n let params = byKind.get(kind)\n if (!params) {\n params = def.params(kind)\n byKind.set(kind, params)\n }\n\n return params\n}\n","/**\n * Field keys this package owns. A field type's props can't use them.\n */\nexport const RESERVED_FIELD_KEYS = [\n 'name',\n 'type',\n 'label',\n 'description',\n 'placeholder',\n 'default',\n 'required',\n 'rules',\n 'ui',\n] as const\n\n/**\n * Rule keys this package own. A rule's params can't use them.\n */\nexport const RESERVED_RULE_KEYS = ['rule', 'message'] as const\n\nconst fieldKeys: ReadonlySet<string> = new Set(RESERVED_FIELD_KEYS)\nconst ruleKeys: ReadonlySet<string> = new Set(RESERVED_RULE_KEYS)\n\nexport const isReservedFieldKey = (key: string): boolean => fieldKeys.has(key)\nexport const isReservedRuleKey = (key: string): boolean => ruleKeys.has(key)\n","import * as v from 'valibot'\nimport type { JsonField, JsonRule } from '../definition/json-form-schema'\nimport {\n type DefinitionPath,\n type DefinitionIssue,\n type DefinitionIssueCode,\n formatPath,\n} from '../errors/definition-error'\nimport type { FieldTypeDef, KindOf } from '../field-types/field-type-def'\nimport type { KindDef } from '../kinds/kind-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport { paramsFor } from '../rules/rule-params'\nimport { lookup, type Registry } from './registry'\nimport { isReservedFieldKey, isReservedRuleKey } from '../shared/reserved-keys'\nimport type { ValueKind } from '../shared/value-kind'\n\nexport interface CheckedField {\n name: string\n field: JsonField\n path: DefinitionPath\n type: FieldTypeDef\n kind: KindDef\n rules: CheckedRule[]\n}\n\nexport interface CheckedRule {\n name: string\n def: RuleDef\n params: Record<string, unknown>\n message?: string\n /** True when the rule runs on each item of an array value, not on the array. */\n each: boolean\n}\n\n/** The kind of a field's value, and of its items when the value is an array. */\nexport interface FieldKinds {\n kind: ValueKind\n itemKind?: ValueKind\n}\n\ninterface CheckResult {\n issues: DefinitionIssue[]\n fields: CheckedField[]\n}\n\nconst formShape = v.object({ version: v.string(), fields: v.array(v.unknown()) })\nconst fieldShape = v.looseObject({\n name: v.optional(v.string()),\n type: v.string(),\n label: v.optional(v.string()),\n description: v.optional(v.string()),\n placeholder: v.optional(v.string()),\n default: v.optional(v.unknown()),\n required: v.optional(v.union([v.boolean(), v.strictObject({ message: v.optional(v.string()) })])),\n rules: v.optional(v.array(v.unknown())),\n ui: v.optional(v.record(v.string(), v.unknown())),\n})\nconst ruleShape = v.looseObject({ rule: v.string(), message: v.optional(v.string()) })\nconst noParams = v.object({})\n\n/**\n * Checks a whole definition and collects every issue, in document order. Never throws.\n */\nexport function checkDefinition(json: unknown, registry: Registry): CheckResult {\n const issues: DefinitionIssue[] = []\n const fields: CheckedField[] = []\n\n const form = v.safeParse(formShape, json)\n if (!form.success) return { issues: toIssues('invalid_shape', [], form.issues), fields }\n\n if (form.output.version !== '1') {\n const message = `Unsupported version \"${form.output.version}\". This package reads version '1'.`\n return { issues: [{ code: 'unsupported_version', path: ['version'], message }], fields }\n }\n\n const names = new Set<string>()\n form.output.fields.forEach((raw, i) => {\n const field = checkField(raw, ['fields', i], registry, names, issues)\n if (field) fields.push(field)\n })\n\n return { issues, fields }\n}\n\nfunction checkField(\n raw: unknown,\n path: DefinitionPath,\n registry: Registry,\n names: Set<string>,\n issues: DefinitionIssue[],\n): CheckedField | undefined {\n const shape = v.safeParse(fieldShape, raw)\n if (!shape.success) {\n issues.push(...toIssues('invalid_shape', path, shape.issues))\n return undefined\n }\n\n const field = shape.output as JsonField\n const issueCount = issues.length\n const type = lookup(registry.fieldTypes, field.type)\n // Only a fixed kind can be 'none'. A kind() function that returns it throws in kindDef.\n const hasValue = type?.kind !== 'none'\n\n if (!field.name) {\n if (type && hasValue) {\n issues.push(issue('missing_name', [...path, 'name'], 'A field needs a name'))\n }\n } else if (hasValue) {\n if (names.has(field.name)) {\n issues.push(issue('duplicate_name', [...path, 'name'], `Duplicate name \"${field.name}\"`))\n }\n names.add(field.name)\n }\n\n if (!type) {\n issues.push(issue('unknown_type', [...path, 'type'], `Unknown field type \"${field.type}\"`))\n return undefined\n }\n\n const props = checkProps(field, type, path, issues)\n\n if (!hasValue) {\n for (const key of ['required', 'rules'] as const) {\n if (field[key] !== undefined) {\n const message = `A \"${field.type}\" field has no value, so it can't have \"${key}\"`\n issues.push(issue('invalid_shape', [...path, key], message))\n }\n }\n return undefined\n }\n\n // A kind that comes from a function needs the parsed props. Without them, the rules can't be\n // checked either; the props issues are reported already.\n const withProps = props && { ...field, ...props }\n const kind = resolveKind(type.kind, withProps)\n if (kind === undefined) return undefined\n const kinds: FieldKinds = {\n kind,\n itemKind: kind === 'array' ? resolveKind(type.itemKind, withProps) : undefined,\n }\n\n const fieldRules = (shape.output.rules ?? []).flatMap(\n (rule, j) => checkRule(rule, kinds, [...path, 'rules', j], registry, issues) ?? [],\n )\n if (issues.length > issueCount || !field.name || !withProps) return undefined\n\n const overridden = new Set(fieldRules.map((rule) => rule.name))\n const defaultRules = checkDefaultRules(field.type, type, kinds, registry).filter(\n (rule) => !overridden.has(rule.name),\n )\n\n return {\n name: field.name,\n field: withProps,\n path,\n type,\n kind: kindDef(field.type, kind, registry),\n rules: [...defaultRules, ...fieldRules],\n }\n}\n\nfunction resolveKind(\n kind: ValueKind | KindOf | undefined,\n field: JsonField | undefined,\n): ValueKind | undefined {\n if (typeof kind !== 'function') return kind\n return field && kind(field)\n}\n\n/** A kind that doesn't fit is a mistake in the field type, not in the definition. */\nfunction kindDef(typeName: string, kind: ValueKind, registry: Registry): KindDef {\n const at = `Field type \"${typeName}\"`\n if (kind === 'none') throw new TypeError(`${at}: kind() can't return 'none'`)\n const def = lookup(registry.kinds, kind)\n if (!def) throw new TypeError(`${at}: kind \"${kind}\" is not registered`)\n return def\n}\n\n/** Throws for a default rule that doesn't fit, because that is a mistake in the type. */\nfunction checkDefaultRules(\n typeName: string,\n type: FieldTypeDef,\n kinds: FieldKinds,\n registry: Registry,\n): CheckedRule[] {\n const issues: DefinitionIssue[] = []\n const rules = (type.defaultRules ?? []).flatMap(\n (rule, j) => checkRule(rule, kinds, ['defaultRules', j], registry, issues) ?? [],\n )\n const [first] = issues\n if (first) {\n throw new TypeError(`Field type \"${typeName}\": ${formatPath(first.path)}: ${first.message}`)\n }\n return rules\n}\n\nfunction checkProps(\n field: JsonField,\n type: FieldTypeDef,\n path: DefinitionPath,\n issues: DefinitionIssue[],\n): Record<string, unknown> | undefined {\n const propKeys = Object.keys(type.props?.entries ?? {})\n const input: Record<string, unknown> = {}\n\n for (const key of Object.keys(field)) {\n if (isReservedFieldKey(key)) continue\n if (propKeys.includes(key)) {\n input[key] = field[key]\n } else {\n issues.push(\n issue('unknown_key', [...path, key], `Unknown key \"${key}\" on a \"${field.type}\" field`),\n )\n }\n }\n\n if (!type.props) return {}\n const parsed = v.safeParse(type.props, input)\n if (parsed.success) return parsed.output\n issues.push(...toIssues('invalid_props', path, parsed.issues))\n return undefined\n}\n\nexport function checkRule(\n raw: unknown,\n { kind, itemKind }: FieldKinds,\n path: DefinitionPath,\n registry: Registry,\n issues: DefinitionIssue[],\n): CheckedRule | undefined {\n const shape = v.safeParse(ruleShape, raw)\n if (!shape.success) {\n issues.push(...toIssues('invalid_shape', path, shape.issues))\n return undefined\n }\n\n const rule: JsonRule = shape.output\n const def = lookup(registry.rules, rule.rule)\n if (!def) {\n issues.push(issue('unknown_rule', [...path, 'rule'], `Unknown rule \"${rule.rule}\"`))\n return undefined\n }\n\n // A rule for the items of an array, but not for arrays, runs on each item.\n const each = !def.kinds.includes(kind) && !!itemKind && def.kinds.includes(itemKind)\n\n // Params can depend on the kind, so they can't be checked for a kind the rule doesn't support.\n if (!def.kinds.includes(kind) && !each) {\n const items = itemKind ? ` or their ${itemKind} items` : ''\n const message = `Rule \"${rule.rule}\" can't be used on ${kind} fields${items}`\n issues.push(issue('kind_mismatch', [...path, 'rule'], message))\n return undefined\n }\n\n const issueCount = issues.length\n const params = paramsFor(def, each ? (itemKind as ValueKind) : kind)\n const paramKeys = Object.keys(params?.entries ?? {})\n const input: Record<string, unknown> = {}\n for (const key of Object.keys(rule)) {\n if (isReservedRuleKey(key)) continue\n if (paramKeys.includes(key)) {\n input[key] = rule[key]\n } else {\n issues.push(\n issue('unknown_param', [...path, key], `Rule \"${rule.rule}\" has no param \"${key}\"`),\n )\n }\n }\n\n const parsed = v.safeParse(params ?? noParams, input)\n if (!parsed.success) issues.push(...toIssues('invalid_params', path, parsed.issues))\n if (!parsed.success || issues.length > issueCount) return undefined\n\n return { name: rule.rule, def, params: parsed.output, message: rule.message, each }\n}\n\nexport function checkRegistry(registry: Registry): void {\n for (const [name, rule] of Object.entries(registry.rules)) {\n // Params can depend on the kind, so check them for every kind the rule supports.\n for (const kind of rule.kinds) {\n for (const key of Object.keys(paramsFor(rule, kind)?.entries ?? {})) {\n if (isReservedRuleKey(key)) {\n throw new TypeError(`Rule \"${name}\": params can't use the reserved key \"${key}\"`)\n }\n }\n }\n }\n\n for (const [name, type] of Object.entries(registry.fieldTypes)) {\n const at = `Field type \"${name}\"`\n for (const kind of [type.kind, type.itemKind]) {\n if (typeof kind === 'string' && !lookup(registry.kinds, kind)) {\n throw new TypeError(`${at}: kind \"${kind}\" is not registered`)\n }\n }\n if (type.kind !== 'none' && !type.schema) {\n throw new TypeError(`${at}: schema() is required unless the kind is 'none'`)\n }\n for (const key of Object.keys(type.props?.entries ?? {})) {\n if (isReservedFieldKey(key)) {\n throw new TypeError(`${at}: props can't use the reserved key \"${key}\"`)\n }\n }\n\n // A kind from a function is only known per field, so checkField checks those default rules.\n if (typeof type.kind === 'string' && typeof type.itemKind !== 'function') {\n const kinds: FieldKinds = {\n kind: type.kind,\n itemKind: type.kind === 'array' ? type.itemKind : undefined,\n }\n checkDefaultRules(name, type, kinds, registry)\n }\n }\n}\n\nfunction issue(code: DefinitionIssueCode, path: DefinitionPath, message: string): DefinitionIssue {\n return { code, path, message }\n}\n\nfunction toIssues(\n code: DefinitionIssueCode,\n path: DefinitionPath,\n valibotIssues: readonly v.BaseIssue<unknown>[],\n): DefinitionIssue[] {\n return valibotIssues.map((valibotIssue) => {\n const keys = valibotIssue.path?.map((item) => item.key as string | number) ?? []\n return issue(code, [...path, ...keys], valibotIssue.message)\n })\n}\n","import * as v from 'valibot'\nimport type { KindDef } from '../kinds/kind-def'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport { buildFieldSchema, type MessageContext, type Messages } from './build-field-schema'\nimport { mergeRegistry } from './registry'\nimport { checkDefinition, checkRegistry } from './validate-definition'\nimport { DefinitionError, type ValidateResult } from '../errors/definition-error'\nimport type { JsonForm } from '../definition/json-form-schema'\nimport type { ValueKind } from '../shared/value-kind'\n\nexport interface SchemaBuilderOptions {\n kinds?: Record<string, KindDef>\n fieldTypes?: Record<string, FieldTypeDef>\n rules?: Record<string, RuleDef>\n includeDefaultRules?: boolean\n messages?: { required?: string }\n /**\n * Called with every message from the definition and with `messages.required`, e.g. to treat\n * them as i18n keys. Return undefined to use the text as written.\n */\n resolveMessage?(key: string, ctx: MessageContext): string | undefined\n}\n\nexport function createSchemaBuilder(options: SchemaBuilderOptions = {}) {\n const registry = mergeRegistry(options)\n checkRegistry(registry)\n\n const messages: Messages = {\n required: options.messages?.required ?? 'Required',\n resolve: (text, ctx) => options.resolveMessage?.(text, ctx) ?? text,\n }\n\n /** Every issue in the definition, in document order. Never throws on bad input. */\n function validate(json: unknown): ValidateResult {\n const { issues } = checkDefinition(json, registry)\n return issues.length ? { success: false, issues } : { success: true, issues: [] }\n }\n\n function build(json: JsonForm) {\n const { issues, fields } = checkDefinition(json, registry)\n if (issues.length) throw new DefinitionError(issues)\n\n const entries: v.ObjectEntries = {}\n for (const field of fields) {\n entries[field.name] = buildFieldSchema(field, messages)\n }\n return v.object(entries)\n }\n\n /**\n * The registered rules that can be used on a field of `kind`, e.g. for a rule picker.\n */\n function rulesForKind(kind: ValueKind): [name: string, def: RuleDef][] {\n return Object.entries(registry.rules).filter(([, def]) => def.kinds.includes(kind))\n }\n\n return {\n build,\n validate,\n rulesForKind,\n kinds: registry.kinds,\n fieldTypes: registry.fieldTypes,\n rules: registry.rules,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["meta","meta","kinds","meta","kinds","meta","meta","kinds","meta"],"sources":["../src/shared/each-item.ts","../src/builder/build-field-schema.ts","../src/field-types/basic-types.ts","../src/field-types/define-field-type.ts","../src/field-types/choice-types.ts","../src/field-types/date-types.ts","../src/field-types/display-types.ts","../src/field-types/file-type.ts","../src/field-types/default-field-types.ts","../src/kinds/default-kinds.ts","../src/rules/define-rule.ts","../src/rules/param-schemas.ts","../src/rules/comparison-rules.ts","../src/rules/content-rules.ts","../src/rules/date-rules.ts","../src/rules/file-rules.ts","../src/rules/format-rules.ts","../src/rules/length-rules.ts","../src/rules/normalize-rules.ts","../src/rules/number-rules.ts","../src/rules/text-unit-rules.ts","../src/rules/default-rules.ts","../src/builder/registry.ts","../src/errors/definition-error.ts","../src/rules/rule-params.ts","../src/shared/reserved-keys.ts","../src/builder/validate-definition.ts","../src/builder/create-schema-builder.ts"],"sourcesContent":["import * as v from 'valibot'\nimport type { AnyAction, AnySchema } from './valibot-types'\n\n/**\n * Checks every item of an array with `schema` and reports the issues on the array itself.\n * Formisch keeps no field for each item of an array value, so an issue with an item's index in\n * its path would show nowhere.\n */\nexport function eachItem(schema: AnySchema): AnyAction {\n return v.rawCheck(({ dataset, config, addIssue }) => {\n if (!dataset.typed || !Array.isArray(dataset.value)) return\n for (const item of dataset.value as unknown[]) {\n const result = v.safeParse(schema, item, config as v.Config<v.BaseIssue<unknown>>)\n for (const issue of result.issues ?? []) {\n addIssue({\n message: issue.message,\n input: item,\n expected: issue.expected ?? undefined,\n received: issue.received,\n })\n }\n }\n })\n}\n","import * as v from 'valibot'\nimport type { JsonField } from '../definition/json-form-schema'\nimport type { DefinitionPath } from '../errors/definition-error'\nimport type { RuleStage } from '../rules/rule-def'\nimport type { CheckedField } from './validate-definition'\nimport { eachItem } from '../shared/each-item'\nimport type { AnyAction, AnySchema } from '../shared/valibot-types'\n\nexport interface MessageContext {\n field: JsonField\n rule?: string\n path: DefinitionPath\n}\n\nexport interface Messages {\n required: string\n resolve(text: string, ctx: MessageContext): string\n}\n\n/**\n * The schema runs in this order: empty check, base schema, normalize rules, required check,\n * then the type's default rules and the field's rules, and last the type's `finalize()`.\n */\nexport function buildFieldSchema(checked: CheckedField, messages: Messages): AnySchema {\n const { field, path, type, kind } = checked\n const required = !!field.required\n const requiredMessage = messages.resolve(\n (typeof field.required === 'object' && field.required.message) || messages.required,\n { field, path },\n )\n\n // Rules for a whole value, and rules that run on each item of an array value.\n const whole: Record<RuleStage, PipeItem[]> = { normalize: [], validate: [] }\n const each: Record<RuleStage, AnyAction[]> = { normalize: [], validate: [] }\n\n for (const rule of checked.rules) {\n const message =\n rule.message === undefined\n ? undefined\n : messages.resolve(rule.message, { field, rule: rule.name, path })\n const action = rule.def.create(rule.params, message)\n const stage = rule.def.stage ?? 'validate'\n if (rule.each) {\n each[stage].push(action)\n } else {\n whole[stage].push(action)\n }\n }\n\n // Item rules run before the rules for the whole array.\n if (each.normalize.length) {\n whole.normalize.unshift(v.array(pipe(v.unknown(), each.normalize)))\n }\n if (each.validate.length) {\n whole.validate.unshift(eachItem(pipe(v.unknown(), each.validate)))\n }\n\n const finalize = type.finalize?.(field)\n if (finalize) whole.validate.push(finalize)\n\n const base = (type.schema as NonNullable<typeof type.schema>)(field, { path })\n // The type can replace the kind's required check, e.g. a yes/no radio accepts false.\n const requiredCheck = !required\n ? undefined\n : type.required\n ? type.required(requiredMessage)\n : kind.required?.(requiredMessage)\n const head = pipe(base, requiredCheck ? [...whole.normalize, requiredCheck] : whole.normalize)\n\n const empty = required\n ? v.never(requiredMessage)\n : v.pipe(\n v.unknown(),\n v.transform(() => undefined),\n )\n\n const whenFilled = (schema: AnySchema): AnySchema =>\n v.lazy((input) => (kind.isEmpty(input) ? empty : schema))\n\n const schema = whenFilled(v.pipe(head, whenFilled(pipe(v.unknown(), whole.validate))))\n\n return required ? schema : v.optional(schema)\n}\n\n/** An action, or a schema that runs on the value so far, e.g. on each item of an array. */\ntype PipeItem = AnyAction | AnySchema\n\nconst pipe = (schema: AnySchema, items: readonly PipeItem[]): AnySchema =>\n items.reduce<AnySchema>((acc, item) => v.pipe(acc, item), schema)\n","import * as v from 'valibot'\nimport type { FieldTypeDef } from './field-type-def'\n\n/** Types with one plain value and no props. Each maps to a native input. */\nexport const basicTypes = {\n text: { kind: 'string', schema: () => v.string() },\n textarea: { kind: 'string', schema: () => v.string() },\n email: { kind: 'string', schema: () => v.string(), defaultRules: [{ rule: 'email' }] },\n password: { kind: 'string', schema: () => v.string() },\n url: { kind: 'string', schema: () => v.string(), defaultRules: [{ rule: 'url' }] },\n // Phone formats differ per country, so there is no default rule. Add a regex rule for yours.\n tel: { kind: 'string', schema: () => v.string() },\n number: { kind: 'number', schema: () => v.number() },\n // Required means \"must be ticked\", e.g. accepting terms.\n checkbox: { kind: 'boolean', schema: () => v.boolean() },\n} satisfies Record<string, FieldTypeDef>\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { FieldTypeDef } from './field-type-def'\n\nexport const defineFieldType = <T extends AnyObjectSchema>(def: FieldTypeDef<T>): FieldTypeDef<T> =>\n def\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\ntype OptionValue = string | number | boolean\ntype Option = { value: OptionValue; label: string }\n\nconst options = <TValue extends v.GenericSchema<OptionValue>>(value: TValue) =>\n v.pipe(\n v.array(v.object({ value, label: v.string() })),\n v.minLength(1, 'Give at least one option'),\n v.check(\n (items) => new Set(items.map((item) => typeof item.value)).size <= 1,\n 'Give every option a value of the same type',\n ),\n v.check(\n (items) => new Set(items.map((item) => item.value)).size === items.length,\n 'Give every option a different value',\n ),\n )\n\nconst stringOrNumber = v.union([v.string(), v.number()])\nconst anyValue = v.union([v.string(), v.number(), v.boolean()])\n\n/** The options' value type. Every option has the same one. */\nconst kindOf = (items: readonly Option[]): ValueKind => {\n const [first] = items\n return first ? typeof first.value : 'string'\n}\n\n/** One of the option values. `v.picklist` can't hold booleans, so this is a union of literals. */\nconst oneOf = (items: readonly Option[]) => v.union(items.map((item) => v.literal(item.value)))\n\nexport const choiceTypes = {\n select: defineFieldType({\n kind: (field) => (field.options ? kindOf(field.options) : (field.valueType ?? 'string')),\n props: v.object({\n options: v.optional(options(stringOrNumber)),\n /** The value's type while `options` is missing, e.g. until they load from an API. */\n valueType: v.optional(v.picklist(['string', 'number'])),\n }),\n schema: (field) => {\n if (field.options) return oneOf(field.options)\n return field.valueType === 'number' ? v.number() : v.string()\n },\n }),\n radio: defineFieldType({\n kind: (field) => kindOf(field.options),\n props: v.object({ options: options(anyValue) }),\n schema: (field) => oneOf(field.options),\n // Any option counts as an answer, so a required yes/no radio accepts \"no\". The empty check\n // already rejects a radio with nothing picked.\n required: () => null,\n }),\n // A checkbox group is a multiselect with `ui: { widget: 'checkboxes' }`.\n multiselect: defineFieldType({\n kind: 'array',\n itemKind: (field) => kindOf(field.options),\n props: v.object({ options: options(stringOrNumber) }),\n schema: (field) => v.array(oneOf(field.options)),\n }),\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\nconst outputProps = v.object({\n /** `'date'` turns the ISO string into a `Date`. Defaults to `'string'`. */\n output: v.optional(v.picklist(['string', 'date'])),\n})\n\n// Runs after every rule, so comparison rules like minValue still compare ISO strings.\nconst finalize = (field: v.InferOutput<typeof outputProps>) =>\n field.output === 'date' ? v.toDate() : undefined\n\n/**\n * Dates and times are ISO strings, the values of <input type=\"date|time|datetime-local\">.\n * The format is part of the type rather than a default rule, so these types don't depend on\n * `dateRules` being registered.\n */\nexport const dateTypes = {\n date: defineFieldType({\n kind: 'date',\n props: outputProps,\n schema: () => v.pipe(v.string(), v.isoDate()),\n finalize,\n }),\n time: { kind: 'date', schema: () => v.pipe(v.string(), v.isoTime()) },\n // A local date and time without a time zone, e.g. 2026-10-28T14:30.\n datetime: defineFieldType({\n kind: 'date',\n props: outputProps,\n schema: () => v.pipe(v.string(), v.isoDateTime()),\n finalize,\n }),\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\n/**\n * Elements without a value. They need no name and add no output key. Their `text` can be an\n * i18n key: renderers resolve it with the same function they pass as `resolveMessage`.\n */\nexport const displayTypes = {\n heading: defineFieldType({\n kind: 'none',\n props: v.object({\n text: v.string(),\n /** 1 to 6. Defaults to 2. */\n level: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(6))),\n }),\n }),\n // Plain text. Whether to render markdown is up to the renderer.\n paragraph: defineFieldType({ kind: 'none', props: v.object({ text: v.string() }) }),\n divider: { kind: 'none' },\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport { eachItem } from '../shared/each-item'\nimport { defineFieldType } from './define-field-type'\n\ntype MimeType = `${string}/${string}`\n\nconst mimeTypes = (accept: string) => accept.split(',').map((type) => type.trim()) as MimeType[]\n\nconst fileProps = v.object({\n multiple: v.optional(v.boolean()),\n // A File only carries its MIME type, so extensions (.pdf) and wildcards (image/*) can't be\n // checked against it.\n accept: v.optional(\n v.pipe(\n v.string(),\n v.check(\n (input) => mimeTypes(input).every((type) => /^[\\w.+-]+\\/[\\w.+-]+$/.test(type)),\n 'Use MIME types separated by commas, such as image/png,image/jpeg',\n ),\n ),\n ),\n})\n\n/**\n * A File, or an array of them with `multiple`. Rules for files, like `maxSize`, run on each one;\n * rules for arrays, like `maxLength`, limit the count.\n */\nexport const fileType = defineFieldType({\n kind: (field) => (field.multiple ? 'array' : 'file'),\n itemKind: 'file',\n props: fileProps,\n // The schema is created per field and v.file() only reads the File global while parsing, so\n // the package still loads where File doesn't exist.\n schema: (field) => {\n const file = field.accept ? v.pipe(v.file(), v.mimeType(mimeTypes(field.accept))) : v.file()\n if (!field.multiple) return file\n // Checking each file after the array keeps the issues on the field, not on its items.\n return field.accept ? v.pipe(v.array(v.file()), eachItem(file)) : v.array(file)\n },\n})\n","import { basicTypes } from './basic-types'\nimport { choiceTypes } from './choice-types'\nimport { dateTypes } from './date-types'\nimport { displayTypes } from './display-types'\nimport { fileType } from './file-type'\nimport type { FieldTypeDef } from './field-type-def'\n\n/** Every built-in field type. */\nexport const defaultFieldTypes = {\n ...basicTypes,\n ...dateTypes,\n ...choiceTypes,\n file: fileType,\n ...displayTypes,\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport type { KindDef } from './kind-def'\n\nconst isNil = (input: unknown) => input === undefined || input === null\n\nexport const defaultKinds = {\n string: {\n isEmpty: (input) => isNil(input) || input === '',\n required: (message) => v.nonEmpty(message),\n },\n // A cleared <input type=\"number\"/> holds '' or NaN, depending on the adapter.\n number: {\n isEmpty: (input) => isNil(input) || input === '' || Number.isNaN(input),\n },\n // Required means \"must be ticked\", e.g accepting terms.\n boolean: {\n isEmpty: isNil,\n required: (message) => v.value(true, message),\n },\n date: {\n isEmpty: (input) => isNil(input) || input === '',\n required: (message) => v.nonEmpty(message),\n },\n array: {\n isEmpty: (input) => isNil(input) || (Array.isArray(input) && input.length === 0),\n required: (message) => v.minLength(1, message),\n },\n file: { isEmpty: isNil },\n object: { isEmpty: isNil },\n // Display elements (headings, dividers) have no value, so the builder never calls this.\n none: { isEmpty: () => true },\n} satisfies Record<string, KindDef>\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { RuleDef } from './rule-def'\n\nexport const defineRule = <T extends AnyObjectSchema>(def: RuleDef<T>): RuleDef<T> => def\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\n\n/** A length, count or size: a whole number from 0. */\nexport const count = v.pipe(v.number(), v.integer(), v.minValue(0))\n\nexport const countParams = v.object({ value: count })\n\nconst isIsoValue = (input: string) =>\n v.ISO_DATE_REGEX.test(input) || v.ISO_DATE_TIME_REGEX.test(input) || v.ISO_TIME_REGEX.test(input)\n\n/** Valibot compares dates as ISO strings, so the param must be one too. */\nexport const isoValue = v.pipe(\n v.string(),\n v.check(isIsoValue, 'Use an ISO date, date-time or time, such as 2026-01-01'),\n)\n\nexport const valueSchema = (kind: ValueKind) => {\n switch (kind) {\n case 'date':\n return isoValue\n case 'string':\n return v.string()\n case 'boolean':\n return v.boolean()\n default:\n return v.number()\n }\n}\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineRule } from './define-rule'\nimport { valueSchema } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\ntype Value = string | number | boolean\n\nconst ordered = ['number', 'date'] as const\nconst any = ['number', 'date', 'string', 'boolean'] as const\nconst meta = (label: string) => ({ label, category: 'comparison' }) as const\n\n// The param has the field's type: a number on a number field, an ISO string on a date field.\nconst valueParams = (kind: ValueKind) => v.object({ value: valueSchema(kind) })\nconst valuesParams = (kind: ValueKind) =>\n v.object({\n values: v.pipe(v.array(valueSchema(kind)), v.minLength(1, 'Give at least one value')),\n })\n\n/** Compares the value with a param of the same type. */\nexport const comparisonRules = {\n minValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Minimum'),\n create: (p, m) => v.minValue(p.value as Value, m) as AnyAction,\n }),\n maxValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Maximum'),\n create: (p, m) => v.maxValue(p.value as Value, m) as AnyAction,\n }),\n gtValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Greater than'),\n create: (p, m) => v.gtValue(p.value as Value, m) as AnyAction,\n }),\n ltValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Less than'),\n create: (p, m) => v.ltValue(p.value as Value, m) as AnyAction,\n }),\n value: defineRule({\n kinds: any,\n params: valueParams,\n meta: meta('Equals'),\n create: (p, m) => v.value(p.value as Value, m) as AnyAction,\n }),\n notValue: defineRule({\n kinds: any,\n params: valueParams,\n meta: meta('Does not equal'),\n create: (p, m) => v.notValue(p.value as Value, m) as AnyAction,\n }),\n values: defineRule({\n kinds: ordered,\n params: valuesParams,\n meta: meta('One of'),\n create: (p, m) => v.values(p.values as Value[], m) as AnyAction,\n }),\n notValues: defineRule({\n kinds: ordered,\n params: valuesParams,\n meta: meta('None of'),\n create: (p, m) => v.notValues(p.values as Value[], m) as AnyAction,\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineRule } from './define-rule'\nimport type { AnyAction } from '../shared/valibot-types'\nimport type { RuleDef } from './rule-def'\n\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'content' }) as const\n\nconst regexError = (pattern: string, flags = '') => {\n try {\n new RegExp(pattern, flags)\n return undefined\n } catch (error) {\n return (error as Error).message\n }\n}\n\nconst FLAGS = /^[dgimsuvy]*$/\n\nconst regexParams = v.pipe(\n v.object({\n pattern: v.string(),\n flags: v.optional(v.pipe(v.string(), v.regex(FLAGS, 'Flags can be d, g, i, m, s, u, v and y'))),\n }),\n v.forward(\n v.check(\n (p) => !FLAGS.test(p.flags ?? '') || regexError(p.pattern, p.flags) === undefined,\n (issue) => regexError(issue.input.pattern, issue.input.flags) ?? 'Invalid pattern',\n ),\n ['pattern'],\n ),\n)\n\nconst item = v.union([v.string(), v.number(), v.boolean()])\nconst stringParams = v.object({ value: v.string() })\nconst contentParams = (kind: ValueKind) => v.object({ value: kind === 'array' ? item : v.string() })\n\nexport const contentRules = {\n regex: defineRule({\n kinds: ['string'],\n params: regexParams,\n meta: meta('Matches pattern', 'A JavaScript regular expression, without the slashes.'),\n create: (p, m) => v.regex(new RegExp(p.pattern, p.flags?.replace(/[gy]/g, '')), m),\n }),\n startsWith: defineRule({\n kinds: ['string'],\n params: stringParams,\n meta: meta('Starts with'),\n create: (p, m) => v.startsWith(p.value, m),\n }),\n endsWith: defineRule({\n kinds: ['string'],\n params: stringParams,\n meta: meta('Ends with'),\n create: (p, m) => v.endsWith(p.value, m),\n }),\n includes: defineRule({\n kinds: ['string', 'array'],\n params: contentParams,\n meta: meta('Contains'),\n create: (p, m) => v.includes(p.value, m) as AnyAction,\n }),\n excludes: defineRule({\n kinds: ['string', 'array'],\n params: contentParams,\n meta: meta('Does not contain'),\n create: (p, m) => v.excludes(p.value, m) as AnyAction,\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst iso = (label: string, description: string, create: (message?: string) => AnyAction) =>\n defineRule({\n kinds: ['string', 'date'],\n meta: { label, description, category: 'date' },\n create: (_, message) => create(message),\n })\n\nexport const dateRules = {\n isoDate: iso('ISO date', 'Like 2026-10-28', (m) => v.isoDate(m)),\n isoDateTime: iso('ISO date and time', 'Like 2026-10-28T14:30', (m) => v.isoDateTime(m)),\n isoTime: iso('ISO time', 'Like 14:30', (m) => v.isoTime(m)),\n isoTimeSecond: iso('ISO time with seconds', 'Like 14:30:15', (m) => v.isoTimeSecond(m)),\n isoTimestamp: iso('ISO timestamp', 'Like 2026-10-28T14:30:15.000z', (m) => v.isoTimestamp(m)),\n isoWeek: iso('ISO week', 'Like 2026-W44', (m) => v.isoWeek(m)),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport { countParams } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['file'] as const\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'file' }) as const\nconst bytes = 'In bytes, e.g. 1048576 for 1 MiB.'\n\ntype MimeType = `${string}/${string}`\n\n// A File only carries its MIME type, and Valibot compares it exactly, so image/* can't work.\nconst mimeTypeParams = v.object({\n types: v.pipe(\n v.array(\n v.pipe(v.string(), v.regex(/^[\\w.+-]+\\/[\\w.+-]+$/, 'Use a MIME type, such as image/png')),\n ),\n v.minLength(1, 'Give at least one MIME type'),\n ),\n})\n\n/** Size and type of a File or Blob. */\nexport const fileRules = {\n minSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum size', bytes),\n create: (p, m) => v.minSize(p.value, m),\n }),\n maxSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum size', bytes),\n create: (p, m) => v.maxSize(p.value, m),\n }),\n size: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact size', bytes),\n create: (p, m) => v.size(p.value, m),\n }),\n notSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this size', bytes),\n create: (p, m) => v.notSize(p.value, m),\n }),\n mimeType: defineRule({\n kinds,\n params: mimeTypeParams,\n meta: meta('File type'),\n create: (p, m) => v.mimeType(p.types as MimeType[], m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\n/** A string format without params. */\nconst format = (label: string, create: (message?: string) => AnyAction) =>\n defineRule({\n kinds: ['string'],\n meta: { label, category: 'format' },\n create: (_, message) => create(message),\n })\n\n/** Valibot's hash types. Valibot doesn't export the list, only the type. */\nconst HASH_TYPES = [\n 'md4',\n 'md5',\n 'sha1',\n 'sha256',\n 'sha384',\n 'sha512',\n 'ripemd128',\n 'ripemd160',\n 'tiger128',\n 'tiger160',\n 'tiger192',\n 'crc32',\n 'crc32b',\n 'adler32',\n] as const satisfies readonly v.HashType[]\n\nconst hashParams = v.object({\n types: v.pipe(v.array(v.picklist(HASH_TYPES)), v.minLength(1, 'Pick at least one hash type')),\n})\n\n/** Formats Valibot can check on a string. */\nexport const formatRules = {\n email: format('Email', (m) => v.email(m)),\n rfcEmail: format('Email (RFC 5322)', (m) => v.rfcEmail(m)),\n url: format('URL', (m) => v.url(m)),\n domain: format('Domain', (m) => v.domain(m)),\n slug: format('Slug', (m) => v.slug(m)),\n uuid: format('UUID', (m) => v.uuid(m)),\n ulid: format('ULID', (m) => v.ulid(m)),\n cuid2: format('CUID2', (m) => v.cuid2(m)),\n nanoid: format('Nano ID', (m) => v.nanoid(m)),\n ip: format('IP address', (m) => v.ip(m)),\n ipv4: format('IPv4 address', (m) => v.ipv4(m)),\n ipv6: format('IPv6 address', (m) => v.ipv6(m)),\n mac: format('MAC address', (m) => v.mac(m)),\n mac48: format('MAC-48 address', (m) => v.mac48(m)),\n mac64: format('MAC-64 address', (m) => v.mac64(m)),\n hexColor: format('Hex colour', (m) => v.hexColor(m)),\n hexadecimal: format('Hexadecimal', (m) => v.hexadecimal(m)),\n octal: format('Octal', (m) => v.octal(m)),\n decimal: format('Decimal number', (m) => v.decimal(m)),\n digits: format('Digits only', (m) => v.digits(m)),\n base64: format('Base64', (m) => v.base64(m)),\n bic: format('BIC (SWIFT code)', (m) => v.bic(m)),\n creditCard: format('Credit card number', (m) => v.creditCard(m)),\n imei: format('IMEI', (m) => v.imei(m)),\n isbn: format('ISBN', (m) => v.isbn(m)),\n isrc: format('ISRC', (m) => v.isrc(m)),\n emoji: format('Emoji', (m) => v.emoji(m)),\n hash: defineRule({\n kinds: ['string'],\n params: hashParams,\n meta: { label: 'Hash', category: 'format' },\n create: (p, m) => v.hash(p.types as [v.HashType, ...v.HashType[]], m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport { countParams } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['string', 'array'] as const\nconst meta = (label: string) => ({ label, category: 'length' }) as const\n\n/** Characters of a string, or items of an array */\nexport const lengthRules = {\n length: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact length'),\n create: (p, m) => v.length(p.value, m),\n }),\n minLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum length'),\n create: (p, m) => v.minLength(p.value, m),\n }),\n maxLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum length'),\n create: (p, m) => v.maxLength(p.value, m),\n }),\n notLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this length'),\n create: (p, m) => v.notLength(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst stage = 'normalize'\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'normalize' }) as const\nconst limit = v.object({ value: v.number() })\n\n/**\n * Rules that change the value instead of checking it. They run before the required check, so\n * `' '` with `trim` is empty. Their `message` is never shown.\n */\nexport const normalizeRules = {\n trim: defineRule({ kinds: ['string'], stage, meta: meta('Trim'), create: () => v.trim() }),\n trimStart: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Trim start'),\n create: () => v.trimStart(),\n }),\n trimEnd: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Trim end'),\n create: () => v.trimEnd(),\n }),\n toLowerCase: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Lowercase'),\n create: () => v.toLowerCase(),\n }),\n toUpperCase: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Uppercase'),\n create: () => v.toUpperCase(),\n }),\n normalize: defineRule({\n kinds: ['string'],\n stage,\n params: v.object({ form: v.optional(v.picklist(['NFC', 'NFD', 'NFKC', 'NFKD'])) }),\n meta: meta('Unicode normalize', 'Defaults to NFC.'),\n create: (p) => v.normalize(p.form),\n }),\n toMinValue: defineRule({\n kinds: ['number'],\n stage,\n params: limit,\n meta: meta('Raise to minimum', 'Replaces a smaller number with the minimum.'),\n create: (p) => v.toMinValue(p.value),\n }),\n toMaxValue: defineRule({\n kinds: ['number'],\n stage,\n params: limit,\n meta: meta('Lower to maximum', 'Replaces a larger number with the maximum.'),\n create: (p) => v.toMaxValue(p.value),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['number'] as const\nconst meta = (label: string) => ({ label, category: 'number' }) as const\n\nconst divisor = v.pipe(v.number(), v.finite(), v.notValue(0, \"Can't be 0\"))\n\n/** Checks only numbers have. */\nexport const numberRules = {\n integer: defineRule({ kinds, meta: meta('Whole number'), create: (_, m) => v.integer(m) }),\n safeInteger: defineRule({\n kinds,\n meta: meta('Safe whole number'),\n create: (_, m) => v.safeInteger(m),\n }),\n finite: defineRule({ kinds, meta: meta('Finite number'), create: (_, m) => v.finite(m) }),\n multipleOf: defineRule({\n kinds,\n params: v.object({ value: divisor }),\n meta: meta('Multiple of'),\n create: (p, m) => v.multipleOf(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { count, countParams } from './param-schemas'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['string'] as const\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'text' }) as const\n\nconst isLocale = (input: string) => {\n try {\n return Intl.getCanonicalLocales(input).length === 1\n } catch {\n return false\n }\n}\n\nconst wordsParams = v.object({\n locale: v.optional(\n v.pipe(v.string(), v.check(isLocale, 'Use a language tag, such as en or sr-Latn')),\n ),\n value: count,\n})\n\nconst graphemesInfo = 'Counts characters as people see them, so an emoji is one.'\nconst bytesInfo = 'Counts UTF-8 bytes, e.g. to fit a database column,'\n\nexport const textUnitRules = {\n graphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact characters', graphemesInfo),\n create: (p, m) => v.graphemes(p.value, m),\n }),\n minGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum characters', graphemesInfo),\n create: (p, m) => v.minGraphemes(p.value, m),\n }),\n maxGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum characters', graphemesInfo),\n create: (p, m) => v.maxGraphemes(p.value, m),\n }),\n notGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this many characters', graphemesInfo),\n create: (p, m) => v.notGraphemes(p.value, m),\n }),\n words: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Exact words'),\n create: (p, m) => v.words(p.locale, p.value, m),\n }),\n minWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Minimum words'),\n create: (p, m) => v.minWords(p.locale, p.value, m),\n }),\n maxWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Maximum words'),\n create: (p, m) => v.maxWords(p.locale, p.value, m),\n }),\n notWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Not this many words'),\n create: (p, m) => v.notWords(p.locale, p.value, m),\n }),\n bytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact bytes', bytesInfo),\n create: (p, m) => v.bytes(p.value, m),\n }),\n minBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum bytes', bytesInfo),\n create: (p, m) => v.minBytes(p.value, m),\n }),\n maxBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum bytes', bytesInfo),\n create: (p, m) => v.maxBytes(p.value, m),\n }),\n notBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this many bytes', bytesInfo),\n create: (p, m) => v.notBytes(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import { comparisonRules } from './comparison-rules'\nimport { contentRules } from './content-rules'\nimport { dateRules } from './date-rules'\nimport { fileRules } from './file-rules'\nimport { formatRules } from './format-rules'\nimport { lengthRules } from './length-rules'\nimport { normalizeRules } from './normalize-rules'\nimport { numberRules } from './number-rules'\nimport { textUnitRules } from './text-unit-rules'\n\n/** Every built-in rule. Register single families with `includeDefaultRules: false`. */\nexport const defaultRules = {\n ...lengthRules,\n ...textUnitRules,\n ...contentRules,\n ...formatRules,\n ...dateRules,\n ...comparisonRules,\n ...numberRules,\n ...fileRules,\n ...normalizeRules,\n}\n","import { defaultFieldTypes } from '../field-types/default-field-types'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport { defaultKinds } from '../kinds/default-kinds'\nimport type { KindDef } from '../kinds/kind-def'\nimport { defaultRules } from '../rules/default-rules'\nimport type { RuleDef } from '../rules/rule-def'\n\nexport interface Registry {\n readonly kinds: Readonly<Record<string, KindDef>>\n readonly fieldTypes: Readonly<Record<string, FieldTypeDef>>\n readonly rules: Readonly<Record<string, RuleDef>>\n}\n\nexport interface RegistryOptions extends Partial<Registry> {\n /** With false, only the consumer's own rules are registered. Defaults to true. */\n includeDefaultRules?: boolean\n}\n\n/** Consumer entries replace defaults with the same key. */\nexport function mergeRegistry(custom: RegistryOptions): Registry {\n const rules = custom.includeDefaultRules === false ? {} : defaultRules\n return {\n kinds: Object.freeze({ ...defaultKinds, ...custom.kinds }),\n fieldTypes: Object.freeze({ ...defaultFieldTypes, ...custom.fieldTypes }),\n rules: Object.freeze({ ...rules, ...custom.rules }),\n }\n}\n\nexport function lookup<T>(record: Readonly<Record<string, T>>, key: string): T | undefined {\n return Object.hasOwn(record, key) ? record[key] : undefined\n}\n","/** Where something is in a definition, e.g. `['fields', 0, 'rules', 1]`. */\nexport type DefinitionPath = readonly (string | number)[]\n\n/** Public API: adding a code is a minor change, renaming one is breaking. */\nexport type DefinitionIssueCode =\n | 'invalid_shape'\n | 'unsupported_version'\n | 'unknown_key'\n | 'unknown_type'\n | 'missing_name'\n | 'duplicate_name'\n | 'invalid_props'\n | 'unknown_rule'\n | 'unknown_param'\n | 'invalid_params'\n | 'kind_mismatch'\n\nexport interface DefinitionIssue {\n code: DefinitionIssueCode\n path: DefinitionPath\n message: string\n}\n\nexport type ValidateResult =\n | { success: true; issues: [] }\n | { success: false; issues: DefinitionIssue[] }\n\nexport function formatPath(path: DefinitionPath): string {\n return path.reduce<string>((out, key) => {\n if (typeof key === 'number') return `${out}[${key}]`\n return out ? `${out}.${key}` : key\n }, '')\n}\n\n/** Thrown by `build()` when the definition has issues. Lists all of them. */\nexport class DefinitionError extends Error {\n readonly issues: readonly DefinitionIssue[]\n\n constructor(issues: readonly DefinitionIssue[]) {\n const lines = issues.map(\n (issue) => ` ${formatPath(issue.path) || '(root)'}: ${issue.message}`,\n )\n super(`Invalid form definition:\\n${lines.join('\\n')}`)\n this.name = 'DefinitionError'\n this.issues = issues\n }\n}\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { ValueKind } from '../shared/value-kind'\nimport type { RuleDef } from './rule-def'\n\nconst cache = new WeakMap<RuleDef, Map<ValueKind, AnyObjectSchema>>()\n\nexport function paramsFor(def: RuleDef, kind: ValueKind): AnyObjectSchema | undefined {\n if (typeof def.params !== 'function') return def.params\n\n let byKind = cache.get(def)\n\n if (!byKind) {\n byKind = new Map()\n cache.set(def, byKind)\n }\n\n let params = byKind.get(kind)\n if (!params) {\n params = def.params(kind)\n byKind.set(kind, params)\n }\n\n return params\n}\n","/**\n * Field keys this package owns. A field type's props can't use them.\n */\nexport const RESERVED_FIELD_KEYS = [\n 'name',\n 'type',\n 'label',\n 'description',\n 'placeholder',\n 'default',\n 'required',\n 'rules',\n 'ui',\n] as const\n\n/**\n * Rule keys this package owns. A rule's params can't use them.\n */\nexport const RESERVED_RULE_KEYS = ['rule', 'message'] as const\n\nconst fieldKeys: ReadonlySet<string> = new Set(RESERVED_FIELD_KEYS)\nconst ruleKeys: ReadonlySet<string> = new Set(RESERVED_RULE_KEYS)\n\nexport const isReservedFieldKey = (key: string): boolean => fieldKeys.has(key)\nexport const isReservedRuleKey = (key: string): boolean => ruleKeys.has(key)\n","import * as v from 'valibot'\nimport type { JsonField, JsonRule } from '../definition/json-form-schema'\nimport {\n type DefinitionPath,\n type DefinitionIssue,\n type DefinitionIssueCode,\n formatPath,\n} from '../errors/definition-error'\nimport type { FieldTypeDef, KindOf } from '../field-types/field-type-def'\nimport type { KindDef } from '../kinds/kind-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport { paramsFor } from '../rules/rule-params'\nimport { lookup, type Registry } from './registry'\nimport { isReservedFieldKey, isReservedRuleKey } from '../shared/reserved-keys'\nimport type { ValueKind } from '../shared/value-kind'\n\nexport interface CheckedField {\n name: string\n field: JsonField\n path: DefinitionPath\n type: FieldTypeDef\n kind: KindDef\n rules: CheckedRule[]\n}\n\nexport interface CheckedRule {\n name: string\n def: RuleDef\n params: Record<string, unknown>\n message?: string\n /** True when the rule runs on each item of an array value, not on the array. */\n each: boolean\n}\n\n/** The kind of a field's value, and of its items when the value is an array. */\nexport interface FieldKinds {\n kind: ValueKind\n itemKind?: ValueKind\n}\n\ninterface CheckResult {\n issues: DefinitionIssue[]\n fields: CheckedField[]\n}\n\nconst formShape = v.object({ version: v.string(), fields: v.array(v.unknown()) })\nconst fieldShape = v.looseObject({\n name: v.optional(v.string()),\n type: v.string(),\n label: v.optional(v.string()),\n description: v.optional(v.string()),\n placeholder: v.optional(v.string()),\n default: v.optional(v.unknown()),\n required: v.optional(v.union([v.boolean(), v.strictObject({ message: v.optional(v.string()) })])),\n rules: v.optional(v.array(v.unknown())),\n ui: v.optional(v.record(v.string(), v.unknown())),\n})\nconst ruleShape = v.looseObject({ rule: v.string(), message: v.optional(v.string()) })\nconst noParams = v.object({})\n\n/**\n * Checks a whole definition and collects every issue, in document order. Never throws.\n */\nexport function checkDefinition(json: unknown, registry: Registry): CheckResult {\n const issues: DefinitionIssue[] = []\n const fields: CheckedField[] = []\n\n const form = v.safeParse(formShape, json)\n if (!form.success) return { issues: toIssues('invalid_shape', [], form.issues), fields }\n\n if (form.output.version !== '1') {\n const message = `Unsupported version \"${form.output.version}\". This package reads version '1'.`\n return { issues: [{ code: 'unsupported_version', path: ['version'], message }], fields }\n }\n\n const names = new Set<string>()\n form.output.fields.forEach((raw, i) => {\n const field = checkField(raw, ['fields', i], registry, names, issues)\n if (field) fields.push(field)\n })\n\n return { issues, fields }\n}\n\nfunction checkField(\n raw: unknown,\n path: DefinitionPath,\n registry: Registry,\n names: Set<string>,\n issues: DefinitionIssue[],\n): CheckedField | undefined {\n const shape = v.safeParse(fieldShape, raw)\n if (!shape.success) {\n issues.push(...toIssues('invalid_shape', path, shape.issues))\n return undefined\n }\n\n const field = shape.output as JsonField\n const issueCount = issues.length\n const type = lookup(registry.fieldTypes, field.type)\n // Only a fixed kind can be 'none'. A kind() function that returns it throws in kindDef.\n const hasValue = type?.kind !== 'none'\n\n if (!field.name) {\n if (type && hasValue) {\n issues.push(issue('missing_name', [...path, 'name'], 'A field needs a name'))\n }\n } else if (hasValue) {\n if (names.has(field.name)) {\n issues.push(issue('duplicate_name', [...path, 'name'], `Duplicate name \"${field.name}\"`))\n }\n names.add(field.name)\n }\n\n if (!type) {\n issues.push(issue('unknown_type', [...path, 'type'], `Unknown field type \"${field.type}\"`))\n return undefined\n }\n\n const props = checkProps(field, type, path, issues)\n\n if (!hasValue) {\n for (const key of ['required', 'rules'] as const) {\n if (field[key] !== undefined) {\n const message = `A \"${field.type}\" field has no value, so it can't have \"${key}\"`\n issues.push(issue('invalid_shape', [...path, key], message))\n }\n }\n return undefined\n }\n\n // A kind that comes from a function needs the parsed props. Without them, the rules can't be\n // checked either; the props issues are reported already.\n const withProps = props && { ...field, ...props }\n const kind = resolveKind(type.kind, withProps)\n if (kind === undefined) return undefined\n const kinds: FieldKinds = {\n kind,\n itemKind: kind === 'array' ? resolveKind(type.itemKind, withProps) : undefined,\n }\n\n const fieldRules = (shape.output.rules ?? []).flatMap(\n (rule, j) => checkRule(rule, kinds, [...path, 'rules', j], registry, issues) ?? [],\n )\n if (issues.length > issueCount || !field.name || !withProps) return undefined\n\n const overridden = new Set(fieldRules.map((rule) => rule.name))\n const defaultRules = checkDefaultRules(field.type, type, kinds, registry).filter(\n (rule) => !overridden.has(rule.name),\n )\n\n return {\n name: field.name,\n field: withProps,\n path,\n type,\n kind: kindDef(field.type, kind, registry),\n rules: [...defaultRules, ...fieldRules],\n }\n}\n\nfunction resolveKind(\n kind: ValueKind | KindOf | undefined,\n field: JsonField | undefined,\n): ValueKind | undefined {\n if (typeof kind !== 'function') return kind\n return field && kind(field)\n}\n\n/** A kind that doesn't fit is a mistake in the field type, not in the definition. */\nfunction kindDef(typeName: string, kind: ValueKind, registry: Registry): KindDef {\n const at = `Field type \"${typeName}\"`\n if (kind === 'none') throw new TypeError(`${at}: kind() can't return 'none'`)\n const def = lookup(registry.kinds, kind)\n if (!def) throw new TypeError(`${at}: kind \"${kind}\" is not registered`)\n return def\n}\n\n/** Throws for a default rule that doesn't fit, because that is a mistake in the type. */\nfunction checkDefaultRules(\n typeName: string,\n type: FieldTypeDef,\n kinds: FieldKinds,\n registry: Registry,\n): CheckedRule[] {\n const issues: DefinitionIssue[] = []\n const rules = (type.defaultRules ?? []).flatMap(\n (rule, j) => checkRule(rule, kinds, ['defaultRules', j], registry, issues) ?? [],\n )\n const [first] = issues\n if (first) {\n throw new TypeError(`Field type \"${typeName}\": ${formatPath(first.path)}: ${first.message}`)\n }\n return rules\n}\n\nfunction checkProps(\n field: JsonField,\n type: FieldTypeDef,\n path: DefinitionPath,\n issues: DefinitionIssue[],\n): Record<string, unknown> | undefined {\n const propKeys = Object.keys(type.props?.entries ?? {})\n const input: Record<string, unknown> = {}\n\n for (const key of Object.keys(field)) {\n if (isReservedFieldKey(key)) continue\n if (propKeys.includes(key)) {\n input[key] = field[key]\n } else {\n issues.push(\n issue('unknown_key', [...path, key], `Unknown key \"${key}\" on a \"${field.type}\" field`),\n )\n }\n }\n\n if (!type.props) return {}\n const parsed = v.safeParse(type.props, input)\n if (parsed.success) return parsed.output\n issues.push(...toIssues('invalid_props', path, parsed.issues))\n return undefined\n}\n\nexport function checkRule(\n raw: unknown,\n { kind, itemKind }: FieldKinds,\n path: DefinitionPath,\n registry: Registry,\n issues: DefinitionIssue[],\n): CheckedRule | undefined {\n const shape = v.safeParse(ruleShape, raw)\n if (!shape.success) {\n issues.push(...toIssues('invalid_shape', path, shape.issues))\n return undefined\n }\n\n const rule: JsonRule = shape.output\n const def = lookup(registry.rules, rule.rule)\n if (!def) {\n issues.push(issue('unknown_rule', [...path, 'rule'], `Unknown rule \"${rule.rule}\"`))\n return undefined\n }\n\n // A rule for the items of an array, but not for arrays, runs on each item.\n const each = !def.kinds.includes(kind) && !!itemKind && def.kinds.includes(itemKind)\n\n // Params can depend on the kind, so they can't be checked for a kind the rule doesn't support.\n if (!def.kinds.includes(kind) && !each) {\n const items = itemKind ? ` or their ${itemKind} items` : ''\n const message = `Rule \"${rule.rule}\" can't be used on ${kind} fields${items}`\n issues.push(issue('kind_mismatch', [...path, 'rule'], message))\n return undefined\n }\n\n const issueCount = issues.length\n const params = paramsFor(def, each ? (itemKind as ValueKind) : kind)\n const paramKeys = Object.keys(params?.entries ?? {})\n const input: Record<string, unknown> = {}\n for (const key of Object.keys(rule)) {\n if (isReservedRuleKey(key)) continue\n if (paramKeys.includes(key)) {\n input[key] = rule[key]\n } else {\n issues.push(\n issue('unknown_param', [...path, key], `Rule \"${rule.rule}\" has no param \"${key}\"`),\n )\n }\n }\n\n const parsed = v.safeParse(params ?? noParams, input)\n if (!parsed.success) issues.push(...toIssues('invalid_params', path, parsed.issues))\n if (!parsed.success || issues.length > issueCount) return undefined\n\n return { name: rule.rule, def, params: parsed.output, message: rule.message, each }\n}\n\nexport function checkRegistry(registry: Registry): void {\n for (const [name, rule] of Object.entries(registry.rules)) {\n // Params can depend on the kind, so check them for every kind the rule supports.\n for (const kind of rule.kinds) {\n for (const key of Object.keys(paramsFor(rule, kind)?.entries ?? {})) {\n if (isReservedRuleKey(key)) {\n throw new TypeError(`Rule \"${name}\": params can't use the reserved key \"${key}\"`)\n }\n }\n }\n }\n\n for (const [name, type] of Object.entries(registry.fieldTypes)) {\n const at = `Field type \"${name}\"`\n for (const kind of [type.kind, type.itemKind]) {\n if (typeof kind === 'string' && !lookup(registry.kinds, kind)) {\n throw new TypeError(`${at}: kind \"${kind}\" is not registered`)\n }\n }\n if (type.kind !== 'none' && !type.schema) {\n throw new TypeError(`${at}: schema() is required unless the kind is 'none'`)\n }\n for (const key of Object.keys(type.props?.entries ?? {})) {\n if (isReservedFieldKey(key)) {\n throw new TypeError(`${at}: props can't use the reserved key \"${key}\"`)\n }\n }\n\n // A kind from a function is only known per field, so checkField checks those default rules.\n if (typeof type.kind === 'string' && typeof type.itemKind !== 'function') {\n const kinds: FieldKinds = {\n kind: type.kind,\n itemKind: type.kind === 'array' ? type.itemKind : undefined,\n }\n checkDefaultRules(name, type, kinds, registry)\n }\n }\n}\n\nfunction issue(code: DefinitionIssueCode, path: DefinitionPath, message: string): DefinitionIssue {\n return { code, path, message }\n}\n\nfunction toIssues(\n code: DefinitionIssueCode,\n path: DefinitionPath,\n valibotIssues: readonly v.BaseIssue<unknown>[],\n): DefinitionIssue[] {\n return valibotIssues.map((valibotIssue) => {\n const keys = valibotIssue.path?.map((item) => item.key as string | number) ?? []\n return issue(code, [...path, ...keys], valibotIssue.message)\n })\n}\n","import * as v from 'valibot'\nimport type { KindDef } from '../kinds/kind-def'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport { buildFieldSchema, type MessageContext, type Messages } from './build-field-schema'\nimport { mergeRegistry } from './registry'\nimport { checkDefinition, checkRegistry } from './validate-definition'\nimport { DefinitionError, type ValidateResult } from '../errors/definition-error'\nimport type { JsonForm } from '../definition/json-form-schema'\nimport type { ValueKind } from '../shared/value-kind'\n\nexport interface SchemaBuilderOptions {\n kinds?: Record<string, KindDef>\n fieldTypes?: Record<string, FieldTypeDef>\n rules?: Record<string, RuleDef>\n includeDefaultRules?: boolean\n messages?: { required?: string }\n /**\n * Called with every message from the definition and with `messages.required`, e.g. to treat\n * them as i18n keys. Return undefined to use the text as written.\n */\n resolveMessage?(key: string, ctx: MessageContext): string | undefined\n}\n\nexport function createSchemaBuilder(options: SchemaBuilderOptions = {}) {\n const registry = mergeRegistry(options)\n checkRegistry(registry)\n\n const messages: Messages = {\n required: options.messages?.required ?? 'Required',\n resolve: (text, ctx) => options.resolveMessage?.(text, ctx) ?? text,\n }\n\n /** Every issue in the definition, in document order. Never throws on bad input. */\n function validate(json: unknown): ValidateResult {\n const { issues } = checkDefinition(json, registry)\n return issues.length ? { success: false, issues } : { success: true, issues: [] }\n }\n\n function build(json: JsonForm) {\n const { issues, fields } = checkDefinition(json, registry)\n if (issues.length) throw new DefinitionError(issues)\n\n const entries: v.ObjectEntries = {}\n for (const field of fields) {\n entries[field.name] = buildFieldSchema(field, messages)\n }\n return v.object(entries)\n }\n\n /**\n * The registered rules that can be used on a field of `kind`, e.g. for a rule picker.\n */\n function rulesForKind(kind: ValueKind): [name: string, def: RuleDef][] {\n return Object.entries(registry.rules).filter(([, def]) => def.kinds.includes(kind))\n }\n\n return {\n build,\n validate,\n rulesForKind,\n kinds: registry.kinds,\n fieldTypes: registry.fieldTypes,\n rules: registry.rules,\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whatsaaaa/form-builder-schema",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Build Formisch-ready Valibot schemas from JSON form definitions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"form",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"vitest": "^5.0.5"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"valibot": "^1.
|
|
45
|
+
"valibot": "^1.3.0"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsdown",
|