Skip to content

Commit b81eddb

Browse files
author
Harry Whorlow
committed
working mvp and improved test
1 parent 06193dc commit b81eddb

File tree

2 files changed

+24
-16
lines changed

2 files changed

+24
-16
lines changed

packages/form-core/src/FieldApi.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ export type FieldListenerFn<
125125
* @private
126126
*/
127127
export type FieldMetaFn<TFormData, TMetaExtension extends object> = (
128-
props: FormState<TFormData>,
129-
) => TMetaExtension
128+
props: Derived<FormState<TFormData>>,
129+
) => FieldMeta<TMetaExtension>
130130

131131
export interface FieldValidators<
132132
TParentData,
@@ -366,12 +366,14 @@ export interface FieldApiOptions<
366366
| Validator<TParentData, unknown>
367367
| undefined = undefined,
368368
TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
369+
TMetaExtension extends object = {},
369370
> extends FieldOptions<
370371
TParentData,
371372
TName,
372373
TFieldValidator,
373374
TFormValidator,
374-
TData
375+
TData,
376+
TMetaExtension
375377
> {
376378
form: FormApi<TParentData, TFormValidator>
377379
}
@@ -655,11 +657,6 @@ export class FieldApi<
655657
this.setMeta(this.state.meta)
656658
}
657659

658-
this.setMeta((prev) => ({
659-
...prev,
660-
...this.options.meta?.(this.form.state),
661-
}))
662-
663660
this.options = opts as never
664661
this.name = opts.name
665662
}
@@ -683,14 +680,15 @@ export class FieldApi<
683680
fieldApi: this,
684681
})
685682

683+
this.setMeta((prev) => ({
684+
...prev,
685+
...this.options.meta?.(this.form.state),
686+
}))
687+
686688
this.validate('change')
687689
}
688690

689-
getMeta = () => this.store.state.meta
690-
691-
get meta() {
692-
return this.store.state as FieldMeta<TMetaExtension>
693-
}
691+
getMeta = () => this.store.state.meta as FieldMeta<TMetaExtension>
694692

695693
/**
696694
* Sets the field metadata.

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,18 +1764,28 @@ describe('field api', () => {
17641764
it('should have user defined meta', () => {
17651765
const form = new FormApi({
17661766
defaultValues: {
1767-
name: '',
1767+
name: 'Stegosaurus',
17681768
},
17691769
})
17701770
form.mount()
17711771

17721772
const nameField = new FieldApi({
17731773
form,
17741774
name: 'name',
1775-
meta: () => ({ dinosaur: true }),
1775+
meta: ({ values }) => ({
1776+
dinosaur: values.name === 'Stegosaurus' ? 'dino' : 'notDino',
1777+
}),
17761778
})
17771779

17781780
nameField.mount()
1779-
expect(nameField.meta.dinosaur).toEqual(true)
1781+
1782+
// cant infer dinosaur from getMeta()
1783+
expect(nameField.getMeta().dinosaur).toEqual('dino')
1784+
1785+
nameField.handleChange('Cat')
1786+
1787+
expect(nameField.state.value).toEqual('Cat')
1788+
1789+
expect(nameField.getMeta().dinosaur).toEqual('notDino')
17801790
})
17811791
})

0 commit comments

Comments
 (0)