@idem.agency/form-builder 0.0.14 → 0.0.16

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["base","z"],"sources":["../src/shared/model/store/store.ts","../src/shared/model/store/createStoreContext.tsx","../src/shared/utils.ts","../src/shared/model/store/index.tsx","../src/plugins/validation/rules/confirm.ts","../src/plugins/validation/rules/required.ts","../src/plugins/validation/rules/email.ts","../src/plugins/validation/rules/index.ts","../src/plugins/validation/validation.ts","../src/plugins/validation/provider.tsx","../src/plugins/validation/index.ts","../src/entity/dynamicBuilder/element.tsx","../src/entity/dynamicBuilder/model/createBuilderContext.tsx","../src/entity/dynamicBuilder/model/index.ts","../src/entity/dynamicBuilder/index.tsx","../src/widgets/form/form.tsx","../src/app/index.tsx","../src/entity/inputs/ui/input/index.tsx","../src/entity/inputs/ui/group/index.tsx","../src/shared/model/index.ts"],"sourcesContent":["export type Reducer<S, A> = (state: S, action: A) => S;\n\nexport function createStore<S, A>(\n reducer: Reducer<S, A>,\n initialState: S\n) {\n let state = initialState;\n const listeners = new Set<() => void>();\n \n return {\n getState(): S {\n return state;\n },\n \n dispatch(action: A) {\n state = reducer(state, action);\n listeners.forEach(l => l());\n },\n \n subscribe(listener: () => void) {\n listeners.add(listener);\n return () => { listeners.delete(listener) };\n },\n\n subscribeSelector<T>(selector: (state: S) => T, listener: (value: T) => void) {\n let prev = selector(state);\n return this.subscribe(() => {\n const next = selector(state);\n if (next !== prev) {\n prev = next;\n listener(next);\n }\n });\n }\n };\n}\n\nexport type Store<S, A> = ReturnType<typeof createStore<S, A>>;\n","import {\n createContext,\n useContext,\n useRef,\n useSyncExternalStore\n} from \"react\";\n\nimport { createStore, type Reducer, type Store } from \"./store\";\n\nexport function createStoreContext<S, A>(\n reducer: Reducer<S, A>,\n defaultState: S\n) {\n const StoreContext = createContext<Store<S, A> | null>(null);\n const Provider: React.FC<{ children: React.ReactNode, initialState?: S }> = ({\n children,\n initialState\n }) => {\n const storeRef = useRef<Store<S, A>>(createStore(reducer, initialState ?? defaultState));\n\n return (\n <StoreContext.Provider value={storeRef.current}>\n {children}\n </StoreContext.Provider>\n );\n };\n \n function useStore<T>(\n selector: (state: S) => T\n ): T {\n const store = useContext(StoreContext);\n\n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return useSyncExternalStore(\n store.subscribe,\n () => selector(store.getState()),\n () => selector(store.getState())\n );\n }\n \n function useDispatch() {\n const store = useContext(StoreContext);\n \n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return store.dispatch;\n }\n \n function useStoreInstance(): Store<S, A> {\n const store = useContext(StoreContext);\n\n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n\n return store;\n }\n \n return {\n Provider,\n useStore,\n useDispatch,\n useStoreInstance,\n };\n}\n","export function updateNestedValue(obj: any, path: string, value: any): any {\n if (!path) return value;\n return _updateByKeys(obj, path.split('.'), value);\n}\n\nfunction _updateByKeys(obj: any, keys: string[], value: any): any {\n if (keys.length === 0) return value;\n\n const newObj = Array.isArray(obj) ? [...obj] : { ...obj };\n const currentKey = keys[0];\n\n if (currentKey === '__proto__' || currentKey === 'constructor' || currentKey === 'prototype') {\n throw new Error(`Forbidden path key: ${currentKey}`);\n }\n\n if (keys.length === 1) {\n newObj[currentKey] = value;\n } else {\n const remainingKeys = keys.slice(1);\n const nestedObj = newObj[currentKey];\n\n if (typeof nestedObj === 'undefined' || nestedObj === null) {\n newObj[currentKey] = typeof remainingKeys[0] === 'number' ? [] : {};\n }\n newObj[currentKey] = _updateByKeys(newObj[currentKey], remainingKeys, value);\n }\n return newObj;\n}\n\nexport function getNestedValue(obj: any, path: string): any {\n if (!path) return obj;\n return path.split('.').reduce(\n (acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined),\n obj\n );\n}\n","import { createStoreContext } from \"./createStoreContext\";\nimport type {FormData} from \"@/shared/types/common\";\nimport {updateNestedValue} from \"@/shared/utils\";\nimport type {Provider, ReactNode} from \"react\";\n\ntype State = {\n formData: FormData\n errors: Record<string, any>\n};\n\ntype Action =\n | { type: \"setValue\"; path: string; value: unknown }\n | { type: \"setFieldValue\"; path: string; value: unknown, errors?: string[] }\n | { type: \"setError\"; path: string; value?: string }\n | { type: \"reset\"; }\n | { type: \"setErrors\"; errors?: object };\n\n\nfunction reducer(state: State, action: Action): State {\n const newData = {...state};\n switch (action.type) {\n case 'setValue':\n newData.formData = updateNestedValue(newData.formData, action.path, action.value);\n break;\n case 'setFieldValue':\n newData.formData = updateNestedValue(newData.formData, action.path, action.value);\n newData.errors = updateNestedValue(newData.errors, action.path, action?.errors?.length ? action.errors : null);\n break;\n case 'setError':\n newData.errors = updateNestedValue(newData.errors, action.path, action.value);\n break;\n case 'reset':\n newData.formData = {};\n newData.errors = {};\n break;\n case 'setErrors':\n newData.errors = {...action.errors};\n break;\n }\n return newData;\n}\n\nconst {\n Provider,\n useStore: useFormStore,\n useDispatch: useFormDispatch,\n useStoreInstance: useFormStoreInstance,\n} = createStoreContext(reducer, { formData: {}, errors: {} });\n\nconst FormStoreProvider: React.FC<{ children: ReactNode; formData?: FormData }> = ({children, formData}) =>\n (<Provider initialState={{ formData: formData ?? {}, errors: {} }}>{children}</Provider>);\n\n\nexport { FormStoreProvider, useFormStore, useFormDispatch, useFormStoreInstance };\n","import type {IUserRule} from \"@/plugins/validation/types\";\nimport {getNestedValue} from \"@/shared/utils\";\n\nexport const confirm: IUserRule = {\n code: 'confirm',\n fn: (value, data, args) => {\n const attr = args[0] ?? false;\n return attr ? value == getNestedValue(data, attr) : false;\n },\n message: 'Поле не совпадает с ::attr(1)'\n};\n","import type {IUserRule} from \"@/plugins/validation/types\";\n\nexport const required: IUserRule = {\n code: 'required',\n fn: (value) => {\n return value !== undefined && value !== null && value.length > 0;\n },\n message: 'Поле обязательно для заполнения'\n};\n","import type {IUserRule} from \"@/plugins/validation/types\";\n\nconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\nexport const email: IUserRule = {\n code: 'email',\n fn: (value) => {\n return emailRegex.test(value);\n },\n message: 'Поле не является email'\n};\n","import { confirm } from \"@/plugins/validation/rules/confirm\";\nimport { required } from \"@/plugins/validation/rules/required\";\nimport {email} from \"@/plugins/validation/rules/email\";\n\nexport default [confirm, required, email]\n","import type {FormData} from \"@/shared/types/common\";\nimport base from './rules';\nimport type {IUserRule} from \"@/plugins/validation/types\";\nimport {getNestedValue} from \"@/shared/utils\";\n\nexport class Validation {\n private readonly registry: IUserRule[] = [];\n private registerFields: Record<string, string[]> = {};\n constructor(public readonly onSubmit: boolean, rules: IUserRule[] = []) {\n this.registry = [...rules, ...base];\n }\n \n \n private validateRule(rule: string, data: unknown, formData: FormData): string|null {\n const [code, rawArgs] = rule.split(':');\n const args = rawArgs ? rawArgs.split(',') : [];\n const userRule = this.registry.find(i => i.code == code);\n if (!userRule) {\n return null;\n }\n const validateStatus = userRule.fn(data, formData, args);\n return !validateStatus ? this.replaceMessageArgs(userRule.message, args) : null;\n }\n \n private replaceMessageArgs(message: string, args: string[] = []): string {\n const replaceArgs = args.reduce<Record<string, string>>((acc, arg, index) => {\n acc[`::attr(${index})`] = arg;\n return acc;\n }, {});\n\n return message.replace(/::attr\\(\\d\\)/g, i => replaceArgs[i]);\n }\n \n public registerField(path: string, validators: string[]): void {\n this.registerFields[path] = validators;\n }\n\n private _validate(rules: string[], data: unknown, formData: FormData): string[] {\n return rules.map((rule) => {\n return this.validateRule(rule, data, formData);\n }).filter(i => i !== null)\n }\n validate(rules: string[], data: unknown, formData: FormData): string[] {\n return !this.onSubmit ? this._validate(rules, data, formData) : [];\n }\n \n public validateAll(formData: FormData): Record<string, string[]> {\n return Object.entries(this.registerFields).reduce<Record<string, string[]>>((acc, [path, rules]) => {\n const value = getNestedValue(formData, path);\n const validationMessage = this._validate(rules, value, formData);\n if (validationMessage.length) {\n acc[path] = validationMessage;\n }\n return acc;\n } , {});\n }\n}\n","import React, {createContext, useContext, useMemo} from \"react\";\nimport type {IUserRule} from \"@/plugins/validation/types\";\nimport {Validation} from \"@/plugins/validation/validation\";\nimport type {FormData, FormFieldConfig} from \"@/shared/types/common\";\n\nexport type TValidator = {\n rules?: IUserRule[],\n onSubmit?: boolean,\n}\n\nexport function createValidationProvider() {\n const Context = createContext<Validation | null>(null);\n const Provider: React.FC<{\n children: React.ReactNode,\n validator?: TValidator,\n }> = ({\n validator = {\n onSubmit: false,\n rules: []\n },\n children\n }) => {\n const core = useMemo(() => new Validation(validator.onSubmit ?? false, validator.rules ?? []), [validator]);\n \n return (\n <Context.Provider value={core}>\n {children}\n </Context.Provider>\n );\n }\n \n const useValidate = (rules ?: string[]) => {\n const core = useContext(Context);\n if (!core) {\n throw new Error(\"ValidationProvider missing\");\n }\n return (data: unknown, formData: FormData) => {\n return core.validate(rules ?? [], data, formData);\n }\n }\n \n const useRegister = (currentFieldPath: string, field: FormFieldConfig) => {\n const core = useContext(Context);\n if (!core) {\n throw new Error(\"ValidationProvider missing\");\n }\n \n core.registerField(currentFieldPath, field.validation ?? []);\n\n return useValidate(field.validation);\n }\n \n const useSubmitValidation = () => {\n const core = useContext(Context);\n if (!core) {\n throw new Error(\"ValidationProvider missing\");\n }\n \n return (formData: FormData) => core.validateAll(formData);\n }\n \n return {\n Provider,\n useRegister,\n useSubmitValidation,\n }\n}\n","import {createValidationProvider } from \"./provider\";\nexport { type TValidator } from \"./provider\";\n\nexport const {\n Provider: ValidationProvider,\n useRegister,\n useSubmitValidation\n} = createValidationProvider();\n","import {useFormStore, useFormDispatch, useFormStoreInstance} from \"@/shared/model/store\";\nimport {getNestedValue} from \"@/shared/utils\";\n\nimport type { FormFieldConfig, FormElementComponent} from \"@/shared/types/common\";\nimport {useRegister} from \"@/plugins/validation\";\n\ntype BuilderElementProps = {\n element: FormElementComponent;\n field: FormFieldConfig;\n path: string;\n};\n\n\nexport const DynamicBuilderElement = (props: BuilderElementProps) => {\n const Element = props.element;\n const field = props.field;\n const currentFieldPath = props.path ? `${props.path}.${field.name}` : field.name;\n const value = useFormStore((s=> getNestedValue(s.formData, currentFieldPath)));\n const errors = useFormStore((s=> s.errors[currentFieldPath]));\n const dispatch= useFormDispatch();\n const store = useFormStoreInstance();\n const validator = useRegister(currentFieldPath, field);\n return <Element\n field={{...field}}\n path={currentFieldPath}\n value={value}\n errors={errors}\n onChange={(value: any) => {\n const data = store.getState().formData;\n const errors = validator(value, data);\n dispatch({\n type: 'setFieldValue',\n path: currentFieldPath,\n value,\n errors\n });\n }}\n />;\n}\n","import React, {createContext, type ReactNode, useCallback, useContext} from \"react\";\nimport {DynamicBuilder} from \"@/entity/dynamicBuilder\";\nimport type {FormElementRegistry} from \"~/src\";\n\nexport type TFnBuilder = (layout: any, path: string | undefined, children?: ReactNode) => ReactNode;\nexport function createBuilderContext() {\n const BuilderContext = createContext<{\n builder: TFnBuilder,\n fields: FormElementRegistry,\n } | null>(null);\n \n const Provider: React.FC<{ children: React.ReactNode, fields: FormElementRegistry }> = ({\n fields,\n children\n }) => {\n const builder = useCallback<TFnBuilder>((layout, path, children) => {\n return <DynamicBuilder layout={layout} path={path}>{children}</DynamicBuilder>\n }, [fields]);\n \n return (\n <BuilderContext.Provider value={{builder, fields}}>\n {children}\n </BuilderContext.Provider>\n );\n };\n \n function useBuilder(): TFnBuilder {\n const store = useContext(BuilderContext);\n \n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return store.builder\n }\n \n function useFields(): FormElementRegistry {\n const store = useContext(BuilderContext);\n \n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return store.fields\n }\n \n return {\n Provider,\n useBuilder,\n useFields,\n };\n}\n","import { createBuilderContext } from \"./createBuilderContext\";\n\nexport const {\n Provider: BuilderProvider,\n useBuilder,\n useFields,\n} = createBuilderContext();\n","import type {TDynamicBuilder} from \"@/shared/types/common\";\nimport {DynamicBuilderElement} from \"./element\";\nimport { useFields } from \"@/entity/dynamicBuilder/model\";\n\nexport const DynamicBuilder: TDynamicBuilder = (props) => {\n const path = props.path ?? '';\n const fields = useFields();\n\n return props.layout.map((field, index) => {\n const FormElement = fields[field.type];\n \n if (!FormElement) {\n console.warn(`Неизвестный тип поля: ${field.type}. Проверьте formRegistry.`);\n return null;\n }\n\n return <DynamicBuilderElement key={`${field.name}-${index}`} element={FormElement} path={path} field={field}/>\n })\n}\n\nexport * from './model';\n","'use client';\n\nimport {DynamicBuilder, BuilderProvider} from \"@/entity/dynamicBuilder\";\nimport {forwardRef, useCallback, useEffect, useImperativeHandle, useRef} from \"react\";\nimport {useFormDispatch, useFormStoreInstance} from \"@/shared/model/store\";\nimport type {FormBuilderRef, TFormBuilder} from \"@/shared/types/common\";\nimport { useSubmitValidation } from \"@/plugins/validation\";\n\nexport const Form = forwardRef<FormBuilderRef, TFormBuilder>((props, ref) => {\n const dispatch = useFormDispatch();\n const store = useFormStoreInstance();\n const changeRef = useRef(props.onChange);\n \n useEffect(() => {\n return store.subscribeSelector(\n (s) => s.formData,\n (formData) => changeRef.current?.(formData)\n );\n }, [store]);\n \n const validation = useSubmitValidation();\n \n const submitHdl = useCallback(() => {\n if (props.onSubmit) {\n const errors = validation(store.getState().formData);\n if (Object.keys(errors).length == 0) {\n props.onSubmit(store.getState().formData);\n } else {\n dispatch({type: 'setErrors', errors })\n }\n }\n }, [props.onSubmit, validation]);\n \n useImperativeHandle(ref, () => ({\n reset: () => dispatch({type: 'reset'}),\n submit: () => submitHdl(),\n errors: () => store.getState().errors,\n }), [submitHdl, dispatch, store]);\n \n return (\n <form onSubmit={(e) => {\n e.preventDefault();\n submitHdl();\n }}\n className={props?.className}\n >\n <BuilderProvider fields={props.fields}>\n <DynamicBuilder layout={props.layout}/>\n </BuilderProvider>\n <input type=\"submit\" style={{display: 'none'}}/>\n {props.children}\n </form>\n );\n});\n","import type {FormBuilderRef, TFormBuilder} from \"../shared/types/common\";\nimport {forwardRef} from \"react\";\nimport {FormStoreProvider} from \"@/shared/model/store\";\n\nimport { Form } from \"@/widgets/form/form\";\nimport {ValidationProvider} from \"@/plugins/validation\";\n\nexport const FormBuilder = forwardRef<FormBuilderRef, TFormBuilder>((props, ref) => {\n const {formData, ...innerProps} = props;\n\n return <FormStoreProvider formData={formData}>\n <ValidationProvider validator={props.validator}>\n <Form {...innerProps} ref={ref}></Form>\n </ValidationProvider>\n </FormStoreProvider>\n});\n\nexport default FormBuilder;\n","import type { FormElementProps, FormFieldConfig, FormFieldBase, RC } from '../../../../shared/types/common';\nimport { useId } from \"react\";\n\nexport type TextFieldConfig = FormFieldBase & { type: 'text' | 'email' | 'password'; placeholder?: string; };\n\nfunction isTextFieldConfig(field: FormFieldConfig): field is TextFieldConfig {\n return field.type === 'text' || field.type === 'email' || field.type === 'password';\n}\n\nexport const TextField: RC<FormElementProps> = ({ field, value, errors, onChange }) => {\n if (!isTextFieldConfig(field)) {\n console.warn(`TextField received an invalid field config for type: ${field.type}`);\n return null;\n }\n const id = useId();\n return (\n <div style={{ marginBottom: '15px' }}>\n <label htmlFor={id}>{field.label}:</label>\n <input\n type={field.type}\n id={id}\n name={field.name}\n placeholder={field.placeholder}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n style={{ borderColor: errors ? 'red' : '#ccc' }}\n />\n {errors && <p style={{ color: 'red', fontSize: '0.8em' }}>{Object.values(errors).join(', ')}</p>}\n </div>\n );\n};\n","import type {FormElementProps, FormFieldBase, FormFieldConfig, RC} from \"../../../../shared/types/common.ts\";\nimport clsx from \"clsx\";\nimport {useBuilder} from \"@/entity/dynamicBuilder\";\nexport type FormGroupConfig = FormFieldBase & { variant?: 'row' | 'col', fields: FormFieldConfig[] };\n\nfunction isGroupConfig(field: FormFieldConfig): field is FormGroupConfig {\n return Array.isArray(field.fields);\n}\n\n\nexport const FormGroup: RC<FormElementProps<FormGroupConfig>> = ({field, path}) => {\n if (!isGroupConfig(field)) {\n return null;\n }\n const Builder = useBuilder()(field.fields, path);\n const variant = field.variant ?? 'col';\n \n const className = variant == 'col' ? 'flex-col' : 'flex-row';\n\n return <div>\n <div>{field.label}</div>\n <div className={clsx(className, 'flex')}>\n {Builder}\n </div>\n </div>;\n};\n","import { z } from 'zod';\n\nconst fieldShema = z.object({\n name: z.string(),\n label: z.string().optional(),\n type: z.string(),\n});\n\ntype TField = z.infer<typeof fieldShema>;\n\nexport type { TField };\nexport { fieldShema };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["base","z"],"sources":["../src/shared/utils.ts","../src/plugins/validation/rules/confirm.ts","../src/plugins/validation/rules/required.ts","../src/plugins/validation/rules/email.ts","../src/plugins/validation/rules/index.ts","../src/plugins/validation/validation.ts","../src/plugins/validation/index.ts","../src/plugins/visibility/core.ts","../src/plugins/visibility/index.ts","../src/entity/inputs/ui/input/index.tsx","../src/shared/model/store/store.ts","../src/shared/model/store/createStoreContext.tsx","../src/shared/model/plugins/context.tsx","../src/shared/model/store/index.tsx","../src/shared/model/plugins/hooks.ts","../src/entity/dynamicBuilder/element.tsx","../src/entity/dynamicBuilder/model/createBuilderContext.tsx","../src/entity/dynamicBuilder/model/index.ts","../src/entity/dynamicBuilder/index.tsx","../src/entity/inputs/ui/group/index.tsx","../src/widgets/form/form.tsx","../src/shared/model/plugins/HookRegistry.ts","../src/shared/model/plugins/PipelineRegistry.ts","../src/shared/model/plugins/EventBus.ts","../src/shared/model/plugins/MiddlewareRegistry.ts","../src/shared/model/plugins/FieldRegistry.ts","../src/shared/model/plugins/PluginManager.ts","../src/app/index.tsx","../src/shared/model/index.ts","../src/index.ts"],"sourcesContent":["export function updateNestedValue(obj: any, path: string, value: any): any {\n if (!path) return value;\n return _updateByKeys(obj, path.split('.'), value);\n}\n\nfunction _updateByKeys(obj: any, keys: string[], value: any): any {\n if (keys.length === 0) return value;\n\n const newObj = Array.isArray(obj) ? [...obj] : { ...obj };\n const currentKey = keys[0];\n\n if (currentKey === '__proto__' || currentKey === 'constructor' || currentKey === 'prototype') {\n throw new Error(`Forbidden path key: ${currentKey}`);\n }\n\n if (keys.length === 1) {\n newObj[currentKey] = value;\n } else {\n const remainingKeys = keys.slice(1);\n const nestedObj = newObj[currentKey];\n\n if (typeof nestedObj === 'undefined' || nestedObj === null) {\n newObj[currentKey] = typeof remainingKeys[0] === 'number' ? [] : {};\n }\n newObj[currentKey] = _updateByKeys(newObj[currentKey], remainingKeys, value);\n }\n return newObj;\n}\n\nexport function getNestedValue(obj: any, path: string): any {\n if (!path) return obj;\n return path.split('.').reduce(\n (acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined),\n obj\n );\n}\n","import type {IUserRule} from \"@/plugins/validation/types\";\nimport {getNestedValue} from \"@/shared/utils\";\n\nexport const confirm: IUserRule = {\n code: 'confirm',\n fn: (value, data, args) => {\n const attr = args[0] ?? false;\n return attr ? value == getNestedValue(data, attr) : false;\n },\n message: 'Поле не совпадает с ::attr(1)'\n};\n","import type {IUserRule} from \"@/plugins/validation/types\";\n\nexport const required: IUserRule = {\n code: 'required',\n fn: (value) => {\n return value !== undefined && value !== null && value.length > 0;\n },\n message: 'Поле обязательно для заполнения'\n};\n","import type {IUserRule} from \"@/plugins/validation/types\";\n\nconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\nexport const email: IUserRule = {\n code: 'email',\n fn: (value) => {\n return emailRegex.test(value);\n },\n message: 'Поле не является email'\n};\n","import { confirm } from \"@/plugins/validation/rules/confirm\";\nimport { required } from \"@/plugins/validation/rules/required\";\nimport {email} from \"@/plugins/validation/rules/email\";\n\nexport default [confirm, required, email]\n","import type {FormData} from \"@/shared/types/common\";\nimport base from './rules';\nimport type {IUserRule} from \"@/plugins/validation/types\";\nimport {getNestedValue} from \"@/shared/utils\";\n\nexport class Validation {\n private readonly registry: IUserRule[] = [];\n private registerFields: Record<string, string[]> = {};\n constructor(public readonly onSubmit: boolean, rules: IUserRule[] = []) {\n this.registry = [...rules, ...base];\n }\n \n \n private validateRule(rule: string, data: unknown, formData: FormData): string|null {\n const [code, rawArgs] = rule.split(':');\n const args = rawArgs ? rawArgs.split(',') : [];\n const userRule = this.registry.find(i => i.code == code);\n if (!userRule) {\n return null;\n }\n const validateStatus = userRule.fn(data, formData, args);\n return !validateStatus ? this.replaceMessageArgs(userRule.message, args) : null;\n }\n \n private replaceMessageArgs(message: string, args: string[] = []): string {\n const replaceArgs = args.reduce<Record<string, string>>((acc, arg, index) => {\n acc[`::attr(${index})`] = arg;\n return acc;\n }, {});\n\n return message.replace(/::attr\\(\\d\\)/g, i => replaceArgs[i]);\n }\n \n public registerField(path: string, validators: string[]): void {\n this.registerFields[path] = validators;\n }\n\n private _validate(rules: string[], data: unknown, formData: FormData): string[] {\n return rules.map((rule) => {\n return this.validateRule(rule, data, formData);\n }).filter(i => i !== null)\n }\n validate(rules: string[], data: unknown, formData: FormData): string[] {\n return !this.onSubmit ? this._validate(rules, data, formData) : [];\n }\n \n public validateAll(formData: FormData): Record<string, string[]> {\n return Object.entries(this.registerFields).reduce<Record<string, string[]>>((acc, [path, rules]) => {\n const value = getNestedValue(formData, path);\n const validationMessage = this._validate(rules, value, formData);\n if (validationMessage.length) {\n acc[path] = validationMessage;\n }\n return acc;\n } , {});\n }\n}\n","import { Validation } from './validation';\nimport type { IPlugin, IPluginContext } from '@/shared/model/plugins/types';\nimport type { IUserRule } from './types';\n\nexport type TValidator = {\n rules?: IUserRule[];\n onSubmit?: boolean;\n};\n\nexport function createValidationPlugin(config?: TValidator): IPlugin {\n const engine = new Validation(\n config?.onSubmit ?? false,\n config?.rules ?? []\n );\n\n return {\n name: 'validation',\n install(ctx: IPluginContext) {\n ctx.events.tap<{ path: string; field: { validation?: string[] } }>(\n 'field:register',\n ({ path, field }) => {\n engine.registerField(path, field.validation ?? []);\n }\n );\n\n ctx.pipeline.use('field:change', (data, next) => {\n const errors = engine.validate(data.field.validation ?? [], data.value, data.formData);\n return next({ ...data, errors });\n });\n\n ctx.pipeline.use('form:validate', (data, next) => {\n const errors = engine.validateAll(data.formData);\n return next({ ...data, errors });\n });\n },\n };\n}\n\nexport type { IUserRule };\n","import type {TEqualRule, TGroupRules, TInRule, TCommonRule} from \"@/plugins/visibility/types\";\nimport type {FormData} from \"@/shared/types/common\";\nimport {getNestedValue} from \"@/shared/utils\";\nexport class VisibilityCore {\n private registerFields: Record<string, TGroupRules> = {};\n\n registerField(path: string, rule: TGroupRules): void {\n this.registerFields[path] = rule;\n }\n \n private static isGroupRule(i: TGroupRules | TCommonRule): i is TGroupRules {\n return 'rules' in i;\n }\n \n private static isInOperator(i: TCommonRule): i is TInRule {\n return i.operator == 'in' ;\n }\n \n private static isEqualOperand(i: TCommonRule): i is TEqualRule {\n return i.operator == '=' ;\n }\n \n static checkGroup(groupRule: TGroupRules, formData: FormData): boolean {\n const logic = groupRule.logic;\n const items: boolean[] = [];\n groupRule.rules.forEach((rule: TGroupRules | TCommonRule) => {\n if (this.isGroupRule(rule)) {\n items.push(this.checkGroup(rule, formData));\n } else {\n const value = getNestedValue(formData, rule.field)\n if (this.isInOperator(rule)) {\n items.push(rule.value.indexOf(value) !== -1);\n } else if (this.isEqualOperand(rule)) {\n items.push(rule.value == value);\n }\n }\n })\n if (logic == 'or') {\n return items.indexOf(true) != -1\n } else {\n return items.indexOf(false) == -1;\n }\n }\n \n isView(path: string, data: FormData): boolean {\n const rule = this.checkInRule(path);\n if (!this.checkInRule(path)) {\n return true;\n }\n return VisibilityCore.checkGroup(rule, data);\n }\n \n private checkInRule(path: string) {\n return this.registerFields[path];\n }\n}\n","import type {IPlugin, IPluginContext} from \"~/src\";\nimport {VisibilityCore} from \"@/plugins/visibility/core\";\nimport type {TGroupRules} from \"@/plugins/visibility/types\";\n\nexport function createVisibilityPlugin(): IPlugin {\n const engine = new VisibilityCore();\n return {\n name: 'visibility',\n install(ctx: IPluginContext) {\n ctx.events.tap<{ path: string; field: { visibility?: TGroupRules } }>(\n 'field:register',\n ({ path, field }) => {\n if (field.visibility) {\n engine.registerField(path, field.visibility);\n }\n }\n );\n \n ctx.pipeline.useSync('field:visible', (data, next) => {\n const visible = engine.isView(data.path, data.formData);\n return next({ ...data, visible});\n });\n },\n };\n}\n","import type { FormElementProps, FormFieldConfig, RC } from '../../../../shared/types/common';\nimport { useId } from \"react\";\nimport type {TField} from \"@/shared/model\";\n\nexport type TextFieldConfig = TField & { type: 'text' | 'email' | 'password'; placeholder?: string; };\n\nfunction isTextFieldConfig(field: FormFieldConfig): field is TextFieldConfig {\n return field.type === 'text' || field.type === 'email' || field.type === 'password';\n}\n\nexport const TextField: RC<FormElementProps> = ({ field, value, errors, onChange }) => {\n if (!isTextFieldConfig(field)) {\n console.warn(`TextField received an invalid field config for type: ${field.type}`);\n return null;\n }\n const id = useId();\n return (\n <div style={{ marginBottom: '15px' }}>\n <label htmlFor={id}>{field.label}:</label>\n <input\n type={field.type}\n id={id}\n name={field.name}\n placeholder={field.placeholder}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n style={{ borderColor: errors ? 'red' : '#ccc' }}\n />\n {errors && <p style={{ color: 'red', fontSize: '0.8em' }}>{Object.values(errors).join(', ')}</p>}\n </div>\n );\n};\n","export type Reducer<S, A> = (state: S, action: A) => S;\n\nexport function createStore<S, A>(\n reducer: Reducer<S, A>,\n initialState: S\n) {\n let state = initialState;\n const listeners = new Set<() => void>();\n \n return {\n getState(): S {\n return state;\n },\n \n dispatch(action: A) {\n state = reducer(state, action);\n listeners.forEach(l => l());\n },\n \n subscribe(listener: () => void) {\n listeners.add(listener);\n return () => { listeners.delete(listener) };\n },\n\n subscribeSelector<T>(selector: (state: S) => T, listener: (value: T) => void) {\n let prev = selector(state);\n return this.subscribe(() => {\n const next = selector(state);\n if (next !== prev) {\n prev = next;\n listener(next);\n }\n });\n }\n };\n}\n\nexport type Store<S, A> = ReturnType<typeof createStore<S, A>>;\n","import {\n createContext,\n useContext,\n useRef,\n useSyncExternalStore\n} from \"react\";\n\nimport { createStore, type Reducer, type Store } from \"./store\";\n\nexport function createStoreContext<S, A>(\n reducer: Reducer<S, A>,\n defaultState: S\n) {\n const StoreContext = createContext<Store<S, A> | null>(null);\n const Provider: React.FC<{ children: React.ReactNode, initialState?: S }> = ({\n children,\n initialState\n }) => {\n const storeRef = useRef<Store<S, A>>(createStore(reducer, initialState ?? defaultState));\n\n return (\n <StoreContext.Provider value={storeRef.current}>\n {children}\n </StoreContext.Provider>\n );\n };\n \n function useStore<T>(\n selector: (state: S) => T\n ): T {\n const store = useContext(StoreContext);\n\n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return useSyncExternalStore(\n store.subscribe,\n () => selector(store.getState()),\n () => selector(store.getState())\n );\n }\n \n function useDispatch() {\n const store = useContext(StoreContext);\n \n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return store.dispatch;\n }\n \n function useStoreInstance(): Store<S, A> {\n const store = useContext(StoreContext);\n\n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n\n return store;\n }\n \n return {\n Provider,\n useStore,\n useDispatch,\n useStoreInstance,\n };\n}\n","import { createContext, useContext } from 'react';\nimport type { PluginManager } from './PluginManager';\n\nexport const PluginSystemContext = createContext<PluginManager | null>(null);\n\nexport function usePluginManager(): PluginManager {\n const ctx = useContext(PluginSystemContext);\n if (!ctx) throw new Error('PluginSystemContext not found');\n return ctx;\n}\n","import { createStoreContext } from \"./createStoreContext\";\nimport type { FormData } from \"@/shared/types/common\";\nimport { updateNestedValue } from \"@/shared/utils\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { PluginSystemContext } from \"@/shared/model/plugins/context\";\nimport type { StoreMiddleware, FormAction as PluginFormAction, FormState as PluginFormState } from \"@/shared/model/plugins/types\";\n\ntype State = {\n formData: FormData\n errors: Record<string, any>\n};\n\ntype Action =\n | { type: \"setValue\"; path: string; value: unknown }\n | { type: \"setFieldValue\"; path: string; value: unknown, errors?: string[] }\n | { type: \"setError\"; path: string; value?: string }\n | { type: \"reset\"; }\n | { type: \"setErrors\"; errors?: object };\n\nfunction reducer(state: State, action: Action): State {\n const newData = { ...state };\n switch (action.type) {\n case 'setValue':\n newData.formData = updateNestedValue(newData.formData, action.path, action.value);\n break;\n case 'setFieldValue':\n newData.formData = updateNestedValue(newData.formData, action.path, action.value);\n newData.errors = updateNestedValue(newData.errors, action.path, action?.errors?.length ? action.errors : null);\n break;\n case 'setError':\n newData.errors = updateNestedValue(newData.errors, action.path, action.value);\n break;\n case 'reset':\n newData.formData = {};\n newData.errors = {};\n break;\n case 'setErrors':\n newData.errors = { ...action.errors };\n break;\n }\n return newData;\n}\n\nfunction composeMiddleware(\n middlewares: StoreMiddleware[],\n baseDispatch: (action: Action) => void,\n getState: () => State\n): (action: Action) => void {\n if (middlewares.length === 0) return baseDispatch;\n return middlewares.reduceRight(\n (next, m) => (action: Action) =>\n m(\n action as PluginFormAction,\n next as (a: PluginFormAction) => void,\n getState as () => PluginFormState\n ),\n baseDispatch as (action: Action) => void\n );\n}\n\nconst {\n Provider,\n useStore: useFormStore,\n useDispatch: _useRawDispatch,\n useStoreInstance: useFormStoreInstance,\n} = createStoreContext(reducer, { formData: {}, errors: {} });\n\nconst DispatchContext = createContext<((action: Action) => void) | null>(null);\n\nconst DispatchEnhancer: React.FC<{ children: ReactNode }> = ({ children }) => {\n const pluginManager = useContext(PluginSystemContext);\n const store = useFormStoreInstance();\n const rawDispatch = _useRawDispatch();\n const middlewares = pluginManager ? pluginManager.getMiddleware() : [];\n\n const dispatch = useMemo(\n () => composeMiddleware(middlewares, rawDispatch, store.getState as () => State),\n [] // middleware is fixed at mount time\n );\n\n return <DispatchContext.Provider value={dispatch}>{children}</DispatchContext.Provider>;\n};\n\nconst FormStoreProvider: React.FC<{ children: ReactNode; formData?: FormData }> = ({ children, formData }) => (\n <Provider initialState={{ formData: formData ?? {}, errors: {} }}>\n <DispatchEnhancer>{children}</DispatchEnhancer>\n </Provider>\n);\n\nfunction useFormDispatch(): (action: Action) => void {\n const ctx = useContext(DispatchContext);\n if (!ctx) throw new Error(\"FormStoreProvider missing\");\n return ctx;\n}\n\nexport { FormStoreProvider, useFormStore, useFormDispatch, useFormStoreInstance };\n","import { usePluginManager } from './context';\nimport type { StoreMiddleware } from './types';\n\nexport function useCallEvents() {\n const pm = usePluginManager();\n return pm.callEvents;\n}\n\nexport function useRunPipeline() {\n const pm = usePluginManager();\n return pm.runPipeline;\n}\n\nexport function useRunPipelineSync() {\n const pm = usePluginManager();\n return pm.runPipelineSync;\n}\n\nexport function useMiddleware(): StoreMiddleware[] {\n const pm = usePluginManager();\n return pm.getMiddleware();\n}\n","import { useEffect } from 'react';\nimport { useFormStore, useFormDispatch, useFormStoreInstance } from \"@/shared/model/store\";\nimport { getNestedValue } from \"@/shared/utils\";\nimport type { FormFieldConfig, FormElementComponent } from \"@/shared/types/common\";\nimport { useCallEvents, useRunPipeline, useRunPipelineSync } from '@/shared/model/plugins/hooks';\n\ntype BuilderElementProps = {\n element: FormElementComponent;\n field: FormFieldConfig;\n path: string;\n};\n\nexport const DynamicBuilderElement = (props: BuilderElementProps) => {\n const Element = props.element;\n const field = props.field;\n const currentFieldPath = props.path ? `${props.path}.${field.name}` : field.name;\n const value = useFormStore((s) => getNestedValue(s.formData, currentFieldPath));\n const errors = useFormStore((s) => s.errors[currentFieldPath]);\n const dispatch = useFormDispatch();\n const store = useFormStoreInstance();\n const callEvents = useCallEvents();\n const runPipeline = useRunPipeline();\n const runPipelineSync = useRunPipelineSync();\n \n useEffect(() => {\n callEvents('field:register', { path: currentFieldPath, field });\n }, [currentFieldPath]);\n \n const visible = useFormStore((s) =>\n runPipelineSync('field:visible', {\n visible: true,\n field,\n path: currentFieldPath,\n formData: s.formData,\n }).visible\n );\n\n if (!visible) return null;\n\n return (\n <Element\n field={{ ...field }}\n path={currentFieldPath}\n value={value}\n errors={errors}\n onChange={async (value: any) => {\n const data = store.getState().formData;\n const { value: finalValue, errors } = await runPipeline('field:change', {\n value,\n field,\n path: currentFieldPath,\n formData: data,\n errors: [],\n });\n dispatch({\n type: 'setFieldValue',\n path: currentFieldPath,\n value: finalValue,\n errors,\n });\n await callEvents('field:change', {\n value: finalValue,\n prevValue: value,\n field,\n path: currentFieldPath,\n formData: store.getState().formData,\n });\n }}\n />\n );\n};\n","import React, {createContext, type ReactNode, useCallback, useContext} from \"react\";\nimport {DynamicBuilder} from \"@/entity/dynamicBuilder\";\nimport type {FormElementRegistry} from \"~/src\";\n\nexport type TFnBuilder = (layout: any, path: string | undefined, children?: ReactNode) => ReactNode;\nexport function createBuilderContext() {\n const BuilderContext = createContext<{\n builder: TFnBuilder,\n fields: FormElementRegistry,\n } | null>(null);\n \n const Provider: React.FC<{ children: React.ReactNode, fields: FormElementRegistry }> = ({\n fields,\n children\n }) => {\n const builder = useCallback<TFnBuilder>((layout, path, children) => {\n return <DynamicBuilder layout={layout} path={path}>{children}</DynamicBuilder>\n }, [fields]);\n \n return (\n <BuilderContext.Provider value={{builder, fields}}>\n {children}\n </BuilderContext.Provider>\n );\n };\n \n function useBuilder(): TFnBuilder {\n const store = useContext(BuilderContext);\n \n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return store.builder\n }\n \n function useFields(): FormElementRegistry {\n const store = useContext(BuilderContext);\n \n if (!store) {\n throw new Error(\"StoreProvider missing\");\n }\n \n return store.fields\n }\n \n return {\n Provider,\n useBuilder,\n useFields,\n };\n}\n","import { createBuilderContext } from \"./createBuilderContext\";\n\nexport const {\n Provider: BuilderProvider,\n useBuilder,\n useFields,\n} = createBuilderContext();\n","import type {TDynamicBuilder} from \"@/shared/types/common\";\nimport {DynamicBuilderElement} from \"./element\";\nimport { useFields } from \"@/entity/dynamicBuilder/model\";\n\nexport const DynamicBuilder: TDynamicBuilder = (props) => {\n const path = props.path ?? '';\n const fields = useFields();\n\n return props.layout.map((field, index) => {\n const FormElement = fields[field.type];\n \n if (!FormElement) {\n console.warn(`Неизвестный тип поля: ${field.type}. Проверьте formRegistry.`);\n return null;\n }\n\n return <DynamicBuilderElement key={`${field.name}-${index}`} element={FormElement} path={path} field={field}/>\n })\n}\n\nexport * from './model';\n","import type {FormElementProps, FormFieldConfig, RC} from \"../../../../shared/types/common.ts\";\nimport clsx from \"clsx\";\nimport {useBuilder} from \"@/entity/dynamicBuilder\";\nimport type {TField} from \"@/shared/model\";\nexport type FormGroupConfig = TField & { variant?: 'row' | 'col', fields: FormFieldConfig[] };\n\nfunction isGroupConfig(field: FormFieldConfig): field is FormGroupConfig {\n return Array.isArray(field.fields);\n}\n\n\nexport const FormGroup: RC<FormElementProps<FormGroupConfig>> = ({field, path}) => {\n if (!isGroupConfig(field)) {\n return null;\n }\n const Builder = useBuilder()(field.fields, path);\n const variant = field.variant ?? 'col';\n \n const className = variant == 'col' ? 'flex-col' : 'flex-row';\n\n return <div>\n <div>{field.label}</div>\n <div className={clsx(className, 'flex')}>\n {Builder}\n </div>\n </div>;\n};\n","'use client';\n\nimport { DynamicBuilder, BuilderProvider } from \"@/entity/dynamicBuilder\";\nimport { forwardRef, useCallback, useEffect, useImperativeHandle } from \"react\";\nimport { useFormDispatch, useFormStoreInstance } from \"@/shared/model/store\";\nimport type { FormBuilderRef, TFormBuilder } from \"@/shared/types/common\";\nimport { useCallEvents, useRunPipeline } from '@/shared/model/plugins/hooks';\n\nexport const Form = forwardRef<FormBuilderRef, TFormBuilder>((props, ref) => {\n const dispatch = useFormDispatch();\n const store = useFormStoreInstance();\n const callEvents = useCallEvents();\n const runPipeline = useRunPipeline();\n\n useEffect(() => {\n return store.subscribeSelector(\n (s) => s.formData,\n (formData) => props.onChange ? props.onChange?.(formData): null\n );\n }, [props.onChange]);\n\n const submitHdl = useCallback(async () => {\n if (props.onSubmit) {\n const currentFormData = store.getState().formData;\n await callEvents('form:submit:before', { formData: currentFormData });\n const { formData: transformed } = await runPipeline('form:submit', { formData: currentFormData });\n const { errors } = await runPipeline('form:validate', { formData: transformed, errors: {} });\n\n if (Object.keys(errors).length === 0) {\n props.onSubmit(transformed);\n } else {\n dispatch({ type: 'setErrors', errors });\n }\n await callEvents('form:submit:after', { formData: transformed, errors });\n }\n }, [props.onSubmit, callEvents, runPipeline, store, dispatch]);\n\n useImperativeHandle(ref, () => ({\n reset: () => dispatch({ type: 'reset' }),\n submit: () => submitHdl(),\n errors: () => store.getState().errors,\n }), [submitHdl, dispatch, store]);\n\n return (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n await submitHdl();\n }}\n className={props?.className}\n >\n <BuilderProvider fields={props.fields}>\n <DynamicBuilder layout={props.layout} />\n </BuilderProvider>\n <input type=\"submit\" style={{ display: 'none' }} />\n {props.children}\n </form>\n );\n});\n","import type { FormHookName, HookHandler, IEventRegistry } from './types';\n\nexport class HookRegistry implements IEventRegistry {\n private handlers = new Map<string, Set<HookHandler<any>>>();\n\n tap<T>(hook: FormHookName, handler: HookHandler<T>): () => void {\n if (!this.handlers.has(hook)) {\n this.handlers.set(hook, new Set());\n }\n this.handlers.get(hook)!.add(handler as HookHandler<any>);\n return () => {\n this.handlers.get(hook)?.delete(handler as HookHandler<any>);\n };\n }\n\n async call<T>(hook: FormHookName, data: T): Promise<void> {\n const set = this.handlers.get(hook);\n if (!set) return;\n await Promise.all([...set].map((h) => h(data)));\n }\n}\n","import type {\n AsyncPipelineName,\n SyncPipelineName,\n PipelineStage,\n SyncPipelineStage,\n IPipelineRegistry,\n AsyncPipelineDataMap,\n SyncPipelineDataMap,\n} from './types';\n\ntype SortedAsyncStage<T> = { stage: PipelineStage<T>; priority: number };\ntype SortedSyncStage<T> = { stage: SyncPipelineStage<T>; priority: number };\n\nexport class PipelineRegistry implements IPipelineRegistry {\n private stages = new Map<string, SortedAsyncStage<any>[]>();\n private syncStages = new Map<string, SortedSyncStage<any>[]>();\n\n use<K extends AsyncPipelineName>(\n pipeline: K,\n stage: PipelineStage<AsyncPipelineDataMap[K]>,\n priority = 10\n ): () => void {\n if (!this.stages.has(pipeline)) this.stages.set(pipeline, []);\n const arr = this.stages.get(pipeline)!;\n const entry = { stage, priority };\n arr.push(entry);\n arr.sort((a, b) => b.priority - a.priority);\n return () => {\n const i = arr.indexOf(entry);\n if (i >= 0) arr.splice(i, 1);\n };\n }\n\n useSync<K extends SyncPipelineName>(\n pipeline: K,\n stage: SyncPipelineStage<SyncPipelineDataMap[K]>,\n priority = 10\n ): () => void {\n if (!this.syncStages.has(pipeline)) this.syncStages.set(pipeline, []);\n const arr = this.syncStages.get(pipeline)!;\n const entry = { stage, priority };\n arr.push(entry);\n arr.sort((a, b) => b.priority - a.priority);\n return () => {\n const i = arr.indexOf(entry);\n if (i >= 0) arr.splice(i, 1);\n };\n }\n\n async run<K extends AsyncPipelineName>(\n name: K,\n initialData: AsyncPipelineDataMap[K]\n ): Promise<AsyncPipelineDataMap[K]> {\n const arr = this.stages.get(name) ?? [];\n const compose = (index: number) => (data: AsyncPipelineDataMap[K]): Promise<AsyncPipelineDataMap[K]> => {\n if (index >= arr.length) return Promise.resolve(data);\n return arr[index].stage(data, compose(index + 1));\n };\n return compose(0)(initialData);\n }\n\n runSync<K extends SyncPipelineName>(\n name: K,\n initialData: SyncPipelineDataMap[K]\n ): SyncPipelineDataMap[K] {\n const arr = this.syncStages.get(name) ?? [];\n const compose = (index: number) => (data: SyncPipelineDataMap[K]): SyncPipelineDataMap[K] => {\n if (index >= arr.length) return data;\n return arr[index].stage(data, compose(index + 1));\n };\n return compose(0)(initialData);\n }\n}\n","import type { IEventBus } from './types';\n\nexport class EventBus implements IEventBus {\n private listeners = new Map<string, Set<(data: any) => void>>();\n\n on<T = unknown>(event: string, handler: (data: T) => void): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n this.listeners.get(event)!.add(handler);\n return () => this.listeners.get(event)?.delete(handler);\n }\n\n emit<T = unknown>(event: string, data: T): void {\n this.listeners.get(event)?.forEach((h) => h(data));\n }\n}\n","import type { IMiddlewareRegistry, StoreMiddleware } from './types';\n\nexport class MiddlewareRegistry implements IMiddlewareRegistry {\n private middlewares: StoreMiddleware[] = [];\n\n use(middleware: StoreMiddleware): () => void {\n this.middlewares.push(middleware);\n return () => {\n const i = this.middlewares.indexOf(middleware);\n if (i >= 0) this.middlewares.splice(i, 1);\n };\n }\n\n getAll(): StoreMiddleware[] {\n return [...this.middlewares];\n }\n}\n","import type { IFieldRegistry } from './types';\nimport type { FormElementComponent } from '@/shared/types/common';\n\nexport class FieldRegistry implements IFieldRegistry {\n private components = new Map<string, FormElementComponent<any>>();\n\n register(type: string, component: FormElementComponent<any>): () => void {\n this.components.set(type, component);\n return () => this.components.delete(type);\n }\n\n getAll(): Record<string, FormElementComponent<any>> {\n return Object.fromEntries(this.components);\n }\n}\n","import type { IPlugin, IPluginContext } from './types';\nimport { HookRegistry } from './HookRegistry';\nimport { PipelineRegistry } from './PipelineRegistry';\nimport { EventBus } from './EventBus';\nimport { MiddlewareRegistry } from './MiddlewareRegistry';\nimport { FieldRegistry } from './FieldRegistry';\n\nexport class PluginManager {\n private readonly eventRegistry = new HookRegistry();\n private readonly pipelineRegistry = new PipelineRegistry();\n private readonly eventBus = new EventBus();\n private readonly middlewareRegistry = new MiddlewareRegistry();\n private readonly fieldRegistry = new FieldRegistry();\n private unsubscribers: Array<() => void> = [];\n private installed = false;\n\n constructor(private readonly plugins: IPlugin[]) {}\n\n install(): void {\n if (this.installed) return;\n const context: IPluginContext = {\n events: {\n tap: (hook, handler) => {\n const unsub = this.eventRegistry.tap(hook, handler);\n this.unsubscribers.push(unsub);\n return unsub;\n },\n },\n pipeline: {\n use: (pipeline, stage, priority) => {\n const unsub = this.pipelineRegistry.use(pipeline, stage, priority);\n this.unsubscribers.push(unsub);\n return unsub;\n },\n useSync: (pipeline, stage, priority) => {\n const unsub = this.pipelineRegistry.useSync(pipeline, stage, priority);\n this.unsubscribers.push(unsub);\n return unsub;\n },\n },\n eventBus: {\n on: (event, handler) => {\n const unsub = this.eventBus.on(event, handler);\n this.unsubscribers.push(unsub);\n return unsub;\n },\n emit: (event, data) => this.eventBus.emit(event, data),\n },\n fields: {\n register: (type, component) => {\n const unsub = this.fieldRegistry.register(type, component);\n this.unsubscribers.push(unsub);\n return unsub;\n },\n },\n middleware: {\n use: (middleware) => {\n const unsub = this.middlewareRegistry.use(middleware);\n this.unsubscribers.push(unsub);\n return unsub;\n },\n },\n };\n\n this.installed = true;\n for (const plugin of this.plugins) {\n plugin.install(context);\n }\n }\n\n uninstall(): void {\n if (!this.installed) return;\n this.installed = false;\n [...this.unsubscribers].reverse().forEach((fn) => fn());\n this.unsubscribers = [];\n [...this.plugins].reverse().forEach((plugin) => plugin.uninstall?.());\n }\n\n callEvents = this.eventRegistry.call.bind(this.eventRegistry);\n runPipeline = this.pipelineRegistry.run.bind(this.pipelineRegistry);\n runPipelineSync = this.pipelineRegistry.runSync.bind(this.pipelineRegistry);\n getMiddleware = this.middlewareRegistry.getAll.bind(this.middlewareRegistry);\n getFields = this.fieldRegistry.getAll.bind(this.fieldRegistry);\n}\n","import type { FormBuilderRef, TFormBuilder } from \"../shared/types/common\";\nimport { forwardRef, useEffect, useMemo } from \"react\";\nimport { FormStoreProvider } from \"@/shared/model/store\";\nimport { Form } from \"@/widgets/form/form\";\nimport { PluginManager } from '@/shared/model/plugins/PluginManager';\nimport { PluginSystemContext } from '@/shared/model/plugins/context';\nimport { createValidationPlugin } from '@/plugins/validation';\n\nexport const FormBuilder = forwardRef<FormBuilderRef, TFormBuilder>((props, ref) => {\n const { formData, ...innerProps } = props;\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const pluginManager = useMemo(() => {\n const pm = new PluginManager([createValidationPlugin(props.validator), ...(props.plugins ?? [])]);\n pm.install();\n return pm;\n }, []);\n\n useEffect(() => {\n // Re-install after Strict Mode's simulated unmount clears subscriptions\n pluginManager.install();\n return () => pluginManager.uninstall();\n }, [pluginManager]);\n\n return (\n <PluginSystemContext.Provider value={pluginManager}>\n <FormStoreProvider formData={formData}>\n <Form {...innerProps} ref={ref} />\n </FormStoreProvider>\n </PluginSystemContext.Provider>\n );\n});\n\nexport default FormBuilder;\n","import { z } from 'zod';\n\nconst fieldShema = z.object({\n name: z.string(),\n label: z.string().optional(),\n type: z.string(),\n});\n\ntype TField = z.infer<typeof fieldShema>;\n\nexport type { TField };\nexport { fieldShema };\n","import { createValidationPlugin } from './plugins/validation';\nimport { createVisibilityPlugin } from './plugins/visibility';\nimport { FormGroup, TextField } from \"./entity/inputs\";\n\nexport type { FormFieldConfig, FormElementProps, FormElementRegistry, FormBuilderRef } from \"./shared/types/common.ts\";\nexport type { IPlugin, IPluginContext } from './shared/model/plugins/types';\nexport type { TValidator, IUserRule } from './plugins/validation';\n\nexport { FormBuilder } from \"@/app\";\nexport { fieldShema } from './shared/model';\n\nexport const plugins = {\n createValidationPlugin,\n createVisibilityPlugin\n };\n\nexport const inputs = {\n FormGroup,\n TextField\n};\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -10,18 +10,80 @@ declare const fieldShema: z.ZodObject<{
10
10
  }, z.core.$strip>;
11
11
  type TField = z.infer<typeof fieldShema>;
12
12
  //#endregion
13
- //#region src/plugins/validation/types/index.d.ts
14
- interface IUserRule {
15
- code: string;
16
- fn: (value: any, data: FormData, args: string[]) => boolean;
17
- message: string;
13
+ //#region src/shared/model/plugins/types.d.ts
14
+ type FormHookName = 'form:init' | 'form:destroy' | 'form:reset' | 'form:submit:before' | 'form:submit:after' | 'field:register' | 'field:change' | 'field:validate';
15
+ type HookHandler<T = unknown> = (data: T) => void | Promise<void>;
16
+ interface IEventRegistry {
17
+ tap<T>(hook: FormHookName, handler: HookHandler<T>): () => void;
18
18
  }
19
- //#endregion
20
- //#region src/plugins/validation/provider.d.ts
21
- type TValidator = {
22
- rules?: IUserRule[];
23
- onSubmit?: boolean;
19
+ type AsyncPipelineName = 'field:change' | 'form:submit' | 'form:init' | 'form:validate';
20
+ type SyncPipelineName = 'field:visible';
21
+ type AsyncPipelineDataMap = {
22
+ 'field:change': {
23
+ value: any;
24
+ field: FormFieldConfig;
25
+ path: string;
26
+ formData: FormData;
27
+ errors: string[];
28
+ };
29
+ 'form:submit': {
30
+ formData: FormData;
31
+ };
32
+ 'form:init': {
33
+ formData: FormData;
34
+ };
35
+ 'form:validate': {
36
+ formData: FormData;
37
+ errors: Record<string, string[]>;
38
+ };
39
+ };
40
+ type SyncPipelineDataMap = {
41
+ 'field:visible': {
42
+ visible: boolean;
43
+ field: FormFieldConfig;
44
+ path: string;
45
+ formData: FormData;
46
+ };
47
+ };
48
+ type PipelineStage<T> = (data: T, next: (data: T) => Promise<T>) => Promise<T>;
49
+ type SyncPipelineStage<T> = (data: T, next: (data: T) => T) => T;
50
+ interface IPipelineRegistry {
51
+ use<K extends AsyncPipelineName>(pipeline: K, stage: PipelineStage<AsyncPipelineDataMap[K]>, priority?: number): () => void;
52
+ useSync<K extends SyncPipelineName>(pipeline: K, stage: SyncPipelineStage<SyncPipelineDataMap[K]>, priority?: number): () => void;
53
+ }
54
+ interface IEventBus {
55
+ on<T = unknown>(event: string, handler: (data: T) => void): () => void;
56
+ emit<T = unknown>(event: string, data: T): void;
57
+ }
58
+ type FormValues = Record<string, unknown>;
59
+ type FormAction = {
60
+ type: string;
61
+ payload?: unknown;
62
+ };
63
+ type FormState = {
64
+ formData: FormValues;
65
+ errors: Record<string, string[]>;
24
66
  };
67
+ type StoreMiddleware = (action: FormAction, next: (action: FormAction) => void, getState: () => FormState) => void;
68
+ interface IMiddlewareRegistry {
69
+ use(middleware: StoreMiddleware): () => void;
70
+ }
71
+ interface IFieldRegistry {
72
+ register(type: string, component: FormElementComponent<any>): () => void;
73
+ }
74
+ interface IPluginContext {
75
+ events: IEventRegistry;
76
+ pipeline: IPipelineRegistry;
77
+ eventBus: IEventBus;
78
+ fields: IFieldRegistry;
79
+ middleware: IMiddlewareRegistry;
80
+ }
81
+ interface IPlugin {
82
+ name: string;
83
+ version?: string;
84
+ install(context: IPluginContext): void;
85
+ uninstall?(): void;
86
+ }
25
87
  //#endregion
26
88
  //#region src/shared/types/common.d.ts
27
89
  type ConfigFunctionComponent<P> = FC<P> & {
@@ -32,11 +94,7 @@ type RC<T = {}> = ConfigFunctionComponent<T & {
32
94
  children?: ReactNode;
33
95
  }>;
34
96
  type FormData = Record<string, any>;
35
- type FormFieldBase = {
36
- validation?: string[];
37
- viewConfig?: TGroupRules;
38
- } & TField;
39
- type FormFieldConfig = FormFieldBase & Record<string, any>;
97
+ type FormFieldConfig = TField & Record<string, any>;
40
98
  type FormElementProps<F extends FormFieldConfig = FormFieldConfig> = {
41
99
  field: F;
42
100
  path: string;
@@ -51,38 +109,52 @@ type TFormBuilder = {
51
109
  className?: string;
52
110
  layout: FormFieldConfig[];
53
111
  fields: FormElementRegistry;
54
- validator?: TValidator;
112
+ plugins?: IPlugin[];
55
113
  onChange?: (formData: any) => void;
56
114
  onSubmit?: (formData: any) => void;
57
115
  children?: ReactNode;
58
116
  };
59
- type TCommonRule = {
60
- operator: string;
61
- field: string;
62
- value: any;
63
- };
64
- type TGroupRules = {
65
- logic: 'and' | 'or';
66
- rules: (TGroupRules | TCommonRule)[];
67
- };
68
117
  type FormBuilderRef = {
69
118
  reset: () => void;
70
- submit: () => void;
119
+ submit: () => Promise<void>;
71
120
  errors: () => Record<string, any>;
72
121
  };
73
122
  //#endregion
74
- //#region src/app/index.d.ts
75
- declare const FormBuilder: react.ForwardRefExoticComponent<TFormBuilder & react.RefAttributes<FormBuilderRef>>;
76
- //#endregion
77
- //#region src/entity/inputs/ui/input/index.d.ts
78
- declare const TextField: RC<FormElementProps>;
79
- //#endregion
80
123
  //#region src/entity/inputs/ui/group/index.d.ts
81
- type FormGroupConfig = FormFieldBase & {
124
+ type FormGroupConfig = TField & {
82
125
  variant?: 'row' | 'col';
83
126
  fields: FormFieldConfig[];
84
127
  };
85
- declare const FormGroup: RC<FormElementProps<FormGroupConfig>>;
86
128
  //#endregion
87
- export { FormBuilder, type FormBuilderRef, type FormElementProps, type FormElementRegistry, type FormFieldConfig, FormGroup, type TGroupRules, TextField, fieldShema };
129
+ //#region src/plugins/validation/types/index.d.ts
130
+ interface IUserRule {
131
+ code: string;
132
+ fn: (value: any, data: FormData, args: string[]) => boolean;
133
+ message: string;
134
+ }
135
+ //#endregion
136
+ //#region src/plugins/validation/index.d.ts
137
+ type TValidator = {
138
+ rules?: IUserRule[];
139
+ onSubmit?: boolean;
140
+ };
141
+ declare function createValidationPlugin(config?: TValidator): IPlugin;
142
+ //#endregion
143
+ //#region src/plugins/visibility/index.d.ts
144
+ declare function createVisibilityPlugin(): IPlugin;
145
+ //#endregion
146
+ //#region src/app/index.d.ts
147
+ declare const FormBuilder: react.ForwardRefExoticComponent<TFormBuilder & react.RefAttributes<FormBuilderRef>>;
148
+ //#endregion
149
+ //#region src/index.d.ts
150
+ declare const plugins: {
151
+ createValidationPlugin: typeof createValidationPlugin;
152
+ createVisibilityPlugin: typeof createVisibilityPlugin;
153
+ };
154
+ declare const inputs: {
155
+ FormGroup: RC<FormElementProps<FormGroupConfig>>;
156
+ TextField: RC<FormElementProps>;
157
+ };
158
+ //#endregion
159
+ export { FormBuilder, type FormBuilderRef, type FormElementProps, type FormElementRegistry, type FormFieldConfig, type IPlugin, type IPluginContext, type IUserRule, type TValidator, fieldShema, inputs, plugins };
88
160
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -10,18 +10,80 @@ declare const fieldShema: z.ZodObject<{
10
10
  }, z.core.$strip>;
11
11
  type TField = z.infer<typeof fieldShema>;
12
12
  //#endregion
13
- //#region src/plugins/validation/types/index.d.ts
14
- interface IUserRule {
15
- code: string;
16
- fn: (value: any, data: FormData, args: string[]) => boolean;
17
- message: string;
13
+ //#region src/shared/model/plugins/types.d.ts
14
+ type FormHookName = 'form:init' | 'form:destroy' | 'form:reset' | 'form:submit:before' | 'form:submit:after' | 'field:register' | 'field:change' | 'field:validate';
15
+ type HookHandler<T = unknown> = (data: T) => void | Promise<void>;
16
+ interface IEventRegistry {
17
+ tap<T>(hook: FormHookName, handler: HookHandler<T>): () => void;
18
18
  }
19
- //#endregion
20
- //#region src/plugins/validation/provider.d.ts
21
- type TValidator = {
22
- rules?: IUserRule[];
23
- onSubmit?: boolean;
19
+ type AsyncPipelineName = 'field:change' | 'form:submit' | 'form:init' | 'form:validate';
20
+ type SyncPipelineName = 'field:visible';
21
+ type AsyncPipelineDataMap = {
22
+ 'field:change': {
23
+ value: any;
24
+ field: FormFieldConfig;
25
+ path: string;
26
+ formData: FormData;
27
+ errors: string[];
28
+ };
29
+ 'form:submit': {
30
+ formData: FormData;
31
+ };
32
+ 'form:init': {
33
+ formData: FormData;
34
+ };
35
+ 'form:validate': {
36
+ formData: FormData;
37
+ errors: Record<string, string[]>;
38
+ };
39
+ };
40
+ type SyncPipelineDataMap = {
41
+ 'field:visible': {
42
+ visible: boolean;
43
+ field: FormFieldConfig;
44
+ path: string;
45
+ formData: FormData;
46
+ };
47
+ };
48
+ type PipelineStage<T> = (data: T, next: (data: T) => Promise<T>) => Promise<T>;
49
+ type SyncPipelineStage<T> = (data: T, next: (data: T) => T) => T;
50
+ interface IPipelineRegistry {
51
+ use<K extends AsyncPipelineName>(pipeline: K, stage: PipelineStage<AsyncPipelineDataMap[K]>, priority?: number): () => void;
52
+ useSync<K extends SyncPipelineName>(pipeline: K, stage: SyncPipelineStage<SyncPipelineDataMap[K]>, priority?: number): () => void;
53
+ }
54
+ interface IEventBus {
55
+ on<T = unknown>(event: string, handler: (data: T) => void): () => void;
56
+ emit<T = unknown>(event: string, data: T): void;
57
+ }
58
+ type FormValues = Record<string, unknown>;
59
+ type FormAction = {
60
+ type: string;
61
+ payload?: unknown;
62
+ };
63
+ type FormState = {
64
+ formData: FormValues;
65
+ errors: Record<string, string[]>;
24
66
  };
67
+ type StoreMiddleware = (action: FormAction, next: (action: FormAction) => void, getState: () => FormState) => void;
68
+ interface IMiddlewareRegistry {
69
+ use(middleware: StoreMiddleware): () => void;
70
+ }
71
+ interface IFieldRegistry {
72
+ register(type: string, component: FormElementComponent<any>): () => void;
73
+ }
74
+ interface IPluginContext {
75
+ events: IEventRegistry;
76
+ pipeline: IPipelineRegistry;
77
+ eventBus: IEventBus;
78
+ fields: IFieldRegistry;
79
+ middleware: IMiddlewareRegistry;
80
+ }
81
+ interface IPlugin {
82
+ name: string;
83
+ version?: string;
84
+ install(context: IPluginContext): void;
85
+ uninstall?(): void;
86
+ }
25
87
  //#endregion
26
88
  //#region src/shared/types/common.d.ts
27
89
  type ConfigFunctionComponent<P> = FC<P> & {
@@ -32,11 +94,7 @@ type RC<T = {}> = ConfigFunctionComponent<T & {
32
94
  children?: ReactNode;
33
95
  }>;
34
96
  type FormData = Record<string, any>;
35
- type FormFieldBase = {
36
- validation?: string[];
37
- viewConfig?: TGroupRules;
38
- } & TField;
39
- type FormFieldConfig = FormFieldBase & Record<string, any>;
97
+ type FormFieldConfig = TField & Record<string, any>;
40
98
  type FormElementProps<F extends FormFieldConfig = FormFieldConfig> = {
41
99
  field: F;
42
100
  path: string;
@@ -51,38 +109,52 @@ type TFormBuilder = {
51
109
  className?: string;
52
110
  layout: FormFieldConfig[];
53
111
  fields: FormElementRegistry;
54
- validator?: TValidator;
112
+ plugins?: IPlugin[];
55
113
  onChange?: (formData: any) => void;
56
114
  onSubmit?: (formData: any) => void;
57
115
  children?: ReactNode;
58
116
  };
59
- type TCommonRule = {
60
- operator: string;
61
- field: string;
62
- value: any;
63
- };
64
- type TGroupRules = {
65
- logic: 'and' | 'or';
66
- rules: (TGroupRules | TCommonRule)[];
67
- };
68
117
  type FormBuilderRef = {
69
118
  reset: () => void;
70
- submit: () => void;
119
+ submit: () => Promise<void>;
71
120
  errors: () => Record<string, any>;
72
121
  };
73
122
  //#endregion
74
- //#region src/app/index.d.ts
75
- declare const FormBuilder: react.ForwardRefExoticComponent<TFormBuilder & react.RefAttributes<FormBuilderRef>>;
76
- //#endregion
77
- //#region src/entity/inputs/ui/input/index.d.ts
78
- declare const TextField: RC<FormElementProps>;
79
- //#endregion
80
123
  //#region src/entity/inputs/ui/group/index.d.ts
81
- type FormGroupConfig = FormFieldBase & {
124
+ type FormGroupConfig = TField & {
82
125
  variant?: 'row' | 'col';
83
126
  fields: FormFieldConfig[];
84
127
  };
85
- declare const FormGroup: RC<FormElementProps<FormGroupConfig>>;
86
128
  //#endregion
87
- export { FormBuilder, type FormBuilderRef, type FormElementProps, type FormElementRegistry, type FormFieldConfig, FormGroup, type TGroupRules, TextField, fieldShema };
129
+ //#region src/plugins/validation/types/index.d.ts
130
+ interface IUserRule {
131
+ code: string;
132
+ fn: (value: any, data: FormData, args: string[]) => boolean;
133
+ message: string;
134
+ }
135
+ //#endregion
136
+ //#region src/plugins/validation/index.d.ts
137
+ type TValidator = {
138
+ rules?: IUserRule[];
139
+ onSubmit?: boolean;
140
+ };
141
+ declare function createValidationPlugin(config?: TValidator): IPlugin;
142
+ //#endregion
143
+ //#region src/plugins/visibility/index.d.ts
144
+ declare function createVisibilityPlugin(): IPlugin;
145
+ //#endregion
146
+ //#region src/app/index.d.ts
147
+ declare const FormBuilder: react.ForwardRefExoticComponent<TFormBuilder & react.RefAttributes<FormBuilderRef>>;
148
+ //#endregion
149
+ //#region src/index.d.ts
150
+ declare const plugins: {
151
+ createValidationPlugin: typeof createValidationPlugin;
152
+ createVisibilityPlugin: typeof createVisibilityPlugin;
153
+ };
154
+ declare const inputs: {
155
+ FormGroup: RC<FormElementProps<FormGroupConfig>>;
156
+ TextField: RC<FormElementProps>;
157
+ };
158
+ //#endregion
159
+ export { FormBuilder, type FormBuilderRef, type FormElementProps, type FormElementRegistry, type FormFieldConfig, type IPlugin, type IPluginContext, type IUserRule, type TValidator, fieldShema, inputs, plugins };
88
160
  //# sourceMappingURL=index.d.mts.map