@idem.agency/form-builder 0.0.15 → 0.0.17

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/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, 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","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, 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","'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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"}
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
@@ -120,6 +120,12 @@ type FormBuilderRef = {
120
120
  errors: () => Record<string, any>;
121
121
  };
122
122
  //#endregion
123
+ //#region src/entity/inputs/ui/group/index.d.ts
124
+ type FormGroupConfig = TField & {
125
+ variant?: 'row' | 'col';
126
+ fields: FormFieldConfig[];
127
+ };
128
+ //#endregion
123
129
  //#region src/plugins/validation/types/index.d.ts
124
130
  interface IUserRule {
125
131
  code: string;
@@ -146,7 +152,7 @@ declare const plugins: {
146
152
  createVisibilityPlugin: typeof createVisibilityPlugin;
147
153
  };
148
154
  declare const inputs: {
149
- FormGroup: RC<FormElementProps<any>>;
155
+ FormGroup: RC<FormElementProps<FormGroupConfig>>;
150
156
  TextField: RC<FormElementProps>;
151
157
  };
152
158
  //#endregion
package/dist/index.d.mts CHANGED
@@ -120,6 +120,12 @@ type FormBuilderRef = {
120
120
  errors: () => Record<string, any>;
121
121
  };
122
122
  //#endregion
123
+ //#region src/entity/inputs/ui/group/index.d.ts
124
+ type FormGroupConfig = TField & {
125
+ variant?: 'row' | 'col';
126
+ fields: FormFieldConfig[];
127
+ };
128
+ //#endregion
123
129
  //#region src/plugins/validation/types/index.d.ts
124
130
  interface IUserRule {
125
131
  code: string;
@@ -146,7 +152,7 @@ declare const plugins: {
146
152
  createVisibilityPlugin: typeof createVisibilityPlugin;
147
153
  };
148
154
  declare const inputs: {
149
- FormGroup: RC<FormElementProps<any>>;
155
+ FormGroup: RC<FormElementProps<FormGroupConfig>>;
150
156
  TextField: RC<FormElementProps>;
151
157
  };
152
158
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["base"],"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, 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","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, 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","'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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"}
1
+ {"version":3,"file":"index.mjs","names":["base"],"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":";;;;;;AAAA,SAAgB,kBAAkB,KAAU,MAAc,OAAiB;AACzE,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,cAAc,KAAK,KAAK,MAAM,IAAI,EAAE,MAAM;;AAGnD,SAAS,cAAc,KAAU,MAAgB,OAAiB;AAChE,KAAI,KAAK,WAAW,EAAG,QAAO;CAE9B,MAAM,SAAS,MAAM,QAAQ,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK;CACzD,MAAM,aAAa,KAAK;AAExB,KAAI,eAAe,eAAe,eAAe,iBAAiB,eAAe,YAC/E,OAAM,IAAI,MAAM,uBAAuB,aAAa;AAGtD,KAAI,KAAK,WAAW,EAClB,QAAO,cAAc;MAChB;EACL,MAAM,gBAAgB,KAAK,MAAM,EAAE;EACnC,MAAM,YAAY,OAAO;AAEzB,MAAI,OAAO,cAAc,eAAe,cAAc,KACpD,QAAO,cAAc,OAAO,cAAc,OAAO,WAAW,EAAE,GAAG,EAAE;AAErE,SAAO,cAAc,cAAc,OAAO,aAAa,eAAe,MAAM;;AAE9E,QAAO;;AAGT,SAAgB,eAAe,KAAU,MAAmB;AAC1D,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,KAAK,MAAM,IAAI,CAAC,QACpB,KAAK,QAAS,OAAO,IAAI,SAAS,SAAY,IAAI,OAAO,QAC1D,IACD;;;;;AC/BH,MAAa,UAAqB;CAChC,MAAM;CACN,KAAK,OAAO,MAAM,SAAS;EACzB,MAAM,OAAO,KAAK,MAAM;AACxB,SAAO,OAAO,SAAS,eAAe,MAAM,KAAK,GAAG;;CAEtD,SAAS;CACV;;;;ACRD,MAAa,WAAsB;CACjC,MAAM;CACN,KAAK,UAAU;AACb,SAAO,UAAU,UAAa,UAAU,QAAQ,MAAM,SAAS;;CAEjE,SAAS;CACV;;;;ACND,MAAM,aAAa;AACnB,MAAa,QAAmB;CAC9B,MAAM;CACN,KAAK,UAAU;AACb,SAAO,WAAW,KAAK,MAAM;;CAE/B,SAAS;CACV;;;;ACLD,oBAAe;CAAC;CAAS;CAAU;CAAM;;;;ACCzC,IAAa,aAAb,MAAwB;CACtB,AAAiB,WAAwB,EAAE;CAC3C,AAAQ,iBAA2C,EAAE;CACrD,YAAY,AAAgB,UAAmB,QAAqB,EAAE,EAAE;EAA5C;AAC1B,OAAK,WAAW,CAAC,GAAG,OAAO,GAAGA,cAAK;;CAIrC,AAAQ,aAAa,MAAc,MAAe,UAAiC;EACjF,MAAM,CAAC,MAAM,WAAW,KAAK,MAAM,IAAI;EACvC,MAAM,OAAO,UAAU,QAAQ,MAAM,IAAI,GAAG,EAAE;EAC9C,MAAM,WAAW,KAAK,SAAS,MAAK,MAAK,EAAE,QAAQ,KAAK;AACxD,MAAI,CAAC,SACH,QAAO;AAGT,SAAO,CADgB,SAAS,GAAG,MAAM,UAAU,KAAK,GAC/B,KAAK,mBAAmB,SAAS,SAAS,KAAK,GAAG;;CAG7E,AAAQ,mBAAmB,SAAiB,OAAiB,EAAE,EAAU;EACvE,MAAM,cAAc,KAAK,QAAgC,KAAK,KAAK,UAAU;AAC3E,OAAI,UAAU,MAAM,MAAM;AAC1B,UAAO;KACN,EAAE,CAAC;AAEN,SAAO,QAAQ,QAAQ,kBAAiB,MAAK,YAAY,GAAG;;CAG9D,AAAO,cAAc,MAAc,YAA4B;AAC7D,OAAK,eAAe,QAAQ;;CAG9B,AAAQ,UAAU,OAAiB,MAAe,UAA8B;AAC9E,SAAO,MAAM,KAAK,SAAS;AACzB,UAAO,KAAK,aAAa,MAAM,MAAM,SAAS;IAC9C,CAAC,QAAO,MAAK,MAAM,KAAK;;CAE5B,SAAS,OAAiB,MAAe,UAA8B;AACrE,SAAO,CAAC,KAAK,WAAW,KAAK,UAAU,OAAO,MAAM,SAAS,GAAG,EAAE;;CAGpE,AAAO,YAAY,UAA8C;AAC/D,SAAO,OAAO,QAAQ,KAAK,eAAe,CAAC,QAAkC,KAAK,CAAC,MAAM,WAAW;GAClG,MAAM,QAAQ,eAAe,UAAU,KAAK;GAC5C,MAAM,oBAAoB,KAAK,UAAU,OAAO,OAAO,SAAS;AAChE,OAAI,kBAAkB,OACpB,KAAI,QAAQ;AAEd,UAAO;KACL,EAAE,CAAC;;;;;;AC7CX,SAAgB,uBAAuB,QAA8B;CACnE,MAAM,SAAS,IAAI,WACjB,QAAQ,YAAY,OACpB,QAAQ,SAAS,EAAE,CACpB;AAED,QAAO;EACL,MAAM;EACN,QAAQ,KAAqB;AAC3B,OAAI,OAAO,IACT,mBACC,EAAE,MAAM,YAAY;AACnB,WAAO,cAAc,MAAM,MAAM,cAAc,EAAE,CAAC;KAErD;AAED,OAAI,SAAS,IAAI,iBAAiB,MAAM,SAAS;IAC/C,MAAM,SAAS,OAAO,SAAS,KAAK,MAAM,cAAc,EAAE,EAAE,KAAK,OAAO,KAAK,SAAS;AACtF,WAAO,KAAK;KAAE,GAAG;KAAM;KAAQ,CAAC;KAChC;AAEF,OAAI,SAAS,IAAI,kBAAkB,MAAM,SAAS;IAChD,MAAM,SAAS,OAAO,YAAY,KAAK,SAAS;AAChD,WAAO,KAAK;KAAE,GAAG;KAAM;KAAQ,CAAC;KAChC;;EAEL;;;;;AChCH,IAAa,iBAAb,MAAa,eAAe;CAC1B,AAAQ,iBAA8C,EAAE;CAExD,cAAc,MAAc,MAAyB;AACnD,OAAK,eAAe,QAAQ;;CAG9B,OAAe,YAAY,GAAgD;AACzE,SAAO,WAAW;;CAGpB,OAAe,aAAa,GAA+B;AACzD,SAAO,EAAE,YAAY;;CAGvB,OAAe,eAAe,GAAkC;AAC9D,SAAO,EAAE,YAAY;;CAGvB,OAAO,WAAW,WAAwB,UAA6B;EACrE,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAmB,EAAE;AAC3B,YAAU,MAAM,SAAS,SAAoC;AAC3D,OAAI,KAAK,YAAY,KAAK,CACxB,OAAM,KAAK,KAAK,WAAW,MAAM,SAAS,CAAC;QACtC;IACL,MAAM,QAAQ,eAAe,UAAU,KAAK,MAAM;AAClD,QAAI,KAAK,aAAa,KAAK,CACzB,OAAM,KAAK,KAAK,MAAM,QAAQ,MAAM,KAAK,GAAG;aACnC,KAAK,eAAe,KAAK,CAClC,OAAM,KAAK,KAAK,SAAS,MAAM;;IAGnC;AACF,MAAI,SAAS,KACX,QAAO,MAAM,QAAQ,KAAK,IAAI;MAE9B,QAAO,MAAM,QAAQ,MAAM,IAAI;;CAInC,OAAO,MAAc,MAAyB;EAC5C,MAAM,OAAO,KAAK,YAAY,KAAK;AACnC,MAAI,CAAC,KAAK,YAAY,KAAK,CACzB,QAAO;AAET,SAAO,eAAe,WAAW,MAAM,KAAK;;CAG9C,AAAQ,YAAY,MAAc;AAChC,SAAO,KAAK,eAAe;;;;;;ACjD/B,SAAgB,yBAAkC;CAChD,MAAM,SAAS,IAAI,gBAAgB;AACnC,QAAO;EACL,MAAM;EACN,QAAQ,KAAqB;AAC3B,OAAI,OAAO,IACT,mBACC,EAAE,MAAM,YAAY;AACnB,QAAI,MAAM,WACR,QAAO,cAAc,MAAM,MAAM,WAAW;KAGjD;AAED,OAAI,SAAS,QAAQ,kBAAkB,MAAM,SAAS;IACpD,MAAM,UAAU,OAAO,OAAO,KAAK,MAAM,KAAK,SAAS;AACvD,WAAO,KAAK;KAAE,GAAG;KAAM;KAAQ,CAAC;KAChC;;EAEL;;;;;ACjBH,SAAS,kBAAkB,OAAkD;AAC3E,QAAO,MAAM,SAAS,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS;;AAG3E,MAAa,aAAmC,EAAE,OAAO,OAAO,QAAQ,eAAe;AACrF,KAAI,CAAC,kBAAkB,MAAM,EAAE;AAC7B,UAAQ,KAAK,wDAAwD,MAAM,OAAO;AAClF,SAAO;;CAET,MAAM,KAAK,OAAO;AAClB,QACE,qBAAC;EAAI,OAAO,EAAE,cAAc,QAAQ;;GAClC,qBAAC;IAAM,SAAS;eAAK,MAAM,OAAM;KAAS;GAC1C,oBAAC;IACC,MAAM,MAAM;IACR;IACJ,MAAM,MAAM;IACZ,aAAa,MAAM;IACnB,OAAO,SAAS;IAChB,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;IACzC,OAAO,EAAE,aAAa,SAAS,QAAQ,QAAQ;KAC/C;GACD,UAAU,oBAAC;IAAE,OAAO;KAAE,OAAO;KAAO,UAAU;KAAS;cAAG,OAAO,OAAO,OAAO,CAAC,KAAK,KAAK;KAAK;;GAC5F;;;;;AC3BV,SAAgB,YACd,SACA,cACA;CACA,IAAI,QAAQ;CACZ,MAAM,4BAAY,IAAI,KAAiB;AAEvC,QAAO;EACL,WAAc;AACZ,UAAO;;EAGT,SAAS,QAAW;AAClB,WAAQ,QAAQ,OAAO,OAAO;AAC9B,aAAU,SAAQ,MAAK,GAAG,CAAC;;EAG7B,UAAU,UAAsB;AAC9B,aAAU,IAAI,SAAS;AACvB,gBAAa;AAAE,cAAU,OAAO,SAAS;;;EAG3C,kBAAqB,UAA2B,UAA8B;GAC5E,IAAI,OAAO,SAAS,MAAM;AAC1B,UAAO,KAAK,gBAAgB;IAC1B,MAAM,OAAO,SAAS,MAAM;AAC5B,QAAI,SAAS,MAAM;AACjB,YAAO;AACP,cAAS,KAAK;;KAEhB;;EAEL;;;;;ACzBH,SAAgB,mBACd,SACA,cACA;CACA,MAAM,eAAe,cAAkC,KAAK;CAC5D,MAAM,YAAuE,EAChB,UACA,mBACI;EAC/D,MAAM,WAAW,OAAoB,YAAY,SAAS,gBAAgB,aAAa,CAAC;AAExF,SACE,oBAAC,aAAa;GAAS,OAAO,SAAS;GACpC;IACqB;;CAI5B,SAAS,SACP,UACG;EACH,MAAM,QAAQ,WAAW,aAAa;AAEtC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAO,qBACL,MAAM,iBACA,SAAS,MAAM,UAAU,CAAC,QAC1B,SAAS,MAAM,UAAU,CAAC,CACjC;;CAGH,SAAS,cAAc;EACrB,MAAM,QAAQ,WAAW,aAAa;AAEtC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAO,MAAM;;CAGf,SAAS,mBAAgC;EACvC,MAAM,QAAQ,WAAW,aAAa;AAEtC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAO;;AAGT,QAAO;EACL;EACA;EACA;EACA;EACD;;;;;ACjEH,MAAa,sBAAsB,cAAoC,KAAK;AAE5E,SAAgB,mBAAkC;CAChD,MAAM,MAAM,WAAW,oBAAoB;AAC3C,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gCAAgC;AAC1D,QAAO;;;;;ACWT,SAAS,QAAQ,OAAc,QAAuB;CACpD,MAAM,UAAU,EAAE,GAAG,OAAO;AAC5B,SAAQ,OAAO,MAAf;EACE,KAAK;AACH,WAAQ,WAAW,kBAAkB,QAAQ,UAAU,OAAO,MAAM,OAAO,MAAM;AACjF;EACF,KAAK;AACH,WAAQ,WAAW,kBAAkB,QAAQ,UAAU,OAAO,MAAM,OAAO,MAAM;AACjF,WAAQ,SAAS,kBAAkB,QAAQ,QAAQ,OAAO,MAAM,QAAQ,QAAQ,SAAS,OAAO,SAAS,KAAK;AAC9G;EACF,KAAK;AACH,WAAQ,SAAS,kBAAkB,QAAQ,QAAQ,OAAO,MAAM,OAAO,MAAM;AAC7E;EACF,KAAK;AACH,WAAQ,WAAW,EAAE;AACrB,WAAQ,SAAS,EAAE;AACnB;EACF,KAAK;AACH,WAAQ,SAAS,EAAE,GAAG,OAAO,QAAQ;AACrC;;AAEJ,QAAO;;AAGT,SAAS,kBACP,aACA,cACA,UAC0B;AAC1B,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAO,YAAY,aAChB,MAAM,OAAO,WACZ,EACE,QACA,MACA,SACD,EACH,aACD;;AAGH,MAAM,EACJ,UACA,UAAU,cACV,aAAa,iBACb,kBAAkB,yBAChB,mBAAmB,SAAS;CAAE,UAAU,EAAE;CAAE,QAAQ,EAAE;CAAE,CAAC;AAE7D,MAAM,kBAAkB,cAAiD,KAAK;AAE9E,MAAM,oBAAuD,EAAE,eAAe;CAC5E,MAAM,gBAAgB,WAAW,oBAAoB;CACrD,MAAM,QAAQ,sBAAsB;CACpC,MAAM,cAAc,iBAAiB;CACrC,MAAM,cAAc,gBAAgB,cAAc,eAAe,GAAG,EAAE;CAEtE,MAAM,WAAW,cACT,kBAAkB,aAAa,aAAa,MAAM,SAAwB,EAChF,EAAE,CACH;AAED,QAAO,oBAAC,gBAAgB;EAAS,OAAO;EAAW;GAAoC;;AAGzF,MAAM,qBAA6E,EAAE,UAAU,eAC7F,oBAAC;CAAS,cAAc;EAAE,UAAU,YAAY,EAAE;EAAE,QAAQ,EAAE;EAAE;WAC9D,oBAAC,oBAAkB,WAA4B;EACtC;AAGb,SAAS,kBAA4C;CACnD,MAAM,MAAM,WAAW,gBAAgB;AACvC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,4BAA4B;AACtD,QAAO;;;;;ACzFT,SAAgB,gBAAgB;AAE9B,QADW,kBAAkB,CACnB;;AAGZ,SAAgB,iBAAiB;AAE/B,QADW,kBAAkB,CACnB;;AAGZ,SAAgB,qBAAqB;AAEnC,QADW,kBAAkB,CACnB;;;;;ACHZ,MAAa,yBAAyB,UAA+B;CACnE,MAAM,UAAU,MAAM;CACtB,MAAM,QAAQ,MAAM;CACpB,MAAM,mBAAmB,MAAM,OAAO,GAAG,MAAM,KAAK,GAAG,MAAM,SAAS,MAAM;CAC5E,MAAM,QAAQ,cAAc,MAAM,eAAe,EAAE,UAAU,iBAAiB,CAAC;CAC/E,MAAM,SAAS,cAAc,MAAM,EAAE,OAAO,kBAAkB;CAC9D,MAAM,WAAW,iBAAiB;CAClC,MAAM,QAAQ,sBAAsB;CACpC,MAAM,aAAa,eAAe;CAClC,MAAM,cAAc,gBAAgB;CACpC,MAAM,kBAAkB,oBAAoB;AAE5C,iBAAgB;AACd,aAAW,kBAAkB;GAAE,MAAM;GAAkB;GAAO,CAAC;IAC9D,CAAC,iBAAiB,CAAC;AAWtB,KAAI,CATY,cAAc,MAC5B,gBAAgB,iBAAiB;EAC/B,SAAS;EACT;EACA,MAAM;EACN,UAAU,EAAE;EACb,CAAC,CAAC,QACJ,CAEa,QAAO;AAErB,QACE,oBAAC;EACC,OAAO,EAAE,GAAG,OAAO;EACnB,MAAM;EACC;EACC;EACR,UAAU,OAAO,UAAe;GAC9B,MAAM,OAAO,MAAM,UAAU,CAAC;GAC9B,MAAM,EAAE,OAAO,YAAY,WAAW,MAAM,YAAY,gBAAgB;IACtE;IACA;IACA,MAAM;IACN,UAAU;IACV,QAAQ,EAAE;IACX,CAAC;AACF,YAAS;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP;IACD,CAAC;AACF,SAAM,WAAW,gBAAgB;IAC/B,OAAO;IACP,WAAW;IACX;IACA,MAAM;IACN,UAAU,MAAM,UAAU,CAAC;IAC5B,CAAC;;GAEJ;;;;;AC/DN,SAAgB,uBAAuB;CACrC,MAAM,iBAAiB,cAGb,KAAK;CAEf,MAAM,YAAkF,EACd,QACA,eACI;EAC5E,MAAM,UAAU,aAAyB,QAAQ,MAAM,aAAa;AAClE,UAAO,oBAAC;IAAuB;IAAc;IAAO;KAA0B;KAC7E,CAAC,OAAO,CAAC;AAEZ,SACE,oBAAC,eAAe;GAAS,OAAO;IAAC;IAAS;IAAO;GAC9C;IACuB;;CAI9B,SAAS,aAAyB;EAChC,MAAM,QAAQ,WAAW,eAAe;AAExC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAO,MAAM;;CAGf,SAAS,YAAiC;EACxC,MAAM,QAAQ,WAAW,eAAe;AAExC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAO,MAAM;;AAGf,QAAO;EACL;EACA;EACA;EACD;;;;;AChDH,MAAa,EACX,UAAU,iBACV,YACA,cACE,sBAAsB;;;;ACF1B,MAAa,kBAAmC,UAAU;CACxD,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,SAAS,WAAW;AAE1B,QAAO,MAAM,OAAO,KAAK,OAAO,UAAU;EACxC,MAAM,cAAc,OAAO,MAAM;AAEjC,MAAI,CAAC,aAAa;AAChB,WAAQ,KAAK,yBAAyB,MAAM,KAAK,2BAA2B;AAC5E,UAAO;;AAGT,SAAO,oBAAC;GAAqD,SAAS;GAAmB;GAAa;KAAnE,GAAG,MAAM,KAAK,GAAG,QAA0D;GAC9G;;;;;ACXJ,SAAS,cAAc,OAAkD;AACvE,QAAO,MAAM,QAAQ,MAAM,OAAO;;AAIpC,MAAa,aAAoD,EAAC,OAAO,WAAU;AACjF,KAAI,CAAC,cAAc,MAAM,CACvB,QAAO;CAET,MAAM,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;CAGhD,MAAM,aAFU,MAAM,WAAW,UAEJ,QAAQ,aAAa;AAElD,QAAO,qBAAC,oBACN,oBAAC,mBAAK,MAAM,QAAY,EACxB,oBAAC;EAAI,WAAW,KAAK,WAAW,OAAO;YACpC;GACG,IACF;;;;;ACjBR,MAAa,OAAO,YAA0C,OAAO,QAAQ;CAC3E,MAAM,WAAW,iBAAiB;CAClC,MAAM,QAAQ,sBAAsB;CACpC,MAAM,aAAa,eAAe;CAClC,MAAM,cAAc,gBAAgB;AAEpC,iBAAgB;AACd,SAAO,MAAM,mBACV,MAAM,EAAE,WACR,aAAa,MAAM,WAAW,MAAM,WAAW,SAAS,GAAE,KAC5D;IACA,CAAC,MAAM,SAAS,CAAC;CAEpB,MAAM,YAAY,YAAY,YAAY;AACxC,MAAI,MAAM,UAAU;GAClB,MAAM,kBAAkB,MAAM,UAAU,CAAC;AACzC,SAAM,WAAW,sBAAsB,EAAE,UAAU,iBAAiB,CAAC;GACrE,MAAM,EAAE,UAAU,gBAAgB,MAAM,YAAY,eAAe,EAAE,UAAU,iBAAiB,CAAC;GACjG,MAAM,EAAE,WAAW,MAAM,YAAY,iBAAiB;IAAE,UAAU;IAAa,QAAQ,EAAE;IAAE,CAAC;AAE5F,OAAI,OAAO,KAAK,OAAO,CAAC,WAAW,EACjC,OAAM,SAAS,YAAY;OAE3B,UAAS;IAAE,MAAM;IAAa;IAAQ,CAAC;AAEzC,SAAM,WAAW,qBAAqB;IAAE,UAAU;IAAa;IAAQ,CAAC;;IAEzE;EAAC,MAAM;EAAU;EAAY;EAAa;EAAO;EAAS,CAAC;AAE9D,qBAAoB,YAAY;EAC9B,aAAa,SAAS,EAAE,MAAM,SAAS,CAAC;EACxC,cAAc,WAAW;EACzB,cAAc,MAAM,UAAU,CAAC;EAChC,GAAG;EAAC;EAAW;EAAU;EAAM,CAAC;AAEjC,QACE,qBAAC;EACC,UAAU,OAAO,MAAM;AACrB,KAAE,gBAAgB;AAClB,SAAM,WAAW;;EAEnB,WAAW,OAAO;;GAElB,oBAAC;IAAgB,QAAQ,MAAM;cAC7B,oBAAC,kBAAe,QAAQ,MAAM,SAAU;KACxB;GAClB,oBAAC;IAAM,MAAK;IAAS,OAAO,EAAE,SAAS,QAAQ;KAAI;GAClD,MAAM;;GACF;EAET;;;;ACxDF,IAAa,eAAb,MAAoD;CAClD,AAAQ,2BAAW,IAAI,KAAoC;CAE3D,IAAO,MAAoB,SAAqC;AAC9D,MAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAC1B,MAAK,SAAS,IAAI,sBAAM,IAAI,KAAK,CAAC;AAEpC,OAAK,SAAS,IAAI,KAAK,CAAE,IAAI,QAA4B;AACzD,eAAa;AACX,QAAK,SAAS,IAAI,KAAK,EAAE,OAAO,QAA4B;;;CAIhE,MAAM,KAAQ,MAAoB,MAAwB;EACxD,MAAM,MAAM,KAAK,SAAS,IAAI,KAAK;AACnC,MAAI,CAAC,IAAK;AACV,QAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC;;;;;;ACLnD,IAAa,mBAAb,MAA2D;CACzD,AAAQ,yBAAS,IAAI,KAAsC;CAC3D,AAAQ,6BAAa,IAAI,KAAqC;CAE9D,IACE,UACA,OACA,WAAW,IACC;AACZ,MAAI,CAAC,KAAK,OAAO,IAAI,SAAS,CAAE,MAAK,OAAO,IAAI,UAAU,EAAE,CAAC;EAC7D,MAAM,MAAM,KAAK,OAAO,IAAI,SAAS;EACrC,MAAM,QAAQ;GAAE;GAAO;GAAU;AACjC,MAAI,KAAK,MAAM;AACf,MAAI,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS;AAC3C,eAAa;GACX,MAAM,IAAI,IAAI,QAAQ,MAAM;AAC5B,OAAI,KAAK,EAAG,KAAI,OAAO,GAAG,EAAE;;;CAIhC,QACE,UACA,OACA,WAAW,IACC;AACZ,MAAI,CAAC,KAAK,WAAW,IAAI,SAAS,CAAE,MAAK,WAAW,IAAI,UAAU,EAAE,CAAC;EACrE,MAAM,MAAM,KAAK,WAAW,IAAI,SAAS;EACzC,MAAM,QAAQ;GAAE;GAAO;GAAU;AACjC,MAAI,KAAK,MAAM;AACf,MAAI,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS;AAC3C,eAAa;GACX,MAAM,IAAI,IAAI,QAAQ,MAAM;AAC5B,OAAI,KAAK,EAAG,KAAI,OAAO,GAAG,EAAE;;;CAIhC,MAAM,IACJ,MACA,aACkC;EAClC,MAAM,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,EAAE;EACvC,MAAM,WAAW,WAAmB,SAAoE;AACtG,OAAI,SAAS,IAAI,OAAQ,QAAO,QAAQ,QAAQ,KAAK;AACrD,UAAO,IAAI,OAAO,MAAM,MAAM,QAAQ,QAAQ,EAAE,CAAC;;AAEnD,SAAO,QAAQ,EAAE,CAAC,YAAY;;CAGhC,QACE,MACA,aACwB;EACxB,MAAM,MAAM,KAAK,WAAW,IAAI,KAAK,IAAI,EAAE;EAC3C,MAAM,WAAW,WAAmB,SAAyD;AAC3F,OAAI,SAAS,IAAI,OAAQ,QAAO;AAChC,UAAO,IAAI,OAAO,MAAM,MAAM,QAAQ,QAAQ,EAAE,CAAC;;AAEnD,SAAO,QAAQ,EAAE,CAAC,YAAY;;;;;;ACpElC,IAAa,WAAb,MAA2C;CACzC,AAAQ,4BAAY,IAAI,KAAuC;CAE/D,GAAgB,OAAe,SAAwC;AACrE,MAAI,CAAC,KAAK,UAAU,IAAI,MAAM,CAAE,MAAK,UAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AACpE,OAAK,UAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;AACvC,eAAa,KAAK,UAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;;CAGzD,KAAkB,OAAe,MAAe;AAC9C,OAAK,UAAU,IAAI,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,CAAC;;;;;;ACVtD,IAAa,qBAAb,MAA+D;CAC7D,AAAQ,cAAiC,EAAE;CAE3C,IAAI,YAAyC;AAC3C,OAAK,YAAY,KAAK,WAAW;AACjC,eAAa;GACX,MAAM,IAAI,KAAK,YAAY,QAAQ,WAAW;AAC9C,OAAI,KAAK,EAAG,MAAK,YAAY,OAAO,GAAG,EAAE;;;CAI7C,SAA4B;AAC1B,SAAO,CAAC,GAAG,KAAK,YAAY;;;;;;ACXhC,IAAa,gBAAb,MAAqD;CACnD,AAAQ,6BAAa,IAAI,KAAwC;CAEjE,SAAS,MAAc,WAAkD;AACvE,OAAK,WAAW,IAAI,MAAM,UAAU;AACpC,eAAa,KAAK,WAAW,OAAO,KAAK;;CAG3C,SAAoD;AAClD,SAAO,OAAO,YAAY,KAAK,WAAW;;;;;;ACL9C,IAAa,gBAAb,MAA2B;CACzB,AAAiB,gBAAgB,IAAI,cAAc;CACnD,AAAiB,mBAAmB,IAAI,kBAAkB;CAC1D,AAAiB,WAAW,IAAI,UAAU;CAC1C,AAAiB,qBAAqB,IAAI,oBAAoB;CAC9D,AAAiB,gBAAgB,IAAI,eAAe;CACpD,AAAQ,gBAAmC,EAAE;CAC7C,AAAQ,YAAY;CAEpB,YAAY,AAAiB,SAAoB;EAApB;;CAE7B,UAAgB;AACd,MAAI,KAAK,UAAW;EACpB,MAAM,UAA0B;GAC9B,QAAQ,EACN,MAAM,MAAM,YAAY;IACtB,MAAM,QAAQ,KAAK,cAAc,IAAI,MAAM,QAAQ;AACnD,SAAK,cAAc,KAAK,MAAM;AAC9B,WAAO;MAEV;GACD,UAAU;IACR,MAAM,UAAU,OAAO,aAAa;KAClC,MAAM,QAAQ,KAAK,iBAAiB,IAAI,UAAU,OAAO,SAAS;AAClE,UAAK,cAAc,KAAK,MAAM;AAC9B,YAAO;;IAET,UAAU,UAAU,OAAO,aAAa;KACtC,MAAM,QAAQ,KAAK,iBAAiB,QAAQ,UAAU,OAAO,SAAS;AACtE,UAAK,cAAc,KAAK,MAAM;AAC9B,YAAO;;IAEV;GACD,UAAU;IACR,KAAK,OAAO,YAAY;KACtB,MAAM,QAAQ,KAAK,SAAS,GAAG,OAAO,QAAQ;AAC9C,UAAK,cAAc,KAAK,MAAM;AAC9B,YAAO;;IAET,OAAO,OAAO,SAAS,KAAK,SAAS,KAAK,OAAO,KAAK;IACvD;GACD,QAAQ,EACN,WAAW,MAAM,cAAc;IAC7B,MAAM,QAAQ,KAAK,cAAc,SAAS,MAAM,UAAU;AAC1D,SAAK,cAAc,KAAK,MAAM;AAC9B,WAAO;MAEV;GACD,YAAY,EACV,MAAM,eAAe;IACnB,MAAM,QAAQ,KAAK,mBAAmB,IAAI,WAAW;AACrD,SAAK,cAAc,KAAK,MAAM;AAC9B,WAAO;MAEV;GACF;AAED,OAAK,YAAY;AACjB,OAAK,MAAM,UAAU,KAAK,QACxB,QAAO,QAAQ,QAAQ;;CAI3B,YAAkB;AAChB,MAAI,CAAC,KAAK,UAAW;AACrB,OAAK,YAAY;AACjB,GAAC,GAAG,KAAK,cAAc,CAAC,SAAS,CAAC,SAAS,OAAO,IAAI,CAAC;AACvD,OAAK,gBAAgB,EAAE;AACvB,GAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,CAAC,SAAS,WAAW,OAAO,aAAa,CAAC;;CAGvE,aAAa,KAAK,cAAc,KAAK,KAAK,KAAK,cAAc;CAC7D,cAAc,KAAK,iBAAiB,IAAI,KAAK,KAAK,iBAAiB;CACnE,kBAAkB,KAAK,iBAAiB,QAAQ,KAAK,KAAK,iBAAiB;CAC3E,gBAAgB,KAAK,mBAAmB,OAAO,KAAK,KAAK,mBAAmB;CAC5E,YAAY,KAAK,cAAc,OAAO,KAAK,KAAK,cAAc;;;;;AC1EhE,MAAa,cAAc,YAA0C,OAAO,QAAQ;CAClF,MAAM,EAAE,UAAU,GAAG,eAAe;CAGpC,MAAM,gBAAgB,cAAc;EAClC,MAAM,KAAK,IAAI,cAAc,CAAC,uBAAuB,MAAM,UAAU,EAAE,GAAI,MAAM,WAAW,EAAE,CAAE,CAAC;AACjG,KAAG,SAAS;AACZ,SAAO;IACN,EAAE,CAAC;AAEN,iBAAgB;AAEd,gBAAc,SAAS;AACvB,eAAa,cAAc,WAAW;IACrC,CAAC,cAAc,CAAC;AAEnB,QACE,oBAAC,oBAAoB;EAAS,OAAO;YACnC,oBAAC;GAA4B;aAC3B,oBAAC;IAAK,GAAI;IAAiB;KAAO;IAChB;GACS;EAEjC;;;;AC7BF,MAAM,aAAa,EAAE,OAAO;CAC1B,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,MAAM,EAAE,QAAQ;CACjB,CAAC;;;;ACKF,MAAa,UAAU;CACnB;CACA;CACD;AAEH,MAAa,SAAS;CAClB;CACA;CACH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idem.agency/form-builder",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "Построитель форм",
5
5
  "author": "idem.agency",
6
6
  "license": "ISC",
@@ -31,8 +31,8 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "clsx": "2.1.1",
34
- "react": "19.2.3",
35
- "react-dom": "19.2.3",
34
+ "react": "~19.2.4",
35
+ "react-dom": "~19.2.4",
36
36
  "zod": "4.3.6"
37
37
  },
38
38
  "devDependencies": {
@@ -55,5 +55,5 @@
55
55
  "vite-tsconfig-paths": "6.0.5",
56
56
  "vitest": "4.0.17"
57
57
  },
58
- "gitHead": "8fb4733065c87fe29151207329c81695cecbb9ff"
58
+ "gitHead": "1c6fa40a5dfd63ab8646bae159dbe259f419eb85"
59
59
  }