Skip to content

Commit 06193dc

Browse files
author
Harry Whorlow
committed
defualted generic and basic test
1 parent c6419fa commit 06193dc

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

packages/form-core/src/FieldApi.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export type FieldListenerFn<
126126
*/
127127
export type FieldMetaFn<TFormData, TMetaExtension extends object> = (
128128
props: FormState<TFormData>,
129-
) => FieldMetaExtension<TMetaExtension>
129+
) => TMetaExtension
130130

131131
export interface FieldValidators<
132132
TParentData,
@@ -297,14 +297,14 @@ export interface FieldListeners<
297297
export interface FieldOptions<
298298
TParentData,
299299
TName extends DeepKeys<TParentData>,
300-
TMetaExtension extends object,
301300
TFieldValidator extends
302301
| Validator<DeepValue<TParentData, TName>, unknown>
303302
| undefined = undefined,
304303
TFormValidator extends
305304
| Validator<TParentData, unknown>
306305
| undefined = undefined,
307306
TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
307+
TMetaExtension extends object = {},
308308
> {
309309
/**
310310
* The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.
@@ -410,28 +410,25 @@ export type FieldMetaDerived = {
410410
isPristine: boolean
411411
}
412412

413-
export type FieldMetaExtension<TMetaExtension extends object = {}> =
414-
TMetaExtension
415-
416413
/**
417414
* An object type representing the metadata of a field in a form.
418415
*/
419416
export type FieldMeta<TMetaExtension extends object = {}> = FieldMetaBase &
420417
FieldMetaDerived &
421-
FieldMetaExtension<TMetaExtension>
418+
TMetaExtension
422419

423420
/**
424421
* An object type representing the state of a field.
425422
*/
426-
export type FieldState<TData> = {
423+
export type FieldState<TData, TMetaExtension extends object = {}> = {
427424
/**
428425
* The current value of the field.
429426
*/
430427
value: TData
431428
/**
432429
* The current metadata of the field.
433430
*/
434-
meta: FieldMeta
431+
meta: FieldMeta<TMetaExtension>
435432
}
436433

437434
/**
@@ -453,6 +450,7 @@ export class FieldApi<
453450
| Validator<TParentData, unknown>
454451
| undefined = undefined,
455452
TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
453+
TMetaExtension extends object = {},
456454
> {
457455
/**
458456
* A reference to the form API instance.
@@ -481,7 +479,7 @@ export class FieldApi<
481479
/**
482480
* The field state store.
483481
*/
484-
store!: Derived<FieldState<TData>>
482+
store!: Derived<FieldState<TData, TMetaExtension>>
485483
/**
486484
* The current field state.
487485
*/
@@ -529,7 +527,7 @@ export class FieldApi<
529527
return {
530528
value,
531529
meta,
532-
} as FieldState<TData>
530+
} as FieldState<TData, TMetaExtension>
533531
},
534532
})
535533

@@ -657,6 +655,11 @@ export class FieldApi<
657655
this.setMeta(this.state.meta)
658656
}
659657

658+
this.setMeta((prev) => ({
659+
...prev,
660+
...this.options.meta?.(this.form.state),
661+
}))
662+
660663
this.options = opts as never
661664
this.name = opts.name
662665
}
@@ -685,7 +688,9 @@ export class FieldApi<
685688

686689
getMeta = () => this.store.state.meta
687690

688-
meta = this.store.state.meta
691+
get meta() {
692+
return this.store.state as FieldMeta<TMetaExtension>
693+
}
689694

690695
/**
691696
* Sets the field metadata.

packages/form-core/tests/FieldApi.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,4 +1760,22 @@ describe('field api', () => {
17601760
nameField.mount()
17611761
expect(nameField.getMeta().errors).toEqual(['THERE IS AN ERROR'])
17621762
})
1763+
1764+
it('should have user defined meta', () => {
1765+
const form = new FormApi({
1766+
defaultValues: {
1767+
name: '',
1768+
},
1769+
})
1770+
form.mount()
1771+
1772+
const nameField = new FieldApi({
1773+
form,
1774+
name: 'name',
1775+
meta: () => ({ dinosaur: true }),
1776+
})
1777+
1778+
nameField.mount()
1779+
expect(nameField.meta.dinosaur).toEqual(true)
1780+
})
17631781
})

0 commit comments

Comments
 (0)