@connect-soft/form-generator 1.1.0-alpha8 → 1.1.0-alpha9

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/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
2
- import React, { createElement, Fragment, memo, useCallback, useMemo, useRef, useImperativeHandle } from 'react';
2
+ import React, { createElement, Fragment, memo, useCallback, useContext, createContext, useRef, useMemo, useImperativeHandle } from 'react';
3
3
  import * as n$1 from 'zod/v4/core';
4
4
  import { c } from 'react/compiler-runtime';
5
5
  import { z } from 'zod';
@@ -3387,6 +3387,167 @@ function createTemplateFields(fieldEntries) {
3387
3387
  return new Proxy({}, handler);
3388
3388
  }
3389
3389
 
3390
+ const FieldsContext = /*#__PURE__*/createContext(null);
3391
+ function FieldsProvider(t0) {
3392
+ const $ = c(9);
3393
+ const {
3394
+ children,
3395
+ fields,
3396
+ namePrefix
3397
+ } = t0;
3398
+ let map;
3399
+ if ($[0] !== fields || $[1] !== namePrefix) {
3400
+ map = new Map();
3401
+ const addFields = (items, prefix) => {
3402
+ items.forEach(item => {
3403
+ if ("fields" in item && Array.isArray(item.fields)) {
3404
+ const arrayPrefix = prefix ? `${prefix}.${item.name}` : item.name;
3405
+ addFields(item.fields, arrayPrefix);
3406
+ } else {
3407
+ const fieldName = prefix ? `${prefix}.${item.name}` : item.name;
3408
+ map.set(fieldName, item);
3409
+ if (prefix) {
3410
+ map.set(item.name, item);
3411
+ }
3412
+ }
3413
+ });
3414
+ };
3415
+ addFields(fields, namePrefix);
3416
+ $[0] = fields;
3417
+ $[1] = namePrefix;
3418
+ $[2] = map;
3419
+ } else {
3420
+ map = $[2];
3421
+ }
3422
+ const fieldsMap = map;
3423
+ let t1;
3424
+ if ($[3] !== fieldsMap || $[4] !== namePrefix) {
3425
+ t1 = {
3426
+ fields: fieldsMap,
3427
+ namePrefix
3428
+ };
3429
+ $[3] = fieldsMap;
3430
+ $[4] = namePrefix;
3431
+ $[5] = t1;
3432
+ } else {
3433
+ t1 = $[5];
3434
+ }
3435
+ const value = t1;
3436
+ let t2;
3437
+ if ($[6] !== children || $[7] !== value) {
3438
+ t2 = jsx(FieldsContext.Provider, {
3439
+ value,
3440
+ children
3441
+ });
3442
+ $[6] = children;
3443
+ $[7] = value;
3444
+ $[8] = t2;
3445
+ } else {
3446
+ t2 = $[8];
3447
+ }
3448
+ return t2;
3449
+ }
3450
+ function useFieldProps(name) {
3451
+ const $ = c(23);
3452
+ const context = useContext(FieldsContext);
3453
+ const form = useFormContext();
3454
+ if (!context) {
3455
+ throw new Error("useFieldProps must be used within FormGenerator or FieldsProvider");
3456
+ }
3457
+ if (!form) {
3458
+ throw new Error("useFieldProps must be used within a FormProvider context");
3459
+ }
3460
+ const {
3461
+ fields,
3462
+ namePrefix
3463
+ } = context;
3464
+ const fullName = namePrefix ? `${namePrefix}.${name}` : name;
3465
+ let t0;
3466
+ if ($[0] !== fields || $[1] !== fullName || $[2] !== name) {
3467
+ t0 = fields.get(fullName) || fields.get(name);
3468
+ $[0] = fields;
3469
+ $[1] = fullName;
3470
+ $[2] = name;
3471
+ $[3] = t0;
3472
+ } else {
3473
+ t0 = $[3];
3474
+ }
3475
+ const field = t0;
3476
+ if (!field) {
3477
+ throw new Error(`Field "${name}" not found in form fields. ` + `Available fields: ${Array.from(fields.keys()).join(", ")}`);
3478
+ }
3479
+ let t1;
3480
+ if ($[4] !== form.control || $[5] !== fullName) {
3481
+ t1 = {
3482
+ control: form.control,
3483
+ name: fullName
3484
+ };
3485
+ $[4] = form.control;
3486
+ $[5] = fullName;
3487
+ $[6] = t1;
3488
+ } else {
3489
+ t1 = $[6];
3490
+ }
3491
+ const {
3492
+ field: controllerField,
3493
+ fieldState
3494
+ } = useController(t1);
3495
+ let t2;
3496
+ if ($[7] !== field || $[8] !== fullName) {
3497
+ t2 = {
3498
+ ...field,
3499
+ name: fullName
3500
+ };
3501
+ $[7] = field;
3502
+ $[8] = fullName;
3503
+ $[9] = t2;
3504
+ } else {
3505
+ t2 = $[9];
3506
+ }
3507
+ let t3;
3508
+ if ($[10] !== fieldState.error || $[11] !== fieldState.invalid || $[12] !== fieldState.isDirty || $[13] !== fieldState.isTouched) {
3509
+ t3 = {
3510
+ invalid: fieldState.invalid,
3511
+ error: fieldState.error,
3512
+ isDirty: fieldState.isDirty,
3513
+ isTouched: fieldState.isTouched
3514
+ };
3515
+ $[10] = fieldState.error;
3516
+ $[11] = fieldState.invalid;
3517
+ $[12] = fieldState.isDirty;
3518
+ $[13] = fieldState.isTouched;
3519
+ $[14] = t3;
3520
+ } else {
3521
+ t3 = $[14];
3522
+ }
3523
+ let t4;
3524
+ if ($[15] !== controllerField.name || $[16] !== controllerField.onBlur || $[17] !== controllerField.onChange || $[18] !== controllerField.ref || $[19] !== controllerField.value || $[20] !== t2 || $[21] !== t3) {
3525
+ t4 = {
3526
+ name: controllerField.name,
3527
+ value: controllerField.value,
3528
+ onChange: controllerField.onChange,
3529
+ onBlur: controllerField.onBlur,
3530
+ ref: controllerField.ref,
3531
+ field: t2,
3532
+ fieldState: t3
3533
+ };
3534
+ $[15] = controllerField.name;
3535
+ $[16] = controllerField.onBlur;
3536
+ $[17] = controllerField.onChange;
3537
+ $[18] = controllerField.ref;
3538
+ $[19] = controllerField.value;
3539
+ $[20] = t2;
3540
+ $[21] = t3;
3541
+ $[22] = t4;
3542
+ } else {
3543
+ t4 = $[22];
3544
+ }
3545
+ return t4;
3546
+ }
3547
+ function useFieldsContext() {
3548
+ return useContext(FieldsContext);
3549
+ }
3550
+
3390
3551
  function deepMerge(target, source) {
3391
3552
  const result = {
3392
3553
  ...target
@@ -3497,10 +3658,7 @@ function buildDefaultValues(fields) {
3497
3658
  return values;
3498
3659
  }
3499
3660
 
3500
- function hasSchema(props) {
3501
- return props.schema !== undefined;
3502
- }
3503
- function FormGeneratorImpl(props) {
3661
+ function FormGenerator(props) {
3504
3662
  const {
3505
3663
  fields,
3506
3664
  defaultValues,
@@ -3516,6 +3674,8 @@ function FormGeneratorImpl(props) {
3516
3674
  ref,
3517
3675
  validateTypes
3518
3676
  } = props;
3677
+ const onSubmit = props.onSubmit;
3678
+ const formRef = useRef(null);
3519
3679
  useMemo(() => {
3520
3680
  if (validateTypes) {
3521
3681
  const registeredTypes = getRegisteredFieldTypes();
@@ -3526,15 +3686,7 @@ function FormGeneratorImpl(props) {
3526
3686
  validateFieldTypes(fields, registeredTypes, options);
3527
3687
  }
3528
3688
  }, [fields, validateTypes]);
3529
- const userSchema = hasSchema(props) ? props.schema : undefined;
3530
- const onSubmit = props.onSubmit;
3531
- const formRef = useRef(null);
3532
- const schema = useMemo(() => {
3533
- if (userSchema) {
3534
- return userSchema;
3535
- }
3536
- return buildSchema(fields);
3537
- }, [fields, userSchema]);
3689
+ const schema = useMemo(() => buildSchema(fields), [fields]);
3538
3690
  const mergedDefaultValues = useMemo(() => {
3539
3691
  const builtDefaults = buildDefaultValues(fields);
3540
3692
  return defaultValues ? deepMerge(builtDefaults, defaultValues) : builtDefaults;
@@ -3646,31 +3798,242 @@ function FormGeneratorImpl(props) {
3646
3798
  if (!children) {
3647
3799
  return jsx(FormProvider, {
3648
3800
  ...form,
3649
- children: jsxs("form", {
3801
+ children: jsx(FieldsProvider, {
3802
+ fields: fields,
3803
+ children: jsxs("form", {
3804
+ ref: formRef,
3805
+ onSubmit: handleSubmit,
3806
+ className: className,
3807
+ children: [jsxs(FieldsWrapper, {
3808
+ children: [regularFields.map((field_2, index_0) => jsx(FieldWrapper, {
3809
+ name: field_2.name,
3810
+ type: field_2.type,
3811
+ className: field_2.className,
3812
+ children: jsx(FieldRenderer, {
3813
+ field: field_2
3814
+ })
3815
+ }, field_2.name || `field-${index_0}`)), arrayFields.map(arrayField => jsx(FieldWrapper, {
3816
+ name: arrayField.name,
3817
+ type: "array",
3818
+ className: arrayField.className,
3819
+ children: jsx(ArrayFieldRenderer, {
3820
+ field: arrayField
3821
+ })
3822
+ }, arrayField.name))]
3823
+ }), jsx(SubmitButton, {
3824
+ disabled: disabled || form.formState.isSubmitting,
3825
+ isSubmitting: form.formState.isSubmitting,
3826
+ children: submitText
3827
+ })]
3828
+ })
3829
+ })
3830
+ });
3831
+ }
3832
+ const renderProps = {
3833
+ fields: templateFields,
3834
+ arrays: Object.fromEntries(arrayFields.map(arrayField_0 => [arrayField_0.name, {
3835
+ field: arrayField_0
3836
+ }])),
3837
+ buttons,
3838
+ title,
3839
+ description,
3840
+ form: form,
3841
+ isSubmitting: form.formState.isSubmitting,
3842
+ isValid: form.formState.isValid,
3843
+ isDirty: form.formState.isDirty,
3844
+ renderField,
3845
+ FieldWrapper,
3846
+ FieldsWrapper
3847
+ };
3848
+ const renderFn = children;
3849
+ return jsx(FormProvider, {
3850
+ ...form,
3851
+ children: jsx(FieldsProvider, {
3852
+ fields: fields,
3853
+ children: jsx("form", {
3650
3854
  ref: formRef,
3651
3855
  onSubmit: handleSubmit,
3652
3856
  className: className,
3653
- children: [jsxs(FieldsWrapper, {
3654
- children: [regularFields.map((field_2, index_0) => jsx(FieldWrapper, {
3655
- name: field_2.name,
3656
- type: field_2.type,
3657
- className: field_2.className,
3658
- children: jsx(FieldRenderer, {
3659
- field: field_2
3660
- })
3661
- }, field_2.name || `field-${index_0}`)), arrayFields.map(arrayField => jsx(FieldWrapper, {
3662
- name: arrayField.name,
3663
- type: "array",
3664
- className: arrayField.className,
3665
- children: jsx(ArrayFieldRenderer, {
3666
- field: arrayField
3667
- })
3668
- }, arrayField.name))]
3669
- }), jsx(SubmitButton, {
3670
- disabled: disabled || form.formState.isSubmitting,
3671
- isSubmitting: form.formState.isSubmitting,
3672
- children: submitText
3673
- })]
3857
+ children: renderFn(renderProps)
3858
+ })
3859
+ })
3860
+ });
3861
+ }
3862
+
3863
+ function typedField() {
3864
+ return field => field;
3865
+ }
3866
+ function typedFields(fields) {
3867
+ return fields;
3868
+ }
3869
+ function StrictFormGenerator(props) {
3870
+ const {
3871
+ schema,
3872
+ fields,
3873
+ onSubmit,
3874
+ defaultValues,
3875
+ className,
3876
+ submitText = 'Submit',
3877
+ disabled,
3878
+ mode = 'onChange',
3879
+ title,
3880
+ description,
3881
+ showReset = false,
3882
+ resetText = 'Reset',
3883
+ children,
3884
+ ref,
3885
+ validateTypes
3886
+ } = props;
3887
+ const formRef = useRef(null);
3888
+ useMemo(() => {
3889
+ if (validateTypes) {
3890
+ const registeredTypes = getRegisteredFieldTypes();
3891
+ const options = typeof validateTypes === 'object' ? validateTypes : {
3892
+ throwOnError: false,
3893
+ warn: true
3894
+ };
3895
+ validateFieldTypes(fields, registeredTypes, options);
3896
+ }
3897
+ }, [fields, validateTypes]);
3898
+ const mergedDefaultValues = useMemo(() => {
3899
+ const builtDefaults = buildDefaultValues(fields);
3900
+ return defaultValues ? deepMerge(builtDefaults, defaultValues) : builtDefaults;
3901
+ }, [fields, defaultValues]);
3902
+ const form = useForm({
3903
+ resolver: a(schema),
3904
+ defaultValues: mergedDefaultValues,
3905
+ mode
3906
+ });
3907
+ const handleSubmit = form.handleSubmit(async data => {
3908
+ await onSubmit(data);
3909
+ });
3910
+ const handleReset = useCallback(() => {
3911
+ form.reset(mergedDefaultValues);
3912
+ }, [form, mergedDefaultValues]);
3913
+ useImperativeHandle(ref, () => ({
3914
+ setValues: values => {
3915
+ Object.entries(values).forEach(([key, value]) => {
3916
+ form.setValue(key, value, {
3917
+ shouldValidate: true,
3918
+ shouldDirty: true
3919
+ });
3920
+ });
3921
+ },
3922
+ getValues: () => form.getValues(),
3923
+ reset: values_0 => {
3924
+ if (values_0) {
3925
+ form.reset(deepMerge(mergedDefaultValues, values_0));
3926
+ } else {
3927
+ form.reset(mergedDefaultValues);
3928
+ }
3929
+ },
3930
+ submit: async () => {
3931
+ await handleSubmit();
3932
+ },
3933
+ clearErrors: () => form.clearErrors(),
3934
+ setError: (name, error) => form.setError(name, error),
3935
+ isValid: () => form.formState.isValid,
3936
+ isDirty: () => form.formState.isDirty,
3937
+ form: form
3938
+ }), [form, handleSubmit, mergedDefaultValues]);
3939
+ const SubmitButton = getFormComponent('SubmitButton');
3940
+ const FieldWrapper = getFormComponent('FieldWrapper');
3941
+ const FieldsWrapper = getFormComponent('FieldsWrapper');
3942
+ const {
3943
+ regularFields,
3944
+ arrayFields
3945
+ } = useMemo(() => {
3946
+ const regular = [];
3947
+ const arrays = [];
3948
+ fields.forEach(field => {
3949
+ if (isArrayField(field)) {
3950
+ arrays.push(field);
3951
+ } else {
3952
+ regular.push(field);
3953
+ }
3954
+ });
3955
+ return {
3956
+ regularFields: regular,
3957
+ arrayFields: arrays
3958
+ };
3959
+ }, [fields]);
3960
+ const fieldEntries = useMemo(() => {
3961
+ const entries = new Map();
3962
+ regularFields.forEach((field_0, index) => {
3963
+ if (!field_0.hidden) {
3964
+ const element = jsx(FieldWrapper, {
3965
+ name: field_0.name,
3966
+ type: field_0.type,
3967
+ className: field_0.className,
3968
+ children: jsx(FieldRenderer, {
3969
+ field: field_0
3970
+ })
3971
+ }, field_0.name || `field-${index}`);
3972
+ entries.set(field_0.name, {
3973
+ field: field_0,
3974
+ element,
3975
+ accessed: false
3976
+ });
3977
+ }
3978
+ });
3979
+ return entries;
3980
+ }, [regularFields, FieldWrapper]);
3981
+ const templateFields = useMemo(() => createTemplateFields(fieldEntries), [fieldEntries]);
3982
+ const buttons = useMemo(() => {
3983
+ const result = {
3984
+ submit: jsx(SubmitButton, {
3985
+ disabled: disabled || form.formState.isSubmitting,
3986
+ isSubmitting: form.formState.isSubmitting,
3987
+ children: submitText
3988
+ }, "submit")
3989
+ };
3990
+ if (showReset) {
3991
+ result.reset = jsx("button", {
3992
+ type: "button",
3993
+ onClick: handleReset,
3994
+ disabled: disabled,
3995
+ children: resetText
3996
+ }, "reset");
3997
+ }
3998
+ return result;
3999
+ }, [SubmitButton, disabled, form.formState.isSubmitting, submitText, showReset, resetText, handleReset]);
4000
+ const renderField = useCallback((field_1, options_0) => {
4001
+ return jsx(FieldRenderer, {
4002
+ field: field_1,
4003
+ namePrefix: options_0 === null || options_0 === void 0 ? void 0 : options_0.namePrefix
4004
+ });
4005
+ }, []);
4006
+ if (!children) {
4007
+ return jsx(FormProvider, {
4008
+ ...form,
4009
+ children: jsx(FieldsProvider, {
4010
+ fields: fields,
4011
+ children: jsxs("form", {
4012
+ ref: formRef,
4013
+ onSubmit: handleSubmit,
4014
+ className: className,
4015
+ children: [jsxs(FieldsWrapper, {
4016
+ children: [regularFields.map((field_2, index_0) => jsx(FieldWrapper, {
4017
+ name: field_2.name,
4018
+ type: field_2.type,
4019
+ className: field_2.className,
4020
+ children: jsx(FieldRenderer, {
4021
+ field: field_2
4022
+ })
4023
+ }, field_2.name || `field-${index_0}`)), arrayFields.map(arrayField => jsx(FieldWrapper, {
4024
+ name: arrayField.name,
4025
+ type: "array",
4026
+ className: arrayField.className,
4027
+ children: jsx(ArrayFieldRenderer, {
4028
+ field: arrayField
4029
+ })
4030
+ }, arrayField.name))]
4031
+ }), jsx(SubmitButton, {
4032
+ disabled: disabled || form.formState.isSubmitting,
4033
+ isSubmitting: form.formState.isSubmitting,
4034
+ children: submitText
4035
+ })]
4036
+ })
3674
4037
  })
3675
4038
  });
3676
4039
  }
@@ -3693,17 +4056,20 @@ function FormGeneratorImpl(props) {
3693
4056
  const renderFn = children;
3694
4057
  return jsx(FormProvider, {
3695
4058
  ...form,
3696
- children: jsx("form", {
3697
- ref: formRef,
3698
- onSubmit: handleSubmit,
3699
- className: className,
3700
- children: renderFn(renderProps)
4059
+ children: jsx(FieldsProvider, {
4060
+ fields: fields,
4061
+ children: jsx("form", {
4062
+ ref: formRef,
4063
+ onSubmit: handleSubmit,
4064
+ className: className,
4065
+ children: renderFn(renderProps)
4066
+ })
3701
4067
  })
3702
4068
  });
3703
4069
  }
3704
- function FormGenerator(props) {
3705
- return FormGeneratorImpl(props);
4070
+ function createFieldFactory(_schema) {
4071
+ return field => field;
3706
4072
  }
3707
4073
 
3708
- export { ArrayFieldRenderer, Controller, FieldRenderer, FormGenerator, FormProvider, clearAllRegistries, clearFieldRegistry, clearFormComponentRegistry, createArrayField, createField, getFieldComponent, getFormComponent, getFormComponents, getRegisteredFieldTypes, hasFieldType, hasFormComponent, isArrayField, registerField, registerFields, registerFormComponent, registerFormComponents, resetFormComponentRegistry, strictFields, unregisterField, useArrayField, useFieldArray, useForm, useFormContext, useWatch, validateFieldType, validateFieldTypes };
4074
+ export { ArrayFieldRenderer, Controller, FieldRenderer, FieldsProvider, FormGenerator, FormProvider, StrictFormGenerator, clearAllRegistries, clearFieldRegistry, clearFormComponentRegistry, createArrayField, createField, createFieldFactory, getFieldComponent, getFormComponent, getFormComponents, getRegisteredFieldTypes, hasFieldType, hasFormComponent, isArrayField, registerField, registerFields, registerFormComponent, registerFormComponents, resetFormComponentRegistry, strictFields, typedField, typedFields, unregisterField, useArrayField, useFieldArray, useFieldProps, useFieldsContext, useForm, useFormContext, useWatch, validateFieldType, validateFieldTypes };
3709
4075
  //# sourceMappingURL=index.mjs.map