@tanstack/form-core 1.28.0 → 1.28.2
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/FormApi.cjs +39 -22
- package/dist/cjs/FormApi.cjs.map +1 -1
- package/dist/cjs/FormApi.d.cts +2 -12
- package/dist/cjs/index.cjs +3 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -0
- package/dist/cjs/mergeForm.cjs.map +1 -1
- package/dist/cjs/mergeForm.d.cts +2 -2
- package/dist/cjs/transform.cjs +46 -0
- package/dist/cjs/transform.cjs.map +1 -0
- package/dist/cjs/transform.d.cts +11 -0
- package/dist/cjs/utils.cjs +37 -0
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +1 -0
- package/dist/esm/FormApi.d.ts +2 -12
- package/dist/esm/FormApi.js +39 -22
- package/dist/esm/FormApi.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +4 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mergeForm.d.ts +2 -2
- package/dist/esm/mergeForm.js.map +1 -1
- package/dist/esm/transform.d.ts +11 -0
- package/dist/esm/transform.js +46 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/utils.d.ts +1 -0
- package/dist/esm/utils.js +37 -0
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/FormApi.ts +86 -100
- package/src/index.ts +1 -0
- package/src/mergeForm.ts +42 -25
- package/src/transform.ts +155 -0
- package/src/utils.ts +44 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FormApi, FormAsyncValidateOrFn, FormValidateOrFn } from './FormApi.js';
|
|
2
|
+
/**
|
|
3
|
+
* @private
|
|
4
|
+
*/
|
|
5
|
+
export type FormTransform<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>, TOnDynamic extends undefined | FormValidateOrFn<TFormData>, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>, TSubmitMeta = never> = (formBase: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnDynamic, TOnDynamicAsync, TOnServer, TSubmitMeta>) => FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnDynamic, TOnDynamicAsync, TOnServer, TSubmitMeta>;
|
|
6
|
+
/**
|
|
7
|
+
* @private
|
|
8
|
+
*/
|
|
9
|
+
export declare function mergeAndUpdate<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>, TOnDynamic extends undefined | FormValidateOrFn<TFormData>, TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>, TSubmitMeta = never>(form: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnDynamic, TOnDynamicAsync, TOnServer, TSubmitMeta>, fn?: FormTransform<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnDynamic, TOnDynamicAsync, TOnServer, TSubmitMeta>): (FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnDynamic, TOnDynamicAsync, TOnServer, TSubmitMeta> & {
|
|
10
|
+
state: import('./FormApi.js').FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnDynamic, TOnDynamicAsync, TOnServer>;
|
|
11
|
+
}) | undefined;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { batch } from "@tanstack/store";
|
|
2
|
+
import { deepCopy } from "./utils.js";
|
|
3
|
+
function mergeAndUpdate(form, fn) {
|
|
4
|
+
if (!fn) return;
|
|
5
|
+
const newObj = Object.assign({}, form, {
|
|
6
|
+
state: deepCopy(form.state)
|
|
7
|
+
});
|
|
8
|
+
fn(newObj);
|
|
9
|
+
if (newObj.fieldInfo !== form.fieldInfo) {
|
|
10
|
+
form.fieldInfo = newObj.fieldInfo;
|
|
11
|
+
}
|
|
12
|
+
if (newObj.options !== form.options) {
|
|
13
|
+
form.options = newObj.options;
|
|
14
|
+
}
|
|
15
|
+
const baseFormKeys = Object.keys({
|
|
16
|
+
values: null,
|
|
17
|
+
validationMetaMap: null,
|
|
18
|
+
fieldMetaBase: null,
|
|
19
|
+
isSubmitting: null,
|
|
20
|
+
isSubmitted: null,
|
|
21
|
+
isValidating: null,
|
|
22
|
+
submissionAttempts: null,
|
|
23
|
+
isSubmitSuccessful: null,
|
|
24
|
+
_force_re_eval: null
|
|
25
|
+
// Do not remove this, it ensures that we have all the keys in `BaseFormState`
|
|
26
|
+
});
|
|
27
|
+
const diffedObject = baseFormKeys.reduce((prev, key) => {
|
|
28
|
+
if (form.state[key] !== newObj.state[key]) {
|
|
29
|
+
prev[key] = newObj.state[key];
|
|
30
|
+
}
|
|
31
|
+
return prev;
|
|
32
|
+
}, {});
|
|
33
|
+
batch(() => {
|
|
34
|
+
if (Object.keys(diffedObject).length) {
|
|
35
|
+
form.baseStore.setState((prev) => ({ ...prev, ...diffedObject }));
|
|
36
|
+
}
|
|
37
|
+
if (newObj.state.errorMap !== form.state.errorMap) {
|
|
38
|
+
form.setErrorMap(newObj.state.errorMap);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return newObj;
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
mergeAndUpdate
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sources":["../../src/transform.ts"],"sourcesContent":["import { batch } from '@tanstack/store'\nimport { deepCopy } from './utils'\nimport type {\n AnyBaseFormState,\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from './FormApi'\n\n/**\n * @private\n */\nexport type FormTransform<\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 TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> = (\n formBase: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n) => FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n>\n\n/**\n * @private\n */\nexport function mergeAndUpdate<\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 TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n>(\n form: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n fn?: FormTransform<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n) {\n // Run the `transform` function on `form.state`, diff it, and update the relevant parts with what needs updating\n if (!fn) return\n\n const newObj = Object.assign({}, form, {\n state: deepCopy(form.state),\n })\n\n fn(newObj)\n\n if (newObj.fieldInfo !== form.fieldInfo) {\n form.fieldInfo = newObj.fieldInfo\n }\n\n if (newObj.options !== form.options) {\n form.options = newObj.options\n }\n\n const baseFormKeys = Object.keys({\n values: null,\n validationMetaMap: null,\n fieldMetaBase: null,\n isSubmitting: null,\n isSubmitted: null,\n isValidating: null,\n submissionAttempts: null,\n isSubmitSuccessful: null,\n _force_re_eval: null,\n // Do not remove this, it ensures that we have all the keys in `BaseFormState`\n } satisfies Record<\n // Exclude errorMap since we need to handle that uniquely\n Exclude<keyof AnyBaseFormState, 'errorMap'>,\n null\n >) as Array<keyof AnyBaseFormState>\n\n const diffedObject = baseFormKeys.reduce((prev, key) => {\n if (form.state[key] !== newObj.state[key]) {\n prev[key] = newObj.state[key]\n }\n return prev\n }, {} as Partial<AnyBaseFormState>)\n\n batch(() => {\n if (Object.keys(diffedObject).length) {\n form.baseStore.setState((prev) => ({ ...prev, ...diffedObject }))\n }\n\n if (newObj.state.errorMap !== form.state.errorMap) {\n // Check if we need to update `fieldMetaBase` with `errorMaps` set by\n form.setErrorMap(newObj.state.errorMap)\n }\n })\n\n return newObj\n}\n"],"names":[],"mappings":";;AA0DO,SAAS,eAcd,MAcA,IAcA;AAEA,MAAI,CAAC,GAAI;AAET,QAAM,SAAS,OAAO,OAAO,CAAA,GAAI,MAAM;AAAA,IACrC,OAAO,SAAS,KAAK,KAAK;AAAA,EAAA,CAC3B;AAED,KAAG,MAAM;AAET,MAAI,OAAO,cAAc,KAAK,WAAW;AACvC,SAAK,YAAY,OAAO;AAAA,EAC1B;AAEA,MAAI,OAAO,YAAY,KAAK,SAAS;AACnC,SAAK,UAAU,OAAO;AAAA,EACxB;AAEA,QAAM,eAAe,OAAO,KAAK;AAAA,IAC/B,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA;AAAA,EAAA,CAMjB;AAED,QAAM,eAAe,aAAa,OAAO,CAAC,MAAM,QAAQ;AACtD,QAAI,KAAK,MAAM,GAAG,MAAM,OAAO,MAAM,GAAG,GAAG;AACzC,WAAK,GAAG,IAAI,OAAO,MAAM,GAAG;AAAA,IAC9B;AACA,WAAO;AAAA,EACT,GAAG,CAAA,CAA+B;AAElC,QAAM,MAAM;AACV,QAAI,OAAO,KAAK,YAAY,EAAE,QAAQ;AACpC,WAAK,UAAU,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,aAAA,EAAe;AAAA,IAClE;AAEA,QAAI,OAAO,MAAM,aAAa,KAAK,MAAM,UAAU;AAEjD,WAAK,YAAY,OAAO,MAAM,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO;AACT;"}
|
package/dist/esm/utils.d.ts
CHANGED
|
@@ -105,4 +105,5 @@ export declare function createFieldMap<T>(values: Readonly<T>): {
|
|
|
105
105
|
export declare function mergeOpts<T>(originalOpts: T | undefined | null, overrides: T): T;
|
|
106
106
|
export declare function uuid(): string;
|
|
107
107
|
export declare const throttleFormState: (form: AnyFormApi) => void;
|
|
108
|
+
export declare function deepCopy<T>(obj: T): T;
|
|
108
109
|
export {};
|
package/dist/esm/utils.js
CHANGED
|
@@ -301,9 +301,46 @@ const throttleFormState = liteThrottle(
|
|
|
301
301
|
wait: 300
|
|
302
302
|
}
|
|
303
303
|
);
|
|
304
|
+
function deepCopy(obj) {
|
|
305
|
+
if (obj === null || typeof obj !== "object") {
|
|
306
|
+
return obj;
|
|
307
|
+
}
|
|
308
|
+
if (obj instanceof Date) {
|
|
309
|
+
return new Date(obj.getTime());
|
|
310
|
+
}
|
|
311
|
+
if (Array.isArray(obj)) {
|
|
312
|
+
const arrCopy = [];
|
|
313
|
+
for (let i = 0; i < obj.length; i++) {
|
|
314
|
+
arrCopy[i] = deepCopy(obj[i]);
|
|
315
|
+
}
|
|
316
|
+
return arrCopy;
|
|
317
|
+
}
|
|
318
|
+
if (obj instanceof Map) {
|
|
319
|
+
const mapCopy = /* @__PURE__ */ new Map();
|
|
320
|
+
obj.forEach((value, key) => {
|
|
321
|
+
mapCopy.set(key, deepCopy(value));
|
|
322
|
+
});
|
|
323
|
+
return mapCopy;
|
|
324
|
+
}
|
|
325
|
+
if (obj instanceof Set) {
|
|
326
|
+
const setCopy = /* @__PURE__ */ new Set();
|
|
327
|
+
obj.forEach((value) => {
|
|
328
|
+
setCopy.add(deepCopy(value));
|
|
329
|
+
});
|
|
330
|
+
return setCopy;
|
|
331
|
+
}
|
|
332
|
+
const copy = {};
|
|
333
|
+
for (const key in obj) {
|
|
334
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
335
|
+
copy[key] = deepCopy(obj[key]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return copy;
|
|
339
|
+
}
|
|
304
340
|
export {
|
|
305
341
|
concatenatePaths,
|
|
306
342
|
createFieldMap,
|
|
343
|
+
deepCopy,
|
|
307
344
|
deleteBy,
|
|
308
345
|
determineFieldLevelErrorSourceAndValue,
|
|
309
346
|
determineFormLevelErrorSourceAndValue,
|
package/dist/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import { liteThrottle } from '@tanstack/pacer-lite'\nimport { formEventClient } from './EventClient'\nimport type { ValidationLogicProps } from './ValidationLogic'\nimport type { FieldValidators } from './FieldApi'\nimport type { AnyFormApi, FormValidators } from './FormApi'\nimport type {\n GlobalFormValidationError,\n ValidationCause,\n ValidationError,\n ValidationSource,\n} from './types'\n\nexport type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\n/**\n * @private\n */\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n * @private\n */\nexport function getBy(obj: unknown, path: string | (string | number)[]): any {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart) => {\n if (current === null) return null\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n * @private\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n if (parent === null) {\n parent = {}\n }\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && typeof key === 'number') {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n * @private\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (!parent) return\n if (path.length === 1) {\n const finalPath = path[0]!\n if (Array.isArray(parent) && typeof finalPath === 'number') {\n return parent.filter((_, i) => i !== finalPath)\n }\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n if (key >= parent.length) {\n return parent\n }\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reLineOfOnlyDigits = /^(\\d+)$/gm\n// the second dot must be in a lookahead or the engine\n// will skip subsequent numbers (like foo.0.1.)\nconst reDigitsBetweenDots = /\\.(\\d+)(?=\\.)/gm\nconst reStartWithDigitThenDot = /^(\\d+)\\./gm\nconst reDotWithDigitsToEnd = /\\.(\\d+$)/gm\nconst reMultipleDots = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\n/**\n * @private\n */\nexport function makePathArray(str: string | Array<string | number>) {\n if (Array.isArray(str)) {\n return [...str]\n }\n\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return (\n str\n // Leading `[` may lead to wrong parsing down the line\n // (Example: '[0][1]' should be '0.1', not '.0.1')\n .replace(/(^\\[)|]/gm, '')\n .replace(/\\[/g, '.')\n .replace(reLineOfOnlyDigits, intReplace)\n .replace(reDigitsBetweenDots, `.${intReplace}.`)\n .replace(reStartWithDigitThenDot, `${intReplace}.`)\n .replace(reDotWithDigitsToEnd, `.${intReplace}`)\n .replace(reMultipleDots, '.')\n .split('.')\n .map((d) => {\n if (d.startsWith(intPrefix)) {\n const numStr = d.substring(intPrefix.length)\n const num = parseInt(numStr, 10)\n\n if (String(num) === numStr) {\n return num\n }\n return numStr\n }\n return d\n })\n )\n}\n\n/**\n * @private\n */\nexport function concatenatePaths(path1: string, path2: string): string {\n if (path1.length === 0) return path2\n if (path2.length === 0) return path1\n\n if (path2.startsWith('[')) {\n return path1 + path2\n }\n\n // In cases where parent and child withFieldGroup forms are both nested\n if (path2.startsWith('.')) {\n return path1 + path2\n }\n\n return `${path1}.${path2}`\n}\n\n/**\n * @private\n */\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\ninterface AsyncValidatorArrayPartialOptions<T> {\n validators?: T\n asyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface AsyncValidator<T> {\n cause: ValidationCause\n validate: T\n debounceMs: number\n}\n\ninterface SyncValidatorArrayPartialOptions<T> {\n validators?: T\n}\n\n/**\n * @private\n */\nexport interface SyncValidator<T> {\n cause: ValidationCause\n validate: T\n}\n\n/**\n * @private\n */\nexport function getSyncValidatorArray<T>(\n cause: ValidationCause,\n options: SyncValidatorArrayPartialOptions<T> & {\n validationLogic?: any\n form?: any\n },\n): T extends FieldValidators<\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 ? Array<\n SyncValidator<\n | T['onChange']\n | T['onBlur']\n | T['onSubmit']\n | T['onMount']\n | T['onDynamic']\n >\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<\n | T['onChange']\n | T['onBlur']\n | T['onSubmit']\n | T['onMount']\n | T['onDynamic']\n >\n >\n : never {\n const runValidation = (\n props: Parameters<ValidationLogicProps['runValidation']>[0],\n ) => {\n return props.validators.filter(Boolean).map((validator) => {\n return {\n cause: validator!.cause,\n validate: validator!.fn,\n }\n })\n }\n\n return options.validationLogic({\n form: options.form,\n validators: options.validators,\n event: { type: cause, async: false },\n runValidation,\n })\n}\n\n/**\n * @private\n */\nexport function getAsyncValidatorArray<T>(\n cause: ValidationCause,\n options: AsyncValidatorArrayPartialOptions<T> & {\n validationLogic?: any\n form?: any\n },\n): T extends FieldValidators<\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 ? Array<\n AsyncValidator<\n | T['onChangeAsync']\n | T['onBlurAsync']\n | T['onSubmitAsync']\n | T['onDynamicAsync']\n >\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<\n | T['onChangeAsync']\n | T['onBlurAsync']\n | T['onSubmitAsync']\n | T['onDynamicAsync']\n >\n >\n : never {\n const { asyncDebounceMs } = options\n const {\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n onDynamicAsyncDebounceMs,\n } = (options.validators || {}) as\n | FieldValidators<\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 | FormValidators<any, any, any, any, any, any, any, any, any, any>\n\n const defaultDebounceMs = asyncDebounceMs ?? 0\n\n const runValidation = (\n props: Parameters<ValidationLogicProps['runValidation']>[0],\n ) => {\n return props.validators.filter(Boolean).map((validator) => {\n const validatorCause = validator?.cause || cause\n\n let debounceMs = defaultDebounceMs\n\n switch (validatorCause) {\n case 'change':\n debounceMs = onChangeAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'blur':\n debounceMs = onBlurAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'dynamic':\n debounceMs = onDynamicAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'submit':\n debounceMs = 0 // submit validators are always run immediately\n break\n default:\n break\n }\n\n if (cause === 'submit') {\n debounceMs = 0\n }\n\n return {\n cause: validatorCause,\n validate: validator!.fn,\n debounceMs: debounceMs,\n }\n })\n }\n\n return options.validationLogic({\n form: options.form,\n validators: options.validators,\n event: { type: cause, async: true },\n runValidation,\n })\n}\n\nexport const isGlobalFormValidationError = (\n error: unknown,\n): error is GlobalFormValidationError<unknown> => {\n return !!error && typeof error === 'object' && 'fields' in error\n}\n\nexport function evaluate<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n return objA.getTime() === objB.getTime()\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n const keysA = Object.keys(objA)\n const keysB = Object.keys(objB)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n for (const key of keysA) {\n // performs recursive search down the object tree\n\n if (\n !keysB.includes(key) ||\n !evaluate(objA[key as keyof T], objB[key as keyof T])\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the form level sync/async validation.\n * @private\n */\nexport const determineFormLevelErrorSourceAndValue = ({\n newFormValidatorError,\n isPreviousErrorFromFormValidator,\n previousErrorValue,\n}: {\n newFormValidatorError: ValidationError\n isPreviousErrorFromFormValidator: boolean\n previousErrorValue: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // All falsy values are not considered errors\n if (newFormValidatorError) {\n return { newErrorValue: newFormValidatorError, newSource: 'form' }\n }\n\n // Clears form level error since it's now stale\n if (isPreviousErrorFromFormValidator) {\n return { newErrorValue: undefined, newSource: undefined }\n }\n\n // At this point, we have a preivous error which must have been set by the field validator, keep as is\n if (previousErrorValue) {\n return { newErrorValue: previousErrorValue, newSource: 'field' }\n }\n\n // No new or previous error, clear the error\n return { newErrorValue: undefined, newSource: undefined }\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the field level sync/async validation.\n * @private\n */\nexport const determineFieldLevelErrorSourceAndValue = ({\n formLevelError,\n fieldLevelError,\n}: {\n formLevelError: ValidationError\n fieldLevelError: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // At field level, we prioritize the field level error\n if (fieldLevelError) {\n return { newErrorValue: fieldLevelError, newSource: 'field' }\n }\n\n // If there is no field level error, and there is a form level error, we set the form level error\n if (formLevelError) {\n return { newErrorValue: formLevelError, newSource: 'form' }\n }\n\n return { newErrorValue: undefined, newSource: undefined }\n}\n\nexport function createFieldMap<T>(values: Readonly<T>): { [K in keyof T]: K } {\n const output: { [K in keyof T]: K } = {} as any\n\n for (const key in values) {\n output[key] = key\n }\n\n return output\n}\n\n/**\n * Merge the first parameter with the given overrides.\n * @private\n */\nexport function mergeOpts<T>(\n originalOpts: T | undefined | null,\n overrides: T,\n): T {\n if (originalOpts === undefined || originalOpts === null) {\n return overrides\n }\n\n return { ...originalOpts, ...overrides }\n}\n\n/*\n/ credit is due to https://github.com/lukeed/uuid for this code, with current npm\n/ attacks we didn't feel comfortable installing directly from npm. But big appreciation\n/ from the TanStack Form team <3.\n*/\n\nlet IDX = 256\nconst HEX: string[] = []\nlet BUFFER: number[] | undefined\n\nwhile (IDX--) {\n HEX[IDX] = (IDX + 256).toString(16).substring(1)\n}\n\nexport function uuid(): string {\n let i = 0\n let num: number\n let out = ''\n\n if (!BUFFER || IDX + 16 > 256) {\n BUFFER = new Array<number>(256)\n i = 256\n while (i--) {\n BUFFER[i] = (256 * Math.random()) | 0\n }\n i = 0\n IDX = 0\n }\n\n for (; i < 16; i++) {\n num = BUFFER[IDX + i] as number\n if (i === 6) out += HEX[(num & 15) | 64]\n else if (i === 8) out += HEX[(num & 63) | 128]\n else out += HEX[num]\n\n if (i & 1 && i > 1 && i < 11) out += '-'\n }\n\n IDX++\n return out\n}\n\nexport const throttleFormState = liteThrottle(\n (form: AnyFormApi) =>\n formEventClient.emit('form-state', {\n id: form.formId,\n state: form.store.state,\n }),\n {\n wait: 300,\n },\n)\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import { liteThrottle } from '@tanstack/pacer-lite'\nimport { formEventClient } from './EventClient'\nimport type { ValidationLogicProps } from './ValidationLogic'\nimport type { FieldValidators } from './FieldApi'\nimport type { AnyFormApi, FormValidators } from './FormApi'\nimport type {\n GlobalFormValidationError,\n ValidationCause,\n ValidationError,\n ValidationSource,\n} from './types'\n\nexport type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\n/**\n * @private\n */\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n * @private\n */\nexport function getBy(obj: unknown, path: string | (string | number)[]): any {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart) => {\n if (current === null) return null\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n * @private\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n if (parent === null) {\n parent = {}\n }\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && typeof key === 'number') {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n * @private\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (!parent) return\n if (path.length === 1) {\n const finalPath = path[0]!\n if (Array.isArray(parent) && typeof finalPath === 'number') {\n return parent.filter((_, i) => i !== finalPath)\n }\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n if (key >= parent.length) {\n return parent\n }\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reLineOfOnlyDigits = /^(\\d+)$/gm\n// the second dot must be in a lookahead or the engine\n// will skip subsequent numbers (like foo.0.1.)\nconst reDigitsBetweenDots = /\\.(\\d+)(?=\\.)/gm\nconst reStartWithDigitThenDot = /^(\\d+)\\./gm\nconst reDotWithDigitsToEnd = /\\.(\\d+$)/gm\nconst reMultipleDots = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\n/**\n * @private\n */\nexport function makePathArray(str: string | Array<string | number>) {\n if (Array.isArray(str)) {\n return [...str]\n }\n\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return (\n str\n // Leading `[` may lead to wrong parsing down the line\n // (Example: '[0][1]' should be '0.1', not '.0.1')\n .replace(/(^\\[)|]/gm, '')\n .replace(/\\[/g, '.')\n .replace(reLineOfOnlyDigits, intReplace)\n .replace(reDigitsBetweenDots, `.${intReplace}.`)\n .replace(reStartWithDigitThenDot, `${intReplace}.`)\n .replace(reDotWithDigitsToEnd, `.${intReplace}`)\n .replace(reMultipleDots, '.')\n .split('.')\n .map((d) => {\n if (d.startsWith(intPrefix)) {\n const numStr = d.substring(intPrefix.length)\n const num = parseInt(numStr, 10)\n\n if (String(num) === numStr) {\n return num\n }\n return numStr\n }\n return d\n })\n )\n}\n\n/**\n * @private\n */\nexport function concatenatePaths(path1: string, path2: string): string {\n if (path1.length === 0) return path2\n if (path2.length === 0) return path1\n\n if (path2.startsWith('[')) {\n return path1 + path2\n }\n\n // In cases where parent and child withFieldGroup forms are both nested\n if (path2.startsWith('.')) {\n return path1 + path2\n }\n\n return `${path1}.${path2}`\n}\n\n/**\n * @private\n */\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\ninterface AsyncValidatorArrayPartialOptions<T> {\n validators?: T\n asyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface AsyncValidator<T> {\n cause: ValidationCause\n validate: T\n debounceMs: number\n}\n\ninterface SyncValidatorArrayPartialOptions<T> {\n validators?: T\n}\n\n/**\n * @private\n */\nexport interface SyncValidator<T> {\n cause: ValidationCause\n validate: T\n}\n\n/**\n * @private\n */\nexport function getSyncValidatorArray<T>(\n cause: ValidationCause,\n options: SyncValidatorArrayPartialOptions<T> & {\n validationLogic?: any\n form?: any\n },\n): T extends FieldValidators<\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 ? Array<\n SyncValidator<\n | T['onChange']\n | T['onBlur']\n | T['onSubmit']\n | T['onMount']\n | T['onDynamic']\n >\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<\n | T['onChange']\n | T['onBlur']\n | T['onSubmit']\n | T['onMount']\n | T['onDynamic']\n >\n >\n : never {\n const runValidation = (\n props: Parameters<ValidationLogicProps['runValidation']>[0],\n ) => {\n return props.validators.filter(Boolean).map((validator) => {\n return {\n cause: validator!.cause,\n validate: validator!.fn,\n }\n })\n }\n\n return options.validationLogic({\n form: options.form,\n validators: options.validators,\n event: { type: cause, async: false },\n runValidation,\n })\n}\n\n/**\n * @private\n */\nexport function getAsyncValidatorArray<T>(\n cause: ValidationCause,\n options: AsyncValidatorArrayPartialOptions<T> & {\n validationLogic?: any\n form?: any\n },\n): T extends FieldValidators<\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 ? Array<\n AsyncValidator<\n | T['onChangeAsync']\n | T['onBlurAsync']\n | T['onSubmitAsync']\n | T['onDynamicAsync']\n >\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<\n | T['onChangeAsync']\n | T['onBlurAsync']\n | T['onSubmitAsync']\n | T['onDynamicAsync']\n >\n >\n : never {\n const { asyncDebounceMs } = options\n const {\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n onDynamicAsyncDebounceMs,\n } = (options.validators || {}) as\n | FieldValidators<\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 | FormValidators<any, any, any, any, any, any, any, any, any, any>\n\n const defaultDebounceMs = asyncDebounceMs ?? 0\n\n const runValidation = (\n props: Parameters<ValidationLogicProps['runValidation']>[0],\n ) => {\n return props.validators.filter(Boolean).map((validator) => {\n const validatorCause = validator?.cause || cause\n\n let debounceMs = defaultDebounceMs\n\n switch (validatorCause) {\n case 'change':\n debounceMs = onChangeAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'blur':\n debounceMs = onBlurAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'dynamic':\n debounceMs = onDynamicAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'submit':\n debounceMs = 0 // submit validators are always run immediately\n break\n default:\n break\n }\n\n if (cause === 'submit') {\n debounceMs = 0\n }\n\n return {\n cause: validatorCause,\n validate: validator!.fn,\n debounceMs: debounceMs,\n }\n })\n }\n\n return options.validationLogic({\n form: options.form,\n validators: options.validators,\n event: { type: cause, async: true },\n runValidation,\n })\n}\n\nexport const isGlobalFormValidationError = (\n error: unknown,\n): error is GlobalFormValidationError<unknown> => {\n return !!error && typeof error === 'object' && 'fields' in error\n}\n\nexport function evaluate<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n return objA.getTime() === objB.getTime()\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n const keysA = Object.keys(objA)\n const keysB = Object.keys(objB)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n for (const key of keysA) {\n // performs recursive search down the object tree\n\n if (\n !keysB.includes(key) ||\n !evaluate(objA[key as keyof T], objB[key as keyof T])\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the form level sync/async validation.\n * @private\n */\nexport const determineFormLevelErrorSourceAndValue = ({\n newFormValidatorError,\n isPreviousErrorFromFormValidator,\n previousErrorValue,\n}: {\n newFormValidatorError: ValidationError\n isPreviousErrorFromFormValidator: boolean\n previousErrorValue: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // All falsy values are not considered errors\n if (newFormValidatorError) {\n return { newErrorValue: newFormValidatorError, newSource: 'form' }\n }\n\n // Clears form level error since it's now stale\n if (isPreviousErrorFromFormValidator) {\n return { newErrorValue: undefined, newSource: undefined }\n }\n\n // At this point, we have a preivous error which must have been set by the field validator, keep as is\n if (previousErrorValue) {\n return { newErrorValue: previousErrorValue, newSource: 'field' }\n }\n\n // No new or previous error, clear the error\n return { newErrorValue: undefined, newSource: undefined }\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the field level sync/async validation.\n * @private\n */\nexport const determineFieldLevelErrorSourceAndValue = ({\n formLevelError,\n fieldLevelError,\n}: {\n formLevelError: ValidationError\n fieldLevelError: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // At field level, we prioritize the field level error\n if (fieldLevelError) {\n return { newErrorValue: fieldLevelError, newSource: 'field' }\n }\n\n // If there is no field level error, and there is a form level error, we set the form level error\n if (formLevelError) {\n return { newErrorValue: formLevelError, newSource: 'form' }\n }\n\n return { newErrorValue: undefined, newSource: undefined }\n}\n\nexport function createFieldMap<T>(values: Readonly<T>): { [K in keyof T]: K } {\n const output: { [K in keyof T]: K } = {} as any\n\n for (const key in values) {\n output[key] = key\n }\n\n return output\n}\n\n/**\n * Merge the first parameter with the given overrides.\n * @private\n */\nexport function mergeOpts<T>(\n originalOpts: T | undefined | null,\n overrides: T,\n): T {\n if (originalOpts === undefined || originalOpts === null) {\n return overrides\n }\n\n return { ...originalOpts, ...overrides }\n}\n\n/*\n/ credit is due to https://github.com/lukeed/uuid for this code, with current npm\n/ attacks we didn't feel comfortable installing directly from npm. But big appreciation\n/ from the TanStack Form team <3.\n*/\n\nlet IDX = 256\nconst HEX: string[] = []\nlet BUFFER: number[] | undefined\n\nwhile (IDX--) {\n HEX[IDX] = (IDX + 256).toString(16).substring(1)\n}\n\nexport function uuid(): string {\n let i = 0\n let num: number\n let out = ''\n\n if (!BUFFER || IDX + 16 > 256) {\n BUFFER = new Array<number>(256)\n i = 256\n while (i--) {\n BUFFER[i] = (256 * Math.random()) | 0\n }\n i = 0\n IDX = 0\n }\n\n for (; i < 16; i++) {\n num = BUFFER[IDX + i] as number\n if (i === 6) out += HEX[(num & 15) | 64]\n else if (i === 8) out += HEX[(num & 63) | 128]\n else out += HEX[num]\n\n if (i & 1 && i > 1 && i < 11) out += '-'\n }\n\n IDX++\n return out\n}\n\nexport const throttleFormState = liteThrottle(\n (form: AnyFormApi) =>\n formEventClient.emit('form-state', {\n id: form.formId,\n state: form.store.state,\n }),\n {\n wait: 300,\n },\n)\n\n// Do not use a serialize and deserialize method like JSON.stringify/parse\n// as that will drop functions, dates, undefined, Infinity, NaN, etc.\nexport function deepCopy<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as any\n }\n\n if (Array.isArray(obj)) {\n const arrCopy = [] as any[]\n for (let i = 0; i < obj.length; i++) {\n arrCopy[i] = deepCopy(obj[i])\n }\n return arrCopy as any\n }\n\n if (obj instanceof Map) {\n const mapCopy = new Map()\n obj.forEach((value, key) => {\n mapCopy.set(key, deepCopy(value))\n })\n return mapCopy as any\n }\n\n if (obj instanceof Set) {\n const setCopy = new Set()\n obj.forEach((value) => {\n setCopy.add(deepCopy(value))\n })\n return setCopy as any\n }\n\n const copy: { [key: string]: any } = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n copy[key] = deepCopy((obj as any)[key])\n }\n }\n return copy as T\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/form-core",
|
|
3
|
-
"version": "1.28.
|
|
3
|
+
"version": "1.28.2",
|
|
4
4
|
"description": "Powerful, type-safe, framework agnostic forms.",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@tanstack/devtools-event-client": "^0.4.0",
|
|
41
41
|
"@tanstack/pacer-lite": "^0.1.1",
|
|
42
|
-
"@tanstack/store": "^0.
|
|
42
|
+
"@tanstack/store": "^0.8.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"arktype": "^2.1.22",
|
package/src/FormApi.ts
CHANGED
|
@@ -40,6 +40,7 @@ import type {
|
|
|
40
40
|
FieldManipulator,
|
|
41
41
|
FormValidationError,
|
|
42
42
|
FormValidationErrorMap,
|
|
43
|
+
GlobalFormValidationError,
|
|
43
44
|
ListenerCause,
|
|
44
45
|
UpdateMetaOptions,
|
|
45
46
|
ValidationCause,
|
|
@@ -218,55 +219,6 @@ export interface FormValidators<
|
|
|
218
219
|
onDynamicAsyncDebounceMs?: number
|
|
219
220
|
}
|
|
220
221
|
|
|
221
|
-
/**
|
|
222
|
-
* @private
|
|
223
|
-
*/
|
|
224
|
-
export interface FormTransform<
|
|
225
|
-
TFormData,
|
|
226
|
-
TOnMount extends undefined | FormValidateOrFn<TFormData>,
|
|
227
|
-
TOnChange extends undefined | FormValidateOrFn<TFormData>,
|
|
228
|
-
TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
229
|
-
TOnBlur extends undefined | FormValidateOrFn<TFormData>,
|
|
230
|
-
TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
231
|
-
TOnSubmit extends undefined | FormValidateOrFn<TFormData>,
|
|
232
|
-
TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
233
|
-
TOnDynamic extends undefined | FormValidateOrFn<TFormData>,
|
|
234
|
-
TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
235
|
-
TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
236
|
-
TSubmitMeta = never,
|
|
237
|
-
> {
|
|
238
|
-
fn: (
|
|
239
|
-
formBase: FormApi<
|
|
240
|
-
TFormData,
|
|
241
|
-
TOnMount,
|
|
242
|
-
TOnChange,
|
|
243
|
-
TOnChangeAsync,
|
|
244
|
-
TOnBlur,
|
|
245
|
-
TOnBlurAsync,
|
|
246
|
-
TOnSubmit,
|
|
247
|
-
TOnSubmitAsync,
|
|
248
|
-
TOnDynamic,
|
|
249
|
-
TOnDynamicAsync,
|
|
250
|
-
TOnServer,
|
|
251
|
-
TSubmitMeta
|
|
252
|
-
>,
|
|
253
|
-
) => FormApi<
|
|
254
|
-
TFormData,
|
|
255
|
-
TOnMount,
|
|
256
|
-
TOnChange,
|
|
257
|
-
TOnChangeAsync,
|
|
258
|
-
TOnBlur,
|
|
259
|
-
TOnBlurAsync,
|
|
260
|
-
TOnSubmit,
|
|
261
|
-
TOnSubmitAsync,
|
|
262
|
-
TOnDynamic,
|
|
263
|
-
TOnDynamicAsync,
|
|
264
|
-
TOnServer,
|
|
265
|
-
TSubmitMeta
|
|
266
|
-
>
|
|
267
|
-
deps: unknown[]
|
|
268
|
-
}
|
|
269
|
-
|
|
270
222
|
export interface FormListeners<
|
|
271
223
|
TFormData,
|
|
272
224
|
TOnMount extends undefined | FormValidateOrFn<TFormData>,
|
|
@@ -498,20 +450,13 @@ export interface FormOptions<
|
|
|
498
450
|
>
|
|
499
451
|
meta: TSubmitMeta
|
|
500
452
|
}) => void
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
NoInfer<TOnSubmit>,
|
|
509
|
-
NoInfer<TOnSubmitAsync>,
|
|
510
|
-
NoInfer<TOnDynamic>,
|
|
511
|
-
NoInfer<TOnDynamicAsync>,
|
|
512
|
-
NoInfer<TOnServer>,
|
|
513
|
-
NoInfer<TSubmitMeta>
|
|
514
|
-
>
|
|
453
|
+
// Only runs in `core` for the first run on the Form, any additional transforms
|
|
454
|
+
// need to be handled at framework runtime due to complexity of comparison check
|
|
455
|
+
// and state merging
|
|
456
|
+
//
|
|
457
|
+
// Made intentionally type loose to avoid headaches with framework's individual
|
|
458
|
+
// `useTransform` hooks
|
|
459
|
+
transform?: (data: unknown) => unknown
|
|
515
460
|
}
|
|
516
461
|
|
|
517
462
|
export type AnyFormOptions = FormOptions<
|
|
@@ -659,6 +604,20 @@ export type BaseFormState<
|
|
|
659
604
|
_force_re_eval?: boolean
|
|
660
605
|
}
|
|
661
606
|
|
|
607
|
+
export type AnyBaseFormState = BaseFormState<
|
|
608
|
+
any,
|
|
609
|
+
any,
|
|
610
|
+
any,
|
|
611
|
+
any,
|
|
612
|
+
any,
|
|
613
|
+
any,
|
|
614
|
+
any,
|
|
615
|
+
any,
|
|
616
|
+
any,
|
|
617
|
+
any,
|
|
618
|
+
any
|
|
619
|
+
>
|
|
620
|
+
|
|
662
621
|
export type DerivedFormState<
|
|
663
622
|
in out TFormData,
|
|
664
623
|
in out TOnMount extends undefined | FormValidateOrFn<TFormData>,
|
|
@@ -916,6 +875,7 @@ export class FormApi<
|
|
|
916
875
|
TOnServer,
|
|
917
876
|
TSubmitMeta
|
|
918
877
|
> = {}
|
|
878
|
+
|
|
919
879
|
baseStore!: Store<
|
|
920
880
|
BaseFormState<
|
|
921
881
|
TFormData,
|
|
@@ -970,11 +930,6 @@ export class FormApi<
|
|
|
970
930
|
return this.store.state
|
|
971
931
|
}
|
|
972
932
|
|
|
973
|
-
/**
|
|
974
|
-
* @private
|
|
975
|
-
*/
|
|
976
|
-
prevTransformArray: unknown[] = []
|
|
977
|
-
|
|
978
933
|
/**
|
|
979
934
|
* @private
|
|
980
935
|
*/
|
|
@@ -1021,13 +976,67 @@ export class FormApi<
|
|
|
1021
976
|
|
|
1022
977
|
this._devtoolsSubmissionOverride = false
|
|
1023
978
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
979
|
+
let baseStoreVal: BaseFormState<
|
|
980
|
+
TFormData,
|
|
981
|
+
TOnMount,
|
|
982
|
+
TOnChange,
|
|
983
|
+
TOnChangeAsync,
|
|
984
|
+
TOnBlur,
|
|
985
|
+
TOnBlurAsync,
|
|
986
|
+
TOnSubmit,
|
|
987
|
+
TOnSubmitAsync,
|
|
988
|
+
TOnDynamic,
|
|
989
|
+
TOnDynamicAsync,
|
|
990
|
+
TOnServer
|
|
991
|
+
> = getDefaultFormState({
|
|
992
|
+
...(opts?.defaultState as any),
|
|
993
|
+
values: opts?.defaultValues ?? opts?.defaultState?.values,
|
|
994
|
+
isFormValid: true,
|
|
995
|
+
})
|
|
996
|
+
|
|
997
|
+
if (opts?.transform) {
|
|
998
|
+
baseStoreVal = (
|
|
999
|
+
opts.transform({ state: baseStoreVal }) as { state: unknown }
|
|
1000
|
+
).state as never
|
|
1001
|
+
for (const errKey of Object.keys(baseStoreVal.errorMap)) {
|
|
1002
|
+
const errKeyMap = baseStoreVal.errorMap[errKey as never] as
|
|
1003
|
+
| GlobalFormValidationError<any>
|
|
1004
|
+
| undefined
|
|
1005
|
+
if (
|
|
1006
|
+
errKeyMap === undefined ||
|
|
1007
|
+
!isGlobalFormValidationError(errKeyMap)
|
|
1008
|
+
) {
|
|
1009
|
+
continue
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
for (const fieldName of Object.keys(errKeyMap.fields)) {
|
|
1013
|
+
const fieldErr = errKeyMap.fields[fieldName]
|
|
1014
|
+
if (fieldErr === undefined) {
|
|
1015
|
+
continue
|
|
1016
|
+
}
|
|
1017
|
+
const existingFieldMeta = baseStoreVal.fieldMetaBase[
|
|
1018
|
+
fieldName as never
|
|
1019
|
+
] as AnyFieldMetaBase | undefined
|
|
1020
|
+
baseStoreVal.fieldMetaBase[fieldName as never] = {
|
|
1021
|
+
isTouched: false,
|
|
1022
|
+
isValidating: false,
|
|
1023
|
+
isBlurred: false,
|
|
1024
|
+
isDirty: false,
|
|
1025
|
+
...(existingFieldMeta ?? {}),
|
|
1026
|
+
errorSourceMap: {
|
|
1027
|
+
...(existingFieldMeta?.['errorSourceMap'] ?? {}),
|
|
1028
|
+
onChange: 'form',
|
|
1029
|
+
},
|
|
1030
|
+
errorMap: {
|
|
1031
|
+
...(existingFieldMeta?.['errorMap'] ?? {}),
|
|
1032
|
+
[errKey as never]: fieldErr,
|
|
1033
|
+
},
|
|
1034
|
+
} satisfies AnyFieldMetaBase as never
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
this.baseStore = new Store(baseStoreVal)
|
|
1031
1040
|
|
|
1032
1041
|
this.fieldMetaDerived = new Derived({
|
|
1033
1042
|
deps: [this.baseStore],
|
|
@@ -1260,7 +1269,7 @@ export class FormApi<
|
|
|
1260
1269
|
return prevVal
|
|
1261
1270
|
}
|
|
1262
1271
|
|
|
1263
|
-
|
|
1272
|
+
const state = {
|
|
1264
1273
|
...currBaseStore,
|
|
1265
1274
|
errorMap,
|
|
1266
1275
|
fieldMeta: this.fieldMetaDerived.state,
|
|
@@ -1289,20 +1298,6 @@ export class FormApi<
|
|
|
1289
1298
|
TOnServer
|
|
1290
1299
|
>
|
|
1291
1300
|
|
|
1292
|
-
// Only run transform if state has shallowly changed - IE how React.useEffect works
|
|
1293
|
-
const transformArray = this.options.transform?.deps ?? []
|
|
1294
|
-
const shouldTransform =
|
|
1295
|
-
transformArray.length !== this.prevTransformArray.length ||
|
|
1296
|
-
transformArray.some((val, i) => val !== this.prevTransformArray[i])
|
|
1297
|
-
|
|
1298
|
-
if (shouldTransform) {
|
|
1299
|
-
const newObj = Object.assign({}, this, { state })
|
|
1300
|
-
// This mutates the state
|
|
1301
|
-
this.options.transform?.fn(newObj)
|
|
1302
|
-
state = newObj.state
|
|
1303
|
-
this.prevTransformArray = transformArray
|
|
1304
|
-
}
|
|
1305
|
-
|
|
1306
1301
|
return state
|
|
1307
1302
|
},
|
|
1308
1303
|
})
|
|
@@ -1443,11 +1438,6 @@ export class FormApi<
|
|
|
1443
1438
|
// Options need to be updated first so that when the store is updated, the state is correct for the derived state
|
|
1444
1439
|
this.options = options
|
|
1445
1440
|
|
|
1446
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
1447
|
-
const shouldUpdateReeval = !!options.transform?.deps?.some(
|
|
1448
|
-
(val, i) => val !== this.prevTransformArray[i],
|
|
1449
|
-
)
|
|
1450
|
-
|
|
1451
1441
|
const shouldUpdateValues =
|
|
1452
1442
|
options.defaultValues &&
|
|
1453
1443
|
!evaluate(options.defaultValues, oldOptions.defaultValues) &&
|
|
@@ -1457,7 +1447,7 @@ export class FormApi<
|
|
|
1457
1447
|
!evaluate(options.defaultState, oldOptions.defaultState) &&
|
|
1458
1448
|
!this.state.isTouched
|
|
1459
1449
|
|
|
1460
|
-
if (!shouldUpdateValues && !shouldUpdateState
|
|
1450
|
+
if (!shouldUpdateValues && !shouldUpdateState) return
|
|
1461
1451
|
|
|
1462
1452
|
batch(() => {
|
|
1463
1453
|
this.baseStore.setState(() =>
|
|
@@ -1473,10 +1463,6 @@ export class FormApi<
|
|
|
1473
1463
|
values: options.defaultValues,
|
|
1474
1464
|
}
|
|
1475
1465
|
: {},
|
|
1476
|
-
|
|
1477
|
-
shouldUpdateReeval
|
|
1478
|
-
? { _force_re_eval: !this.state._force_re_eval }
|
|
1479
|
-
: {},
|
|
1480
1466
|
),
|
|
1481
1467
|
),
|
|
1482
1468
|
)
|
package/src/index.ts
CHANGED
package/src/mergeForm.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
FormApi,
|
|
3
|
+
FormAsyncValidateOrFn,
|
|
4
|
+
FormValidateOrFn,
|
|
5
|
+
} from './FormApi'
|
|
2
6
|
|
|
3
7
|
function isValidKey(key: string | number | symbol): boolean {
|
|
4
8
|
const dangerousProps = ['__proto__', 'constructor', 'prototype']
|
|
@@ -70,35 +74,48 @@ export function mutateMergeDeep(
|
|
|
70
74
|
return target
|
|
71
75
|
}
|
|
72
76
|
|
|
73
|
-
export function mergeForm<
|
|
77
|
+
export function mergeForm<
|
|
78
|
+
TFormData,
|
|
79
|
+
TOnMount extends undefined | FormValidateOrFn<TFormData>,
|
|
80
|
+
TOnChange extends undefined | FormValidateOrFn<TFormData>,
|
|
81
|
+
TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
82
|
+
TOnBlur extends undefined | FormValidateOrFn<TFormData>,
|
|
83
|
+
TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
84
|
+
TOnSubmit extends undefined | FormValidateOrFn<TFormData>,
|
|
85
|
+
TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
86
|
+
TOnDynamic extends undefined | FormValidateOrFn<TFormData>,
|
|
87
|
+
TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
88
|
+
TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,
|
|
89
|
+
TSubmitMeta = never,
|
|
90
|
+
>(
|
|
74
91
|
baseForm: FormApi<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
92
|
+
TFormData,
|
|
93
|
+
TOnMount,
|
|
94
|
+
TOnChange,
|
|
95
|
+
TOnChangeAsync,
|
|
96
|
+
TOnBlur,
|
|
97
|
+
TOnBlurAsync,
|
|
98
|
+
TOnSubmit,
|
|
99
|
+
TOnSubmitAsync,
|
|
100
|
+
TOnDynamic,
|
|
101
|
+
TOnDynamicAsync,
|
|
102
|
+
TOnServer,
|
|
103
|
+
TSubmitMeta
|
|
87
104
|
>,
|
|
88
105
|
state: Partial<
|
|
89
106
|
FormApi<
|
|
90
107
|
TFormData,
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
108
|
+
TOnMount,
|
|
109
|
+
TOnChange,
|
|
110
|
+
TOnChangeAsync,
|
|
111
|
+
TOnBlur,
|
|
112
|
+
TOnBlurAsync,
|
|
113
|
+
TOnSubmit,
|
|
114
|
+
TOnSubmitAsync,
|
|
115
|
+
TOnDynamic,
|
|
116
|
+
TOnDynamicAsync,
|
|
117
|
+
TOnServer,
|
|
118
|
+
TSubmitMeta
|
|
102
119
|
>['state']
|
|
103
120
|
>,
|
|
104
121
|
) {
|