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

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
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import React, { createElement, memo, useCallback, useRef, useMemo, useImperativeHandle } from 'react';
1
+ import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
2
+ import React, { createElement, Fragment, memo, useCallback, useMemo, useRef, 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';
@@ -2775,6 +2775,49 @@ function t(r,e){try{var o=r();}catch(r){return e(r)}return o&&o.then?o.then(void
2775
2775
  function isArrayField(field) {
2776
2776
  return field.type === 'array' && 'fields' in field;
2777
2777
  }
2778
+ function createField(field) {
2779
+ return field;
2780
+ }
2781
+ function createArrayField(field) {
2782
+ return {
2783
+ ...field,
2784
+ type: 'array'
2785
+ };
2786
+ }
2787
+ function strictFields(fields) {
2788
+ return fields;
2789
+ }
2790
+ function validateFieldType(type, registeredTypes) {
2791
+ if (!registeredTypes.includes(type) && type !== 'array') {
2792
+ throw new Error(`Unregistered field type: "${type}". ` + `Registered types: ${registeredTypes.join(', ')}. ` + `Use registerField("${type}", YourComponent) to register it.`);
2793
+ }
2794
+ return type;
2795
+ }
2796
+ function validateFieldTypes(fields, registeredTypes, options = {}) {
2797
+ const {
2798
+ throwOnError = false,
2799
+ warn = true
2800
+ } = options;
2801
+ const invalidTypes = [];
2802
+ const checkField = field => {
2803
+ if (field.type === 'array' && 'fields' in field) {
2804
+ field.fields.forEach(checkField);
2805
+ } else if (!registeredTypes.includes(field.type) && field.type !== 'array') {
2806
+ invalidTypes.push(field.type);
2807
+ }
2808
+ };
2809
+ fields.forEach(checkField);
2810
+ if (invalidTypes.length > 0) {
2811
+ const uniqueInvalid = [...new Set(invalidTypes)];
2812
+ const message = `Unregistered field type(s): ${uniqueInvalid.map(t => `"${t}"`).join(', ')}. ` + `Registered types: ${registeredTypes.join(', ')}. ` + 'Register custom types with registerField() or use module augmentation for TypeScript support.';
2813
+ if (throwOnError) {
2814
+ throw new Error(message);
2815
+ } else if (warn && typeof console !== 'undefined') {
2816
+ console.warn(`[FormGenerator] ${message}`);
2817
+ }
2818
+ }
2819
+ return fields;
2820
+ }
2778
2821
 
2779
2822
  const fieldRegistry = new Map();
2780
2823
  const componentRegistry = {};
@@ -2788,7 +2831,13 @@ const defaultFormComponents = {
2788
2831
  type: 'submit',
2789
2832
  className: className !== null && className !== void 0 ? className : 'form-submit',
2790
2833
  disabled: disabled || isSubmitting
2791
- }, isSubmitting ? 'Submitting...' : children)
2834
+ }, isSubmitting ? 'Submitting...' : children),
2835
+ FieldWrapper: ({
2836
+ children
2837
+ }) => /*#__PURE__*/createElement(Fragment, null, children),
2838
+ FieldsWrapper: ({
2839
+ children
2840
+ }) => /*#__PURE__*/createElement(Fragment, null, children)
2792
2841
  };
2793
2842
  const htmlInputTypes = {
2794
2843
  text: 'text',
@@ -2931,27 +2980,15 @@ function createDefaultFieldComponent(type) {
2931
2980
  };
2932
2981
  return FallbackComponent;
2933
2982
  }
2934
- function registerField(type, component, options = {}, config = {}) {
2935
- const {
2936
- override = true
2937
- } = config;
2938
- const exists = fieldRegistry.has(type);
2939
- if (override === 'only' && !exists) return;
2940
- if (override === false && exists) return;
2983
+ function registerField(type, component, options = {}) {
2941
2984
  fieldRegistry.set(type, {
2942
2985
  component,
2943
2986
  options
2944
2987
  });
2945
2988
  }
2946
- function registerFields(fields, config = {}) {
2947
- const {
2948
- override = true
2949
- } = config;
2989
+ function registerFields(fields) {
2950
2990
  Object.entries(fields).forEach(([type, definition]) => {
2951
2991
  var _a;
2952
- const exists = fieldRegistry.has(type);
2953
- if (override === 'only' && !exists) return;
2954
- if (override === false && exists) return;
2955
2992
  if (typeof definition === 'function') {
2956
2993
  fieldRegistry.set(type, {
2957
2994
  component: definition,
@@ -2986,24 +3023,12 @@ function unregisterField(type) {
2986
3023
  function getRegisteredFieldTypes() {
2987
3024
  return Array.from(fieldRegistry.keys());
2988
3025
  }
2989
- function registerFormComponents(components, config = {}) {
2990
- const {
2991
- override = true
2992
- } = config;
3026
+ function registerFormComponents(components) {
2993
3027
  Object.keys(components).forEach(key => {
2994
- const exists = key in componentRegistry;
2995
- if (override === 'only' && !exists) return;
2996
- if (override === false && exists) return;
2997
3028
  componentRegistry[key] = components[key];
2998
3029
  });
2999
3030
  }
3000
- function registerFormComponent(name, component, config = {}) {
3001
- const {
3002
- override = true
3003
- } = config;
3004
- const exists = name in componentRegistry;
3005
- if (override === 'only' && !exists) return;
3006
- if (override === false && exists) return;
3031
+ function registerFormComponent(name, component) {
3007
3032
  componentRegistry[name] = component;
3008
3033
  }
3009
3034
  function getFormComponent(name) {
@@ -3144,7 +3169,7 @@ function useArrayField(field) {
3144
3169
  const childField = field.fields.find(f_0 => f_0.name === fieldName);
3145
3170
  if (!childField) {
3146
3171
  console.warn(`Field "${fieldName}" not found in array field "${field.name}"`);
3147
- return jsx(Fragment, {});
3172
+ return jsx(Fragment$1, {});
3148
3173
  }
3149
3174
  return jsx(FieldRenderer, {
3150
3175
  field: childField,
@@ -3488,8 +3513,19 @@ function FormGeneratorImpl(props) {
3488
3513
  showReset = false,
3489
3514
  resetText = 'Reset',
3490
3515
  children,
3491
- ref
3516
+ ref,
3517
+ validateTypes
3492
3518
  } = props;
3519
+ useMemo(() => {
3520
+ if (validateTypes) {
3521
+ const registeredTypes = getRegisteredFieldTypes();
3522
+ const options = typeof validateTypes === 'object' ? validateTypes : {
3523
+ throwOnError: false,
3524
+ warn: true
3525
+ };
3526
+ validateFieldTypes(fields, registeredTypes, options);
3527
+ }
3528
+ }, [fields, validateTypes]);
3493
3529
  const userSchema = hasSchema(props) ? props.schema : undefined;
3494
3530
  const onSubmit = props.onSubmit;
3495
3531
  const formRef = useRef(null);
@@ -3541,6 +3577,8 @@ function FormGeneratorImpl(props) {
3541
3577
  form: form
3542
3578
  }), [form, handleSubmit, mergedDefaultValues]);
3543
3579
  const SubmitButton = getFormComponent('SubmitButton');
3580
+ const FieldWrapper = getFormComponent('FieldWrapper');
3581
+ const FieldsWrapper = getFormComponent('FieldsWrapper');
3544
3582
  const {
3545
3583
  regularFields,
3546
3584
  arrayFields
@@ -3563,8 +3601,13 @@ function FormGeneratorImpl(props) {
3563
3601
  const entries = new Map();
3564
3602
  regularFields.forEach((field_0, index) => {
3565
3603
  if (!field_0.hidden) {
3566
- const element = jsx(FieldRenderer, {
3567
- field: field_0
3604
+ const element = jsx(FieldWrapper, {
3605
+ name: field_0.name,
3606
+ type: field_0.type,
3607
+ className: field_0.className,
3608
+ children: jsx(FieldRenderer, {
3609
+ field: field_0
3610
+ })
3568
3611
  }, field_0.name || `field-${index}`);
3569
3612
  entries.set(field_0.name, {
3570
3613
  field: field_0,
@@ -3574,7 +3617,7 @@ function FormGeneratorImpl(props) {
3574
3617
  }
3575
3618
  });
3576
3619
  return entries;
3577
- }, [regularFields]);
3620
+ }, [regularFields, FieldWrapper]);
3578
3621
  const templateFields = useMemo(() => createTemplateFields(fieldEntries), [fieldEntries]);
3579
3622
  const buttons = useMemo(() => {
3580
3623
  const result = {
@@ -3594,10 +3637,10 @@ function FormGeneratorImpl(props) {
3594
3637
  }
3595
3638
  return result;
3596
3639
  }, [SubmitButton, disabled, form.formState.isSubmitting, submitText, showReset, resetText, handleReset]);
3597
- const renderField = useCallback((field_1, options) => {
3640
+ const renderField = useCallback((field_1, options_0) => {
3598
3641
  return jsx(FieldRenderer, {
3599
3642
  field: field_1,
3600
- namePrefix: options === null || options === void 0 ? void 0 : options.namePrefix
3643
+ namePrefix: options_0 === null || options_0 === void 0 ? void 0 : options_0.namePrefix
3601
3644
  });
3602
3645
  }, []);
3603
3646
  if (!children) {
@@ -3607,11 +3650,23 @@ function FormGeneratorImpl(props) {
3607
3650
  ref: formRef,
3608
3651
  onSubmit: handleSubmit,
3609
3652
  className: className,
3610
- children: [regularFields.map((field_2, index_0) => jsx(FieldRenderer, {
3611
- field: field_2
3612
- }, field_2.name || `field-${index_0}`)), arrayFields.map(arrayField => jsx(ArrayFieldRenderer, {
3613
- field: arrayField
3614
- }, arrayField.name)), jsx(SubmitButton, {
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, {
3615
3670
  disabled: disabled || form.formState.isSubmitting,
3616
3671
  isSubmitting: form.formState.isSubmitting,
3617
3672
  children: submitText
@@ -3631,7 +3686,9 @@ function FormGeneratorImpl(props) {
3631
3686
  isSubmitting: form.formState.isSubmitting,
3632
3687
  isValid: form.formState.isValid,
3633
3688
  isDirty: form.formState.isDirty,
3634
- renderField
3689
+ renderField,
3690
+ FieldWrapper,
3691
+ FieldsWrapper
3635
3692
  };
3636
3693
  const renderFn = children;
3637
3694
  return jsx(FormProvider, {
@@ -3648,5 +3705,5 @@ function FormGenerator(props) {
3648
3705
  return FormGeneratorImpl(props);
3649
3706
  }
3650
3707
 
3651
- export { ArrayFieldRenderer, Controller, FieldRenderer, FormGenerator, FormProvider, clearAllRegistries, clearFieldRegistry, clearFormComponentRegistry, getFieldComponent, getFormComponent, getFormComponents, getRegisteredFieldTypes, hasFieldType, hasFormComponent, isArrayField, registerField, registerFields, registerFormComponent, registerFormComponents, resetFormComponentRegistry, unregisterField, useArrayField, useFieldArray, useForm, useFormContext, useWatch };
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 };
3652
3709
  //# sourceMappingURL=index.mjs.map