@tanstack/react-form 0.42.0 → 0.43.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/dist/cjs/nextjs/createServerValidate.cjs +18 -10
- package/dist/cjs/nextjs/createServerValidate.cjs.map +1 -1
- package/dist/cjs/nextjs/createServerValidate.d.cts +5 -9
- package/dist/cjs/nextjs/error.cjs.map +1 -1
- package/dist/cjs/nextjs/error.d.cts +6 -5
- package/dist/cjs/nextjs/types.d.cts +2 -2
- package/dist/cjs/remix/createServerValidate.cjs +18 -10
- package/dist/cjs/remix/createServerValidate.cjs.map +1 -1
- package/dist/cjs/remix/createServerValidate.d.cts +5 -9
- package/dist/cjs/remix/error.cjs.map +1 -1
- package/dist/cjs/remix/error.d.cts +6 -5
- package/dist/cjs/remix/types.d.cts +2 -2
- package/dist/cjs/start/createServerValidate.cjs +21 -12
- package/dist/cjs/start/createServerValidate.cjs.map +1 -1
- package/dist/cjs/start/createServerValidate.d.cts +4 -10
- package/dist/cjs/start/error.cjs.map +1 -1
- package/dist/cjs/start/error.d.cts +6 -5
- package/dist/cjs/start/getFormData.cjs +4 -5
- package/dist/cjs/start/getFormData.cjs.map +1 -1
- package/dist/cjs/start/getFormData.d.cts +2 -3
- package/dist/cjs/start/types.d.cts +2 -2
- package/dist/cjs/types.d.cts +2 -2
- package/dist/cjs/useField.cjs.map +1 -1
- package/dist/cjs/useField.d.cts +10 -10
- package/dist/cjs/useForm.cjs.map +1 -1
- package/dist/cjs/useForm.d.cts +7 -7
- package/dist/cjs/useTransform.cjs.map +1 -1
- package/dist/cjs/useTransform.d.cts +2 -2
- package/dist/esm/nextjs/createServerValidate.d.ts +5 -9
- package/dist/esm/nextjs/createServerValidate.js +18 -10
- package/dist/esm/nextjs/createServerValidate.js.map +1 -1
- package/dist/esm/nextjs/error.d.ts +6 -5
- package/dist/esm/nextjs/error.js.map +1 -1
- package/dist/esm/nextjs/types.d.ts +2 -2
- package/dist/esm/remix/createServerValidate.d.ts +5 -9
- package/dist/esm/remix/createServerValidate.js +18 -10
- package/dist/esm/remix/createServerValidate.js.map +1 -1
- package/dist/esm/remix/error.d.ts +6 -5
- package/dist/esm/remix/error.js.map +1 -1
- package/dist/esm/remix/types.d.ts +2 -2
- package/dist/esm/start/createServerValidate.d.ts +4 -10
- package/dist/esm/start/createServerValidate.js +21 -12
- package/dist/esm/start/createServerValidate.js.map +1 -1
- package/dist/esm/start/error.d.ts +6 -5
- package/dist/esm/start/error.js.map +1 -1
- package/dist/esm/start/getFormData.d.ts +2 -3
- package/dist/esm/start/getFormData.js +4 -5
- package/dist/esm/start/getFormData.js.map +1 -1
- package/dist/esm/start/types.d.ts +2 -2
- package/dist/esm/types.d.ts +2 -2
- package/dist/esm/useField.d.ts +10 -10
- package/dist/esm/useField.js.map +1 -1
- package/dist/esm/useForm.d.ts +7 -7
- package/dist/esm/useForm.js.map +1 -1
- package/dist/esm/useTransform.d.ts +2 -2
- package/dist/esm/useTransform.js.map +1 -1
- package/package.json +17 -12
- package/src/nextjs/createServerValidate.ts +71 -43
- package/src/nextjs/error.ts +13 -6
- package/src/nextjs/types.ts +16 -3
- package/src/remix/createServerValidate.ts +71 -43
- package/src/remix/error.ts +13 -6
- package/src/remix/types.ts +16 -3
- package/src/start/createServerValidate.tsx +73 -47
- package/src/start/error.ts +13 -6
- package/src/start/getFormData.tsx +6 -6
- package/src/start/types.ts +16 -3
- package/src/types.ts +42 -12
- package/src/useField.tsx +295 -58
- package/src/useForm.tsx +132 -14
- package/src/useTransform.ts +38 -4
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const decodeFormdata = require("decode-formdata");
|
|
4
|
+
const formCore = require("@tanstack/form-core");
|
|
4
5
|
const error = require("./error.cjs");
|
|
5
|
-
const isFormValidationError = (error2) => {
|
|
6
|
-
return typeof error2 === "object";
|
|
7
|
-
};
|
|
8
6
|
const createServerValidate = (defaultOpts) => async (formData, info) => {
|
|
9
|
-
const {
|
|
10
|
-
const runValidator = async (
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
const { onServerValidate } = defaultOpts;
|
|
8
|
+
const runValidator = async ({
|
|
9
|
+
value,
|
|
10
|
+
validationSource
|
|
11
|
+
}) => {
|
|
12
|
+
if (formCore.isStandardSchemaValidator(onServerValidate)) {
|
|
13
|
+
return await formCore.standardSchemaValidators.validateAsync(
|
|
14
|
+
{ value, validationSource },
|
|
15
|
+
onServerValidate
|
|
16
|
+
);
|
|
13
17
|
}
|
|
14
|
-
return onServerValidate(
|
|
18
|
+
return onServerValidate({
|
|
19
|
+
value,
|
|
20
|
+
signal: void 0,
|
|
21
|
+
formApi: void 0
|
|
22
|
+
});
|
|
15
23
|
};
|
|
16
24
|
const values = decodeFormdata.decode(formData, info);
|
|
17
25
|
const onServerError = await runValidator({
|
|
@@ -19,13 +27,13 @@ const createServerValidate = (defaultOpts) => async (formData, info) => {
|
|
|
19
27
|
validationSource: "form"
|
|
20
28
|
});
|
|
21
29
|
if (!onServerError) return;
|
|
22
|
-
const
|
|
30
|
+
const onServerErrorVal = formCore.isGlobalFormValidationError(onServerError) ? onServerError.form : onServerError;
|
|
23
31
|
const formState = {
|
|
24
32
|
errorMap: {
|
|
25
33
|
onServer: onServerError
|
|
26
34
|
},
|
|
27
35
|
values,
|
|
28
|
-
errors:
|
|
36
|
+
errors: onServerErrorVal ? [onServerErrorVal] : []
|
|
29
37
|
};
|
|
30
38
|
throw new error.ServerValidateError({
|
|
31
39
|
formState
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServerValidate.cjs","sources":["../../../src/nextjs/createServerValidate.ts"],"sourcesContent":["import { decode } from 'decode-formdata'\nimport { ServerValidateError } from './error'\nimport type {\n FormOptions,\n
|
|
1
|
+
{"version":3,"file":"createServerValidate.cjs","sources":["../../../src/nextjs/createServerValidate.ts"],"sourcesContent":["import { decode } from 'decode-formdata'\nimport {\n isGlobalFormValidationError,\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from '@tanstack/form-core'\nimport { ServerValidateError } from './error'\nimport type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateAsyncFn,\n FormValidateOrFn,\n UnwrapFormAsyncValidateOrFn,\n} from '@tanstack/form-core'\nimport type { ServerFormState } from './types'\n\ninterface CreateServerValidateOptions<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n > {\n onServerValidate: TOnServer\n}\n\nexport const createServerValidate =\n <\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n >(\n defaultOpts: CreateServerValidateOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >,\n ) =>\n async (formData: FormData, info?: Parameters<typeof decode>[1]) => {\n const { onServerValidate } = defaultOpts\n\n const runValidator = async ({\n value,\n validationSource,\n }: {\n value: TFormData\n validationSource: 'form'\n }) => {\n if (isStandardSchemaValidator(onServerValidate)) {\n return await standardSchemaValidators.validateAsync(\n { value, validationSource },\n onServerValidate,\n )\n }\n return (onServerValidate as FormValidateAsyncFn<TFormData>)({\n value,\n signal: undefined as never,\n formApi: undefined as never,\n })\n }\n\n const values = decode(formData, info) as never as TFormData\n\n const onServerError = (await runValidator({\n value: values,\n validationSource: 'form',\n })) as UnwrapFormAsyncValidateOrFn<TOnServer> | undefined\n\n if (!onServerError) return\n\n const onServerErrorVal = (\n isGlobalFormValidationError(onServerError)\n ? onServerError.form\n : onServerError\n ) as UnwrapFormAsyncValidateOrFn<TOnServer>\n\n const formState: ServerFormState<TFormData, TOnServer> = {\n errorMap: {\n onServer: onServerError,\n },\n values,\n errors: onServerErrorVal ? [onServerErrorVal] : [],\n }\n\n throw new ServerValidateError({\n formState,\n })\n }\n\nexport const initialFormState: ServerFormState<any, undefined> = {\n errorMap: {\n onServer: undefined,\n },\n values: undefined,\n errors: [],\n}\n"],"names":["isStandardSchemaValidator","standardSchemaValidators","decode","isGlobalFormValidationError","ServerValidateError"],"mappings":";;;;;AAwCO,MAAM,uBACX,CAWE,gBAYF,OAAO,UAAoB,SAAwC;AAC3D,QAAA,EAAE,qBAAqB;AAE7B,QAAM,eAAe,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,EAAA,MAII;AACA,QAAAA,SAAAA,0BAA0B,gBAAgB,GAAG;AAC/C,aAAO,MAAMC,SAAyB,yBAAA;AAAA,QACpC,EAAE,OAAO,iBAAiB;AAAA,QAC1B;AAAA,MACF;AAAA,IAAA;AAEF,WAAQ,iBAAoD;AAAA,MAC1D;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEM,QAAA,SAASC,eAAAA,OAAO,UAAU,IAAI;AAE9B,QAAA,gBAAiB,MAAM,aAAa;AAAA,IACxC,OAAO;AAAA,IACP,kBAAkB;AAAA,EAAA,CACnB;AAED,MAAI,CAAC,cAAe;AAEpB,QAAM,mBACJC,SAAAA,4BAA4B,aAAa,IACrC,cAAc,OACd;AAGN,QAAM,YAAmD;AAAA,IACvD,UAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,IACA,QAAQ,mBAAmB,CAAC,gBAAgB,IAAI,CAAA;AAAA,EAClD;AAEA,QAAM,IAAIC,MAAAA,oBAAoB;AAAA,IAC5B;AAAA,EAAA,CACD;AACH;AAEK,MAAM,mBAAoD;AAAA,EAC/D,UAAU;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ,CAAA;AACV;;;"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { decode } from 'decode-formdata';
|
|
2
|
-
import {
|
|
2
|
+
import { FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core';
|
|
3
3
|
import { ServerFormState } from './types.cjs';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}) => ValidationError | Promise<ValidationError>;
|
|
7
|
-
type OnServerValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer FFN> ? FFN | OnServerValidateFn<TFormData> : OnServerValidateFn<TFormData>;
|
|
8
|
-
interface CreateServerValidateOptions<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> extends FormOptions<TFormData, TFormValidator> {
|
|
9
|
-
onServerValidate: OnServerValidateOrFn<TFormData, TFormValidator>;
|
|
4
|
+
interface CreateServerValidateOptions<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> extends FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer> {
|
|
5
|
+
onServerValidate: TOnServer;
|
|
10
6
|
}
|
|
11
|
-
export declare const createServerValidate: <TFormData,
|
|
12
|
-
export declare const initialFormState: ServerFormState<any>;
|
|
7
|
+
export declare const createServerValidate: <TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>>(defaultOpts: CreateServerValidateOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>) => (formData: FormData, info?: Parameters<typeof decode>[1]) => Promise<void>;
|
|
8
|
+
export declare const initialFormState: ServerFormState<any, undefined>;
|
|
13
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.cjs","sources":["../../../src/nextjs/error.ts"],"sourcesContent":["import type { ServerFormState } from './types'\n\ninterface ServerValidateErrorState<TFormData> {\n formState: ServerFormState<TFormData>\n}\n\nexport class ServerValidateError<TFormData>\n extends Error\n implements ServerValidateErrorState<TFormData>\n{\n formState: ServerFormState<TFormData>\n\n constructor(options: ServerValidateErrorState<TFormData>) {\n super('Your form has errors. Please check the fields and try again.')\n this.name = 'ServerValidateError'\n this.formState = options.formState\n }\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"error.cjs","sources":["../../../src/nextjs/error.ts"],"sourcesContent":["import type { ServerFormState } from './types'\nimport type { FormAsyncValidateOrFn } from '@tanstack/form-core'\n\ninterface ServerValidateErrorState<\n TFormData,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n formState: ServerFormState<TFormData, TOnServer>\n}\n\nexport class ServerValidateError<\n TFormData,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n >\n extends Error\n implements ServerValidateErrorState<TFormData, TOnServer>\n{\n formState: ServerFormState<TFormData, TOnServer>\n\n constructor(options: ServerValidateErrorState<TFormData, TOnServer>) {\n super('Your form has errors. Please check the fields and try again.')\n this.name = 'ServerValidateError'\n this.formState = options.formState\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,4BAIH,MAEV;AAAA,EAGE,YAAY,SAAyD;AACnE,UAAM,8DAA8D;AACpE,SAAK,OAAO;AACZ,SAAK,YAAY,QAAQ;AAAA,EAAA;AAE7B;;"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ServerFormState } from './types.cjs';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { FormAsyncValidateOrFn } from '@tanstack/form-core';
|
|
3
|
+
interface ServerValidateErrorState<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
4
|
+
formState: ServerFormState<TFormData, TOnServer>;
|
|
4
5
|
}
|
|
5
|
-
export declare class ServerValidateError<TFormData
|
|
6
|
-
formState: ServerFormState<TFormData>;
|
|
7
|
-
constructor(options: ServerValidateErrorState<TFormData>);
|
|
6
|
+
export declare class ServerValidateError<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> extends Error implements ServerValidateErrorState<TFormData, TOnServer> {
|
|
7
|
+
formState: ServerFormState<TFormData, TOnServer>;
|
|
8
|
+
constructor(options: ServerValidateErrorState<TFormData, TOnServer>);
|
|
8
9
|
}
|
|
9
10
|
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { FormState } from '@tanstack/form-core';
|
|
2
|
-
export type ServerFormState<TFormData
|
|
1
|
+
import { FormAsyncValidateOrFn, FormState } from '@tanstack/form-core';
|
|
2
|
+
export type ServerFormState<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> = Pick<FormState<TFormData, undefined, undefined, undefined, undefined, undefined, undefined, undefined, TOnServer>, 'values' | 'errors' | 'errorMap'>;
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const decodeFormdata = require("decode-formdata");
|
|
4
|
+
const formCore = require("@tanstack/form-core");
|
|
4
5
|
const error = require("./error.cjs");
|
|
5
|
-
const isFormValidationError = (error2) => {
|
|
6
|
-
return typeof error2 === "object";
|
|
7
|
-
};
|
|
8
6
|
const createServerValidate = (defaultOpts) => async (formData, info) => {
|
|
9
|
-
const {
|
|
10
|
-
const runValidator = async (
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
const { onServerValidate } = defaultOpts;
|
|
8
|
+
const runValidator = async ({
|
|
9
|
+
value,
|
|
10
|
+
validationSource
|
|
11
|
+
}) => {
|
|
12
|
+
if (formCore.isStandardSchemaValidator(onServerValidate)) {
|
|
13
|
+
return await formCore.standardSchemaValidators.validateAsync(
|
|
14
|
+
{ value, validationSource },
|
|
15
|
+
onServerValidate
|
|
16
|
+
);
|
|
13
17
|
}
|
|
14
|
-
return onServerValidate(
|
|
18
|
+
return onServerValidate({
|
|
19
|
+
value,
|
|
20
|
+
signal: void 0,
|
|
21
|
+
formApi: void 0
|
|
22
|
+
});
|
|
15
23
|
};
|
|
16
24
|
const values = decodeFormdata.decode(formData, info);
|
|
17
25
|
const onServerError = await runValidator({
|
|
@@ -19,13 +27,13 @@ const createServerValidate = (defaultOpts) => async (formData, info) => {
|
|
|
19
27
|
validationSource: "form"
|
|
20
28
|
});
|
|
21
29
|
if (!onServerError) return;
|
|
22
|
-
const
|
|
30
|
+
const onServerErrorVal = formCore.isGlobalFormValidationError(onServerError) ? onServerError.form : onServerError;
|
|
23
31
|
const formState = {
|
|
24
32
|
errorMap: {
|
|
25
33
|
onServer: onServerError
|
|
26
34
|
},
|
|
27
35
|
values,
|
|
28
|
-
errors:
|
|
36
|
+
errors: onServerErrorVal ? [onServerErrorVal] : []
|
|
29
37
|
};
|
|
30
38
|
throw new error.ServerValidateError({
|
|
31
39
|
formState
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServerValidate.cjs","sources":["../../../src/remix/createServerValidate.ts"],"sourcesContent":["import { decode } from 'decode-formdata'\nimport { ServerValidateError } from './error'\nimport type {\n FormOptions,\n
|
|
1
|
+
{"version":3,"file":"createServerValidate.cjs","sources":["../../../src/remix/createServerValidate.ts"],"sourcesContent":["import { decode } from 'decode-formdata'\nimport {\n isGlobalFormValidationError,\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from '@tanstack/form-core'\nimport { ServerValidateError } from './error'\nimport type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateAsyncFn,\n FormValidateOrFn,\n UnwrapFormAsyncValidateOrFn,\n} from '@tanstack/form-core'\nimport type { ServerFormState } from './types'\n\ninterface CreateServerValidateOptions<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n > {\n onServerValidate: TOnServer\n}\n\nexport const createServerValidate =\n <\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n >(\n defaultOpts: CreateServerValidateOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >,\n ) =>\n async (formData: FormData, info?: Parameters<typeof decode>[1]) => {\n const { onServerValidate } = defaultOpts\n\n const runValidator = async ({\n value,\n validationSource,\n }: {\n value: TFormData\n validationSource: 'form'\n }) => {\n if (isStandardSchemaValidator(onServerValidate)) {\n return await standardSchemaValidators.validateAsync(\n { value, validationSource },\n onServerValidate,\n )\n }\n return (onServerValidate as FormValidateAsyncFn<TFormData>)({\n value,\n signal: undefined as never,\n formApi: undefined as never,\n })\n }\n\n const values = decode(formData, info) as never as TFormData\n\n const onServerError = (await runValidator({\n value: values,\n validationSource: 'form',\n })) as UnwrapFormAsyncValidateOrFn<TOnServer> | undefined\n\n if (!onServerError) return\n\n const onServerErrorVal = (\n isGlobalFormValidationError(onServerError)\n ? onServerError.form\n : onServerError\n ) as UnwrapFormAsyncValidateOrFn<TOnServer>\n\n const formState: ServerFormState<TFormData, TOnServer> = {\n errorMap: {\n onServer: onServerError,\n },\n values,\n errors: onServerErrorVal ? [onServerErrorVal] : [],\n }\n\n throw new ServerValidateError({\n formState,\n })\n }\n\nexport const initialFormState: ServerFormState<any, undefined> = {\n errorMap: {\n onServer: undefined,\n },\n values: undefined,\n errors: [],\n}\n"],"names":["isStandardSchemaValidator","standardSchemaValidators","decode","isGlobalFormValidationError","ServerValidateError"],"mappings":";;;;;AAwCO,MAAM,uBACX,CAWE,gBAYF,OAAO,UAAoB,SAAwC;AAC3D,QAAA,EAAE,qBAAqB;AAE7B,QAAM,eAAe,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,EAAA,MAII;AACA,QAAAA,SAAAA,0BAA0B,gBAAgB,GAAG;AAC/C,aAAO,MAAMC,SAAyB,yBAAA;AAAA,QACpC,EAAE,OAAO,iBAAiB;AAAA,QAC1B;AAAA,MACF;AAAA,IAAA;AAEF,WAAQ,iBAAoD;AAAA,MAC1D;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEM,QAAA,SAASC,eAAAA,OAAO,UAAU,IAAI;AAE9B,QAAA,gBAAiB,MAAM,aAAa;AAAA,IACxC,OAAO;AAAA,IACP,kBAAkB;AAAA,EAAA,CACnB;AAED,MAAI,CAAC,cAAe;AAEpB,QAAM,mBACJC,SAAAA,4BAA4B,aAAa,IACrC,cAAc,OACd;AAGN,QAAM,YAAmD;AAAA,IACvD,UAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,IACA,QAAQ,mBAAmB,CAAC,gBAAgB,IAAI,CAAA;AAAA,EAClD;AAEA,QAAM,IAAIC,MAAAA,oBAAoB;AAAA,IAC5B;AAAA,EAAA,CACD;AACH;AAEK,MAAM,mBAAoD;AAAA,EAC/D,UAAU;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ,CAAA;AACV;;;"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { decode } from 'decode-formdata';
|
|
2
|
-
import {
|
|
2
|
+
import { FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core';
|
|
3
3
|
import { ServerFormState } from './types.cjs';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}) => ValidationError | Promise<ValidationError>;
|
|
7
|
-
type OnServerValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer FFN> ? FFN | OnServerValidateFn<TFormData> : OnServerValidateFn<TFormData>;
|
|
8
|
-
interface CreateServerValidateOptions<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> extends FormOptions<TFormData, TFormValidator> {
|
|
9
|
-
onServerValidate: OnServerValidateOrFn<TFormData, TFormValidator>;
|
|
4
|
+
interface CreateServerValidateOptions<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> extends FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer> {
|
|
5
|
+
onServerValidate: TOnServer;
|
|
10
6
|
}
|
|
11
|
-
export declare const createServerValidate: <TFormData,
|
|
12
|
-
export declare const initialFormState: ServerFormState<any>;
|
|
7
|
+
export declare const createServerValidate: <TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>>(defaultOpts: CreateServerValidateOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>) => (formData: FormData, info?: Parameters<typeof decode>[1]) => Promise<void>;
|
|
8
|
+
export declare const initialFormState: ServerFormState<any, undefined>;
|
|
13
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.cjs","sources":["../../../src/remix/error.ts"],"sourcesContent":["import type { ServerFormState } from './types'\n\ninterface ServerValidateErrorState<TFormData> {\n formState: ServerFormState<TFormData>\n}\n\nexport class ServerValidateError<TFormData>\n extends Error\n implements ServerValidateErrorState<TFormData>\n{\n formState: ServerFormState<TFormData>\n\n constructor(options: ServerValidateErrorState<TFormData>) {\n super('Your form has errors. Please check the fields and try again.')\n this.name = 'ServerValidateError'\n this.formState = options.formState\n }\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"error.cjs","sources":["../../../src/remix/error.ts"],"sourcesContent":["import type { ServerFormState } from './types'\nimport type { FormAsyncValidateOrFn } from '@tanstack/form-core'\n\ninterface ServerValidateErrorState<\n TFormData,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n formState: ServerFormState<TFormData, TOnServer>\n}\n\nexport class ServerValidateError<\n TFormData,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n >\n extends Error\n implements ServerValidateErrorState<TFormData, TOnServer>\n{\n formState: ServerFormState<TFormData, TOnServer>\n\n constructor(options: ServerValidateErrorState<TFormData, TOnServer>) {\n super('Your form has errors. Please check the fields and try again.')\n this.name = 'ServerValidateError'\n this.formState = options.formState\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,4BAIH,MAEV;AAAA,EAGE,YAAY,SAAyD;AACnE,UAAM,8DAA8D;AACpE,SAAK,OAAO;AACZ,SAAK,YAAY,QAAQ;AAAA,EAAA;AAE7B;;"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ServerFormState } from './types.cjs';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { FormAsyncValidateOrFn } from '@tanstack/form-core';
|
|
3
|
+
interface ServerValidateErrorState<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
4
|
+
formState: ServerFormState<TFormData, TOnServer>;
|
|
4
5
|
}
|
|
5
|
-
export declare class ServerValidateError<TFormData
|
|
6
|
-
formState: ServerFormState<TFormData>;
|
|
7
|
-
constructor(options: ServerValidateErrorState<TFormData>);
|
|
6
|
+
export declare class ServerValidateError<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> extends Error implements ServerValidateErrorState<TFormData, TOnServer> {
|
|
7
|
+
formState: ServerFormState<TFormData, TOnServer>;
|
|
8
|
+
constructor(options: ServerValidateErrorState<TFormData, TOnServer>);
|
|
8
9
|
}
|
|
9
10
|
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { FormState } from '@tanstack/form-core';
|
|
2
|
-
export type ServerFormState<TFormData
|
|
1
|
+
import { FormAsyncValidateOrFn, FormState } from '@tanstack/form-core';
|
|
2
|
+
export type ServerFormState<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> = Pick<FormState<TFormData, undefined, undefined, undefined, undefined, undefined, undefined, undefined, TOnServer>, 'values' | 'errors' | 'errorMap'>;
|
|
@@ -1,33 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const decodeFormdata = require("decode-formdata");
|
|
4
|
+
const formCore = require("@tanstack/form-core");
|
|
5
|
+
const http = require("vinxi/http");
|
|
4
6
|
const utils = require("./utils.cjs");
|
|
5
7
|
const error = require("./error.cjs");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (
|
|
13
|
-
return
|
|
8
|
+
const createServerValidate = (defaultOpts) => async (formData, info) => {
|
|
9
|
+
const { onServerValidate } = defaultOpts;
|
|
10
|
+
const runValidator = async ({
|
|
11
|
+
value,
|
|
12
|
+
validationSource
|
|
13
|
+
}) => {
|
|
14
|
+
if (formCore.isStandardSchemaValidator(onServerValidate)) {
|
|
15
|
+
return await formCore.standardSchemaValidators.validateAsync(
|
|
16
|
+
{ value, validationSource },
|
|
17
|
+
onServerValidate
|
|
18
|
+
);
|
|
14
19
|
}
|
|
15
|
-
return onServerValidate(
|
|
20
|
+
return onServerValidate({
|
|
21
|
+
value,
|
|
22
|
+
signal: void 0,
|
|
23
|
+
formApi: void 0
|
|
24
|
+
});
|
|
16
25
|
};
|
|
17
|
-
const referer =
|
|
26
|
+
const referer = http.getHeader("referer");
|
|
18
27
|
const data = decodeFormdata.decode(formData, info);
|
|
19
28
|
const onServerError = await runValidator({
|
|
20
29
|
value: data,
|
|
21
30
|
validationSource: "form"
|
|
22
31
|
});
|
|
23
32
|
if (!onServerError) return;
|
|
24
|
-
const
|
|
33
|
+
const onServerErrorVal = formCore.isGlobalFormValidationError(onServerError) ? onServerError.form : onServerError;
|
|
25
34
|
const formState = {
|
|
26
35
|
errorMap: {
|
|
27
36
|
onServer: onServerError
|
|
28
37
|
},
|
|
29
38
|
values: data,
|
|
30
|
-
errors:
|
|
39
|
+
errors: onServerErrorVal ? [onServerErrorVal] : []
|
|
31
40
|
};
|
|
32
41
|
const cookie = await utils._tanstackInternalsCookie.serialize(formState);
|
|
33
42
|
throw new error.ServerValidateError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServerValidate.cjs","sources":["../../../src/start/createServerValidate.tsx"],"sourcesContent":["import { decode } from 'decode-formdata'\nimport { _tanstackInternalsCookie } from './utils'\nimport { ServerValidateError } from './error'\nimport type {\n FormOptions,\n
|
|
1
|
+
{"version":3,"file":"createServerValidate.cjs","sources":["../../../src/start/createServerValidate.tsx"],"sourcesContent":["import { decode } from 'decode-formdata'\nimport {\n isGlobalFormValidationError,\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from '@tanstack/form-core'\nimport { getHeader } from 'vinxi/http'\nimport { _tanstackInternalsCookie } from './utils'\nimport { ServerValidateError } from './error'\nimport type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateAsyncFn,\n FormValidateOrFn,\n UnwrapFormAsyncValidateOrFn,\n} from '@tanstack/form-core'\nimport type { ServerFormState } from './types'\n\ninterface CreateServerValidateOptions<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n > {\n onServerValidate: TOnServer\n}\n\nexport const createServerValidate =\n <\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n >(\n defaultOpts: CreateServerValidateOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >,\n ) =>\n async (formData: FormData, info?: Parameters<typeof decode>[1]) => {\n const { onServerValidate } = defaultOpts\n\n const runValidator = async ({\n value,\n validationSource,\n }: {\n value: TFormData\n validationSource: 'form'\n }) => {\n if (isStandardSchemaValidator(onServerValidate)) {\n return await standardSchemaValidators.validateAsync(\n { value, validationSource },\n onServerValidate,\n )\n }\n return (onServerValidate as FormValidateAsyncFn<TFormData>)({\n value,\n signal: undefined as never,\n formApi: undefined as never,\n })\n }\n\n const referer = getHeader('referer')!\n\n const data = decode(formData, info) as never as TFormData\n\n const onServerError = (await runValidator({\n value: data,\n validationSource: 'form',\n })) as UnwrapFormAsyncValidateOrFn<TOnServer> | undefined\n\n if (!onServerError) return\n\n const onServerErrorVal = (\n isGlobalFormValidationError(onServerError)\n ? onServerError.form\n : onServerError\n ) as UnwrapFormAsyncValidateOrFn<TOnServer>\n\n const formState: ServerFormState<TFormData, TOnServer> = {\n errorMap: {\n onServer: onServerError,\n },\n values: data,\n errors: onServerErrorVal ? [onServerErrorVal] : [],\n }\n\n const cookie = await _tanstackInternalsCookie.serialize(formState)\n\n throw new ServerValidateError({\n response: new Response('ok', {\n headers: {\n Location: referer,\n 'Set-Cookie': cookie,\n },\n status: 302,\n }),\n formState: formState,\n })\n }\n"],"names":["isStandardSchemaValidator","standardSchemaValidators","getHeader","decode","isGlobalFormValidationError","_tanstackInternalsCookie","ServerValidateError"],"mappings":";;;;;;;AA0CO,MAAM,uBACX,CAWE,gBAYF,OAAO,UAAoB,SAAwC;AAC3D,QAAA,EAAE,qBAAqB;AAE7B,QAAM,eAAe,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,EAAA,MAII;AACA,QAAAA,SAAAA,0BAA0B,gBAAgB,GAAG;AAC/C,aAAO,MAAMC,SAAyB,yBAAA;AAAA,QACpC,EAAE,OAAO,iBAAiB;AAAA,QAC1B;AAAA,MACF;AAAA,IAAA;AAEF,WAAQ,iBAAoD;AAAA,MAC1D;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEM,QAAA,UAAUC,eAAU,SAAS;AAE7B,QAAA,OAAOC,eAAAA,OAAO,UAAU,IAAI;AAE5B,QAAA,gBAAiB,MAAM,aAAa;AAAA,IACxC,OAAO;AAAA,IACP,kBAAkB;AAAA,EAAA,CACnB;AAED,MAAI,CAAC,cAAe;AAEpB,QAAM,mBACJC,SAAAA,4BAA4B,aAAa,IACrC,cAAc,OACd;AAGN,QAAM,YAAmD;AAAA,IACvD,UAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,mBAAmB,CAAC,gBAAgB,IAAI,CAAA;AAAA,EAClD;AAEA,QAAM,SAAS,MAAMC,+BAAyB,UAAU,SAAS;AAEjE,QAAM,IAAIC,MAAAA,oBAAoB;AAAA,IAC5B,UAAU,IAAI,SAAS,MAAM;AAAA,MAC3B,SAAS;AAAA,QACP,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AAAA,IACD;AAAA,EAAA,CACD;AACH;;"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { decode } from 'decode-formdata';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
type OnServerValidateFn<TFormData> = (props: {
|
|
6
|
-
value: TFormData;
|
|
7
|
-
}) => ValidationError | Promise<ValidationError>;
|
|
8
|
-
type OnServerValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer FFN> ? FFN | OnServerValidateFn<TFormData> : OnServerValidateFn<TFormData>;
|
|
9
|
-
interface CreateServerValidateOptions<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> extends FormOptions<TFormData, TFormValidator> {
|
|
10
|
-
onServerValidate: OnServerValidateOrFn<TFormData, TFormValidator>;
|
|
2
|
+
import { FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from '@tanstack/form-core';
|
|
3
|
+
interface CreateServerValidateOptions<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> extends FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer> {
|
|
4
|
+
onServerValidate: TOnServer;
|
|
11
5
|
}
|
|
12
|
-
export declare const createServerValidate: <TFormData,
|
|
6
|
+
export declare const createServerValidate: <TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>>(defaultOpts: CreateServerValidateOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>) => (formData: FormData, info?: Parameters<typeof decode>[1]) => Promise<void>;
|
|
13
7
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.cjs","sources":["../../../src/start/error.ts"],"sourcesContent":["import type { ServerFormState } from './types'\n\ninterface ServerValidateErrorState<TFormData> {\n formState: ServerFormState<TFormData>\n response: Response\n}\n\nexport class ServerValidateError<TFormData>\n extends Error\n implements ServerValidateErrorState<TFormData>\n{\n
|
|
1
|
+
{"version":3,"file":"error.cjs","sources":["../../../src/start/error.ts"],"sourcesContent":["import type { ServerFormState } from './types'\nimport type { FormAsyncValidateOrFn } from '@tanstack/form-core'\n\ninterface ServerValidateErrorState<\n TFormData,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n formState: ServerFormState<TFormData, TOnServer>\n response: Response\n}\n\nexport class ServerValidateError<\n TFormData,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n >\n extends Error\n implements ServerValidateErrorState<TFormData, TOnServer>\n{\n formState: ServerFormState<TFormData, TOnServer>\n response: Response\n\n constructor(options: ServerValidateErrorState<TFormData, TOnServer>) {\n super('Your form has errors. Please check the fields and try again.')\n this.name = 'ServerValidateError'\n this.response = options.response\n this.formState = options.formState\n }\n}\n"],"names":[],"mappings":";;AAWO,MAAM,4BAIH,MAEV;AAAA,EAIE,YAAY,SAAyD;AACnE,UAAM,8DAA8D;AACpE,SAAK,OAAO;AACZ,SAAK,WAAW,QAAQ;AACxB,SAAK,YAAY,QAAQ;AAAA,EAAA;AAE7B;;"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { ServerFormState } from './types.cjs';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { FormAsyncValidateOrFn } from '@tanstack/form-core';
|
|
3
|
+
interface ServerValidateErrorState<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
4
|
+
formState: ServerFormState<TFormData, TOnServer>;
|
|
4
5
|
response: Response;
|
|
5
6
|
}
|
|
6
|
-
export declare class ServerValidateError<TFormData
|
|
7
|
+
export declare class ServerValidateError<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> extends Error implements ServerValidateErrorState<TFormData, TOnServer> {
|
|
8
|
+
formState: ServerFormState<TFormData, TOnServer>;
|
|
7
9
|
response: Response;
|
|
8
|
-
|
|
9
|
-
constructor(options: ServerValidateErrorState<TFormData>);
|
|
10
|
+
constructor(options: ServerValidateErrorState<TFormData, TOnServer>);
|
|
10
11
|
}
|
|
11
12
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const http = require("vinxi/http");
|
|
3
4
|
const utils = require("./utils.cjs");
|
|
4
5
|
const initialFormState = {
|
|
5
6
|
errorMap: {
|
|
@@ -7,11 +8,9 @@ const initialFormState = {
|
|
|
7
8
|
},
|
|
8
9
|
errors: []
|
|
9
10
|
};
|
|
10
|
-
const getFormData = async (
|
|
11
|
-
const data = await utils._tanstackInternalsCookie.parse(
|
|
12
|
-
|
|
13
|
-
);
|
|
14
|
-
ctx.request.headers.delete("Cookie");
|
|
11
|
+
const getFormData = async () => {
|
|
12
|
+
const data = await utils._tanstackInternalsCookie.parse(http.getHeader("Cookie"));
|
|
13
|
+
http.removeResponseHeader("Cookie");
|
|
15
14
|
if (!data) return initialFormState;
|
|
16
15
|
return data;
|
|
17
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFormData.cjs","sources":["../../../src/start/getFormData.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"getFormData.cjs","sources":["../../../src/start/getFormData.tsx"],"sourcesContent":["import { getHeader, removeResponseHeader } from 'vinxi/http'\nimport { _tanstackInternalsCookie } from './utils'\nimport type { ServerFormState } from './types'\n\nexport const initialFormState = {\n errorMap: {\n onServer: undefined,\n },\n errors: [],\n}\n\nexport const getFormData = async () => {\n const data = (await _tanstackInternalsCookie.parse(getHeader('Cookie')!)) as\n | undefined\n | ServerFormState<any, undefined>\n // Delete the cookie before it hits the client again¸\n removeResponseHeader('Cookie')\n if (!data) return initialFormState\n return data\n}\n"],"names":["_tanstackInternalsCookie","getHeader","removeResponseHeader"],"mappings":";;;;AAIO,MAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,QAAQ,CAAA;AACV;AAEO,MAAM,cAAc,YAAY;AACrC,QAAM,OAAQ,MAAMA,MAAA,yBAAyB,MAAMC,KAAA,UAAU,QAAQ,CAAE;AAIvEC,OAAAA,qBAAqB,QAAQ;AACzB,MAAA,CAAC,KAAa,QAAA;AACX,SAAA;AACT;;;"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { FetchFnCtx } from '@tanstack/start';
|
|
2
1
|
import { ServerFormState } from './types.cjs';
|
|
3
2
|
export declare const initialFormState: {
|
|
4
3
|
errorMap: {
|
|
@@ -6,9 +5,9 @@ export declare const initialFormState: {
|
|
|
6
5
|
};
|
|
7
6
|
errors: never[];
|
|
8
7
|
};
|
|
9
|
-
export declare const getFormData: (
|
|
8
|
+
export declare const getFormData: () => Promise<{
|
|
10
9
|
errorMap: {
|
|
11
10
|
onServer: undefined;
|
|
12
11
|
};
|
|
13
12
|
errors: never[];
|
|
14
|
-
} | ServerFormState<any>>;
|
|
13
|
+
} | ServerFormState<any, undefined>>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { FormState } from '@tanstack/form-core';
|
|
2
|
-
export type ServerFormState<TFormData
|
|
1
|
+
import { FormAsyncValidateOrFn, FormState } from '@tanstack/form-core';
|
|
2
|
+
export type ServerFormState<TFormData, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> = Pick<FormState<TFormData, undefined, undefined, undefined, undefined, undefined, undefined, undefined, TOnServer>, 'values' | 'errors' | 'errorMap'>;
|
package/dist/cjs/types.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DeepKeys, DeepValue, FieldApiOptions,
|
|
1
|
+
import { DeepKeys, DeepValue, FieldApiOptions, FieldAsyncValidateOrFn, FieldValidateOrFn, FormAsyncValidateOrFn, FormValidateOrFn } from '@tanstack/form-core';
|
|
2
2
|
/**
|
|
3
3
|
* The field options.
|
|
4
4
|
*/
|
|
5
|
-
export type UseFieldOptions<TParentData, TName extends DeepKeys<TParentData>,
|
|
5
|
+
export type UseFieldOptions<TParentData, TName extends DeepKeys<TParentData>, TData extends DeepValue<TParentData, TName>, TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>, TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>, TFormOnMount extends undefined | FormValidateOrFn<TParentData>, TFormOnChange extends undefined | FormValidateOrFn<TParentData>, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnBlur extends undefined | FormValidateOrFn<TParentData>, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>> = FieldApiOptions<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnServer> & {
|
|
6
6
|
mode?: 'value' | 'array';
|
|
7
7
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useField.cjs","sources":["../../src/useField.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react'\nimport { useStore } from '@tanstack/react-store'\nimport { FieldApi, functionalUpdate } from '@tanstack/form-core'\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'\nimport type { FunctionComponent, ReactNode } from 'react'\nimport type { UseFieldOptions } from './types'\nimport type { DeepKeys, DeepValue, Validator } from '@tanstack/form-core'\n\ninterface ReactFieldApi<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> {\n /**\n * A pre-bound and type-safe sub-field component using this field as a root.\n */\n Field: FieldComponent<TParentData, TFormValidator>\n}\n\n/**\n * A type representing a hook for using a field in a form with the given form data type.\n *\n * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field.\n */\nexport type UseField<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> = <\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n>(\n opts: Omit<\n UseFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>,\n 'form'\n >,\n) => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n\n/**\n * A hook for managing a field in a form.\n * @param opts An object with field options.\n *\n * @returns The `FieldApi` instance for the specified field.\n */\nexport function useField<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n>(\n opts: UseFieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n) {\n const [fieldApi] = useState(() => {\n const api = new FieldApi({\n ...opts,\n form: opts.form,\n name: opts.name,\n })\n\n const extendedApi: typeof api & ReactFieldApi<TParentData, TFormValidator> =\n api as never\n\n extendedApi.Field = Field as never\n\n return extendedApi\n })\n\n useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi])\n\n /**\n * fieldApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n */\n useIsomorphicLayoutEffect(() => {\n fieldApi.update(opts)\n })\n\n useStore(\n fieldApi.store,\n opts.mode === 'array'\n ? (state) => {\n return [state.meta, Object.keys(state.value ?? []).length]\n }\n : undefined,\n )\n\n return fieldApi\n}\n\n/**\n * @param children A render function that takes a field API instance and returns a React element.\n */\ntype FieldComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = {\n children: (\n fieldApi: FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => ReactNode\n} & UseFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>\n\n/**\n * A type alias representing a field component for a specific form data type.\n */\nexport type FieldComponent<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> = <\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n>({\n children,\n ...fieldOptions\n}: Omit<\n FieldComponentProps<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n 'form'\n>) => ReactNode\n\n/**\n * A function component that takes field options and a render function as children and returns a React component.\n *\n * The `Field` component uses the `useField` hook internally to manage the field instance.\n */\nexport const Field = (<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n>({\n children,\n ...fieldOptions\n}: FieldComponentProps<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n>): ReactNode => {\n const fieldApi = useField(fieldOptions as any)\n\n const jsxToDisplay = useMemo(\n () => functionalUpdate(children, fieldApi as any),\n /**\n * The reason this exists is to fix an issue with the React Compiler.\n * Namely, functionalUpdate is memoized where it checks for `fieldApi`, which is a static type.\n * This means that when `state.value` changes, it does not trigger a re-render. The useMemo explicitly fixes this problem\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [children, fieldApi, fieldApi.state.value, fieldApi.state.meta],\n )\n return (<>{jsxToDisplay}</>) as never\n}) satisfies FunctionComponent<FieldComponentProps<any, any, any, any, any>>\n"],"names":["useState","FieldApi","useIsomorphicLayoutEffect","useStore","useMemo","functionalUpdate"],"mappings":";;;;;;;AAiDO,SAAS,SAWd,MAOA;AACA,QAAM,CAAC,QAAQ,IAAIA,MAAAA,SAAS,MAAM;AAC1B,UAAA,MAAM,IAAIC,kBAAS;AAAA,MACvB,GAAG;AAAA,MACH,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,IAAA,CACZ;AAED,UAAM,cACJ;AAEF,gBAAY,QAAQ;AAEb,WAAA;AAAA,EAAA,CACR;AAEDC,4BAAAA,0BAA0B,SAAS,OAAO,CAAC,QAAQ,CAAC;AAMpDA,4BAAAA,0BAA0B,MAAM;AAC9B,aAAS,OAAO,IAAI;AAAA,EAAA,CACrB;AAEDC,aAAA;AAAA,IACE,SAAS;AAAA,IACT,KAAK,SAAS,UACV,CAAC,UAAU;AACF,aAAA,CAAC,MAAM,MAAM,OAAO,KAAK,MAAM,SAAS,EAAE,EAAE,MAAM;AAAA,IAAA,IAE3D;AAAA,EACN;AAEO,SAAA;AACT;AA4DO,MAAM,QAAS,CAUpB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAMiB;AACT,QAAA,WAAW,SAAS,YAAmB;AAE7C,QAAM,eAAeC,MAAA;AAAA,IACnB,MAAMC,SAAiB,iBAAA,UAAU,QAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOhD,CAAC,UAAU,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM,IAAI;AAAA,EAChE;AACA,+DAAW,UAAa,aAAA,CAAA;AAC1B;;;"}
|
|
1
|
+
{"version":3,"file":"useField.cjs","sources":["../../src/useField.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react'\nimport { useStore } from '@tanstack/react-store'\nimport { FieldApi, functionalUpdate } from '@tanstack/form-core'\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'\nimport type {\n DeepKeys,\n DeepValue,\n FieldAsyncValidateOrFn,\n FieldValidateOrFn,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { FunctionComponent, ReactNode } from 'react'\nimport type { UseFieldOptions } from './types'\n\ninterface ReactFieldApi<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n> {\n /**\n * A pre-bound and type-safe sub-field component using this field as a root.\n */\n Field: FieldComponent<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n >\n}\n\n/**\n * A type representing a hook for using a field in a form with the given form data type.\n *\n * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field.\n */\nexport type UseField<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = <\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n>(\n opts: Omit<\n UseFieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n >,\n 'form'\n >,\n) => FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n>\n\n/**\n * A hook for managing a field in a form.\n * @param opts An object with field options.\n *\n * @returns The `FieldApi` instance for the specified field.\n */\nexport function useField<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n>(\n opts: UseFieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n >,\n) {\n const [fieldApi] = useState(() => {\n const api = new FieldApi({\n ...opts,\n form: opts.form,\n name: opts.name,\n })\n\n const extendedApi: typeof api &\n ReactFieldApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n > = api as never\n\n extendedApi.Field = Field as never\n\n return extendedApi\n })\n\n useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi])\n\n /**\n * fieldApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n */\n useIsomorphicLayoutEffect(() => {\n fieldApi.update(opts)\n })\n\n useStore(\n fieldApi.store,\n opts.mode === 'array'\n ? (state) => {\n return [state.meta, Object.keys(state.value ?? []).length]\n }\n : undefined,\n )\n\n return fieldApi\n}\n\n/**\n * @param children A render function that takes a field API instance and returns a React element.\n */\ntype FieldComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n children: (\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n >,\n ) => ReactNode\n} & UseFieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n>\n\n/**\n * A type alias representing a field component for a specific form data type.\n */\nexport type FieldComponent<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = <\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n>({\n children,\n ...fieldOptions\n}: Omit<\n FieldComponentProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n >,\n 'form'\n>) => ReactNode\n\n/**\n * A function component that takes field options and a render function as children and returns a React component.\n *\n * The `Field` component uses the `useField` hook internally to manage the field instance.\n */\nexport const Field = (<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n>({\n children,\n ...fieldOptions\n}: FieldComponentProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer\n>): ReactNode => {\n const fieldApi = useField(fieldOptions as any)\n\n const jsxToDisplay = useMemo(\n () => functionalUpdate(children, fieldApi as any),\n /**\n * The reason this exists is to fix an issue with the React Compiler.\n * Namely, functionalUpdate is memoized where it checks for `fieldApi`, which is a static type.\n * This means that when `state.value` changes, it does not trigger a re-render. The useMemo explicitly fixes this problem\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [children, fieldApi, fieldApi.state.value, fieldApi.state.meta],\n )\n return (<>{jsxToDisplay}</>) as never\n}) satisfies FunctionComponent<\n FieldComponentProps<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n>\n"],"names":["useState","FieldApi","useIsomorphicLayoutEffect","useStore","useMemo","functionalUpdate"],"mappings":";;;;;;;AA4HO,SAAS,SA0Bd,MAoBA;AACA,QAAM,CAAC,QAAQ,IAAIA,MAAAA,SAAS,MAAM;AAC1B,UAAA,MAAM,IAAIC,kBAAS;AAAA,MACvB,GAAG;AAAA,MACH,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,IAAA,CACZ;AAED,UAAM,cAWA;AAEN,gBAAY,QAAQ;AAEb,WAAA;AAAA,EAAA,CACR;AAEDC,4BAAAA,0BAA0B,SAAS,OAAO,CAAC,QAAQ,CAAC;AAMpDA,4BAAAA,0BAA0B,MAAM;AAC9B,aAAS,OAAO,IAAI;AAAA,EAAA,CACrB;AAEDC,aAAA;AAAA,IACE,SAAS;AAAA,IACT,KAAK,SAAS,UACV,CAAC,UAAU;AACF,aAAA,CAAC,MAAM,MAAM,OAAO,KAAK,MAAM,SAAS,EAAE,EAAE,MAAM;AAAA,IAAA,IAE3D;AAAA,EACN;AAEO,SAAA;AACT;AAuIO,MAAM,QAAS,CAyBpB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAmBiB;AACT,QAAA,WAAW,SAAS,YAAmB;AAE7C,QAAM,eAAeC,MAAA;AAAA,IACnB,MAAMC,SAAiB,iBAAA,UAAU,QAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOhD,CAAC,UAAU,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM,IAAI;AAAA,EAChE;AACA,+DAAW,UAAa,aAAA,CAAA;AAC1B;;;"}
|