@tanstack/form-core 0.20.3 → 0.21.1

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.
@@ -324,6 +324,23 @@ describe('form api', () => {
324
324
  expect(form.getFieldValue('names')).toStrictEqual(['test', 'other'])
325
325
  })
326
326
 
327
+ it("should insert an array field's value as first element", () => {
328
+ const form = new FormApi({
329
+ defaultValues: {
330
+ names: ['one', 'two', 'three'],
331
+ },
332
+ })
333
+ form.mount()
334
+ form.insertFieldValue('names', 0, 'other')
335
+
336
+ expect(form.getFieldValue('names')).toStrictEqual([
337
+ 'other',
338
+ 'one',
339
+ 'two',
340
+ 'three',
341
+ ])
342
+ })
343
+
327
344
  it("should run onChange validation when pushing an array field's value", () => {
328
345
  const form = new FormApi({
329
346
  defaultValues: {
@@ -352,9 +369,55 @@ describe('form api', () => {
352
369
  form.mount()
353
370
  form.insertFieldValue('names', 1, 'other')
354
371
 
372
+ expect(form.getFieldValue('names')).toStrictEqual([
373
+ 'one',
374
+ 'other',
375
+ 'two',
376
+ 'three',
377
+ ])
378
+ })
379
+
380
+ it("should insert an array field's value at the end if the index is higher than the length", () => {
381
+ const form = new FormApi({
382
+ defaultValues: {
383
+ names: ['one', 'two', 'three'],
384
+ },
385
+ })
386
+ form.mount()
387
+ form.insertFieldValue('names', 10, 'other')
388
+
389
+ expect(form.getFieldValue('names')).toStrictEqual([
390
+ 'one',
391
+ 'two',
392
+ 'three',
393
+ 'other',
394
+ ])
395
+ })
396
+
397
+ it("should replace an array field's value", () => {
398
+ const form = new FormApi({
399
+ defaultValues: {
400
+ names: ['one', 'two', 'three'],
401
+ },
402
+ })
403
+ form.mount()
404
+ form.replaceFieldValue('names', 1, 'other')
405
+
355
406
  expect(form.getFieldValue('names')).toStrictEqual(['one', 'other', 'three'])
356
407
  })
357
408
 
409
+ it("should do nothing when replacing an array field's value with an index that doesn't exist", () => {
410
+ const form = new FormApi({
411
+ defaultValues: {
412
+ names: ['one', 'two', 'three'],
413
+ },
414
+ })
415
+ form.mount()
416
+ form.replaceFieldValue('names', 10, 'other')
417
+
418
+ expect(form.getFieldValue('names')).toStrictEqual(['one', 'two', 'three'])
419
+ })
420
+
358
421
  it("should run onChange validation when inserting an array field's value", () => {
359
422
  const form = new FormApi({
360
423
  defaultValues: {
@@ -400,7 +463,7 @@ describe('form api', () => {
400
463
 
401
464
  expect(field1.state.meta.errors).toStrictEqual([])
402
465
 
403
- await form.insertFieldValue('names', 0, { first: 'other' })
466
+ await form.replaceFieldValue('names', 0, { first: 'other' })
404
467
 
405
468
  expect(field1.state.meta.errors).toStrictEqual(['Invalid value'])
406
469
  })
@@ -41,6 +41,18 @@ assertType<
41
41
  | 'meta.mainUser.age'
42
42
  >(0 as never as NestedSupport)
43
43
 
44
+ /**
45
+ * Properly handles deep partial object nesting like so:
46
+ */
47
+ type NestedPartialSupport = DeepKeys<{ meta?: { mainUser?: User } }>
48
+ assertType<
49
+ | 'meta'
50
+ | 'meta.mainUser'
51
+ | 'meta.mainUser.name'
52
+ | 'meta.mainUser.id'
53
+ | 'meta.mainUser.age'
54
+ >(0 as never as NestedPartialSupport)
55
+
44
56
  /**
45
57
  * Properly handles `object` edgecase nesting like so:
46
58
  */
package/src/util-types.ts CHANGED
@@ -60,7 +60,7 @@ type PrefixTupleAccessor<
60
60
  }[TIndex]
61
61
 
62
62
  type PrefixObjectAccessor<T extends object, TDepth extends any[]> = {
63
- [K in keyof T]: K extends string | number
63
+ [K in keyof T]-?: K extends string | number
64
64
  ?
65
65
  | PrefixFromDepth<K, TDepth>
66
66
  | `${PrefixFromDepth<K, TDepth>}${DeepKeys<T[K], [TDepth]>}`
@@ -71,19 +71,17 @@ export type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5
71
71
  ? never
72
72
  : unknown extends T
73
73
  ? PrefixFromDepth<string, TDepth>
74
- : object extends T
75
- ? PrefixFromDepth<string, TDepth>
76
- : T extends readonly any[] & IsTuple<T>
77
- ? PrefixTupleAccessor<T, AllowedIndexes<T>, TDepth>
78
- : T extends any[]
79
- ? PrefixArrayAccessor<T, [...TDepth, any]>
80
- : T extends Date
81
- ? never
82
- : T extends object
83
- ? PrefixObjectAccessor<T, TDepth>
84
- : T extends string | number | boolean | bigint
85
- ? ''
86
- : never
74
+ : T extends readonly any[] & IsTuple<T>
75
+ ? PrefixTupleAccessor<T, AllowedIndexes<T>, TDepth>
76
+ : T extends any[]
77
+ ? PrefixArrayAccessor<T, [...TDepth, any]>
78
+ : T extends Date
79
+ ? never
80
+ : T extends object
81
+ ? PrefixObjectAccessor<T, TDepth>
82
+ : T extends string | number | boolean | bigint
83
+ ? ''
84
+ : never
87
85
 
88
86
  type PrefixFromDepth<
89
87
  T extends string | number,