@tanstack/form-core 0.11.0 → 0.13.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.
Files changed (101) hide show
  1. package/dist/cjs/FieldApi.d.ts +94 -0
  2. package/dist/cjs/FormApi.d.ts +118 -0
  3. package/dist/cjs/index.cjs +926 -0
  4. package/dist/cjs/index.cjs.map +1 -0
  5. package/dist/cjs/index.d.cts +5 -0
  6. package/dist/cjs/index.d.ts +5 -0
  7. package/dist/cjs/index.js +926 -0
  8. package/dist/cjs/mergeForm.d.ts +4 -0
  9. package/dist/cjs/tests/FieldApi.spec.d.ts +1 -0
  10. package/dist/cjs/tests/FieldApi.test-d.d.ts +1 -0
  11. package/dist/cjs/tests/FormApi.spec.d.ts +1 -0
  12. package/dist/cjs/tests/mutateMergeDeep.spec.d.ts +1 -0
  13. package/dist/cjs/tests/utils.d.ts +1 -0
  14. package/dist/cjs/tests/utils.spec.d.ts +1 -0
  15. package/dist/cjs/types.d.ts +14 -0
  16. package/dist/cjs/utils.d.ts +57 -0
  17. package/dist/mjs/FieldApi.d.ts +94 -0
  18. package/dist/mjs/FormApi.d.ts +118 -0
  19. package/dist/mjs/index.d.mts +5 -0
  20. package/dist/mjs/index.d.ts +5 -0
  21. package/dist/mjs/index.js +926 -0
  22. package/dist/mjs/index.mjs +926 -0
  23. package/dist/mjs/index.mjs.map +1 -0
  24. package/dist/mjs/mergeForm.d.ts +4 -0
  25. package/dist/mjs/tests/FieldApi.spec.d.ts +1 -0
  26. package/dist/mjs/tests/FieldApi.test-d.d.ts +1 -0
  27. package/dist/mjs/tests/FormApi.spec.d.ts +1 -0
  28. package/dist/mjs/tests/mutateMergeDeep.spec.d.ts +1 -0
  29. package/dist/mjs/tests/utils.d.ts +1 -0
  30. package/dist/mjs/tests/utils.spec.d.ts +1 -0
  31. package/dist/mjs/types.d.ts +14 -0
  32. package/dist/mjs/utils.d.ts +57 -0
  33. package/package.json +16 -21
  34. package/src/FieldApi.ts +53 -38
  35. package/src/FormApi.ts +59 -23
  36. package/src/index.ts +1 -0
  37. package/src/mergeForm.ts +42 -0
  38. package/src/tests/FormApi.spec.ts +1 -0
  39. package/src/tests/mutateMergeDeep.spec.ts +32 -0
  40. package/src/types.ts +2 -1
  41. package/src/utils.ts +40 -23
  42. package/build/legacy/FieldApi.cjs +0 -313
  43. package/build/legacy/FieldApi.cjs.map +0 -1
  44. package/build/legacy/FieldApi.d.cts +0 -3
  45. package/build/legacy/FieldApi.d.ts +0 -3
  46. package/build/legacy/FieldApi.js +0 -288
  47. package/build/legacy/FieldApi.js.map +0 -1
  48. package/build/legacy/FormApi.cjs +0 -445
  49. package/build/legacy/FormApi.cjs.map +0 -1
  50. package/build/legacy/FormApi.d.cts +0 -3
  51. package/build/legacy/FormApi.d.ts +0 -3
  52. package/build/legacy/FormApi.js +0 -428
  53. package/build/legacy/FormApi.js.map +0 -1
  54. package/build/legacy/index.cjs +0 -31
  55. package/build/legacy/index.cjs.map +0 -1
  56. package/build/legacy/index.d.cts +0 -257
  57. package/build/legacy/index.d.ts +0 -257
  58. package/build/legacy/index.js +0 -6
  59. package/build/legacy/index.js.map +0 -1
  60. package/build/legacy/types.cjs +0 -19
  61. package/build/legacy/types.cjs.map +0 -1
  62. package/build/legacy/types.d.cts +0 -16
  63. package/build/legacy/types.d.ts +0 -16
  64. package/build/legacy/types.js +0 -1
  65. package/build/legacy/types.js.map +0 -1
  66. package/build/legacy/utils.cjs +0 -187
  67. package/build/legacy/utils.cjs.map +0 -1
  68. package/build/legacy/utils.d.cts +0 -3
  69. package/build/legacy/utils.d.ts +0 -3
  70. package/build/legacy/utils.js +0 -156
  71. package/build/legacy/utils.js.map +0 -1
  72. package/build/modern/FieldApi.cjs +0 -312
  73. package/build/modern/FieldApi.cjs.map +0 -1
  74. package/build/modern/FieldApi.d.cts +0 -3
  75. package/build/modern/FieldApi.d.ts +0 -3
  76. package/build/modern/FieldApi.js +0 -287
  77. package/build/modern/FieldApi.js.map +0 -1
  78. package/build/modern/FormApi.cjs +0 -439
  79. package/build/modern/FormApi.cjs.map +0 -1
  80. package/build/modern/FormApi.d.cts +0 -3
  81. package/build/modern/FormApi.d.ts +0 -3
  82. package/build/modern/FormApi.js +0 -422
  83. package/build/modern/FormApi.js.map +0 -1
  84. package/build/modern/index.cjs +0 -31
  85. package/build/modern/index.cjs.map +0 -1
  86. package/build/modern/index.d.cts +0 -257
  87. package/build/modern/index.d.ts +0 -257
  88. package/build/modern/index.js +0 -6
  89. package/build/modern/index.js.map +0 -1
  90. package/build/modern/types.cjs +0 -19
  91. package/build/modern/types.cjs.map +0 -1
  92. package/build/modern/types.d.cts +0 -16
  93. package/build/modern/types.d.ts +0 -16
  94. package/build/modern/types.js +0 -1
  95. package/build/modern/types.js.map +0 -1
  96. package/build/modern/utils.cjs +0 -187
  97. package/build/modern/utils.cjs.map +0 -1
  98. package/build/modern/utils.d.cts +0 -3
  99. package/build/modern/utils.d.ts +0 -3
  100. package/build/modern/utils.js +0 -156
  101. package/build/modern/utils.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ import type { FormApi } from './FormApi'
2
+ import type { Validator } from './types'
3
+
4
+ export function mutateMergeDeep(target: object, source: object): object {
5
+ const targetKeys = Object.keys(target)
6
+ const sourceKeys = Object.keys(source)
7
+ const keySet = new Set([...targetKeys, ...sourceKeys])
8
+ for (const key of keySet) {
9
+ const targetKey = key as never as keyof typeof target
10
+ const sourceKey = key as never as keyof typeof source
11
+ if (Array.isArray(target[targetKey]) && Array.isArray(source[sourceKey])) {
12
+ target[targetKey] = [
13
+ ...(target[targetKey] as []),
14
+ ...(source[sourceKey] as []),
15
+ ] as never
16
+ } else if (
17
+ typeof target[targetKey] === 'object' &&
18
+ typeof source[sourceKey] === 'object'
19
+ ) {
20
+ mutateMergeDeep(target[targetKey] as {}, source[sourceKey] as {})
21
+ } else {
22
+ // Prevent assigning undefined to target, only if undefined is not explicitly set on source
23
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
24
+ if (!(sourceKey in source) && source[sourceKey] === undefined) {
25
+ continue
26
+ }
27
+ target[targetKey] = source[sourceKey] as never
28
+ }
29
+ }
30
+ return target
31
+ }
32
+
33
+ export function mergeForm<
34
+ TFormData,
35
+ TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,
36
+ >(
37
+ baseForm: FormApi<TFormData, TFormValidator>,
38
+ state: Partial<FormApi<TFormData, TFormValidator>['state']>,
39
+ ) {
40
+ mutateMergeDeep(baseForm.state, state)
41
+ return baseForm
42
+ }
@@ -138,6 +138,7 @@ describe('form api', () => {
138
138
  onBlur: undefined,
139
139
  onSubmit: undefined,
140
140
  onMount: undefined,
141
+ onServer: undefined,
141
142
  },
142
143
  })
143
144
  })
@@ -0,0 +1,32 @@
1
+ import { describe } from 'vitest'
2
+ import { mutateMergeDeep } from '../mergeForm'
3
+
4
+ describe('mutateMergeDeep', () => {
5
+ test('Should merge two objects by mutating', () => {
6
+ const a = { a: 1 }
7
+ const b = { b: 2 }
8
+ mutateMergeDeep(a, b)
9
+ expect(a).toStrictEqual({ a: 1, b: 2 })
10
+ })
11
+
12
+ test('Should merge two objects including overwriting with undefined', () => {
13
+ const a = { a: 1 }
14
+ const b = { a: undefined }
15
+ mutateMergeDeep(a, b)
16
+ expect(a).toStrictEqual({ a: undefined })
17
+ })
18
+
19
+ test('Should merge two object by merging arrays', () => {
20
+ const a = { a: [1] }
21
+ const b = { a: [2] }
22
+ mutateMergeDeep(a, b)
23
+ expect(a).toStrictEqual({ a: [1, 2] })
24
+ })
25
+
26
+ test('Should merge two deeply nested objects', () => {
27
+ const a = { a: { a: 1 } }
28
+ const b = { a: { b: 2 } }
29
+ mutateMergeDeep(a, b)
30
+ expect(a).toStrictEqual({ a: { a: 1, b: 2 } })
31
+ })
32
+ })
package/src/types.ts CHANGED
@@ -6,7 +6,8 @@ export type Validator<Type, Fn = unknown> = () => {
6
6
  validateAsync(options: { value: Type }, fn: Fn): Promise<ValidationError>
7
7
  }
8
8
 
9
- export type ValidationCause = 'change' | 'blur' | 'submit' | 'mount'
9
+ // "server" is only intended for SSR/SSG validation and should not execute anything
10
+ export type ValidationCause = 'change' | 'blur' | 'submit' | 'mount' | 'server'
10
11
 
11
12
  export type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`
12
13
 
package/src/utils.ts CHANGED
@@ -164,10 +164,12 @@ export function getAsyncValidatorArray<T>(
164
164
  AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>
165
165
  >
166
166
  : T extends FormValidators<any, any>
167
- ? Array<
168
- AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>
169
- >
170
- : never {
167
+ ? Array<
168
+ AsyncValidator<
169
+ T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']
170
+ >
171
+ >
172
+ : never {
171
173
  const { asyncDebounceMs } = options
172
174
  const {
173
175
  onChangeAsync,
@@ -203,6 +205,8 @@ export function getAsyncValidatorArray<T>(
203
205
  switch (cause) {
204
206
  case 'submit':
205
207
  return [changeValidator, blurValidator, submitValidator] as never
208
+ case 'server':
209
+ return [] as never
206
210
  case 'blur':
207
211
  return [blurValidator] as never
208
212
  case 'change':
@@ -226,8 +230,8 @@ export function getSyncValidatorArray<T>(
226
230
  ): T extends FieldValidators<any, any>
227
231
  ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>>
228
232
  : T extends FormValidators<any, any>
229
- ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>>
230
- : never {
233
+ ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>>
234
+ : never {
231
235
  const { onChange, onBlur, onSubmit } = (options.validators || {}) as
232
236
  | FieldValidators<any, any>
233
237
  | FormValidators<any, any>
@@ -236,14 +240,27 @@ export function getSyncValidatorArray<T>(
236
240
  const blurValidator = { cause: 'blur', validate: onBlur } as const
237
241
  const submitValidator = { cause: 'submit', validate: onSubmit } as const
238
242
 
243
+ // Allows us to clear onServer errors
244
+ const serverValidator = {
245
+ cause: 'server',
246
+ validate: () => undefined,
247
+ } as const
248
+
239
249
  switch (cause) {
240
250
  case 'submit':
241
- return [changeValidator, blurValidator, submitValidator] as never
251
+ return [
252
+ changeValidator,
253
+ blurValidator,
254
+ submitValidator,
255
+ serverValidator,
256
+ ] as never
257
+ case 'server':
258
+ return [serverValidator] as never
242
259
  case 'blur':
243
- return [blurValidator] as never
260
+ return [blurValidator, serverValidator] as never
244
261
  case 'change':
245
262
  default:
246
- return [changeValidator] as never
263
+ return [changeValidator, serverValidator] as never
247
264
  }
248
265
  }
249
266
 
@@ -272,24 +289,24 @@ type AllowedIndexes<
272
289
  > = Tuple extends readonly []
273
290
  ? Keys
274
291
  : Tuple extends readonly [infer _, ...infer Tail]
275
- ? AllowedIndexes<Tail, Keys | Tail['length']>
276
- : Keys
292
+ ? AllowedIndexes<Tail, Keys | Tail['length']>
293
+ : Keys
277
294
 
278
295
  export type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5
279
296
  ? never
280
297
  : unknown extends T
281
- ? string
282
- : object extends T
283
- ? string
284
- : T extends readonly any[] & IsTuple<T>
285
- ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>
286
- : T extends any[]
287
- ? DeepKeys<T[number], [...TDepth, any]>
288
- : T extends Date
289
- ? never
290
- : T extends object
291
- ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>
292
- : never
298
+ ? string
299
+ : object extends T
300
+ ? string
301
+ : T extends readonly any[] & IsTuple<T>
302
+ ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>
303
+ : T extends any[]
304
+ ? DeepKeys<T[number], [...TDepth, any]>
305
+ : T extends Date
306
+ ? never
307
+ : T extends object
308
+ ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>
309
+ : never
293
310
 
294
311
  type DeepKeysPrefix<
295
312
  T,
@@ -1,313 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/FieldApi.ts
21
- var FieldApi_exports = {};
22
- __export(FieldApi_exports, {
23
- FieldApi: () => FieldApi
24
- });
25
- module.exports = __toCommonJS(FieldApi_exports);
26
- var import_store = require("@tanstack/store");
27
- var import_utils = require("./utils.cjs");
28
- var uid = 0;
29
- var FieldApi = class _FieldApi {
30
- constructor(opts) {
31
- this.options = {};
32
- this.mount = () => {
33
- const info = this.getInfo();
34
- info.instances[this.uid] = this;
35
- const unsubscribe = this.form.store.subscribe(() => {
36
- this.store.batch(() => {
37
- const nextValue = this.getValue();
38
- const nextMeta = this.getMeta();
39
- if (nextValue !== this.state.value) {
40
- this.store.setState((prev) => ({ ...prev, value: nextValue }));
41
- }
42
- if (nextMeta !== this.state.meta) {
43
- this.store.setState((prev) => ({ ...prev, meta: nextMeta }));
44
- }
45
- });
46
- });
47
- this.update(this.options);
48
- const { onMount } = this.options.validators || {};
49
- if (onMount) {
50
- const error = this.runValidator({
51
- validate: onMount,
52
- value: {
53
- value: this.state.value,
54
- fieldApi: this
55
- },
56
- type: "validate"
57
- });
58
- if (error) {
59
- this.setMeta((prev) => ({
60
- ...prev,
61
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
62
- errorMap: { ...prev == null ? void 0 : prev.errorMap, onMount: error }
63
- }));
64
- }
65
- }
66
- return () => {
67
- const preserveValue = this.options.preserveValue;
68
- unsubscribe();
69
- if (!preserveValue) {
70
- delete info.instances[this.uid];
71
- this.form.deleteField(this.name);
72
- }
73
- if (!Object.keys(info.instances).length && !preserveValue) {
74
- delete this.form.fieldInfo[this.name];
75
- }
76
- };
77
- };
78
- this.update = (opts) => {
79
- var _a;
80
- if (this.state.value === void 0) {
81
- const formDefault = (_a = opts.form.options.defaultValues) == null ? void 0 : _a[opts.name];
82
- if (opts.defaultValue !== void 0) {
83
- this.setValue(opts.defaultValue);
84
- } else if (formDefault !== void 0) {
85
- this.setValue(formDefault);
86
- }
87
- }
88
- if (this._getMeta() === void 0) {
89
- this.setMeta(this.state.meta);
90
- }
91
- this.options = opts;
92
- };
93
- this.getValue = () => {
94
- return this.form.getFieldValue(this.name);
95
- };
96
- this.setValue = (updater, options) => {
97
- this.form.setFieldValue(this.name, updater, options);
98
- this.validate("change", this.state.value);
99
- };
100
- this._getMeta = () => this.form.getFieldMeta(this.name);
101
- this.getMeta = () => this._getMeta() ?? {
102
- isValidating: false,
103
- isTouched: false,
104
- touchedErrors: [],
105
- errors: [],
106
- errorMap: {},
107
- ...this.options.defaultMeta
108
- };
109
- this.setMeta = (updater) => this.form.setFieldMeta(this.name, updater);
110
- this.getInfo = () => this.form.getFieldInfo(this.name);
111
- this.pushValue = (value) => this.form.pushFieldValue(this.name, value);
112
- this.insertValue = (index, value) => this.form.insertFieldValue(this.name, index, value);
113
- this.removeValue = (index) => this.form.removeFieldValue(this.name, index);
114
- this.swapValues = (aIndex, bIndex) => this.form.swapFieldValues(this.name, aIndex, bIndex);
115
- this.getSubField = (name) => new _FieldApi({
116
- name: `${this.name}.${name}`,
117
- form: this.form
118
- });
119
- this.validateSync = (value = this.state.value, cause) => {
120
- const validates = (0, import_utils.getSyncValidatorArray)(cause, this.options);
121
- let hasErrored = false;
122
- this.form.store.batch(() => {
123
- for (const validateObj of validates) {
124
- if (!validateObj.validate)
125
- continue;
126
- const error = normalizeError(
127
- this.runValidator({
128
- validate: validateObj.validate,
129
- value: { value, fieldApi: this },
130
- type: "validate"
131
- })
132
- );
133
- const errorMapKey = getErrorMapKey(validateObj.cause);
134
- if (this.state.meta.errorMap[errorMapKey] !== error) {
135
- this.setMeta((prev) => ({
136
- ...prev,
137
- errorMap: {
138
- ...prev.errorMap,
139
- [getErrorMapKey(validateObj.cause)]: error
140
- }
141
- }));
142
- }
143
- if (error) {
144
- hasErrored = true;
145
- }
146
- }
147
- });
148
- const submitErrKey = getErrorMapKey("submit");
149
- if (this.state.meta.errorMap[submitErrKey] && cause !== "submit" && !hasErrored) {
150
- this.setMeta((prev) => ({
151
- ...prev,
152
- errorMap: {
153
- ...prev.errorMap,
154
- [submitErrKey]: void 0
155
- }
156
- }));
157
- }
158
- return { hasErrored };
159
- };
160
- this.validateAsync = async (value = this.state.value, cause) => {
161
- const validates = (0, import_utils.getAsyncValidatorArray)(cause, this.options);
162
- if (!this.state.meta.isValidating) {
163
- this.setMeta((prev) => ({ ...prev, isValidating: true }));
164
- }
165
- const promises = [];
166
- for (const validateObj of validates) {
167
- if (!validateObj.validate)
168
- continue;
169
- const key = getErrorMapKey(validateObj.cause);
170
- const fieldValidatorMeta = this.getInfo().validationMetaMap[key];
171
- fieldValidatorMeta == null ? void 0 : fieldValidatorMeta.lastAbortController.abort();
172
- const controller = new AbortController();
173
- this.getInfo().validationMetaMap[key] = {
174
- lastAbortController: controller
175
- };
176
- promises.push(
177
- new Promise(async (resolve) => {
178
- let rawError;
179
- try {
180
- rawError = await new Promise((rawResolve, rawReject) => {
181
- setTimeout(() => {
182
- if (controller.signal.aborted)
183
- return rawResolve(void 0);
184
- this.runValidator({
185
- validate: validateObj.validate,
186
- value: { value, fieldApi: this, signal: controller.signal },
187
- type: "validateAsync"
188
- }).then(rawResolve).catch(rawReject);
189
- }, validateObj.debounceMs);
190
- });
191
- } catch (e) {
192
- rawError = e;
193
- }
194
- const error = normalizeError(rawError);
195
- this.setMeta((prev) => {
196
- return {
197
- ...prev,
198
- errorMap: {
199
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
200
- ...prev == null ? void 0 : prev.errorMap,
201
- [getErrorMapKey(cause)]: error
202
- }
203
- };
204
- });
205
- resolve(error);
206
- })
207
- );
208
- }
209
- let results = [];
210
- if (promises.length) {
211
- results = await Promise.all(promises);
212
- }
213
- this.setMeta((prev) => ({ ...prev, isValidating: false }));
214
- return results.filter(Boolean);
215
- };
216
- this.validate = (cause, value) => {
217
- if (!this.state.meta.isTouched)
218
- return [];
219
- try {
220
- this.form.validate(cause);
221
- } catch (_) {
222
- }
223
- const { hasErrored } = this.validateSync(value, cause);
224
- if (hasErrored && !this.options.asyncAlways) {
225
- return this.state.meta.errors;
226
- }
227
- return this.validateAsync(value, cause);
228
- };
229
- this.handleChange = (updater) => {
230
- this.setValue(updater, { touch: true });
231
- };
232
- this.handleBlur = () => {
233
- const prevTouched = this.state.meta.isTouched;
234
- if (!prevTouched) {
235
- this.setMeta((prev) => ({ ...prev, isTouched: true }));
236
- this.validate("change");
237
- }
238
- this.validate("blur");
239
- };
240
- this.form = opts.form;
241
- this.uid = uid++;
242
- this.name = opts.name;
243
- if (opts.defaultValue !== void 0) {
244
- this.form.setFieldValue(this.name, opts.defaultValue);
245
- }
246
- this.store = new import_store.Store(
247
- {
248
- value: this.getValue(),
249
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
250
- meta: this._getMeta() ?? {
251
- isValidating: false,
252
- isTouched: false,
253
- touchedErrors: [],
254
- errors: [],
255
- errorMap: {},
256
- ...opts.defaultMeta
257
- }
258
- },
259
- {
260
- onUpdate: () => {
261
- const state = this.store.state;
262
- state.meta.errors = Object.values(state.meta.errorMap).filter(
263
- (val) => val !== void 0
264
- );
265
- state.meta.touchedErrors = state.meta.isTouched ? state.meta.errors : [];
266
- this.prevState = state;
267
- this.state = state;
268
- }
269
- }
270
- );
271
- this.state = this.store.state;
272
- this.prevState = this.state;
273
- this.options = opts;
274
- }
275
- runValidator(props) {
276
- const adapters = [
277
- this.form.options.validatorAdapter,
278
- this.options.validatorAdapter
279
- ];
280
- for (const adapter of adapters) {
281
- if (adapter && typeof props.validate !== "function") {
282
- return adapter()[props.type](props.value, props.validate);
283
- }
284
- }
285
- return props.validate(props.value);
286
- }
287
- };
288
- function normalizeError(rawError) {
289
- if (rawError) {
290
- if (typeof rawError !== "string") {
291
- return "Invalid Form Values";
292
- }
293
- return rawError;
294
- }
295
- return void 0;
296
- }
297
- function getErrorMapKey(cause) {
298
- switch (cause) {
299
- case "submit":
300
- return "onSubmit";
301
- case "change":
302
- return "onChange";
303
- case "blur":
304
- return "onBlur";
305
- case "mount":
306
- return "onMount";
307
- }
308
- }
309
- // Annotate the CommonJS export names for ESM import in node:
310
- 0 && (module.exports = {
311
- FieldApi
312
- });
313
- //# sourceMappingURL=FieldApi.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\nimport type { FormApi } from './FormApi'\nimport type {\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n Validator,\n} from './types'\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { getAsyncValidatorArray, getSyncValidatorArray } from './utils'\n\nexport type FieldValidateFn<\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> = (props: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n}) => ValidationError\n\nexport type FieldValidateOrFn<\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> = TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData>\n\nexport type FieldValidateAsyncFn<\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> = (options: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n signal: AbortSignal\n}) => ValidationError | Promise<ValidationError>\n\nexport type FieldAsyncValidateOrFn<\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> = TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\nexport interface FieldValidators<\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 onMount?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onChange?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onChangeAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onChangeAsyncDebounceMs?: number\n onBlur?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onBlurAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onBlurAsyncDebounceMs?: number\n onSubmit?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onSubmitAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onSubmitAsyncDebounceMs?: number\n}\n\nexport interface FieldOptions<\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 name: TName\n index?: TData extends any[] ? number : never\n defaultValue?: TData\n asyncDebounceMs?: number\n asyncAlways?: boolean\n preserveValue?: boolean\n validatorAdapter?: TFieldValidator\n validators?: FieldValidators<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n defaultMeta?: Partial<FieldMeta>\n}\n\nexport interface FieldApiOptions<\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> extends FieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > {\n form: FormApi<TParentData, TFormValidator>\n}\n\nexport type FieldMeta = {\n isTouched: boolean\n touchedErrors: ValidationError[]\n errors: ValidationError[]\n errorMap: ValidationErrorMap\n isValidating: boolean\n}\n\nlet uid = 0\n\nexport type FieldState<TData> = {\n value: TData\n meta: FieldMeta\n}\n\nexport type ResolveName<TParentData> = unknown extends TParentData\n ? string\n : DeepKeys<TParentData>\n\nexport class FieldApi<\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 uid: number\n form: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >['form']\n name!: DeepKeys<TParentData>\n options: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > = {} as any\n store!: Store<FieldState<TData>>\n state!: FieldState<TData>\n prevState!: FieldState<TData>\n\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) {\n this.form = opts.form as never\n this.uid = uid++\n // Support field prefixing from FieldScope\n // let fieldPrefix = ''\n // if (this.form.fieldName) {\n // fieldPrefix = `${this.form.fieldName}.`\n // }\n\n this.name = opts.name as never\n\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never)\n }\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n meta: this._getMeta() ?? {\n isValidating: false,\n isTouched: false,\n touchedErrors: [],\n errors: [],\n errorMap: {},\n ...opts.defaultMeta,\n },\n },\n {\n onUpdate: () => {\n const state = this.store.state\n\n state.meta.errors = Object.values(state.meta.errorMap).filter(\n (val: unknown) => val !== undefined,\n )\n\n state.meta.touchedErrors = state.meta.isTouched\n ? state.meta.errors\n : []\n\n this.prevState = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n this.prevState = this.state\n this.options = opts as never\n }\n\n runValidator<\n TValue extends { value: TData; fieldApi: FieldApi<any, any, any, any> },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any, any>\n : FieldAsyncValidateOrFn<any, any, any, any>\n value: TValue\n type: TType\n }): ReturnType<ReturnType<Validator<any>>[TType]> {\n const adapters = [\n this.form.options.validatorAdapter,\n this.options.validatorAdapter,\n ] as const\n for (const adapter of adapters) {\n if (adapter && typeof props.validate !== 'function') {\n return adapter()[props.type](props.value, props.validate) as never\n }\n }\n\n return (props.validate as FieldValidateFn<any, any>)(props.value) as never\n }\n\n mount = () => {\n const info = this.getInfo()\n info.instances[this.uid] = this as never\n const unsubscribe = this.form.store.subscribe(() => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n })\n\n this.update(this.options as never)\n const { onMount } = this.options.validators || {}\n\n if (onMount) {\n const error = this.runValidator({\n validate: onMount,\n value: {\n value: this.state.value,\n fieldApi: this,\n },\n type: 'validate',\n })\n if (error) {\n this.setMeta((prev) => ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }))\n }\n }\n\n return () => {\n const preserveValue = this.options.preserveValue\n unsubscribe()\n if (!preserveValue) {\n delete info.instances[this.uid]\n this.form.deleteField(this.name)\n }\n\n if (!Object.keys(info.instances).length && !preserveValue) {\n delete this.form.fieldInfo[this.name]\n }\n }\n }\n\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => {\n // Default Value\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state.value === undefined) {\n const formDefault =\n opts.form.options.defaultValues?.[opts.name as keyof TParentData]\n\n if (opts.defaultValue !== undefined) {\n this.setValue(opts.defaultValue as never)\n } else if (formDefault !== undefined) {\n this.setValue(formDefault as never)\n }\n }\n\n // Default Meta\n if (this._getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n\n this.options = opts as never\n }\n\n getValue = (): TData => {\n return this.form.getFieldValue(this.name) as any\n }\n\n setValue = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => {\n this.form.setFieldValue(this.name, updater as never, options)\n this.validate('change', this.state.value)\n }\n\n _getMeta = () => this.form.getFieldMeta(this.name)\n getMeta = () =>\n this._getMeta() ??\n ({\n isValidating: false,\n isTouched: false,\n touchedErrors: [],\n errors: [],\n errorMap: {},\n ...this.options.defaultMeta,\n } as FieldMeta)\n\n setMeta = (updater: Updater<FieldMeta>) =>\n this.form.setFieldMeta(this.name, updater)\n\n getInfo = () => this.form.getFieldInfo(this.name)\n\n pushValue = (value: TData extends any[] ? TData[number] : never) =>\n this.form.pushFieldValue(this.name, value as any)\n\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n ) => this.form.insertFieldValue(this.name, index, value as any)\n\n removeValue = (index: number) => this.form.removeFieldValue(this.name, index)\n\n swapValues = (aIndex: number, bIndex: number) =>\n this.form.swapFieldValues(this.name, aIndex, bIndex)\n\n getSubField = <\n TSubName extends DeepKeys<TData>,\n TSubData extends DeepValue<TData, TSubName> = DeepValue<TData, TSubName>,\n >(\n name: TSubName,\n ): FieldApi<\n TData,\n TSubName,\n Validator<TSubData, unknown> | undefined,\n Validator<TData, unknown> | undefined,\n TSubData\n > =>\n new FieldApi({\n name: `${this.name}.${name}` as never,\n form: this.form,\n }) as any\n\n validateSync = (value = this.state.value, cause: ValidationCause) => {\n const validates = getSyncValidatorArray(cause, this.options)\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n this.form.store.batch(() => {\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const error = normalizeError(\n this.runValidator({\n validate: validateObj.validate,\n value: { value, fieldApi: this },\n type: 'validate',\n }),\n )\n const errorMapKey = getErrorMapKey(validateObj.cause)\n if (this.state.meta.errorMap[errorMapKey] !== error) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]: error,\n },\n }))\n }\n if (error) {\n hasErrored = true\n }\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n validateAsync = async (value = this.state.value, cause: ValidationCause) => {\n const validates = getAsyncValidatorArray(cause, this.options)\n\n if (!this.state.meta.isValidating) {\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const promises: Promise<ValidationError | undefined>[] = []\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = this.getInfo().validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n // Sorry Safari 12\n // eslint-disable-next-line compat/compat\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[key] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n setTimeout(() => {\n if (controller.signal.aborted) return rawResolve(undefined)\n this.runValidator({\n validate: validateObj.validate,\n value: { value, fieldApi: this, signal: controller.signal },\n type: 'validateAsync',\n })\n .then(rawResolve)\n .catch(rawReject)\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n const error = normalizeError(rawError)\n this.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [getErrorMapKey(cause)]: error,\n },\n }\n })\n\n resolve(error)\n }),\n )\n }\n\n let results: ValidationError[] = []\n if (promises.length) {\n results = await Promise.all(promises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n return results.filter(Boolean)\n }\n\n validate = (\n cause: ValidationCause,\n value?: TData,\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine and validatePristine is false, do not validate\n if (!this.state.meta.isTouched) return []\n\n try {\n this.form.validate(cause)\n } catch (_) {}\n\n // Attempt to sync validate first\n const { hasErrored } = this.validateSync(value, cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return this.state.meta.errors\n }\n // No error? Attempt async validation\n return this.validateAsync(value, cause)\n }\n\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater, { touch: true })\n }\n\n handleBlur = () => {\n const prevTouched = this.state.meta.isTouched\n if (!prevTouched) {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n this.validate('change')\n }\n this.validate('blur')\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'change':\n return 'onChange'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,3 +0,0 @@
1
- export { FieldApi, FieldApiOptions, FieldAsyncValidateOrFn, FieldMeta, FieldOptions, FieldState, FieldValidateAsyncFn, FieldValidateFn, FieldValidateOrFn, FieldValidators, ResolveName } from './index.cjs';
2
- import '@tanstack/store';
3
- import './types.cjs';
@@ -1,3 +0,0 @@
1
- export { FieldApi, FieldApiOptions, FieldAsyncValidateOrFn, FieldMeta, FieldOptions, FieldState, FieldValidateAsyncFn, FieldValidateFn, FieldValidateOrFn, FieldValidators, ResolveName } from './index.js';
2
- import '@tanstack/store';
3
- import './types.js';