@tanstack/form-core 0.13.5 → 0.13.7

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.
@@ -602,7 +602,7 @@ describe('field api', () => {
602
602
 
603
603
  const unmount = field.mount()
604
604
  unmount()
605
- expect(form.getFieldInfo(field.name).instances[field.uid]).toBeDefined()
605
+ expect(form.getFieldInfo(field.name).instance).toBeDefined()
606
606
  expect(form.getFieldInfo(field.name)).toBeDefined()
607
607
  })
608
608
 
@@ -624,8 +624,8 @@ describe('field api', () => {
624
624
  unmount()
625
625
  const info = form.getFieldInfo(field.name)
626
626
  subscription()
627
- expect(info.instances[field.uid]).toBeUndefined()
628
- expect(Object.keys(info.instances).length).toBe(0)
627
+ expect(info.instance).toBeNull()
628
+ expect(Object.keys(info.instance ?? {}).length).toBe(0)
629
629
 
630
630
  // Check that form store has been updated
631
631
  expect(callback).toHaveBeenCalledOnce()
@@ -19,6 +19,66 @@ it('should type value properly', () => {
19
19
  assertType<'test'>(field.getValue())
20
20
  })
21
21
 
22
+ it('should type value when nothing is passed into constructor', () => {
23
+ type FormValues = {
24
+ name?: string
25
+ age?: number
26
+ }
27
+
28
+ const form = new FormApi<FormValues>()
29
+
30
+ const field = new FieldApi({
31
+ form,
32
+ name: 'name' as const,
33
+ })
34
+
35
+ assertType<string | undefined>(field.state.value)
36
+ assertType<'name'>(field.options.name)
37
+ assertType<string | undefined>(field.getValue())
38
+ })
39
+
40
+ it('should type required fields in constructor', () => {
41
+ type FormValues = {
42
+ name: string
43
+ age?: number
44
+ }
45
+
46
+ const form = new FormApi<FormValues>({
47
+ defaultValues: {
48
+ name: 'test',
49
+ },
50
+ })
51
+
52
+ const field = new FieldApi({
53
+ form,
54
+ name: 'name' as const,
55
+ })
56
+
57
+ assertType<string>(field.state.value)
58
+ assertType<'name'>(field.options.name)
59
+ assertType<string>(field.getValue())
60
+ })
61
+
62
+ it('should type value properly for completely partial forms', () => {
63
+ type CompletelyPartialFormValues = {
64
+ name?: 'test'
65
+ age?: number
66
+ }
67
+
68
+ const form = new FormApi<CompletelyPartialFormValues>({
69
+ defaultValues: {},
70
+ })
71
+
72
+ const field = new FieldApi({
73
+ form,
74
+ name: 'name' as const,
75
+ })
76
+
77
+ assertType<'test' | undefined>(field.state.value)
78
+ assertType<'name'>(field.options.name)
79
+ assertType<'test' | undefined>(field.getValue())
80
+ })
81
+
22
82
  it('should type onChange properly', () => {
23
83
  const form = new FormApi({
24
84
  defaultValues: {
package/src/utils.ts CHANGED
@@ -300,17 +300,15 @@ export type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5
300
300
  ? never
301
301
  : unknown extends T
302
302
  ? string
303
- : object extends T
304
- ? string
305
- : T extends readonly any[] & IsTuple<T>
306
- ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>
307
- : T extends any[]
308
- ? DeepKeys<T[number], [...TDepth, any]>
309
- : T extends Date
310
- ? never
311
- : T extends object
312
- ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>
313
- : never
303
+ : T extends readonly any[] & IsTuple<T>
304
+ ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>
305
+ : T extends any[]
306
+ ? DeepKeysPrefix<T, number, TDepth>
307
+ : T extends Date
308
+ ? never
309
+ : T extends object
310
+ ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>
311
+ : never
314
312
 
315
313
  type DeepKeysPrefix<
316
314
  T,