@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.
- package/dist/cjs/FieldApi.cjs +5 -4
- package/dist/cjs/FieldApi.cjs.map +1 -1
- package/dist/cjs/FieldApi.d.cts +15 -4
- package/dist/cjs/FormApi.cjs +33 -11
- package/dist/cjs/FormApi.cjs.map +1 -1
- package/dist/cjs/FormApi.d.cts +9 -2
- package/dist/cjs/util-types.d.cts +2 -2
- package/dist/esm/FieldApi.d.ts +15 -4
- package/dist/esm/FieldApi.js +5 -4
- package/dist/esm/FieldApi.js.map +1 -1
- package/dist/esm/FormApi.d.ts +9 -2
- package/dist/esm/FormApi.js +33 -11
- package/dist/esm/FormApi.js.map +1 -1
- package/dist/esm/util-types.d.ts +2 -2
- package/package.json +2 -2
- package/src/FieldApi.ts +17 -8
- package/src/FormApi.ts +43 -9
- package/src/tests/FieldApi.spec.ts +35 -1
- package/src/tests/FormApi.spec.ts +64 -1
- package/src/tests/util-types.test-d.ts +12 -0
- package/src/util-types.ts +12 -14
|
@@ -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.
|
|
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]
|
|
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
|
-
:
|
|
75
|
-
?
|
|
76
|
-
: T extends
|
|
77
|
-
?
|
|
78
|
-
: T extends
|
|
79
|
-
?
|
|
80
|
-
: T extends
|
|
81
|
-
?
|
|
82
|
-
: T extends
|
|
83
|
-
?
|
|
84
|
-
:
|
|
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,
|