@saas-ui/forms 2.0.0-next.2 → 2.0.0-next.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/README.md +53 -6
  3. package/dist/ajv/index.d.ts +24 -11
  4. package/dist/ajv/index.js +7 -9
  5. package/dist/ajv/index.js.map +1 -1
  6. package/dist/ajv/index.mjs +7 -10
  7. package/dist/ajv/index.mjs.map +1 -1
  8. package/dist/index.d.ts +519 -280
  9. package/dist/index.js +777 -696
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +756 -676
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/yup/index.d.ts +525 -21
  14. package/dist/yup/index.js +21 -9
  15. package/dist/yup/index.js.map +1 -1
  16. package/dist/yup/index.mjs +21 -10
  17. package/dist/yup/index.mjs.map +1 -1
  18. package/dist/zod/index.d.ts +525 -12
  19. package/dist/zod/index.js +21 -1
  20. package/dist/zod/index.js.map +1 -1
  21. package/dist/zod/index.mjs +21 -3
  22. package/dist/zod/index.mjs.map +1 -1
  23. package/package.json +33 -10
  24. package/src/array-field.tsx +88 -48
  25. package/src/auto-form.tsx +7 -3
  26. package/src/base-field.tsx +54 -0
  27. package/src/create-field.tsx +144 -0
  28. package/src/create-form.tsx +68 -0
  29. package/src/create-step-form.tsx +100 -0
  30. package/src/default-fields.tsx +163 -0
  31. package/src/display-field.tsx +9 -11
  32. package/src/display-if.tsx +20 -13
  33. package/src/field-resolver.ts +10 -8
  34. package/src/field.tsx +18 -445
  35. package/src/fields-context.tsx +23 -0
  36. package/src/fields.tsx +34 -21
  37. package/src/form-context.tsx +84 -0
  38. package/src/form.tsx +77 -55
  39. package/src/index.ts +58 -4
  40. package/src/input-right-button/input-right-button.stories.tsx +1 -1
  41. package/src/input-right-button/input-right-button.tsx +0 -2
  42. package/src/layout.tsx +16 -11
  43. package/src/number-input/number-input.tsx +9 -5
  44. package/src/object-field.tsx +35 -13
  45. package/src/password-input/password-input.stories.tsx +23 -2
  46. package/src/password-input/password-input.tsx +6 -6
  47. package/src/pin-input/pin-input.tsx +1 -5
  48. package/src/radio/radio-input.stories.tsx +1 -1
  49. package/src/radio/radio-input.tsx +12 -10
  50. package/src/select/native-select.tsx +1 -4
  51. package/src/select/select-context.tsx +130 -0
  52. package/src/select/select.stories.tsx +116 -85
  53. package/src/select/select.test.tsx +1 -1
  54. package/src/select/select.tsx +162 -146
  55. package/src/step-form.tsx +76 -76
  56. package/src/submit-button.tsx +5 -1
  57. package/src/types.ts +149 -0
  58. package/src/use-array-field.tsx +9 -3
  59. package/src/use-step-form.tsx +54 -9
  60. package/src/utils.ts +23 -1
  61. package/src/watch-field.tsx +2 -6
  62. /package/src/radio/{radio.test.tsx → radio-input.test.tsx} +0 -0
@@ -0,0 +1,144 @@
1
+ import * as React from 'react'
2
+ import { Controller } from 'react-hook-form'
3
+
4
+ import { forwardRef, useMergeRefs } from '@chakra-ui/react'
5
+ import { callAllHandlers } from '@chakra-ui/utils'
6
+ import { BaseFieldProps, FieldProps } from './types'
7
+ import { BaseField } from './base-field'
8
+ import { useFormContext } from './form-context'
9
+
10
+ interface CreateFieldProps {
11
+ displayName: string
12
+ hideLabel?: boolean
13
+ BaseField: React.FC<any>
14
+ }
15
+
16
+ const _createField = (
17
+ InputComponent: React.FC<any>,
18
+ { displayName, hideLabel, BaseField }: CreateFieldProps
19
+ ) => {
20
+ const Field = forwardRef((props, ref) => {
21
+ const {
22
+ id,
23
+ name,
24
+ label,
25
+ help,
26
+ isDisabled,
27
+ isInvalid,
28
+ isReadOnly,
29
+ isRequired,
30
+ rules,
31
+ ...inputProps
32
+ } = props
33
+
34
+ const inputRules = {
35
+ required: isRequired,
36
+ ...rules,
37
+ }
38
+
39
+ return (
40
+ <BaseField
41
+ id={id}
42
+ name={name}
43
+ label={label}
44
+ help={help}
45
+ hideLabel={hideLabel}
46
+ isDisabled={isDisabled}
47
+ isInvalid={isInvalid}
48
+ isReadOnly={isReadOnly}
49
+ isRequired={isRequired}
50
+ >
51
+ <InputComponent
52
+ ref={ref}
53
+ id={id}
54
+ name={name}
55
+ label={hideLabel ? label : undefined} // Only pass down the label when it should be inline.
56
+ rules={inputRules}
57
+ {...inputProps}
58
+ />
59
+ </BaseField>
60
+ )
61
+ })
62
+ Field.displayName = displayName
63
+
64
+ return Field
65
+ }
66
+
67
+ const withControlledInput = (InputComponent: React.FC<any>) => {
68
+ return forwardRef<FieldProps, typeof InputComponent>(
69
+ ({ name, rules, ...inputProps }, ref) => {
70
+ const { control } = useFormContext()
71
+
72
+ return (
73
+ <Controller
74
+ name={name}
75
+ control={control}
76
+ rules={rules}
77
+ render={({ field: { ref: _ref, ...field } }) => (
78
+ <InputComponent
79
+ {...field}
80
+ {...inputProps}
81
+ onChange={callAllHandlers(inputProps.onChange, field.onChange)}
82
+ onBlur={callAllHandlers(inputProps.onBlur, field.onBlur)}
83
+ ref={useMergeRefs(ref, _ref)}
84
+ />
85
+ )}
86
+ />
87
+ )
88
+ }
89
+ )
90
+ }
91
+
92
+ const withUncontrolledInput = (InputComponent: React.FC<any>) => {
93
+ return forwardRef<FieldProps, typeof InputComponent>(
94
+ ({ name, rules, ...inputProps }, ref) => {
95
+ const { register } = useFormContext()
96
+
97
+ const { ref: _ref, ...field } = register(name, rules)
98
+
99
+ return (
100
+ <InputComponent
101
+ {...field}
102
+ {...inputProps}
103
+ onChange={callAllHandlers(inputProps.onChange, field.onChange)}
104
+ onBlur={callAllHandlers(inputProps.onBlur, field.onBlur)}
105
+ ref={useMergeRefs(ref, _ref)}
106
+ />
107
+ )
108
+ }
109
+ )
110
+ }
111
+
112
+ export interface CreateFieldOptions {
113
+ isControlled?: boolean
114
+ hideLabel?: boolean
115
+ BaseField?: React.FC<any>
116
+ }
117
+
118
+ /**
119
+ * Register a new field type
120
+ * @param type The name for this field in kebab-case, eg `email` or `array-field`
121
+ * @param component The React component
122
+ * @param options
123
+ * @param options.isControlled Set this to true if this is a controlled field.
124
+ * @param options.hideLabel Hide the field label, for example for the checkbox field.
125
+ */
126
+ export const createField = <TProps extends object>(
127
+ component: React.FC<TProps>,
128
+ options?: CreateFieldOptions
129
+ ) => {
130
+ let InputComponent
131
+ if (options?.isControlled) {
132
+ InputComponent = withControlledInput(component)
133
+ } else {
134
+ InputComponent = withUncontrolledInput(component)
135
+ }
136
+
137
+ const Field = _createField(InputComponent, {
138
+ displayName: `${component.displayName ?? 'Custom'}Field`,
139
+ hideLabel: options?.hideLabel,
140
+ BaseField: options?.BaseField || BaseField,
141
+ }) as React.FC<TProps & BaseFieldProps>
142
+
143
+ return Field
144
+ }
@@ -0,0 +1,68 @@
1
+ import React, { ForwardedRef } from 'react'
2
+ import { FieldsProvider } from './fields-context'
3
+ import { Form, FieldValues, FormProps, GetResolver } from './form'
4
+ import { DefaultFieldOverrides, WithFields } from './types'
5
+ import { objectFieldResolver } from './field-resolver'
6
+ import { GetFieldResolver } from './field-resolver'
7
+ import { forwardRef } from '@chakra-ui/react'
8
+
9
+ export interface CreateFormProps<FieldDefs> {
10
+ resolver?: GetResolver
11
+ fieldResolver?: GetFieldResolver
12
+ fields?: FieldDefs extends Record<string, React.FC<any>> ? FieldDefs : never
13
+ }
14
+
15
+ export type FormType<
16
+ FieldDefs,
17
+ ExtraProps = object,
18
+ ExtraOverrides = object
19
+ > = (<
20
+ TSchema = unknown,
21
+ TFieldValues extends FieldValues = FieldValues,
22
+ TContext extends object = object
23
+ >(
24
+ props: WithFields<
25
+ FormProps<TSchema, TFieldValues, TContext>,
26
+ FieldDefs,
27
+ ExtraOverrides
28
+ > & {
29
+ ref?: React.ForwardedRef<HTMLFormElement>
30
+ } & ExtraProps
31
+ ) => React.ReactElement) & {
32
+ displayName?: string
33
+ id?: string
34
+ }
35
+
36
+ export function createForm<FieldDefs>({
37
+ resolver,
38
+ fieldResolver = objectFieldResolver,
39
+ fields,
40
+ }: CreateFormProps<FieldDefs> = {}) {
41
+ const DefaultForm = forwardRef(
42
+ <
43
+ TSchema = any,
44
+ TFieldValues extends FieldValues = FieldValues,
45
+ TContext extends object = object
46
+ >(
47
+ props: WithFields<FormProps<TSchema, TFieldValues, TContext>, FieldDefs>,
48
+ ref: ForwardedRef<HTMLFormElement>
49
+ ) => {
50
+ const { schema, ...rest } = props
51
+ return (
52
+ <FieldsProvider value={fields || {}}>
53
+ <Form
54
+ ref={ref}
55
+ resolver={resolver?.(props.schema)}
56
+ fieldResolver={fieldResolver?.(schema)}
57
+ {...rest}
58
+ />
59
+ </FieldsProvider>
60
+ )
61
+ }
62
+ ) as FormType<FieldDefs>
63
+
64
+ DefaultForm.displayName = 'Form'
65
+ DefaultForm.id = 'Form'
66
+
67
+ return DefaultForm
68
+ }
@@ -0,0 +1,100 @@
1
+ import React, { useMemo } from 'react'
2
+ import { forwardRef } from '@chakra-ui/react'
3
+ import {
4
+ ArrayField,
5
+ DisplayIf,
6
+ FieldProps,
7
+ FieldValues,
8
+ FieldsProvider,
9
+ Form,
10
+ GetFieldResolver,
11
+ ObjectField,
12
+ } from './'
13
+ import { Field } from './field'
14
+ import { FormStep, StepsOptions } from './step-form'
15
+ import {
16
+ StepFormProvider,
17
+ UseStepFormProps,
18
+ useStepForm,
19
+ } from './use-step-form'
20
+ import { StepperProvider } from '@saas-ui/core'
21
+ import { runIfFn } from '@chakra-ui/utils'
22
+ import { GetResolver } from './form'
23
+
24
+ type StepFormType<FieldDefs, ExtraProps = object, ExtraOverrides = object> = (<
25
+ TSteps extends StepsOptions<any> = StepsOptions<any>,
26
+ TFieldValues extends FieldValues = FieldValues,
27
+ TContext extends object = object,
28
+ TFieldTypes = FieldProps<TFieldValues>
29
+ >(
30
+ props: UseStepFormProps<TSteps, TFieldValues, TContext, TFieldTypes> & {
31
+ ref?: React.ForwardedRef<HTMLFormElement>
32
+ }
33
+ ) => React.ReactElement) & {
34
+ displayName?: string
35
+ id?: string
36
+ }
37
+
38
+ export type DefaultFormType<
39
+ FieldDefs = any,
40
+ ExtraProps = object,
41
+ ExtraOverrides = object
42
+ > = (<
43
+ TFieldValues extends Record<string, any> = any,
44
+ TContext extends object = object,
45
+ TSchema = unknown
46
+ >(
47
+ props: any
48
+ ) => React.ReactElement) & {
49
+ displayName?: string
50
+ id?: string
51
+ }
52
+
53
+ export interface CreateFormProps<FieldDefs> {
54
+ resolver?: GetResolver
55
+ fieldResolver?: GetFieldResolver
56
+ fields?: FieldDefs extends Record<string, React.FC<any>> ? FieldDefs : never
57
+ }
58
+
59
+ export function createStepForm<
60
+ FieldDefs = any,
61
+ ExtraProps = object,
62
+ ExtraOverrides = object
63
+ >({ fields, resolver, fieldResolver }: CreateFormProps<FieldDefs> = {}) {
64
+ const StepForm = forwardRef<any, 'div'>((props, ref) => {
65
+ const { children, steps, ...rest } = props
66
+
67
+ const stepper = useStepForm({
68
+ resolver,
69
+ fieldResolver,
70
+ ...props,
71
+ })
72
+
73
+ const { getFormProps, ...ctx } = stepper
74
+
75
+ const context = useMemo(() => ctx, [ctx])
76
+
77
+ return (
78
+ <StepperProvider value={context}>
79
+ <StepFormProvider value={context}>
80
+ <FieldsProvider value={fields || {}}>
81
+ <Form ref={ref} {...rest} {...getFormProps()}>
82
+ {runIfFn(children, {
83
+ ...stepper,
84
+ Field: Field as any,
85
+ FormStep: FormStep as any,
86
+ DisplayIf: DisplayIf as any,
87
+ ArrayField: ArrayField as any,
88
+ ObjectField: ObjectField as any,
89
+ })}
90
+ </Form>
91
+ </FieldsProvider>
92
+ </StepFormProvider>
93
+ </StepperProvider>
94
+ )
95
+ }) as StepFormType<FieldDefs, ExtraProps, ExtraOverrides>
96
+
97
+ StepForm.displayName = `Step${Form.displayName || Form.name}`
98
+
99
+ return StepForm
100
+ }
@@ -0,0 +1,163 @@
1
+ import * as React from 'react'
2
+
3
+ import {
4
+ forwardRef,
5
+ Input,
6
+ Textarea,
7
+ Checkbox,
8
+ Switch,
9
+ InputGroup,
10
+ InputProps,
11
+ TextareaProps,
12
+ SwitchProps,
13
+ CheckboxProps,
14
+ PinInputField,
15
+ HStack,
16
+ PinInput,
17
+ UsePinInputProps,
18
+ SystemProps,
19
+ } from '@chakra-ui/react'
20
+
21
+ import { NumberInput, NumberInputProps } from './number-input'
22
+ import { PasswordInput, PasswordInputProps } from './password-input'
23
+ import { RadioInput, RadioInputProps } from './radio'
24
+
25
+ import {
26
+ Select,
27
+ SelectButton,
28
+ SelectList,
29
+ SelectProps,
30
+ NativeSelect,
31
+ NativeSelectProps,
32
+ } from './select'
33
+
34
+ import { createField } from './create-field'
35
+
36
+ export interface InputFieldProps extends InputProps {
37
+ type?: string
38
+ leftAddon?: React.ReactNode
39
+ rightAddon?: React.ReactNode
40
+ }
41
+
42
+ export const InputField = createField<InputFieldProps>(
43
+ forwardRef(({ type = 'text', leftAddon, rightAddon, size, ...rest }, ref) => {
44
+ const input = <Input type={type} size={size} {...rest} ref={ref} />
45
+ if (leftAddon || rightAddon) {
46
+ return (
47
+ <InputGroup size={size}>
48
+ {leftAddon}
49
+ {input}
50
+ {rightAddon}
51
+ </InputGroup>
52
+ )
53
+ }
54
+ return input
55
+ })
56
+ )
57
+
58
+ export interface NumberInputFieldProps extends NumberInputProps {
59
+ type: 'number'
60
+ }
61
+
62
+ export const NumberInputField = createField<NumberInputFieldProps>(
63
+ NumberInput,
64
+ {
65
+ isControlled: true,
66
+ }
67
+ )
68
+
69
+ export const PasswordInputField = createField<PasswordInputProps>(
70
+ forwardRef((props, ref) => <PasswordInput ref={ref} {...props} />)
71
+ )
72
+
73
+ export const TextareaField = createField<TextareaProps>(Textarea)
74
+
75
+ export const SwitchField = createField<SwitchProps>(
76
+ forwardRef(({ type, value, ...rest }, ref) => {
77
+ return <Switch isChecked={!!value} {...rest} ref={ref} />
78
+ }),
79
+ {
80
+ isControlled: true,
81
+ }
82
+ )
83
+
84
+ export const SelectField = createField<SelectProps>(
85
+ forwardRef((props, ref) => {
86
+ return (
87
+ <Select ref={ref} {...props}>
88
+ <SelectButton />
89
+ <SelectList />
90
+ </Select>
91
+ )
92
+ }),
93
+ {
94
+ isControlled: true,
95
+ }
96
+ )
97
+
98
+ export const CheckboxField = createField<CheckboxProps>(
99
+ forwardRef(({ label, type, ...props }, ref) => {
100
+ return (
101
+ <Checkbox ref={ref} {...props}>
102
+ {label}
103
+ </Checkbox>
104
+ )
105
+ }),
106
+ {
107
+ hideLabel: true,
108
+ }
109
+ )
110
+
111
+ export const RadioField = createField<RadioInputProps>(RadioInput, {
112
+ isControlled: true,
113
+ })
114
+
115
+ export const NativeSelectField = createField<NativeSelectProps>(NativeSelect, {
116
+ isControlled: true,
117
+ })
118
+
119
+ export interface PinFieldProps extends Omit<UsePinInputProps, 'type'> {
120
+ pinLength?: number
121
+ pinType?: 'alphanumeric' | 'number'
122
+ spacing?: SystemProps['margin']
123
+ }
124
+
125
+ export const PinField = createField<PinFieldProps>(
126
+ forwardRef((props, ref) => {
127
+ const { pinLength = 4, pinType, spacing, ...inputProps } = props
128
+
129
+ const inputs: React.ReactNode[] = []
130
+ for (let i = 0; i < pinLength; i++) {
131
+ inputs.push(<PinInputField key={i} ref={ref} />)
132
+ }
133
+
134
+ return (
135
+ <HStack spacing={spacing}>
136
+ <PinInput {...inputProps} type={pinType}>
137
+ {inputs}
138
+ </PinInput>
139
+ </HStack>
140
+ )
141
+ }),
142
+ {
143
+ isControlled: true,
144
+ }
145
+ )
146
+
147
+ export const defaultFieldTypes = {
148
+ text: InputField,
149
+ email: InputField,
150
+ url: InputField,
151
+ phone: InputField,
152
+ number: NumberInputField,
153
+ password: PasswordInputField,
154
+ textarea: TextareaField,
155
+ switch: SwitchField,
156
+ select: SelectField,
157
+ checkbox: CheckboxField,
158
+ radio: RadioField,
159
+ pin: PinField,
160
+ 'native-select': NativeSelectField,
161
+ }
162
+
163
+ export type DefaultFields = typeof defaultFieldTypes
@@ -1,7 +1,5 @@
1
1
  import * as React from 'react'
2
- import { __DEV__ } from '@chakra-ui/utils'
3
- import { useFormContext } from 'react-hook-form'
4
-
2
+ import { useFormContext } from './form-context'
5
3
  import {
6
4
  Text,
7
5
  FormControl,
@@ -9,12 +7,16 @@ import {
9
7
  FormLabel,
10
8
  } from '@chakra-ui/react'
11
9
 
12
- import { FieldProps } from './field'
10
+ import { FieldProps } from './types'
13
11
 
14
12
  export interface DisplayFieldProps
15
13
  extends FormControlProps,
16
14
  Omit<FieldProps, 'type' | 'label'> {}
17
-
15
+ /**
16
+ *
17
+ *
18
+ * @see Docs https://saas-ui.dev/
19
+ */
18
20
  export const DisplayField: React.FC<DisplayFieldProps> = ({
19
21
  name,
20
22
  label,
@@ -31,15 +33,11 @@ export const DisplayField: React.FC<DisplayFieldProps> = ({
31
33
  )
32
34
  }
33
35
 
34
- if (__DEV__) {
35
- DisplayField.displayName = 'DisplayField'
36
- }
36
+ DisplayField.displayName = 'DisplayField'
37
37
 
38
38
  export const FormValue: React.FC<{ name: string }> = ({ name }) => {
39
39
  const { getValues } = useFormContext()
40
40
  return getValues(name) || null
41
41
  }
42
42
 
43
- if (__DEV__) {
44
- FormValue.displayName = 'FormValue'
45
- }
43
+ FormValue.displayName = 'FormValue'
@@ -1,41 +1,48 @@
1
1
  import * as React from 'react'
2
- import { __DEV__ } from '@chakra-ui/utils'
3
2
  import {
4
- useFormContext,
5
3
  useWatch,
6
4
  FieldValues,
7
5
  UseFormReturn,
6
+ FieldPath,
8
7
  } from 'react-hook-form'
9
8
 
9
+ import { useFormContext } from './form-context'
10
+
10
11
  export interface DisplayIfProps<
11
- TFieldValues extends FieldValues = FieldValues
12
+ TFieldValues extends FieldValues = FieldValues,
13
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
12
14
  > {
13
15
  children: React.ReactElement
14
- name: string
16
+ name: TName
15
17
  defaultValue?: unknown
16
18
  isDisabled?: boolean
17
19
  isExact?: boolean
18
20
  condition?: (value: unknown, context: UseFormReturn<TFieldValues>) => boolean
19
21
  }
20
-
21
- export const DisplayIf = <TFieldValues extends FieldValues = FieldValues>({
22
+ /**
23
+ * Conditionally render parts of a form.
24
+ *
25
+ * @see Docs https://saas-ui.dev/docs/components/forms/form
26
+ */
27
+ export const DisplayIf = <
28
+ TFieldValues extends FieldValues = FieldValues,
29
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
30
+ >({
22
31
  children,
23
32
  name,
24
33
  defaultValue,
25
34
  isDisabled,
26
35
  isExact,
27
36
  condition = (value) => !!value,
28
- }: DisplayIfProps<TFieldValues>) => {
29
- const value = useWatch({
37
+ }: DisplayIfProps<TFieldValues, TName>) => {
38
+ const value = useWatch<TFieldValues>({
30
39
  name,
31
- defaultValue,
40
+ defaultValue: defaultValue as any,
32
41
  disabled: isDisabled,
33
42
  exact: isExact,
34
43
  })
35
- const context = useFormContext<TFieldValues>()
44
+ const context = useFormContext() as any
36
45
  return condition(value, context) ? children : null
37
46
  }
38
47
 
39
- if (__DEV__) {
40
- DisplayIf.displayName = 'DisplayIf'
41
- }
48
+ DisplayIf.displayName = 'DisplayIf'
@@ -1,20 +1,22 @@
1
- import { FieldProps } from './field'
1
+ import { BaseFieldProps } from './types'
2
2
 
3
3
  import { get } from '@chakra-ui/utils'
4
4
 
5
5
  export type FieldResolver = {
6
- getFields(): FieldProps[]
7
- getNestedFields(name: string): FieldProps[]
6
+ getFields(): BaseFieldProps[]
7
+ getNestedFields(name: string): BaseFieldProps[]
8
8
  }
9
9
 
10
- interface SchemaField extends FieldProps {
10
+ export type GetFieldResolver<TSchema = any> = (schema: TSchema) => FieldResolver
11
+
12
+ interface SchemaField extends BaseFieldProps {
11
13
  items?: SchemaField[]
12
14
  properties?: Record<string, SchemaField>
13
15
  }
14
16
 
15
17
  export type ObjectSchema = Record<string, SchemaField>
16
18
 
17
- const mapFields = (schema: ObjectSchema): FieldProps[] =>
19
+ const mapFields = (schema: ObjectSchema): BaseFieldProps[] =>
18
20
  schema &&
19
21
  Object.entries(schema).map(([name, { items, label, title, ...field }]) => {
20
22
  return {
@@ -24,11 +26,11 @@ const mapFields = (schema: ObjectSchema): FieldProps[] =>
24
26
  }
25
27
  })
26
28
 
27
- export const objectFieldResolver = (schema: ObjectSchema): FieldResolver => {
28
- const getFields = () => {
29
+ export const objectFieldResolver: GetFieldResolver<ObjectSchema> = (schema) => {
30
+ const getFields = (): BaseFieldProps[] => {
29
31
  return mapFields(schema)
30
32
  }
31
- const getNestedFields = (name: string) => {
33
+ const getNestedFields = (name: string): BaseFieldProps[] => {
32
34
  const field = get(schema, name)
33
35
 
34
36
  if (!field) return []