@reckona/mreact-forms 0.0.66 → 0.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { cell, type ReadonlyCell } from \"@reckona/mreact-reactive-core\";\nimport { type StandardSchemaV1, validateStandardSchema } from \"./standard-schema.js\";\n\nexport type FormValues = Record<string, unknown>;\nexport type FieldName<TValues extends FormValues> = Extract<keyof TValues, string>;\nexport type FormErrors<TValues extends FormValues> = Partial<\n Record<FieldName<TValues> | \"root\", string[]>\n>;\nexport type FieldValidator<TValue, TValues extends FormValues> = (\n value: TValue,\n values: TValues,\n) => readonly string[] | string | undefined | Promise<readonly string[] | string | undefined>;\nexport type FormValidateMode = \"change\" | \"blur\" | \"submit\";\n\nexport interface FormState<TValues extends FormValues> {\n dirty: boolean;\n errors: FormErrors<TValues>;\n initialValues: TValues;\n submitCount: number;\n submitting: boolean;\n touched: Partial<Record<FieldName<TValues>, boolean>>;\n valid: boolean;\n validating: Partial<Record<FieldName<TValues>, boolean>>;\n values: TValues;\n}\n\nexport interface FieldState<TValue> {\n dirty: boolean;\n errors: string[];\n touched: boolean;\n validating: boolean;\n value: TValue;\n}\n\nexport interface FieldBinding<TValue> {\n onBlur(event: Event): Promise<void>;\n onChange(event: Event): Promise<void>;\n onInput(event: Event): Promise<void>;\n value: TValue;\n}\n\nexport interface FieldBindingOptions {\n event?: \"change\" | \"input\" | undefined;\n}\n\nexport interface FieldApi<TValues extends FormValues, Name extends FieldName<TValues>> {\n readonly state: ReadonlyCell<FieldState<TValues[Name]>>;\n bind(options?: FieldBindingOptions): FieldBinding<TValues[Name]>;\n blur(): Promise<void>;\n setValue(value: TValues[Name]): Promise<void>;\n}\n\ninterface BaseCreateFormOptions<TValues extends FormValues> {\n initialValues: TValues;\n validate?:\n | Partial<{\n [Name in FieldName<TValues>]: FieldValidator<TValues[Name], TValues>;\n }>\n | undefined;\n validateOn?: FormValidateMode | readonly FormValidateMode[] | undefined;\n}\n\nexport interface CreateFormOptionsWithoutSchema<TValues extends FormValues>\n extends BaseCreateFormOptions<TValues> {\n schema?: undefined;\n}\n\nexport interface CreateFormOptionsWithSchema<TValues extends FormValues, TSubmitValues>\n extends BaseCreateFormOptions<TValues> {\n schema: StandardSchemaV1<TValues, TSubmitValues>;\n}\n\nexport type CreateFormOptions<TValues extends FormValues, TSubmitValues = TValues> =\n | CreateFormOptionsWithoutSchema<TValues>\n | CreateFormOptionsWithSchema<TValues, TSubmitValues>;\n\nexport type FormValidationResult<TValues extends FormValues, TSubmitValues> =\n | {\n success: true;\n value: TSubmitValues;\n }\n | {\n errors: FormErrors<TValues>;\n success: false;\n };\n\nexport type FormSubmitResult<TValues extends FormValues, TResult> =\n | {\n data: TResult;\n status: \"success\";\n }\n | {\n errors: FormErrors<TValues>;\n status: \"invalid\";\n }\n | {\n error: unknown;\n status: \"error\";\n };\n\nexport interface ServerActionErrors<TValues extends FormValues> {\n fieldErrors?: Partial<Record<FieldName<TValues>, readonly string[]>> | undefined;\n formErrors?: readonly string[] | undefined;\n}\n\nexport interface FormApi<TValues extends FormValues, TSubmitValues> {\n readonly state: ReadonlyCell<FormState<TValues>>;\n field<Name extends FieldName<TValues>>(name: Name): FieldApi<TValues, Name>;\n getValues(): TValues;\n reset(values?: TValues): void;\n setErrors(errors: FormErrors<TValues>): void;\n setServerErrors(errors: ServerActionErrors<TValues>): void;\n setValue<Name extends FieldName<TValues>>(name: Name, value: TValues[Name]): Promise<void>;\n submit<TResult>(\n handler: (values: TSubmitValues) => Promise<TResult> | TResult,\n ): Promise<FormSubmitResult<TValues, TResult>>;\n validate(): Promise<FormValidationResult<TValues, TSubmitValues>>;\n}\n\nexport function createForm<TValues extends FormValues>(\n options: CreateFormOptionsWithoutSchema<TValues>,\n): FormApi<TValues, TValues>;\nexport function createForm<TValues extends FormValues, TSubmitValues>(\n options: CreateFormOptionsWithSchema<TValues, TSubmitValues>,\n): FormApi<TValues, TSubmitValues>;\nexport function createForm<TValues extends FormValues, TSubmitValues = TValues>(\n options: CreateFormOptions<TValues, TSubmitValues>,\n): FormApi<TValues, TSubmitValues> {\n const validateOn = new Set(\n Array.isArray(options.validateOn) ? options.validateOn : [options.validateOn ?? \"submit\"],\n );\n let initialValues = cloneValues(options.initialValues);\n const state = cell<FormState<TValues>>({\n dirty: false,\n errors: {},\n initialValues,\n submitCount: 0,\n submitting: false,\n touched: {},\n valid: true,\n validating: {},\n values: cloneValues(options.initialValues),\n });\n const validationGenerations = new Map<FieldName<TValues>, number>();\n\n function commit(patch: Partial<FormState<TValues>>): void {\n const previous = state.get();\n const next = {\n ...previous,\n ...patch,\n };\n next.dirty = isDirty(next.values, next.initialValues);\n next.valid = hasNoErrors(next.errors);\n state.set(next);\n }\n\n function setErrors(errors: FormErrors<TValues>): void {\n commit({ errors: normalizeErrors(errors) });\n }\n\n async function validateField<Name extends FieldName<TValues>>(name: Name): Promise<void> {\n const validator = options.validate?.[name];\n const generation = (validationGenerations.get(name) ?? 0) + 1;\n validationGenerations.set(name, generation);\n\n if (validator === undefined) {\n setFieldErrors(name, []);\n setFieldValidating(name, false);\n return;\n }\n\n const values = state.get().values;\n setFieldValidating(name, true);\n const errors = await validator(values[name], values);\n\n if (validationGenerations.get(name) !== generation) {\n return;\n }\n\n setFieldErrors(name, normalizeFieldErrors(errors));\n setFieldValidating(name, false);\n }\n\n function setFieldErrors<Name extends FieldName<TValues>>(\n name: Name,\n errors: readonly string[],\n ): void {\n const current = state.get().errors;\n setErrors({\n ...current,\n [name]: [...errors],\n } as FormErrors<TValues>);\n }\n\n function setFieldValidating<Name extends FieldName<TValues>>(\n name: Name,\n validating: boolean,\n ): void {\n const current = state.get().validating;\n commit({\n validating: {\n ...current,\n [name]: validating,\n },\n });\n }\n\n async function setValue<Name extends FieldName<TValues>>(\n name: Name,\n value: TValues[Name],\n ): Promise<void> {\n commit({\n values: {\n ...state.get().values,\n [name]: value,\n },\n });\n\n if (validateOn.has(\"change\")) {\n await validateField(name);\n }\n }\n\n async function blurField<Name extends FieldName<TValues>>(name: Name): Promise<void> {\n commit({\n touched: {\n ...state.get().touched,\n [name]: true,\n },\n });\n\n if (validateOn.has(\"blur\")) {\n await validateField(name);\n }\n }\n\n return {\n state,\n field<Name extends FieldName<TValues>>(name: Name): FieldApi<TValues, Name> {\n return {\n state: {\n get: () => fieldState(state.get(), name),\n },\n bind() {\n return {\n onBlur: async () => {\n await blurField(name);\n },\n onChange: async (event) => {\n await setValue(name, eventValue(event, state.get().values[name]) as TValues[Name]);\n },\n onInput: async (event) => {\n await setValue(name, eventValue(event, state.get().values[name]) as TValues[Name]);\n },\n value: state.get().values[name],\n };\n },\n async blur() {\n await blurField(name);\n },\n setValue: (value) => setValue(name, value),\n };\n },\n getValues() {\n return state.get().values;\n },\n reset(values = initialValues): void {\n for (const name of Object.keys(options.validate ?? {}) as Array<FieldName<TValues>>) {\n validationGenerations.set(name, (validationGenerations.get(name) ?? 0) + 1);\n }\n\n initialValues = cloneValues(values);\n commit({\n errors: {},\n initialValues,\n submitCount: 0,\n submitting: false,\n touched: {},\n validating: {},\n values: cloneValues(values),\n });\n },\n setErrors,\n setServerErrors(errors): void {\n const next: FormErrors<TValues> = {};\n\n for (const [name, messages] of Object.entries(errors.fieldErrors ?? {})) {\n if (messages !== undefined && messages.length > 0) {\n next[name as FieldName<TValues>] = [...messages];\n }\n }\n\n if (errors.formErrors !== undefined && errors.formErrors.length > 0) {\n next.root = [...errors.formErrors];\n }\n\n setErrors(next);\n },\n setValue,\n async submit<TResult>(\n handler: (values: TSubmitValues) => Promise<TResult> | TResult,\n ): Promise<FormSubmitResult<TValues, TResult>> {\n commit({\n submitCount: state.get().submitCount + 1,\n submitting: true,\n });\n\n const validation = await this.validate();\n\n if (!validation.success) {\n commit({ submitting: false });\n return {\n errors: validation.errors,\n status: \"invalid\",\n };\n }\n\n try {\n const data = await handler(validation.value);\n commit({ submitting: false });\n return {\n data,\n status: \"success\",\n };\n } catch (error) {\n commit({ submitting: false });\n return {\n error,\n status: \"error\",\n };\n }\n },\n async validate(): Promise<FormValidationResult<TValues, TSubmitValues>> {\n const values = state.get().values;\n const errors: FormErrors<TValues> = {};\n\n for (const name of Object.keys(options.validate ?? {}) as Array<FieldName<TValues>>) {\n const validator = options.validate?.[name];\n if (validator === undefined) {\n continue;\n }\n const fieldErrors = normalizeFieldErrors(await validator(values[name], values));\n if (fieldErrors.length > 0) {\n errors[name] = fieldErrors;\n }\n }\n\n if (options.schema !== undefined) {\n const result = await validateStandardSchema(options.schema, values);\n\n if (!result.success) {\n mergeIssueErrors(errors, result.issues);\n } else if (Object.keys(errors).length === 0) {\n setErrors({});\n return {\n success: true,\n value: result.value as TSubmitValues,\n };\n }\n }\n\n if (Object.keys(errors).length > 0) {\n setErrors(errors);\n return {\n errors,\n success: false,\n };\n }\n\n setErrors({});\n return {\n success: true,\n value: values as TValues & TSubmitValues,\n };\n },\n };\n}\n\nfunction fieldState<TValues extends FormValues, Name extends FieldName<TValues>>(\n formState: FormState<TValues>,\n name: Name,\n): FieldState<TValues[Name]> {\n return {\n dirty: !Object.is(formState.values[name], formState.initialValues[name]),\n errors: [...(formState.errors[name] ?? [])],\n touched: formState.touched[name] === true,\n validating: formState.validating[name] === true,\n value: formState.values[name],\n };\n}\n\nfunction eventValue(event: Event, currentValue: unknown): unknown {\n const target = event.currentTarget ?? event.target;\n\n if (target !== null && typeof target === \"object\") {\n if (typeof currentValue === \"boolean\" && \"checked\" in target) {\n return Boolean((target as { checked: unknown }).checked);\n }\n\n if (\"value\" in target) {\n return (target as { value: unknown }).value;\n }\n }\n\n return currentValue;\n}\n\nfunction mergeIssueErrors<TValues extends FormValues>(\n errors: FormErrors<TValues>,\n issues: ReadonlyArray<StandardSchemaV1.Issue>,\n): void {\n for (const issue of issues) {\n const key = issuePathKey(issue.path);\n const name = (key ?? \"root\") as FieldName<TValues> | \"root\";\n errors[name] = [...(errors[name] ?? []), issue.message];\n }\n}\n\nfunction issuePathKey(\n path: ReadonlyArray<PropertyKey | StandardSchemaV1.PathSegment> | undefined,\n): string | undefined {\n const first = path?.[0];\n\n if (first === undefined) {\n return undefined;\n }\n\n return typeof first === \"object\" && first !== null && \"key\" in first\n ? String(first.key)\n : String(first);\n}\n\nfunction normalizeErrors<TValues extends FormValues>(\n errors: FormErrors<TValues>,\n): FormErrors<TValues> {\n return Object.fromEntries(\n Object.entries(errors).flatMap(([name, messages]) =>\n messages === undefined || messages.length === 0 ? [] : [[name, [...messages]]],\n ),\n ) as FormErrors<TValues>;\n}\n\nfunction hasNoErrors<TValues extends FormValues>(errors: FormErrors<TValues>): boolean {\n return (Object.values(errors) as Array<string[] | undefined>).every(\n (messages) => messages === undefined || messages.length === 0,\n );\n}\n\nfunction normalizeFieldErrors(errors: readonly string[] | string | undefined): string[] {\n if (errors === undefined) {\n return [];\n }\n\n return typeof errors === \"string\" ? [errors] : [...errors];\n}\n\nfunction isDirty<TValues extends FormValues>(values: TValues, initialValues: TValues): boolean {\n return Object.keys(values).some((key) => !Object.is(values[key], initialValues[key]));\n}\n\nfunction cloneValues<TValues extends FormValues>(values: TValues): TValues {\n return { ...values };\n}\n\nexport type {\n InferStandardSchemaInput,\n InferStandardSchemaOutput,\n StandardSchemaV1,\n} from \"./standard-schema.js\";\nexport { validateStandardSchema } from \"./standard-schema.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../src/standard-schema.ts"],"names":[],"mappings":"AAuEA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS;QAChC,CAAC,CAAC;YACE,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,MAAM,CAAC,KAA0C;SACzD;QACH,CAAC,CAAC;YACE,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,KAAK;SACf,CAAC;AACR,CAAC"}
1
+ {"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../src/standard-schema.ts"],"names":[],"mappings":"AAuEA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS;QAChC,CAAC,CAAC;YACE,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,MAAM,CAAC,KAA0C;SACzD;QACH,CAAC,CAAC;YACE,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,KAAK;SACf,CAAC;AACR,CAAC","sourcesContent":["export interface StandardSchemaV1<Input = unknown, Output = Input> {\n readonly \"~standard\": StandardSchemaV1.Props<Input, Output>;\n}\n\nexport namespace StandardSchemaV1 {\n export interface Props<Input = unknown, Output = Input> {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n options?: Options | undefined,\n ) => Result<Output> | Promise<Result<Output>>;\n readonly types?: Types<Input, Output> | undefined;\n }\n\n export interface Options {\n readonly libraryOptions?: Record<string, unknown> | undefined;\n }\n\n export type Result<Output> = SuccessResult<Output> | FailureResult;\n\n export interface SuccessResult<Output> {\n readonly value: Output;\n readonly issues?: undefined;\n }\n\n export interface FailureResult {\n readonly issues: ReadonlyArray<Issue>;\n }\n\n export interface Issue {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;\n }\n\n export interface PathSegment {\n readonly key: PropertyKey;\n }\n\n export interface Types<Input = unknown, Output = Input> {\n readonly input: Input;\n readonly output: Output;\n }\n}\n\nexport type InferStandardSchemaInput<Schema> = Schema extends {\n readonly \"~standard\": { readonly types?: (infer Types) | undefined };\n}\n ? NonNullable<Types> extends { readonly input: infer Input }\n ? Input\n : never\n : never;\n\nexport type InferStandardSchemaOutput<Schema> = Schema extends {\n readonly \"~standard\": { readonly types?: (infer Types) | undefined };\n}\n ? NonNullable<Types> extends { readonly output: infer Output }\n ? Output\n : never\n : never;\n\nexport type StandardSchemaValidationResult<Output> =\n | {\n success: true;\n value: Output;\n }\n | {\n issues: ReadonlyArray<StandardSchemaV1.Issue>;\n success: false;\n };\n\nexport async function validateStandardSchema<Schema extends StandardSchemaV1>(\n schema: Schema,\n value: unknown,\n): Promise<StandardSchemaValidationResult<InferStandardSchemaOutput<Schema>>> {\n const result = await schema[\"~standard\"].validate(value);\n\n return result.issues === undefined\n ? {\n success: true,\n value: result.value as InferStandardSchemaOutput<Schema>,\n }\n : {\n issues: result.issues,\n success: false,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reckona/mreact-forms",
3
- "version": "0.0.66",
3
+ "version": "0.0.68",
4
4
  "description": "Reactive form state and validation utilities for mreact.",
5
5
  "keywords": [
6
6
  "forms",
@@ -24,7 +24,8 @@
24
24
  "dist/**/*.js",
25
25
  "dist/**/*.js.map",
26
26
  "dist/**/*.d.ts",
27
- "dist/**/*.d.ts.map"
27
+ "dist/**/*.d.ts.map",
28
+ "src/**/*"
28
29
  ],
29
30
  "type": "module",
30
31
  "sideEffects": false,
@@ -43,6 +44,6 @@
43
44
  "access": "public"
44
45
  },
45
46
  "dependencies": {
46
- "@reckona/mreact-reactive-core": "0.0.66"
47
+ "@reckona/mreact-reactive-core": "0.0.68"
47
48
  }
48
49
  }
package/src/index.ts ADDED
@@ -0,0 +1,470 @@
1
+ import { cell, type ReadonlyCell } from "@reckona/mreact-reactive-core";
2
+ import { type StandardSchemaV1, validateStandardSchema } from "./standard-schema.js";
3
+
4
+ export type FormValues = Record<string, unknown>;
5
+ export type FieldName<TValues extends FormValues> = Extract<keyof TValues, string>;
6
+ export type FormErrors<TValues extends FormValues> = Partial<
7
+ Record<FieldName<TValues> | "root", string[]>
8
+ >;
9
+ export type FieldValidator<TValue, TValues extends FormValues> = (
10
+ value: TValue,
11
+ values: TValues,
12
+ ) => readonly string[] | string | undefined | Promise<readonly string[] | string | undefined>;
13
+ export type FormValidateMode = "change" | "blur" | "submit";
14
+
15
+ export interface FormState<TValues extends FormValues> {
16
+ dirty: boolean;
17
+ errors: FormErrors<TValues>;
18
+ initialValues: TValues;
19
+ submitCount: number;
20
+ submitting: boolean;
21
+ touched: Partial<Record<FieldName<TValues>, boolean>>;
22
+ valid: boolean;
23
+ validating: Partial<Record<FieldName<TValues>, boolean>>;
24
+ values: TValues;
25
+ }
26
+
27
+ export interface FieldState<TValue> {
28
+ dirty: boolean;
29
+ errors: string[];
30
+ touched: boolean;
31
+ validating: boolean;
32
+ value: TValue;
33
+ }
34
+
35
+ export interface FieldBinding<TValue> {
36
+ onBlur(event: Event): Promise<void>;
37
+ onChange(event: Event): Promise<void>;
38
+ onInput(event: Event): Promise<void>;
39
+ value: TValue;
40
+ }
41
+
42
+ export interface FieldBindingOptions {
43
+ event?: "change" | "input" | undefined;
44
+ }
45
+
46
+ export interface FieldApi<TValues extends FormValues, Name extends FieldName<TValues>> {
47
+ readonly state: ReadonlyCell<FieldState<TValues[Name]>>;
48
+ bind(options?: FieldBindingOptions): FieldBinding<TValues[Name]>;
49
+ blur(): Promise<void>;
50
+ setValue(value: TValues[Name]): Promise<void>;
51
+ }
52
+
53
+ interface BaseCreateFormOptions<TValues extends FormValues> {
54
+ initialValues: TValues;
55
+ validate?:
56
+ | Partial<{
57
+ [Name in FieldName<TValues>]: FieldValidator<TValues[Name], TValues>;
58
+ }>
59
+ | undefined;
60
+ validateOn?: FormValidateMode | readonly FormValidateMode[] | undefined;
61
+ }
62
+
63
+ export interface CreateFormOptionsWithoutSchema<TValues extends FormValues>
64
+ extends BaseCreateFormOptions<TValues> {
65
+ schema?: undefined;
66
+ }
67
+
68
+ export interface CreateFormOptionsWithSchema<TValues extends FormValues, TSubmitValues>
69
+ extends BaseCreateFormOptions<TValues> {
70
+ schema: StandardSchemaV1<TValues, TSubmitValues>;
71
+ }
72
+
73
+ export type CreateFormOptions<TValues extends FormValues, TSubmitValues = TValues> =
74
+ | CreateFormOptionsWithoutSchema<TValues>
75
+ | CreateFormOptionsWithSchema<TValues, TSubmitValues>;
76
+
77
+ export type FormValidationResult<TValues extends FormValues, TSubmitValues> =
78
+ | {
79
+ success: true;
80
+ value: TSubmitValues;
81
+ }
82
+ | {
83
+ errors: FormErrors<TValues>;
84
+ success: false;
85
+ };
86
+
87
+ export type FormSubmitResult<TValues extends FormValues, TResult> =
88
+ | {
89
+ data: TResult;
90
+ status: "success";
91
+ }
92
+ | {
93
+ errors: FormErrors<TValues>;
94
+ status: "invalid";
95
+ }
96
+ | {
97
+ error: unknown;
98
+ status: "error";
99
+ };
100
+
101
+ export interface ServerActionErrors<TValues extends FormValues> {
102
+ fieldErrors?: Partial<Record<FieldName<TValues>, readonly string[]>> | undefined;
103
+ formErrors?: readonly string[] | undefined;
104
+ }
105
+
106
+ export interface FormApi<TValues extends FormValues, TSubmitValues> {
107
+ readonly state: ReadonlyCell<FormState<TValues>>;
108
+ field<Name extends FieldName<TValues>>(name: Name): FieldApi<TValues, Name>;
109
+ getValues(): TValues;
110
+ reset(values?: TValues): void;
111
+ setErrors(errors: FormErrors<TValues>): void;
112
+ setServerErrors(errors: ServerActionErrors<TValues>): void;
113
+ setValue<Name extends FieldName<TValues>>(name: Name, value: TValues[Name]): Promise<void>;
114
+ submit<TResult>(
115
+ handler: (values: TSubmitValues) => Promise<TResult> | TResult,
116
+ ): Promise<FormSubmitResult<TValues, TResult>>;
117
+ validate(): Promise<FormValidationResult<TValues, TSubmitValues>>;
118
+ }
119
+
120
+ export function createForm<TValues extends FormValues>(
121
+ options: CreateFormOptionsWithoutSchema<TValues>,
122
+ ): FormApi<TValues, TValues>;
123
+ export function createForm<TValues extends FormValues, TSubmitValues>(
124
+ options: CreateFormOptionsWithSchema<TValues, TSubmitValues>,
125
+ ): FormApi<TValues, TSubmitValues>;
126
+ export function createForm<TValues extends FormValues, TSubmitValues = TValues>(
127
+ options: CreateFormOptions<TValues, TSubmitValues>,
128
+ ): FormApi<TValues, TSubmitValues> {
129
+ const validateOn = new Set(
130
+ Array.isArray(options.validateOn) ? options.validateOn : [options.validateOn ?? "submit"],
131
+ );
132
+ let initialValues = cloneValues(options.initialValues);
133
+ const state = cell<FormState<TValues>>({
134
+ dirty: false,
135
+ errors: {},
136
+ initialValues,
137
+ submitCount: 0,
138
+ submitting: false,
139
+ touched: {},
140
+ valid: true,
141
+ validating: {},
142
+ values: cloneValues(options.initialValues),
143
+ });
144
+ const validationGenerations = new Map<FieldName<TValues>, number>();
145
+
146
+ function commit(patch: Partial<FormState<TValues>>): void {
147
+ const previous = state.get();
148
+ const next = {
149
+ ...previous,
150
+ ...patch,
151
+ };
152
+ next.dirty = isDirty(next.values, next.initialValues);
153
+ next.valid = hasNoErrors(next.errors);
154
+ state.set(next);
155
+ }
156
+
157
+ function setErrors(errors: FormErrors<TValues>): void {
158
+ commit({ errors: normalizeErrors(errors) });
159
+ }
160
+
161
+ async function validateField<Name extends FieldName<TValues>>(name: Name): Promise<void> {
162
+ const validator = options.validate?.[name];
163
+ const generation = (validationGenerations.get(name) ?? 0) + 1;
164
+ validationGenerations.set(name, generation);
165
+
166
+ if (validator === undefined) {
167
+ setFieldErrors(name, []);
168
+ setFieldValidating(name, false);
169
+ return;
170
+ }
171
+
172
+ const values = state.get().values;
173
+ setFieldValidating(name, true);
174
+ const errors = await validator(values[name], values);
175
+
176
+ if (validationGenerations.get(name) !== generation) {
177
+ return;
178
+ }
179
+
180
+ setFieldErrors(name, normalizeFieldErrors(errors));
181
+ setFieldValidating(name, false);
182
+ }
183
+
184
+ function setFieldErrors<Name extends FieldName<TValues>>(
185
+ name: Name,
186
+ errors: readonly string[],
187
+ ): void {
188
+ const current = state.get().errors;
189
+ setErrors({
190
+ ...current,
191
+ [name]: [...errors],
192
+ } as FormErrors<TValues>);
193
+ }
194
+
195
+ function setFieldValidating<Name extends FieldName<TValues>>(
196
+ name: Name,
197
+ validating: boolean,
198
+ ): void {
199
+ const current = state.get().validating;
200
+ commit({
201
+ validating: {
202
+ ...current,
203
+ [name]: validating,
204
+ },
205
+ });
206
+ }
207
+
208
+ async function setValue<Name extends FieldName<TValues>>(
209
+ name: Name,
210
+ value: TValues[Name],
211
+ ): Promise<void> {
212
+ commit({
213
+ values: {
214
+ ...state.get().values,
215
+ [name]: value,
216
+ },
217
+ });
218
+
219
+ if (validateOn.has("change")) {
220
+ await validateField(name);
221
+ }
222
+ }
223
+
224
+ async function blurField<Name extends FieldName<TValues>>(name: Name): Promise<void> {
225
+ commit({
226
+ touched: {
227
+ ...state.get().touched,
228
+ [name]: true,
229
+ },
230
+ });
231
+
232
+ if (validateOn.has("blur")) {
233
+ await validateField(name);
234
+ }
235
+ }
236
+
237
+ return {
238
+ state,
239
+ field<Name extends FieldName<TValues>>(name: Name): FieldApi<TValues, Name> {
240
+ return {
241
+ state: {
242
+ get: () => fieldState(state.get(), name),
243
+ },
244
+ bind() {
245
+ return {
246
+ onBlur: async () => {
247
+ await blurField(name);
248
+ },
249
+ onChange: async (event) => {
250
+ await setValue(name, eventValue(event, state.get().values[name]) as TValues[Name]);
251
+ },
252
+ onInput: async (event) => {
253
+ await setValue(name, eventValue(event, state.get().values[name]) as TValues[Name]);
254
+ },
255
+ value: state.get().values[name],
256
+ };
257
+ },
258
+ async blur() {
259
+ await blurField(name);
260
+ },
261
+ setValue: (value) => setValue(name, value),
262
+ };
263
+ },
264
+ getValues() {
265
+ return state.get().values;
266
+ },
267
+ reset(values = initialValues): void {
268
+ for (const name of Object.keys(options.validate ?? {}) as Array<FieldName<TValues>>) {
269
+ validationGenerations.set(name, (validationGenerations.get(name) ?? 0) + 1);
270
+ }
271
+
272
+ initialValues = cloneValues(values);
273
+ commit({
274
+ errors: {},
275
+ initialValues,
276
+ submitCount: 0,
277
+ submitting: false,
278
+ touched: {},
279
+ validating: {},
280
+ values: cloneValues(values),
281
+ });
282
+ },
283
+ setErrors,
284
+ setServerErrors(errors): void {
285
+ const next: FormErrors<TValues> = {};
286
+
287
+ for (const [name, messages] of Object.entries(errors.fieldErrors ?? {})) {
288
+ if (messages !== undefined && messages.length > 0) {
289
+ next[name as FieldName<TValues>] = [...messages];
290
+ }
291
+ }
292
+
293
+ if (errors.formErrors !== undefined && errors.formErrors.length > 0) {
294
+ next.root = [...errors.formErrors];
295
+ }
296
+
297
+ setErrors(next);
298
+ },
299
+ setValue,
300
+ async submit<TResult>(
301
+ handler: (values: TSubmitValues) => Promise<TResult> | TResult,
302
+ ): Promise<FormSubmitResult<TValues, TResult>> {
303
+ commit({
304
+ submitCount: state.get().submitCount + 1,
305
+ submitting: true,
306
+ });
307
+
308
+ const validation = await this.validate();
309
+
310
+ if (!validation.success) {
311
+ commit({ submitting: false });
312
+ return {
313
+ errors: validation.errors,
314
+ status: "invalid",
315
+ };
316
+ }
317
+
318
+ try {
319
+ const data = await handler(validation.value);
320
+ commit({ submitting: false });
321
+ return {
322
+ data,
323
+ status: "success",
324
+ };
325
+ } catch (error) {
326
+ commit({ submitting: false });
327
+ return {
328
+ error,
329
+ status: "error",
330
+ };
331
+ }
332
+ },
333
+ async validate(): Promise<FormValidationResult<TValues, TSubmitValues>> {
334
+ const values = state.get().values;
335
+ const errors: FormErrors<TValues> = {};
336
+
337
+ for (const name of Object.keys(options.validate ?? {}) as Array<FieldName<TValues>>) {
338
+ const validator = options.validate?.[name];
339
+ if (validator === undefined) {
340
+ continue;
341
+ }
342
+ const fieldErrors = normalizeFieldErrors(await validator(values[name], values));
343
+ if (fieldErrors.length > 0) {
344
+ errors[name] = fieldErrors;
345
+ }
346
+ }
347
+
348
+ if (options.schema !== undefined) {
349
+ const result = await validateStandardSchema(options.schema, values);
350
+
351
+ if (!result.success) {
352
+ mergeIssueErrors(errors, result.issues);
353
+ } else if (Object.keys(errors).length === 0) {
354
+ setErrors({});
355
+ return {
356
+ success: true,
357
+ value: result.value as TSubmitValues,
358
+ };
359
+ }
360
+ }
361
+
362
+ if (Object.keys(errors).length > 0) {
363
+ setErrors(errors);
364
+ return {
365
+ errors,
366
+ success: false,
367
+ };
368
+ }
369
+
370
+ setErrors({});
371
+ return {
372
+ success: true,
373
+ value: values as TValues & TSubmitValues,
374
+ };
375
+ },
376
+ };
377
+ }
378
+
379
+ function fieldState<TValues extends FormValues, Name extends FieldName<TValues>>(
380
+ formState: FormState<TValues>,
381
+ name: Name,
382
+ ): FieldState<TValues[Name]> {
383
+ return {
384
+ dirty: !Object.is(formState.values[name], formState.initialValues[name]),
385
+ errors: [...(formState.errors[name] ?? [])],
386
+ touched: formState.touched[name] === true,
387
+ validating: formState.validating[name] === true,
388
+ value: formState.values[name],
389
+ };
390
+ }
391
+
392
+ function eventValue(event: Event, currentValue: unknown): unknown {
393
+ const target = event.currentTarget ?? event.target;
394
+
395
+ if (target !== null && typeof target === "object") {
396
+ if (typeof currentValue === "boolean" && "checked" in target) {
397
+ return Boolean((target as { checked: unknown }).checked);
398
+ }
399
+
400
+ if ("value" in target) {
401
+ return (target as { value: unknown }).value;
402
+ }
403
+ }
404
+
405
+ return currentValue;
406
+ }
407
+
408
+ function mergeIssueErrors<TValues extends FormValues>(
409
+ errors: FormErrors<TValues>,
410
+ issues: ReadonlyArray<StandardSchemaV1.Issue>,
411
+ ): void {
412
+ for (const issue of issues) {
413
+ const key = issuePathKey(issue.path);
414
+ const name = (key ?? "root") as FieldName<TValues> | "root";
415
+ errors[name] = [...(errors[name] ?? []), issue.message];
416
+ }
417
+ }
418
+
419
+ function issuePathKey(
420
+ path: ReadonlyArray<PropertyKey | StandardSchemaV1.PathSegment> | undefined,
421
+ ): string | undefined {
422
+ const first = path?.[0];
423
+
424
+ if (first === undefined) {
425
+ return undefined;
426
+ }
427
+
428
+ return typeof first === "object" && first !== null && "key" in first
429
+ ? String(first.key)
430
+ : String(first);
431
+ }
432
+
433
+ function normalizeErrors<TValues extends FormValues>(
434
+ errors: FormErrors<TValues>,
435
+ ): FormErrors<TValues> {
436
+ return Object.fromEntries(
437
+ Object.entries(errors).flatMap(([name, messages]) =>
438
+ messages === undefined || messages.length === 0 ? [] : [[name, [...messages]]],
439
+ ),
440
+ ) as FormErrors<TValues>;
441
+ }
442
+
443
+ function hasNoErrors<TValues extends FormValues>(errors: FormErrors<TValues>): boolean {
444
+ return (Object.values(errors) as Array<string[] | undefined>).every(
445
+ (messages) => messages === undefined || messages.length === 0,
446
+ );
447
+ }
448
+
449
+ function normalizeFieldErrors(errors: readonly string[] | string | undefined): string[] {
450
+ if (errors === undefined) {
451
+ return [];
452
+ }
453
+
454
+ return typeof errors === "string" ? [errors] : [...errors];
455
+ }
456
+
457
+ function isDirty<TValues extends FormValues>(values: TValues, initialValues: TValues): boolean {
458
+ return Object.keys(values).some((key) => !Object.is(values[key], initialValues[key]));
459
+ }
460
+
461
+ function cloneValues<TValues extends FormValues>(values: TValues): TValues {
462
+ return { ...values };
463
+ }
464
+
465
+ export type {
466
+ InferStandardSchemaInput,
467
+ InferStandardSchemaOutput,
468
+ StandardSchemaV1,
469
+ } from "./standard-schema.js";
470
+ export { validateStandardSchema } from "./standard-schema.js";
@@ -0,0 +1,87 @@
1
+ export interface StandardSchemaV1<Input = unknown, Output = Input> {
2
+ readonly "~standard": StandardSchemaV1.Props<Input, Output>;
3
+ }
4
+
5
+ export namespace StandardSchemaV1 {
6
+ export interface Props<Input = unknown, Output = Input> {
7
+ readonly version: 1;
8
+ readonly vendor: string;
9
+ readonly validate: (
10
+ value: unknown,
11
+ options?: Options | undefined,
12
+ ) => Result<Output> | Promise<Result<Output>>;
13
+ readonly types?: Types<Input, Output> | undefined;
14
+ }
15
+
16
+ export interface Options {
17
+ readonly libraryOptions?: Record<string, unknown> | undefined;
18
+ }
19
+
20
+ export type Result<Output> = SuccessResult<Output> | FailureResult;
21
+
22
+ export interface SuccessResult<Output> {
23
+ readonly value: Output;
24
+ readonly issues?: undefined;
25
+ }
26
+
27
+ export interface FailureResult {
28
+ readonly issues: ReadonlyArray<Issue>;
29
+ }
30
+
31
+ export interface Issue {
32
+ readonly message: string;
33
+ readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
34
+ }
35
+
36
+ export interface PathSegment {
37
+ readonly key: PropertyKey;
38
+ }
39
+
40
+ export interface Types<Input = unknown, Output = Input> {
41
+ readonly input: Input;
42
+ readonly output: Output;
43
+ }
44
+ }
45
+
46
+ export type InferStandardSchemaInput<Schema> = Schema extends {
47
+ readonly "~standard": { readonly types?: (infer Types) | undefined };
48
+ }
49
+ ? NonNullable<Types> extends { readonly input: infer Input }
50
+ ? Input
51
+ : never
52
+ : never;
53
+
54
+ export type InferStandardSchemaOutput<Schema> = Schema extends {
55
+ readonly "~standard": { readonly types?: (infer Types) | undefined };
56
+ }
57
+ ? NonNullable<Types> extends { readonly output: infer Output }
58
+ ? Output
59
+ : never
60
+ : never;
61
+
62
+ export type StandardSchemaValidationResult<Output> =
63
+ | {
64
+ success: true;
65
+ value: Output;
66
+ }
67
+ | {
68
+ issues: ReadonlyArray<StandardSchemaV1.Issue>;
69
+ success: false;
70
+ };
71
+
72
+ export async function validateStandardSchema<Schema extends StandardSchemaV1>(
73
+ schema: Schema,
74
+ value: unknown,
75
+ ): Promise<StandardSchemaValidationResult<InferStandardSchemaOutput<Schema>>> {
76
+ const result = await schema["~standard"].validate(value);
77
+
78
+ return result.issues === undefined
79
+ ? {
80
+ success: true,
81
+ value: result.value as InferStandardSchemaOutput<Schema>,
82
+ }
83
+ : {
84
+ issues: result.issues,
85
+ success: false,
86
+ };
87
+ }