@whatsaaaa/form-builder-schema 0.4.0 → 0.5.0

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/README.md CHANGED
@@ -36,7 +36,7 @@ Empty optional fields output `undefined`. Rules never run on empty values, and a
36
36
 
37
37
  ## Field types
38
38
 
39
- There is a type for every native control, plus three display elements. Anything more specific is a `ui.widget` variant of one of them, or your own type: a star rating is a `number` with `ui: { widget: 'rating' }`, and a colour picker is a `text` with a `hexColor` rule.
39
+ There is a type for every native control, two types that hold other fields, and three display elements. Anything more specific is a `ui.widget` variant of one of them, or your own type: a star rating is a `number` with `ui: { widget: 'rating' }`, and a colour picker is a `text` with a `hexColor` rule.
40
40
 
41
41
  | Type | Kind | Value | Props | Checks |
42
42
  | ------------------------------------- | -------------------------------------- | ----------------------------------- | ------------------------ | -------------------------------- |
@@ -69,6 +69,29 @@ There is a type for every native control, plus three display elements. Anything
69
69
 
70
70
  They need no `name`, add no output key, and can't have `rules` or `required`. Their `text` can be an i18n key: renderers resolve it with the same function you pass as `resolveMessage`. Whether a paragraph renders markdown is up to the renderer.
71
71
 
72
+ ### Groups and arrays
73
+
74
+ | Type | Kind | Value | Props |
75
+ | ------- | ------ | -------------------------------------- | -------------------------------- |
76
+ | `group` | object | an object with a key for each field | `fields` |
77
+ | `array` | array | a list of single values, or of objects | exactly one of `of` and `fields` |
78
+
79
+ ```json
80
+ {
81
+ "name": "address",
82
+ "type": "group",
83
+ "fields": [
84
+ { "name": "city", "type": "text", "required": true },
85
+ { "name": "zip", "type": "text" }
86
+ ]
87
+ }
88
+ ```
89
+
90
+ - **A group** builds `{ address: { city, zip } }`, so Formisch's path for the city is `['address', 'city']`. It is always there and its fields decide what is required, so it can't have `required` or `default`.
91
+ - **An array with `of`** is a list of single values, such as tags. `of` is the field each item uses, and it needs no `name`. **An array with `fields`** is a list of objects, such as order lines.
92
+ - **Rules on an array**, like `minLength`, count its items. A required array needs at least one item. A missing array is read as `[]`, so its rules still run.
93
+ - Display elements can go inside both. A name only has to be unique among the fields next to it.
94
+
72
95
  ## Rules
73
96
 
74
97
  Every Valibot action whose arguments fit in JSON is a rule with the same name. Params go next to `rule`, and a rule without a `message` uses Valibot's message, so [`@valibot/i18n`](https://valibot.dev/guides/internationalization/) works.
@@ -128,7 +151,10 @@ if (!result.success) {
128
151
  }
129
152
  ```
130
153
 
131
- `build(json)` runs the same checks and throws one `DefinitionError` with all of them. Issue codes are `invalid_shape`, `unsupported_version`, `unknown_key`, `unknown_type`, `missing_name`, `duplicate_name`, `invalid_props`, `unknown_rule`, `unknown_param`, `invalid_params` and `kind_mismatch`.
154
+ `build(json)` runs the same checks and throws one `DefinitionError` with all of them. Issue codes are `invalid_shape`, `unsupported_version`, `unknown_key`, `unknown_type`, `missing_name`, `invalid_name`, `duplicate_name`, `invalid_props`, `invalid_default`, `unknown_rule`, `unknown_param`, `invalid_params` and `kind_mismatch`. An issue in a nested field has its full path, such as `['fields', 2, 'fields', 0, 'rules', 1]`.
155
+
156
+ - **Names** are one key of the value, so a name with `.`, `[` or `]` is `invalid_name`.
157
+ - **Defaults** must pass the field's own schema, rules included, or they are `invalid_default`. An empty default, like `''`, counts as none.
132
158
 
133
159
  Keys on a field must be reserved keys (`RESERVED_FIELD_KEYS`) or props of its type. Put renderer settings under `ui`, which is never checked.
134
160
 
@@ -165,8 +191,33 @@ const { build } = createSchemaBuilder({ fieldTypes: { tags }, rules: { even } })
165
191
  })
166
192
  ```
167
193
 
194
+ - A **field type whose value holds other fields** sets `container: true` and builds them with `ctx.buildFields(fields, path)`, or `ctx.buildField(field, path)` for the items of a list. The builder checks those fields like any others, so their issues have their full path. A container's kind is `object` or `array`, its value is never empty, and Formisch keeps a field for each child.
195
+ - To **test a field type on its own**, give its `schema()` a context from `createBuildContext()`. Its `buildFields` and `buildField` use the default registries and throw a `DefinitionError` when the child fields have issues:
196
+
197
+ ```ts
198
+ const schema = myType.schema?.(field, createBuildContext({ path: ['fields', 0] }))
199
+ ```
200
+
168
201
  - Mistakes in the registry, such as an unknown kind or a reserved props key, throw a `TypeError` from `createSchemaBuilder`.
169
202
 
203
+ ## Initial input and walking fields
204
+
205
+ Two plain functions read a definition without a builder, for renderers and adapters:
206
+
207
+ ```ts
208
+ import { getInitialInput, walkFields } from '@whatsaaaa/form-builder-schema'
209
+
210
+ const form = useForm({ schema: build(json), initialInput: getInitialInput(json) })
211
+
212
+ for (const { field, dataPath, definitionPath, depth } of walkFields(json)) {
213
+ // e.g. dataPath ['lines', '*', 'quantity'], definitionPath ['fields', 2, 'fields', 1], depth 1
214
+ }
215
+ ```
216
+
217
+ - `getInitialInput` gives each field's `default`, nested the way the value is. A group gives an object, and an array without a default gives `[]`. Other fields without a default are left out.
218
+ - `walkFields` yields every field at every depth, in document order, with a group or array before its fields. The fields of an array's items come once, with `'*'` in place of the index. A field without a name, like a heading, has its parent's `dataPath`.
219
+ - Both know the built-in `group` and `array` types only, and neither checks the definition, so run `validate()` first.
220
+
170
221
  ## Messages
171
222
 
172
223
  ```ts
package/dist/index.d.ts CHANGED
@@ -5,12 +5,6 @@ type AnyAction = v.GenericPipeAction;
5
5
  * A `v.object()` schema. The builder reads its `entries` to find unknown keys.
6
6
  */
7
7
  type AnyObjectSchema = v.ObjectSchema<v.ObjectEntries, v.ErrorMessage<v.ObjectIssue> | undefined>;
8
- interface KindDef {
9
- /** True when the input means "no value". */
10
- isEmpty(input: unknown): boolean;
11
- /** Extra check for required fieldsd after normalize rules ran. Omit it when isEmpty is enough. */
12
- required?(message: string): AnyAction | null;
13
- }
14
8
  /**
15
9
  * The built-in kinds, plus any string so consumers can register their own.
16
10
  */
@@ -32,7 +26,7 @@ interface JsonField {
32
26
  rules?: readonly JsonRule[];
33
27
  /** For renderers. This package never reads or checks it. */
34
28
  ui?: Record<string, unknown>;
35
- /** Validated by the field type's props schema, */
29
+ /** Validated by the field type's props schema. */
36
30
  [prop: string]: unknown;
37
31
  }
38
32
  interface JsonRule {
@@ -42,8 +36,8 @@ interface JsonRule {
42
36
  }
43
37
  /** Where something is in a definition, e.g. `['fields', 0, 'rules', 1]`. */
44
38
  type DefinitionPath = readonly (string | number)[];
45
- /** Public API: adding a code is a minor change, renaming one is breaking, */
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';
39
+ /** Public API: adding a code is a minor change, renaming one is breaking. */
40
+ type DefinitionIssueCode = 'invalid_shape' | 'unsupported_version' | 'unknown_key' | 'unknown_type' | 'missing_name' | 'invalid_name' | 'duplicate_name' | 'invalid_props' | 'invalid_default' | 'unknown_rule' | 'unknown_param' | 'invalid_params' | 'kind_mismatch';
47
41
  interface DefinitionIssue {
48
42
  code: DefinitionIssueCode;
49
43
  path: DefinitionPath;
@@ -89,6 +83,13 @@ interface FieldTypeDef<TProps extends AnyObjectSchema = AnyObjectSchema> {
89
83
  required?(message: string): AnyAction | null;
90
84
  /** Runs last, after every rule, e.g. to turn an ISO string into a `Date`. */
91
85
  finalize?(field: FieldWithProps<TProps>): AnyAction | undefined;
86
+ /**
87
+ * True for a type whose value holds other fields, built with `ctx.buildFields` or
88
+ * `ctx.buildField`. Its kind must be `'object'` or `'array'`. The value is never empty: a
89
+ * missing one becomes `{}` or `[]`, and the rules always run. Formisch then sees the object or
90
+ * array schema itself, so it keeps a field for each child.
91
+ */
92
+ container?: boolean;
92
93
  }
93
94
  /**
94
95
  * Picks the kind from the field. Declared as a method so it stays bivariant, like `schema()`.
@@ -101,6 +102,26 @@ type FieldWithProps<TProps extends AnyObjectSchema = AnyObjectSchema> = JsonFiel
101
102
  interface BuildContext {
102
103
  /** Where the field is in the definition, e.g. `['fields', 2]`. */
103
104
  readonly path: DefinitionPath;
105
+ /**
106
+ * Checks and builds child fields with the same registries, and returns their object schema.
107
+ * Their issues land in the same `validate()` result. `path` is where the list is in the
108
+ * definition, e.g. `[...ctx.path, 'fields']`.
109
+ */
110
+ buildFields(fields: readonly JsonField[], path: DefinitionPath): AnyObjectSchema;
111
+ /** Checks and builds one field for the items of a list. Its name isn't needed or used. */
112
+ buildField(field: JsonField, path: DefinitionPath): AnySchema;
113
+ }
114
+ /**
115
+ * A build context for testing a field type on its own, without a definition around it.
116
+ * `buildFields` and `buildField` use the default registries and throw a `DefinitionError` when
117
+ * the child fields have issues. `overrides` replaces any member, e.g. `path`.
118
+ */
119
+ export declare function createBuildContext(overrides?: Partial<BuildContext>): BuildContext;
120
+ interface KindDef {
121
+ /** True when the input means "no value". */
122
+ isEmpty(input: unknown): boolean;
123
+ /** Extra check for required fields after normalize rules ran. Omit it when isEmpty is enough. */
124
+ required?(message: string): AnyAction | null;
104
125
  }
105
126
  /**
106
127
  * `normalize` rules (trim, change case) run before the required check, so `' '` with `trim` counts
@@ -134,6 +155,8 @@ interface MessageContext {
134
155
  rule?: string;
135
156
  path: DefinitionPath;
136
157
  }
158
+ /** The schema of a list of fields: an object with a key for each field that has a value. */
159
+ type FieldsSchema = v.ObjectSchema<v.ObjectEntries, undefined>;
137
160
  interface SchemaBuilderOptions {
138
161
  kinds?: Record<string, KindDef>;
139
162
  fieldTypes?: Record<string, FieldTypeDef>;
@@ -149,15 +172,55 @@ interface SchemaBuilderOptions {
149
172
  resolveMessage?(key: string, ctx: MessageContext): string | undefined;
150
173
  }
151
174
  export declare function createSchemaBuilder(options?: SchemaBuilderOptions): {
152
- build: (json: JsonForm) => v.ObjectSchema<v.ObjectEntries, undefined>;
175
+ build: (json: JsonForm) => FieldsSchema;
153
176
  validate: (json: unknown) => ValidateResult;
154
177
  rulesForKind: (kind: ValueKind) => [name: string, def: RuleDef][];
155
178
  kinds: Readonly<Record<string, KindDef>>;
156
179
  fieldTypes: Readonly<Record<string, FieldTypeDef<AnyObjectSchema>>>;
157
180
  rules: Readonly<Record<string, RuleDef<AnyObjectSchema>>>;
158
181
  };
182
+ /**
183
+ * Formisch's `initialInput` for a definition: each field's `default`, nested the way the value
184
+ * is. A group gives an object, and an array without a default gives `[]`. Other fields without
185
+ * a default are left out. Like `walkFields`, it reads the built-in `group` and `array` types
186
+ * and needs no builder.
187
+ */
188
+ export declare function getInitialInput(definition: JsonForm): Record<string, unknown>;
189
+ /** One field found by `walkFields`. */
190
+ interface WalkedField {
191
+ field: JsonField;
192
+ /** The field's type, e.g. `'text'`. */
193
+ type: string;
194
+ /**
195
+ * Where the field's value is, as a Formisch path: `['address', 'city']`. The items of an array
196
+ * have no fixed index, so they have `'*'` in its place. A field without a name, like a
197
+ * heading, has its parent's path.
198
+ */
199
+ dataPath: readonly (string | number)[];
200
+ /** Where the field is in the definition: `['fields', 1, 'fields', 0]`. */
201
+ definitionPath: DefinitionPath;
202
+ /** 0 for the form's own fields, 1 for the fields inside them, and so on. */
203
+ depth: number;
204
+ }
205
+ /**
206
+ * Every field of a definition, at every depth, in document order. A group or an array comes
207
+ * before its fields, and the fields of an array's items come once. It reads the built-in
208
+ * `group` and `array` types and needs no builder, so it doesn't check the definition: run
209
+ * `validate()` first.
210
+ */
211
+ export declare function walkFields(definition: JsonForm): Generator<WalkedField, void, undefined>;
159
212
  /** Every built-in field type. */
160
213
  export declare const defaultFieldTypes: {
214
+ group: FieldTypeDef<import("valibot").ObjectSchema<{
215
+ readonly fields: import("valibot").ArraySchema<import("valibot").CustomSchema<JsonField, undefined>, undefined>;
216
+ }, undefined>>;
217
+ array: FieldTypeDef<import("valibot").SchemaWithPipe<readonly [import("valibot").ObjectSchema<{
218
+ readonly of: import("valibot").OptionalSchema<import("valibot").CustomSchema<JsonField, undefined>, undefined>;
219
+ readonly fields: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").CustomSchema<JsonField, undefined>, undefined>, undefined>;
220
+ }, undefined>, import("valibot").CheckAction<{
221
+ of?: JsonField | undefined;
222
+ fields?: JsonField[] | undefined;
223
+ }, "Give exactly one of \"of\" and \"fields\"">]>>;
161
224
  heading: FieldTypeDef<import("valibot").ObjectSchema<{
162
225
  readonly text: import("valibot").StringSchema<undefined>;
163
226
  readonly level: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").NumberSchema<undefined>, import("valibot").IntegerAction<number, undefined>, import("valibot").MinValueAction<number, 1, undefined>, import("valibot").MaxValueAction<number, 6, undefined>]>, undefined>;
@@ -678,8 +741,8 @@ export declare const textUnitRules: {
678
741
  */
679
742
  export declare const RESERVED_FIELD_KEYS: readonly ["name", "type", "label", "description", "placeholder", "default", "required", "rules", "ui"];
680
743
  /**
681
- * Rule keys this package own. A rule's params can't use them.
744
+ * Rule keys this package owns. A rule's params can't use them.
682
745
  */
683
746
  export declare const RESERVED_RULE_KEYS: readonly ["rule", "message"];
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 };
747
+ export type { AnyAction, AnyObjectSchema, AnySchema, BuildContext, DefinitionIssue, DefinitionIssueCode, DefinitionPath, FieldTypeDef, FieldWithProps, JsonField, JsonForm, JsonRule, KindDef, KindOf, MessageContext, RuleCategory, RuleDef, RuleMeta, RuleStage, SchemaBuilderOptions, ValidateResult, ValueKind, WalkedField };
685
748
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,4 +1,21 @@
1
1
  import * as v from "valibot";
2
+ // src/errors/definition-error.ts
3
+ function formatPath(path) {
4
+ return path.reduce((out, key) => {
5
+ if (typeof key === "number") return `${out}[${key}]`;
6
+ return out ? `${out}.${key}` : key;
7
+ }, "");
8
+ }
9
+ /** Thrown by `build()` when the definition has issues. Lists all of them. */
10
+ var DefinitionError = class extends Error {
11
+ issues;
12
+ constructor(issues) {
13
+ const lines = issues.map((issue) => ` ${formatPath(issue.path) || "(root)"}: ${issue.message}`);
14
+ super(`Invalid form definition:\n${lines.join("\n")}`);
15
+ this.name = "DefinitionError";
16
+ this.issues = issues;
17
+ }
18
+ };
2
19
  // src/shared/each-item.ts
3
20
  /**
4
21
  * Checks every item of an array with `schema` and reports the issues on the array itself.
@@ -23,9 +40,10 @@ function eachItem(schema) {
23
40
  /**
24
41
  * The schema runs in this order: empty check, base schema, normalize rules, required check,
25
42
  * then the type's default rules and the field's rules, and last the type's `finalize()`.
43
+ * A container has no empty check: its value is never empty.
26
44
  */
27
- function buildFieldSchema(checked, messages) {
28
- const { field, path, type, kind } = checked;
45
+ function buildFieldSchema(checked, messages, ctx) {
46
+ const { field, path, type, kind, valueKind } = checked;
29
47
  const required = !!field.required;
30
48
  const requiredMessage = messages.resolve(typeof field.required === "object" && field.required.message || messages.required, {
31
49
  field,
@@ -54,15 +72,35 @@ function buildFieldSchema(checked, messages) {
54
72
  if (each.validate.length) whole.validate.unshift(eachItem(pipe(v.unknown(), each.validate)));
55
73
  const finalize = type.finalize?.(field);
56
74
  if (finalize) whole.validate.push(finalize);
57
- const base = type.schema(field, { path });
75
+ const base = type.schema(field, ctx);
58
76
  const requiredCheck = !required ? void 0 : type.required ? type.required(requiredMessage) : kind.required?.(requiredMessage);
59
77
  const head = pipe(base, requiredCheck ? [...whole.normalize, requiredCheck] : whole.normalize);
78
+ if (type.container) {
79
+ const rules = whole.validate.length ? [pipe(v.unknown(), whole.validate)] : [];
80
+ return v.optional(pipe(head, rules), valueKind === "object" ? () => ({}) : () => []);
81
+ }
60
82
  const empty = required ? v.never(requiredMessage) : v.pipe(v.unknown(), v.transform(() => void 0));
61
83
  const whenFilled = (schema) => v.lazy((input) => kind.isEmpty(input) ? empty : schema);
62
84
  const schema = whenFilled(v.pipe(head, whenFilled(pipe(v.unknown(), whole.validate))));
63
85
  return required ? schema : v.optional(schema);
64
86
  }
65
87
  const pipe = (schema, items) => items.reduce((acc, item) => v.pipe(acc, item), schema);
88
+ // src/rules/rule-params.ts
89
+ const cache = /* @__PURE__ */ new WeakMap();
90
+ function paramsFor(def, kind) {
91
+ if (typeof def.params !== "function") return def.params;
92
+ let byKind = cache.get(def);
93
+ if (!byKind) {
94
+ byKind = /* @__PURE__ */ new Map();
95
+ cache.set(def, byKind);
96
+ }
97
+ let params = byKind.get(kind);
98
+ if (!params) {
99
+ params = def.params(kind);
100
+ byKind.set(kind, params);
101
+ }
102
+ return params;
103
+ }
66
104
  // src/field-types/basic-types.ts
67
105
  /** Types with one plain value and no props. Each maps to a native input. */
68
106
  const basicTypes = {
@@ -147,6 +185,26 @@ const choiceTypes = {
147
185
  schema: (field) => v.array(oneOf(field.options))
148
186
  })
149
187
  };
188
+ // src/field-types/container-types.ts
189
+ const childField = v.custom(() => true);
190
+ /** Types whose value holds other fields. Display elements can go inside them too. */
191
+ const containerTypes = {
192
+ group: defineFieldType({
193
+ kind: "object",
194
+ container: true,
195
+ props: v.object({ fields: v.array(childField) }),
196
+ schema: (field, ctx) => ctx.buildFields(field.fields, [...ctx.path, "fields"])
197
+ }),
198
+ array: defineFieldType({
199
+ kind: "array",
200
+ container: true,
201
+ props: v.pipe(v.object({
202
+ of: v.optional(childField),
203
+ fields: v.optional(v.array(childField))
204
+ }), v.check((props) => props.of === void 0 !== (props.fields === void 0), "Give exactly one of \"of\" and \"fields\"")),
205
+ schema: (field, ctx) => v.array(field.of ? ctx.buildField(field.of, [...ctx.path, "of"]) : ctx.buildFields(field.fields ?? [], [...ctx.path, "fields"]))
206
+ })
207
+ };
150
208
  // src/field-types/date-types.ts
151
209
  const outputProps = v.object({
152
210
  /** `'date'` turns the ISO string into a `Date`. Defaults to `'string'`. */
@@ -221,7 +279,8 @@ const defaultFieldTypes = {
221
279
  ...dateTypes,
222
280
  ...choiceTypes,
223
281
  file: fileType,
224
- ...displayTypes
282
+ ...displayTypes,
283
+ ...containerTypes
225
284
  };
226
285
  // src/kinds/default-kinds.ts
227
286
  const isNil = (input) => input === void 0 || input === null;
@@ -775,39 +834,6 @@ function mergeRegistry(custom) {
775
834
  function lookup(record, key) {
776
835
  return Object.hasOwn(record, key) ? record[key] : void 0;
777
836
  }
778
- // src/errors/definition-error.ts
779
- function formatPath(path) {
780
- return path.reduce((out, key) => {
781
- if (typeof key === "number") return `${out}[${key}]`;
782
- return out ? `${out}.${key}` : key;
783
- }, "");
784
- }
785
- /** Thrown by `build()` when the definition has issues. Lists all of them. */
786
- var DefinitionError = class extends Error {
787
- issues;
788
- constructor(issues) {
789
- const lines = issues.map((issue) => ` ${formatPath(issue.path) || "(root)"}: ${issue.message}`);
790
- super(`Invalid form definition:\n${lines.join("\n")}`);
791
- this.name = "DefinitionError";
792
- this.issues = issues;
793
- }
794
- };
795
- // src/rules/rule-params.ts
796
- const cache = /* @__PURE__ */ new WeakMap();
797
- function paramsFor(def, kind) {
798
- if (typeof def.params !== "function") return def.params;
799
- let byKind = cache.get(def);
800
- if (!byKind) {
801
- byKind = /* @__PURE__ */ new Map();
802
- cache.set(def, byKind);
803
- }
804
- let params = byKind.get(kind);
805
- if (!params) {
806
- params = def.params(kind);
807
- byKind.set(kind, params);
808
- }
809
- return params;
810
- }
811
837
  // src/shared/reserved-keys.ts
812
838
  /**
813
839
  * Field keys this package owns. A field type's props can't use them.
@@ -824,7 +850,7 @@ const RESERVED_FIELD_KEYS = [
824
850
  "ui"
825
851
  ];
826
852
  /**
827
- * Rule keys this package own. A rule's params can't use them.
853
+ * Rule keys this package owns. A rule's params can't use them.
828
854
  */
829
855
  const RESERVED_RULE_KEYS = ["rule", "message"];
830
856
  const fieldKeys = new Set(RESERVED_FIELD_KEYS);
@@ -832,10 +858,6 @@ const ruleKeys = new Set(RESERVED_RULE_KEYS);
832
858
  const isReservedFieldKey = (key) => fieldKeys.has(key);
833
859
  const isReservedRuleKey = (key) => ruleKeys.has(key);
834
860
  // src/builder/validate-definition.ts
835
- const formShape = v.object({
836
- version: v.string(),
837
- fields: v.array(v.unknown())
838
- });
839
861
  const fieldShape = v.looseObject({
840
862
  name: v.optional(v.string()),
841
863
  type: v.string(),
@@ -853,34 +875,12 @@ const ruleShape = v.looseObject({
853
875
  });
854
876
  const noParams = v.object({});
855
877
  /**
856
- * Checks a whole definition and collects every issue, in document order. Never throws.
878
+ * Checks one field's shape, name, type, props and rules, and adds its issues to `issues`.
879
+ * Returns the field ready to build, or undefined when it has issues or no value.
880
+ *
881
+ * `names` holds the names used so far at this level. It is undefined for the field of a list's
882
+ * items, which needs no name.
857
883
  */
858
- function checkDefinition(json, registry) {
859
- const issues = [];
860
- const fields = [];
861
- const form = v.safeParse(formShape, json);
862
- if (!form.success) return {
863
- issues: toIssues("invalid_shape", [], form.issues),
864
- fields
865
- };
866
- if (form.output.version !== "1") return {
867
- issues: [{
868
- code: "unsupported_version",
869
- path: ["version"],
870
- message: `Unsupported version "${form.output.version}". This package reads version '1'.`
871
- }],
872
- fields
873
- };
874
- const names = /* @__PURE__ */ new Set();
875
- form.output.fields.forEach((raw, i) => {
876
- const field = checkField(raw, ["fields", i], registry, names, issues);
877
- if (field) fields.push(field);
878
- });
879
- return {
880
- issues,
881
- fields
882
- };
883
- }
884
884
  function checkField(raw, path, registry, names, issues) {
885
885
  const shape = v.safeParse(fieldShape, raw);
886
886
  if (!shape.success) {
@@ -891,9 +891,13 @@ function checkField(raw, path, registry, names, issues) {
891
891
  const issueCount = issues.length;
892
892
  const type = lookup(registry.fieldTypes, field.type);
893
893
  const hasValue = type?.kind !== "none";
894
- if (!field.name) {
894
+ if (!names) {} else if (!field.name) {
895
895
  if (type && hasValue) issues.push(issue("missing_name", [...path, "name"], "A field needs a name"));
896
896
  } else if (hasValue) {
897
+ if (/[.[\]]/.test(field.name)) {
898
+ const message = `Name "${field.name}" can't contain ".", "[" or "]"`;
899
+ issues.push(issue("invalid_name", [...path, "name"], message));
900
+ }
897
901
  if (names.has(field.name)) issues.push(issue("duplicate_name", [...path, "name"], `Duplicate name "${field.name}"`));
898
902
  names.add(field.name);
899
903
  }
@@ -907,6 +911,10 @@ function checkField(raw, path, registry, names, issues) {
907
911
  const message = `A "${field.type}" field has no value, so it can't have "${key}"`;
908
912
  issues.push(issue("invalid_shape", [...path, key], message));
909
913
  }
914
+ if (!names) {
915
+ const message = `A list's items need a value, and a "${field.type}" field has none`;
916
+ issues.push(issue("invalid_shape", [...path, "type"], message));
917
+ }
910
918
  return;
911
919
  }
912
920
  const withProps = props && {
@@ -919,12 +927,18 @@ function checkField(raw, path, registry, names, issues) {
919
927
  kind,
920
928
  itemKind: kind === "array" ? resolveKind(type.itemKind, withProps) : void 0
921
929
  };
930
+ if (type.container && kind === "object") {
931
+ for (const key of ["required", "default"]) if (field[key] !== void 0) {
932
+ const message = `A "${field.type}" field is always there, so it can't have "${key}"`;
933
+ issues.push(issue("invalid_shape", [...path, key], message));
934
+ }
935
+ }
922
936
  const fieldRules = (shape.output.rules ?? []).flatMap((rule, j) => checkRule(rule, kinds, [
923
937
  ...path,
924
938
  "rules",
925
939
  j
926
940
  ], registry, issues) ?? []);
927
- if (issues.length > issueCount || !field.name || !withProps) return void 0;
941
+ if (issues.length > issueCount || names && !field.name || !withProps) return void 0;
928
942
  const overridden = new Set(fieldRules.map((rule) => rule.name));
929
943
  const defaultRules = checkDefaultRules(field.type, type, kinds, registry).filter((rule) => !overridden.has(rule.name));
930
944
  return {
@@ -933,6 +947,7 @@ function checkField(raw, path, registry, names, issues) {
933
947
  path,
934
948
  type,
935
949
  kind: kindDef(field.type, kind, registry),
950
+ valueKind: kind,
936
951
  rules: [...defaultRules, ...fieldRules]
937
952
  };
938
953
  }
@@ -1013,6 +1028,7 @@ function checkRegistry(registry) {
1013
1028
  for (const [name, type] of Object.entries(registry.fieldTypes)) {
1014
1029
  const at = `Field type "${name}"`;
1015
1030
  for (const kind of [type.kind, type.itemKind]) if (typeof kind === "string" && !lookup(registry.kinds, kind)) throw new TypeError(`${at}: kind "${kind}" is not registered`);
1031
+ if (type.container && type.kind !== "object" && type.kind !== "array") throw new TypeError(`${at}: a container's kind must be 'object' or 'array'`);
1016
1032
  if (type.kind !== "none" && !type.schema) throw new TypeError(`${at}: schema() is required unless the kind is 'none'`);
1017
1033
  for (const key of Object.keys(type.props?.entries ?? {})) if (isReservedFieldKey(key)) throw new TypeError(`${at}: props can't use the reserved key "${key}"`);
1018
1034
  if (typeof type.kind === "string" && typeof type.itemKind !== "function") checkDefaultRules(name, type, {
@@ -1034,6 +1050,100 @@ function toIssues(code, path, valibotIssues) {
1034
1050
  return issue(code, [...path, ...keys], valibotIssue.message);
1035
1051
  });
1036
1052
  }
1053
+ // src/builder/compile-definition.ts
1054
+ const formShape = v.object({
1055
+ version: v.string(),
1056
+ fields: v.array(v.unknown())
1057
+ });
1058
+ /**
1059
+ * Checks a definition and builds its schema in the same pass, so `validate()` and `build()`
1060
+ * always agree. Never throws on bad input.
1061
+ */
1062
+ function compileDefinition(json, registry, messages) {
1063
+ const issues = [];
1064
+ const form = v.safeParse(formShape, json);
1065
+ if (!form.success) return {
1066
+ issues: toIssues("invalid_shape", [], form.issues),
1067
+ schema: v.object({})
1068
+ };
1069
+ if (form.output.version !== "1") {
1070
+ const message = `Unsupported version "${form.output.version}". This package reads version '1'.`;
1071
+ issues.push({
1072
+ code: "unsupported_version",
1073
+ path: ["version"],
1074
+ message
1075
+ });
1076
+ return {
1077
+ issues,
1078
+ schema: v.object({})
1079
+ };
1080
+ }
1081
+ return {
1082
+ issues,
1083
+ schema: createCompiler(registry, messages, issues).fields(form.output.fields, ["fields"])
1084
+ };
1085
+ }
1086
+ /** Every field the compiler checks adds its issues to `issues`. */
1087
+ function createCompiler(registry, messages, issues) {
1088
+ const context = (path) => ({
1089
+ path,
1090
+ buildFields: fields,
1091
+ buildField: field
1092
+ });
1093
+ function fields(list, path) {
1094
+ const entries = {};
1095
+ const names = /* @__PURE__ */ new Set();
1096
+ list.forEach((raw, i) => {
1097
+ const checked = checkField(raw, [...path, i], registry, names, issues);
1098
+ if (checked?.name) entries[checked.name] = build(checked);
1099
+ });
1100
+ return v.object(entries);
1101
+ }
1102
+ function field(raw, path) {
1103
+ const checked = checkField(raw, path, registry, void 0, issues);
1104
+ return checked ? build(checked) : v.never();
1105
+ }
1106
+ function build(checked) {
1107
+ const schema = buildFieldSchema(checked, messages, context(checked.path));
1108
+ checkDefault(checked, schema, issues);
1109
+ return schema;
1110
+ }
1111
+ return {
1112
+ fields,
1113
+ field
1114
+ };
1115
+ }
1116
+ /** A default must be a value the field accepts. An empty one is the same as none. */
1117
+ function checkDefault({ field, kind, path }, schema, issues) {
1118
+ if (field.default === void 0 || kind.isEmpty(field.default)) return;
1119
+ const result = v.safeParse(schema, field.default);
1120
+ if (!result.success) issues.push(...toIssues("invalid_default", [...path, "default"], result.issues));
1121
+ }
1122
+ // src/builder/build-context.ts
1123
+ const messages = {
1124
+ required: "Required",
1125
+ resolve: (text) => text
1126
+ };
1127
+ /**
1128
+ * A build context for testing a field type on its own, without a definition around it.
1129
+ * `buildFields` and `buildField` use the default registries and throw a `DefinitionError` when
1130
+ * the child fields have issues. `overrides` replaces any member, e.g. `path`.
1131
+ */
1132
+ function createBuildContext(overrides = {}) {
1133
+ const registry = mergeRegistry({});
1134
+ const run = (compile) => {
1135
+ const issues = [];
1136
+ const result = compile(createCompiler(registry, messages, issues));
1137
+ if (issues.length) throw new DefinitionError(issues);
1138
+ return result;
1139
+ };
1140
+ return {
1141
+ path: [],
1142
+ buildFields: (fields, path) => run((compiler) => compiler.fields(fields, path)),
1143
+ buildField: (field, path) => run((compiler) => compiler.field(field, path)),
1144
+ ...overrides
1145
+ };
1146
+ }
1037
1147
  // src/builder/create-schema-builder.ts
1038
1148
  function createSchemaBuilder(options = {}) {
1039
1149
  const registry = mergeRegistry(options);
@@ -1044,7 +1154,7 @@ function createSchemaBuilder(options = {}) {
1044
1154
  };
1045
1155
  /** Every issue in the definition, in document order. Never throws on bad input. */
1046
1156
  function validate(json) {
1047
- const { issues } = checkDefinition(json, registry);
1157
+ const { issues } = compileDefinition(json, registry, messages);
1048
1158
  return issues.length ? {
1049
1159
  success: false,
1050
1160
  issues
@@ -1054,11 +1164,9 @@ function createSchemaBuilder(options = {}) {
1054
1164
  };
1055
1165
  }
1056
1166
  function build(json) {
1057
- const { issues, fields } = checkDefinition(json, registry);
1167
+ const { issues, schema } = compileDefinition(json, registry, messages);
1058
1168
  if (issues.length) throw new DefinitionError(issues);
1059
- const entries = {};
1060
- for (const field of fields) entries[field.name] = buildFieldSchema(field, messages);
1061
- return v.object(entries);
1169
+ return schema;
1062
1170
  }
1063
1171
  /**
1064
1172
  * The registered rules that can be used on a field of `kind`, e.g. for a rule picker.
@@ -1075,6 +1183,62 @@ function createSchemaBuilder(options = {}) {
1075
1183
  rules: registry.rules
1076
1184
  };
1077
1185
  }
1078
- export { DefinitionError, RESERVED_FIELD_KEYS, RESERVED_RULE_KEYS, comparisonRules, contentRules, createSchemaBuilder, dateRules, defaultFieldTypes, defaultKinds, defaultRules, defineFieldType, defineRule, fileRules, formatPath, formatRules, lengthRules, normalizeRules, numberRules, textUnitRules };
1186
+ // src/definition/initial-input.ts
1187
+ /**
1188
+ * Formisch's `initialInput` for a definition: each field's `default`, nested the way the value
1189
+ * is. A group gives an object, and an array without a default gives `[]`. Other fields without
1190
+ * a default are left out. Like `walkFields`, it reads the built-in `group` and `array` types
1191
+ * and needs no builder.
1192
+ */
1193
+ function getInitialInput(definition) {
1194
+ return inputOf(definition.fields);
1195
+ }
1196
+ function inputOf(fields) {
1197
+ const input = {};
1198
+ for (const field of fields) {
1199
+ if (field.name === void 0) continue;
1200
+ const value = initialValue(field);
1201
+ if (value !== void 0) input[field.name] = value;
1202
+ }
1203
+ return input;
1204
+ }
1205
+ function initialValue(field) {
1206
+ if (field.type === "group") return inputOf(Array.isArray(field.fields) ? field.fields : []);
1207
+ if (field.type === "array") return field.default ?? [];
1208
+ return field.default;
1209
+ }
1210
+ // src/definition/walk-fields.ts
1211
+ /**
1212
+ * Every field of a definition, at every depth, in document order. A group or an array comes
1213
+ * before its fields, and the fields of an array's items come once. It reads the built-in
1214
+ * `group` and `array` types and needs no builder, so it doesn't check the definition: run
1215
+ * `validate()` first.
1216
+ */
1217
+ function* walkFields(definition) {
1218
+ yield* walkList(definition.fields, ["fields"], [], 0);
1219
+ }
1220
+ function* walkList(fields, at, dataPath, depth) {
1221
+ for (const [i, field] of fields.entries()) {
1222
+ const path = field.name === void 0 ? dataPath : [...dataPath, field.name];
1223
+ yield* walkField(field, [...at, i], path, depth);
1224
+ }
1225
+ }
1226
+ function* walkField(field, definitionPath, dataPath, depth) {
1227
+ yield {
1228
+ field,
1229
+ type: field.type,
1230
+ dataPath,
1231
+ definitionPath,
1232
+ depth
1233
+ };
1234
+ if (field.type === "group" && Array.isArray(field.fields)) yield* walkList(field.fields, [...definitionPath, "fields"], dataPath, depth + 1);
1235
+ else if (field.type === "array") {
1236
+ const items = [...dataPath, "*"];
1237
+ if (isField(field.of)) yield* walkField(field.of, [...definitionPath, "of"], items, depth + 1);
1238
+ else if (Array.isArray(field.fields)) yield* walkList(field.fields, [...definitionPath, "fields"], items, depth + 1);
1239
+ }
1240
+ }
1241
+ const isField = (value) => typeof value === "object" && value !== null && "type" in value;
1242
+ export { DefinitionError, RESERVED_FIELD_KEYS, RESERVED_RULE_KEYS, comparisonRules, contentRules, createBuildContext, createSchemaBuilder, dateRules, defaultFieldTypes, defaultKinds, defaultRules, defineFieldType, defineRule, fileRules, formatPath, formatRules, getInitialInput, lengthRules, normalizeRules, numberRules, textUnitRules, walkFields };
1079
1243
 
1080
1244
  //# sourceMappingURL=index.js.map
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/errors/definition-error.ts","../src/shared/each-item.ts","../src/builder/build-field-schema.ts","../src/rules/rule-params.ts","../src/field-types/basic-types.ts","../src/field-types/define-field-type.ts","../src/field-types/choice-types.ts","../src/field-types/container-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/shared/reserved-keys.ts","../src/builder/validate-definition.ts","../src/builder/compile-definition.ts","../src/builder/build-context.ts","../src/builder/create-schema-builder.ts","../src/definition/initial-input.ts","../src/definition/walk-fields.ts"],"sourcesContent":["/** 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 | 'invalid_name'\n | 'duplicate_name'\n | 'invalid_props'\n | 'invalid_default'\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 * 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 { BuildContext } from '../field-types/field-type-def'\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 * A container has no empty check: its value is never empty.\n */\nexport function buildFieldSchema(\n checked: CheckedField,\n messages: Messages,\n ctx: BuildContext,\n): AnySchema {\n const { field, path, type, kind, valueKind } = 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, ctx)\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 if (type.container) {\n // Formisch reads the object or array schema to keep a field for each child, so nothing may\n // wrap it but optional. A missing value is read as an empty one, and the rules still run.\n // They sit in a nested pipe, so an empty required list reports only the required message.\n const rules = whole.validate.length ? [pipe(v.unknown(), whole.validate)] : []\n return v.optional(pipe(head, rules), valueKind === 'object' ? () => ({}) : () => [])\n }\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 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","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 type { JsonField } from '../definition/json-form-schema'\nimport { defineFieldType } from './define-field-type'\nimport type { FieldTypeDef } from './field-type-def'\n\n// The builder checks child fields itself, at their own paths, so the props take any value here.\nconst childField = v.custom<JsonField>(() => true)\n\n/** Types whose value holds other fields. Display elements can go inside them too. */\nexport const containerTypes = {\n // An object with a key for each of its fields. It is always there, so it can't be required.\n group: defineFieldType({\n kind: 'object',\n container: true,\n props: v.object({ fields: v.array(childField) }),\n schema: (field, ctx) => ctx.buildFields(field.fields, [...ctx.path, 'fields']),\n }),\n // A list. `of` is the field of a list of single values, such as tags; its name isn't used.\n // `fields` makes a list of objects, such as order lines. Rules like minLength count the items.\n array: defineFieldType({\n kind: 'array',\n container: true,\n props: v.pipe(\n v.object({ of: v.optional(childField), fields: v.optional(v.array(childField)) }),\n v.check(\n (props) => (props.of === undefined) !== (props.fields === undefined),\n 'Give exactly one of \"of\" and \"fields\"',\n ),\n ),\n schema: (field, ctx) =>\n v.array(\n field.of\n ? ctx.buildField(field.of, [...ctx.path, 'of'])\n : ctx.buildFields(field.fields ?? [], [...ctx.path, 'fields']),\n ),\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 { containerTypes } from './container-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 ...containerTypes,\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","/**\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 /** Undefined for the field of a list's items, which has no name. */\n name: string | undefined\n field: JsonField\n path: DefinitionPath\n type: FieldTypeDef\n kind: KindDef\n /** The name of the kind, e.g. `'array'`. */\n valueKind: ValueKind\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\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 one field's shape, name, type, props and rules, and adds its issues to `issues`.\n * Returns the field ready to build, or undefined when it has issues or no value.\n *\n * `names` holds the names used so far at this level. It is undefined for the field of a list's\n * items, which needs no name.\n */\nexport function checkField(\n raw: unknown,\n path: DefinitionPath,\n registry: Registry,\n names: Set<string> | undefined,\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 (!names) {\n // The field of a list's items has no name.\n } else 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 // A name is one key of the value. Paths like 'address.city' and 'lines[0]' use these as\n // separators.\n if (/[.[\\]]/.test(field.name)) {\n const message = `Name \"${field.name}\" can't contain \".\", \"[\" or \"]\"`\n issues.push(issue('invalid_name', [...path, 'name'], message))\n }\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 if (!names) {\n const message = `A list's items need a value, and a \"${field.type}\" field has none`\n issues.push(issue('invalid_shape', [...path, 'type'], message))\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 // A group is always there, and its fields decide what is required.\n if (type.container && kind === 'object') {\n for (const key of ['required', 'default'] as const) {\n if (field[key] !== undefined) {\n const message = `A \"${field.type}\" field is always there, so it can't have \"${key}\"`\n issues.push(issue('invalid_shape', [...path, key], message))\n }\n }\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 || (names && !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 valueKind: kind,\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.container && type.kind !== 'object' && type.kind !== 'array') {\n throw new TypeError(`${at}: a container's kind must be 'object' or 'array'`)\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\nexport function 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 { DefinitionIssue, DefinitionPath } from '../errors/definition-error'\nimport type { BuildContext } from '../field-types/field-type-def'\nimport type { AnySchema } from '../shared/valibot-types'\nimport { buildFieldSchema, type Messages } from './build-field-schema'\nimport type { Registry } from './registry'\nimport { type CheckedField, checkField, toIssues } from './validate-definition'\n\nexport interface CompileResult {\n /** Every issue in the definition, in document order. */\n issues: DefinitionIssue[]\n /** The form's schema. Only complete when there are no issues. */\n schema: FieldsSchema\n}\n\n/** The schema of a list of fields: an object with a key for each field that has a value. */\nexport type FieldsSchema = v.ObjectSchema<v.ObjectEntries, undefined>\n\nconst formShape = v.object({ version: v.string(), fields: v.array(v.unknown()) })\n\n/**\n * Checks a definition and builds its schema in the same pass, so `validate()` and `build()`\n * always agree. Never throws on bad input.\n */\nexport function compileDefinition(\n json: unknown,\n registry: Registry,\n messages: Messages,\n): CompileResult {\n const issues: DefinitionIssue[] = []\n\n const form = v.safeParse(formShape, json)\n if (!form.success) {\n return { issues: toIssues('invalid_shape', [], form.issues), schema: v.object({}) }\n }\n\n if (form.output.version !== '1') {\n const message = `Unsupported version \"${form.output.version}\". This package reads version '1'.`\n issues.push({ code: 'unsupported_version', path: ['version'], message })\n return { issues, schema: v.object({}) }\n }\n\n const compiler = createCompiler(registry, messages, issues)\n return { issues, schema: compiler.fields(form.output.fields, ['fields']) }\n}\n\nexport interface Compiler {\n /** Checks and builds a list of fields. `path` is where the list is, e.g. `['fields']`. */\n fields(fields: readonly unknown[], path: DefinitionPath): FieldsSchema\n /** Checks and builds the field of a list's items, which needs no name. */\n field(field: unknown, path: DefinitionPath): AnySchema\n}\n\n/** Every field the compiler checks adds its issues to `issues`. */\nexport function createCompiler(\n registry: Registry,\n messages: Messages,\n issues: DefinitionIssue[],\n): Compiler {\n // A field type builds its child fields through these, so it never imports the builder.\n const context = (path: DefinitionPath): BuildContext => ({\n path,\n buildFields: fields,\n buildField: field,\n })\n\n function fields(list: readonly unknown[], path: DefinitionPath): FieldsSchema {\n const entries: v.ObjectEntries = {}\n const names = new Set<string>()\n list.forEach((raw, i) => {\n const checked = checkField(raw, [...path, i], registry, names, issues)\n if (checked?.name) entries[checked.name] = build(checked)\n })\n return v.object(entries)\n }\n\n function field(raw: unknown, path: DefinitionPath): AnySchema {\n const checked = checkField(raw, path, registry, undefined, issues)\n // A field with issues gets no schema. build() throws before anything parses with it.\n return checked ? build(checked) : v.never()\n }\n\n function build(checked: CheckedField): AnySchema {\n const schema = buildFieldSchema(checked, messages, context(checked.path))\n checkDefault(checked, schema, issues)\n return schema\n }\n\n return { fields, field }\n}\n\n/** A default must be a value the field accepts. An empty one is the same as none. */\nfunction checkDefault(\n { field, kind, path }: CheckedField,\n schema: AnySchema,\n issues: DefinitionIssue[],\n): void {\n if (field.default === undefined || kind.isEmpty(field.default)) return\n const result = v.safeParse(schema, field.default)\n if (!result.success) {\n issues.push(...toIssues('invalid_default', [...path, 'default'], result.issues))\n }\n}\n","import { DefinitionError, type DefinitionIssue } from '../errors/definition-error'\nimport type { BuildContext } from '../field-types/field-type-def'\nimport type { Messages } from './build-field-schema'\nimport { type Compiler, createCompiler } from './compile-definition'\nimport { mergeRegistry } from './registry'\n\nconst messages: Messages = { required: 'Required', resolve: (text) => text }\n\n/**\n * A build context for testing a field type on its own, without a definition around it.\n * `buildFields` and `buildField` use the default registries and throw a `DefinitionError` when\n * the child fields have issues. `overrides` replaces any member, e.g. `path`.\n */\nexport function createBuildContext(overrides: Partial<BuildContext> = {}): BuildContext {\n const registry = mergeRegistry({})\n\n const run = <T>(compile: (compiler: Compiler) => T): T => {\n const issues: DefinitionIssue[] = []\n const result = compile(createCompiler(registry, messages, issues))\n if (issues.length) throw new DefinitionError(issues)\n return result\n }\n\n return {\n path: [],\n buildFields: (fields, path) => run((compiler) => compiler.fields(fields, path)),\n buildField: (field, path) => run((compiler) => compiler.field(field, path)),\n ...overrides,\n }\n}\n","import type { KindDef } from '../kinds/kind-def'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport type { MessageContext, Messages } from './build-field-schema'\nimport { compileDefinition } from './compile-definition'\nimport { mergeRegistry } from './registry'\nimport { 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 } = compileDefinition(json, registry, messages)\n return issues.length ? { success: false, issues } : { success: true, issues: [] }\n }\n\n function build(json: JsonForm) {\n const { issues, schema } = compileDefinition(json, registry, messages)\n if (issues.length) throw new DefinitionError(issues)\n return schema\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","import type { JsonField, JsonForm } from './json-form-schema'\n\n/**\n * Formisch's `initialInput` for a definition: each field's `default`, nested the way the value\n * is. A group gives an object, and an array without a default gives `[]`. Other fields without\n * a default are left out. Like `walkFields`, it reads the built-in `group` and `array` types\n * and needs no builder.\n */\nexport function getInitialInput(definition: JsonForm): Record<string, unknown> {\n return inputOf(definition.fields)\n}\n\nfunction inputOf(fields: readonly JsonField[]): Record<string, unknown> {\n const input: Record<string, unknown> = {}\n for (const field of fields) {\n if (field.name === undefined) continue\n const value = initialValue(field)\n if (value !== undefined) input[field.name] = value\n }\n return input\n}\n\nfunction initialValue(field: JsonField): unknown {\n if (field.type === 'group') return inputOf(Array.isArray(field.fields) ? field.fields : [])\n if (field.type === 'array') return field.default ?? []\n return field.default\n}\n","import type { DefinitionPath } from '../errors/definition-error'\nimport type { JsonField, JsonForm } from './json-form-schema'\n\n/** One field found by `walkFields`. */\nexport interface WalkedField {\n field: JsonField\n /** The field's type, e.g. `'text'`. */\n type: string\n /**\n * Where the field's value is, as a Formisch path: `['address', 'city']`. The items of an array\n * have no fixed index, so they have `'*'` in its place. A field without a name, like a\n * heading, has its parent's path.\n */\n dataPath: readonly (string | number)[]\n /** Where the field is in the definition: `['fields', 1, 'fields', 0]`. */\n definitionPath: DefinitionPath\n /** 0 for the form's own fields, 1 for the fields inside them, and so on. */\n depth: number\n}\n\n/**\n * Every field of a definition, at every depth, in document order. A group or an array comes\n * before its fields, and the fields of an array's items come once. It reads the built-in\n * `group` and `array` types and needs no builder, so it doesn't check the definition: run\n * `validate()` first.\n */\nexport function* walkFields(definition: JsonForm): Generator<WalkedField, void, undefined> {\n yield* walkList(definition.fields, ['fields'], [], 0)\n}\n\nfunction* walkList(\n fields: readonly JsonField[],\n at: DefinitionPath,\n dataPath: readonly (string | number)[],\n depth: number,\n): Generator<WalkedField, void, undefined> {\n for (const [i, field] of fields.entries()) {\n const path = field.name === undefined ? dataPath : [...dataPath, field.name]\n yield* walkField(field, [...at, i], path, depth)\n }\n}\n\nfunction* walkField(\n field: JsonField,\n definitionPath: DefinitionPath,\n dataPath: readonly (string | number)[],\n depth: number,\n): Generator<WalkedField, void, undefined> {\n yield { field, type: field.type, dataPath, definitionPath, depth }\n\n if (field.type === 'group' && Array.isArray(field.fields)) {\n yield* walkList(field.fields, [...definitionPath, 'fields'], dataPath, depth + 1)\n } else if (field.type === 'array') {\n const items = [...dataPath, '*']\n if (isField(field.of)) {\n // The field of a list of single values has no name: its value is the item itself.\n yield* walkField(field.of, [...definitionPath, 'of'], items, depth + 1)\n } else if (Array.isArray(field.fields)) {\n yield* walkList(field.fields, [...definitionPath, 'fields'], items, depth + 1)\n }\n }\n}\n\nconst isField = (value: unknown): value is JsonField =>\n typeof value === 'object' && value !== null && 'type' in value\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.0",
3
+ "version": "0.5.0",
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.0.0"
45
+ "valibot": "^1.3.0"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "tsdown",