@tanstack/form-core 0.34.0 → 0.34.3

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/src/FieldApi.ts CHANGED
@@ -432,6 +432,7 @@ export class FieldApi<
432
432
  * @private
433
433
  */
434
434
  prevState!: FieldState<TData>
435
+ timeoutIds: Record<ValidationCause, ReturnType<typeof setTimeout> | null>
435
436
 
436
437
  /**
437
438
  * Initializes a new `FieldApi` instance.
@@ -447,7 +448,7 @@ export class FieldApi<
447
448
  ) {
448
449
  this.form = opts.form as never
449
450
  this.name = opts.name as never
450
-
451
+ this.timeoutIds = {} as Record<ValidationCause, never>
451
452
  if (opts.defaultValue !== undefined) {
452
453
  this.form.setFieldValue(this.name, opts.defaultValue as never, {
453
454
  dontUpdateMeta: true,
@@ -891,7 +892,11 @@ export class FieldApi<
891
892
  let rawError!: ValidationError | undefined
892
893
  try {
893
894
  rawError = await new Promise((rawResolve, rawReject) => {
894
- setTimeout(async () => {
895
+ if (this.timeoutIds[validateObj.cause]) {
896
+ clearTimeout(this.timeoutIds[validateObj.cause]!)
897
+ }
898
+
899
+ this.timeoutIds[validateObj.cause] = setTimeout(async () => {
895
900
  if (controller.signal.aborted) return rawResolve(undefined)
896
901
  try {
897
902
  rawResolve(
package/src/FormApi.ts CHANGED
@@ -584,6 +584,7 @@ export class FormApi<
584
584
  const fieldInstance = field.instance
585
585
  // Validate the field
586
586
  fieldValidationPromises.push(
587
+ // Remember, `validate` is either a sync operation or a promise
587
588
  Promise.resolve().then(() => fieldInstance.validate(cause)),
588
589
  )
589
590
  // If any fields are not touched
package/src/mergeForm.ts CHANGED
@@ -12,11 +12,10 @@ export function mutateMergeDeep(target: object, source: object): object {
12
12
  for (const key of keySet) {
13
13
  const targetKey = key as never as keyof typeof target
14
14
  const sourceKey = key as never as keyof typeof source
15
+
15
16
  if (Array.isArray(target[targetKey]) && Array.isArray(source[sourceKey])) {
16
- target[targetKey] = [
17
- ...(target[targetKey] as []),
18
- ...(source[sourceKey] as []),
19
- ] as never
17
+ // always use the source array to prevent array fields from multiplying
18
+ target[targetKey] = source[sourceKey] as [] as never
20
19
  } else if (
21
20
  typeof target[targetKey] === 'object' &&
22
21
  typeof source[sourceKey] === 'object'