@echojs-ecosystem/form 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/field-persist.ts","../src/primitives/field.ts","../src/primitives/fieldArray.ts","../src/primitives/nested-field-array-ops.ts","../src/primitives/fieldSet.ts","../src/validation/flatten.ts","../src/validation/standard-schema.ts","../src/primitives/collect-form-value.ts","../src/primitives/hydrate.ts","../src/primitives/validation-tree.ts","../src/primitives/create-form.ts","../src/primitives/generate-append-to-array.ts","../src/primitives/generate-remove-from-array.ts","../src/primitives/array-generator.ts","../src/primitives/field-kit.ts","../src/validation/flatten-validation.ts","../src/bindings/hyperdom.ts"],"names":["signal","message","issues","isPlainObject","isFieldSetNode","isFieldArrayNode","out","entries","resolved","getFieldArray","asRecord"],"mappings":"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","file":"index.js","sourcesContent":["import type { Signal } from \"@echojs-ecosystem/reactivity\";\nimport type { Persistable, PersistExtension, PersistExtensionResult } from \"@echojs-ecosystem/persist\";\nimport type { Field, FieldArray, FieldArrayCore, FieldCore } from \"../types\";\n\ntype ValueField<T> = {\n $value: Signal<T>;\n set: (next: T) => void;\n};\n\ntype ItemsField<T> = {\n $items: Signal<T[]>;\n replace: (next: T[]) => void;\n};\n\nconst fieldPersistable = <T>(field: ValueField<T>): Persistable<T> => ({\n value: () => field.$value.peek() as T,\n set: (next: T) => field.set(next),\n subscribe(listener: (value: T, prevValue: T) => void) {\n let prev = field.$value.peek() as T;\n return field.$value.subscribe(() => {\n const next = field.$value.peek() as T;\n listener(next, prev);\n prev = next;\n });\n },\n});\n\nconst fieldArrayPersistable = <T>(fieldArray: ItemsField<T>): Persistable<T[]> => ({\n value: () => [...(fieldArray.$items.peek() as T[])],\n set: (next: T[]) => fieldArray.replace([...next]),\n subscribe(listener: (value: T[], prevValue: T[]) => void) {\n let prev = [...(fieldArray.$items.peek() as T[])];\n return fieldArray.$items.subscribe(() => {\n const next = [...(fieldArray.$items.peek() as T[])];\n listener(next, prev);\n prev = next;\n });\n },\n});\n\nexport const attachFieldPersist = <T>(field: FieldCore<T>): Field<T> => {\n const { value, subscribe } = fieldPersistable(field);\n const target = Object.assign(field, { value, subscribe }) as Field<T>;\n\n target.extend = <Snapshot>(extension: PersistExtension<T, Snapshot>) => {\n const result = extension(fieldPersistable(target));\n Object.assign(target, result);\n return target as Field<T> & PersistExtensionResult<T, Snapshot>;\n };\n\n return target;\n};\n\nexport const attachFieldArrayPersist = <T>(fieldArray: FieldArrayCore<T>): FieldArray<T> => {\n const { value, set, subscribe } = fieldArrayPersistable(fieldArray);\n const target = Object.assign(fieldArray, { value, set, subscribe }) as FieldArray<T>;\n\n target.extend = <Snapshot>(extension: PersistExtension<T[], Snapshot>) => {\n const result = extension(fieldArrayPersistable(target));\n Object.assign(target, result);\n return target as FieldArray<T> & PersistExtensionResult<T[], Snapshot>;\n };\n\n return target;\n};\n\n/** Persist API поверх `createField`: `value` / `subscribe`; запись — через `field.set()`. */\nexport type FieldPersistMethods<T> = {\n value(): T;\n subscribe(listener: (value: T, prevValue: T) => void): () => void;\n extend<Snapshot = T>(\n extension: PersistExtension<T, Snapshot>,\n ): Field<T> & PersistExtensionResult<T, Snapshot>;\n};\n\nexport type FieldArrayPersistMethods<T> = {\n value(): T[];\n set(next: T[]): void;\n subscribe(listener: (value: T[], prevValue: T[]) => void): () => void;\n extend<Snapshot = T[]>(\n extension: PersistExtension<T[], Snapshot>,\n ): FieldArray<T> & PersistExtensionResult<T[], Snapshot>;\n};\n","import { signal } from \"@echojs-ecosystem/reactivity\";\nimport type { Field, FieldBinding, FieldCore, FieldMeta } from \"../types\";\nimport { attachFieldPersist } from \"./field-persist\";\n\nconst defaultMeta = (): FieldMeta => ({\n dirty: false,\n touched: false,\n focused: false,\n errors: [],\n});\n\n/**\n * Одно поле формы: значение и мета в сигналах, биндинг к DOM без встроенной схемы.\n * Валидацию на submit задавайте через `createForm(..., { schema | validate })`.\n */\nexport const createField = <T>(initial: T): Field<T> => {\n let binding: FieldBinding | undefined;\n const $value = signal<T>(initial);\n const $meta = signal<FieldMeta>(defaultMeta());\n\n const setValue = (next: T): void => {\n $value.set(next);\n $meta.update((prev) => ({ ...prev, dirty: true, errors: [] }));\n };\n\n const focus = (): void => {\n $meta.update((prev) => ({ ...prev, focused: true }))\n };\n\n const blur = (): void => {\n $meta.update((prev) => ({ ...prev, focused: false, touched: true }));\n };\n\n\n const bind = (): FieldBinding => {\n if (binding) return binding;\n\n const isBool = typeof initial === \"boolean\";\n\n const onInputText = (event: { currentTarget: HTMLInputElement | HTMLTextAreaElement }): void => {\n if (isBool) return;\n const raw = event.currentTarget.value;\n setValue(raw as unknown as T);\n };\n\n const onChangeText = (event: { currentTarget: HTMLInputElement | HTMLTextAreaElement }): void => {\n if (isBool) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n setValue(checked as unknown as T);\n return;\n }\n\n const raw = event.currentTarget.value;\n setValue(raw as unknown as T);\n };\n\n const onFocus = (): void => focus();\n const onBlur = (): void => blur();\n\n binding = { onInputText, onChangeText, onFocus, onBlur };\n return binding;\n };\n\n const validate = (): string[] => [];\n const validateAsync = async (): Promise<string[]> => [];\n\n const core: FieldCore<T> = {\n $value,\n $meta,\n\n value: () => $value.value(),\n meta: () => $meta.value(),\n get handlers() {\n return bind();\n },\n\n set: (next) => setValue(next),\n reset: (next) => {\n $value.set(next !== undefined ? next : initial);\n $meta.set(defaultMeta());\n },\n\n focus,\n blur,\n touch: () => $meta.update((prev) => ({ ...prev, touched: true })),\n\n bind,\n\n validate,\n validateAsync,\n clearErrors: () => $meta.update((prev) => ({ ...prev, errors: [] })),\n };\n\n return attachFieldPersist(core);\n};\n","import { signal } from \"@echojs-ecosystem/reactivity\";\nimport type { FieldArray, FieldArrayCore } from \"../types\";\nimport { attachFieldArrayPersist } from \"./field-persist\";\n\n/**\n * Creates a dynamic array helper for form state (append/remove/move/update).\n *\n * This primitive only manages the array itself; compose it with fields/fieldSets for rich models.\n */\nexport const createFieldArray = <Item>(initial: Item[] = []): FieldArray<Item> => {\n const initialSnapshot = [...initial];\n const $items = signal<Item[]>([...initial]);\n\n const append = (item: Item): void => {\n $items.update((prev) => [...prev, item]);\n };\n\n const prepend = (item: Item): void => {\n $items.update((prev) => [item, ...prev]);\n };\n\n const removeAt = (index: number): void => {\n $items.update((prev) => prev.filter((_, i) => i !== index));\n };\n\n const move = (from: number, to: number): void => {\n $items.update((prev) => {\n if (from === to) return prev;\n if (from < 0 || to < 0) return prev;\n if (from >= prev.length || to >= prev.length) return prev;\n const next = prev.slice();\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item!);\n return next;\n });\n };\n\n const updateAt = (index: number, fn: (item: Item) => Item): void => {\n $items.update((prev) => prev.map((x, i) => (i === index ? fn(x) : x)));\n };\n\n const replace = (next: Item[]): void => {\n $items.set([...next]);\n };\n\n const reset = (): void => {\n $items.set([...initialSnapshot]);\n };\n\n const core: FieldArrayCore<Item> = {\n $items,\n append,\n prepend,\n removeAt,\n move,\n updateAt,\n replace,\n reset,\n };\n\n return attachFieldArrayPersist(core);\n};\n","import type { FieldArray, NestedFieldArrayOps } from \"../types\";\n\n/**\n * Конфиг вложенных `createFieldArray`: на каждом уровне — фабрика строки и при необходимости дочерние массивы по ключам строки.\n */\nexport type FieldArrayBranchConfig<Row extends Record<string, unknown>> = {\n newRow: () => Row;\n children?: Partial<{\n [K in keyof Row]: Row[K] extends FieldArray<infer Child>\n ? Child extends Record<string, unknown>\n ? FieldArrayBranchConfig<Child>\n : FieldArrayBranchConfig<Record<string, never>>\n : never;\n }>;\n};\n\nconst buildOps = <Row extends Record<string, unknown>>(\n fieldArray: FieldArray<Row>,\n cfg: FieldArrayBranchConfig<Row>,\n): NestedFieldArrayOps<Row> => {\n const removeAt = (index: number): void => {\n fieldArray.removeAt(index);\n };\n\n const children = cfg.children;\n const hasChildren = !!children && Object.keys(children).length > 0;\n\n const at = hasChildren\n ? (index: number): Record<string, NestedFieldArrayOps> | undefined => {\n const row = fieldArray.$items.value()[index] as Row | undefined;\n if (!row) return undefined;\n const slice: Record<string, NestedFieldArrayOps> = {};\n for (const key of Object.keys(children!)) {\n const childCfg = children![key as keyof Row];\n if (!childCfg) continue;\n const childArr = row[key as keyof Row] as FieldArray<Record<string, unknown>>;\n slice[key] = buildOps(childArr, childCfg as FieldArrayBranchConfig<Record<string, unknown>>);\n }\n return slice;\n }\n : (_index: number): undefined => undefined;\n\n return {\n append: (item?: Row) => {\n fieldArray.append((item ?? cfg.newRow()) as Row);\n },\n removeAt,\n remove: removeAt,\n at,\n };\n};\n\n/**\n * Строит цепочку операций над вложенными `FieldArray` по конфигу (фабрики строк + дерево дочерних ключей).\n *\n * @example\n * ```ts\n * const d = form.nestedArrays!.departments;\n * d.append();\n * d.at(0)?.employees.append();\n * d.at(0)?.employees.at(0)?.tickets.removeAt(1);\n * ```\n */\nexport const defineNestedFieldArrayOps = <Row extends Record<string, unknown>>(\n fieldArray: FieldArray<Row>,\n cfg: FieldArrayBranchConfig<Row>,\n): NestedFieldArrayOps<Row> => buildOps(fieldArray, cfg);\n","import type { FieldSet } from \"../types\";\n\n/**\n * Groups fields (or nested fieldSets) into a single unit.\n *\n * This version is intentionally simple: it calls `validate()`/`reset()` on children when present.\n */\nexport const createFieldSet = <Shape extends Record<string, any>>(\n fields: Shape,\n): FieldSet<Shape> => {\n const validate = (): Record<string, string[]> => {\n const out: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(fields)) {\n if (value && typeof value.validate === \"function\") {\n out[key] = value.validate();\n }\n }\n return out;\n };\n\n const reset = (): void => {\n for (const value of Object.values(fields)) {\n if (value && typeof value.reset === \"function\") {\n value.reset();\n }\n }\n };\n\n return { fields, validate, reset };\n};\n","import type { StandardSchemaIssue } from \"../types\";\n\nconst pathKey = (path: readonly (string | number | symbol)[] | undefined): string =>\n (path ?? [])\n .map((segment) => (typeof segment === \"symbol\" ? String(segment) : String(segment)))\n .join(\".\");\n\n/**\n * Turns Standard Schema-ish issues into a flat map keyed by dotted paths.\n *\n * Issues without paths are aggregated under `\"$root\"` (useful for form-level errors).\n */\nexport const flattenFieldErrors = (\n issues: readonly StandardSchemaIssue[],\n): Record<string, string[]> => {\n const out: Record<string, string[]> = {};\n\n for (const issue of issues) {\n const key = pathKey(issue.path);\n const resolvedKey = key.length ? key : \"$root\";\n\n const arr = out[resolvedKey] ?? [];\n arr.push(issue.message);\n out[resolvedKey] = arr;\n }\n\n return out;\n};\n","import type { StandardSchemaIssue, StandardSchemaLike } from \"../types\";\n\nconst asRecord = (v: unknown): Record<string, unknown> | null =>\n typeof v === \"object\" && v !== null ? (v as Record<string, unknown>) : null;\n\nconst isIssueLikeArray = (\n v: unknown,\n): v is readonly { message: string; path?: ReadonlyArray<unknown> | undefined }[] =>\n Array.isArray(v) &&\n v.every(\n (x) => x && typeof x === \"object\" && typeof (x as { message?: unknown }).message === \"string\",\n );\n\nexport const normalizeStandardSchemaPathSegments = (\n path?: ReadonlyArray<unknown> | undefined,\n): string[] =>\n Array.from(path ?? []).map((segment) => {\n if (typeof segment === \"string\" || typeof segment === \"number\") return String(segment);\n if (typeof segment === \"symbol\") return String(segment);\n\n if (segment && typeof segment === \"object\" && \"key\" in (segment as any)) {\n const key = (segment as { key: PropertyKey }).key;\n return typeof key === \"symbol\" ? String(key) : String(key);\n }\n\n return String(segment as any);\n });\n\n/**\n * Normalize common Standard Schema validation result shapes into a flat `{ issues[] }`.\n *\n * Covers:\n * - `{ issues: [...] }`\n * - `{ errors: [...] }` (some wrappers)\n * - `{ value }` → no issues (success-ish)\n */\nexport const normalizeStandardSchemaIssues = (result: unknown): StandardSchemaIssue[] => {\n if (typeof result === \"string\") return [{ message: result }];\n\n if (Array.isArray(result) && result.every((x) => typeof x === \"string\")) {\n return (result as string[]).map((message) => ({ message }));\n }\n\n if (Array.isArray(result) && isIssueLikeArray(result)) {\n return Array.from(result).map((i) => ({\n message: i.message,\n path: normalizeStandardSchemaPathSegments(i.path ?? []),\n }));\n }\n\n const rec = asRecord(result);\n if (!rec) return [];\n\n const directIssues = rec.issues ?? rec.errors ?? rec.issue;\n if (Array.isArray(directIssues) && isIssueLikeArray(directIssues)) {\n return Array.from(directIssues).map((i) => ({\n message: i.message,\n path: normalizeStandardSchemaPathSegments(i.path ?? []),\n }));\n }\n\n // Some adapters return `{ value }` directly on success without `issues`.\n if (\"value\" in rec && !(\"issues\" in rec)) return [];\n\n // Last resort: if it looks like a failure object with a single message field.\n const message = rec.message;\n if (typeof message === \"string\") return [{ message }];\n\n return [];\n};\n\n/**\n * Runs `StandardSchema`'s `.validate()` and normalizes failures into `{ issues }`.\n *\n * Handles Promise results automatically.\n */\nexport const standardSchemaIssuesForUnknown = async (\n schema: StandardSchemaLike<unknown>,\n value: unknown,\n): Promise<{ ok: boolean; issues: StandardSchemaIssue[] }> => {\n const raw = schema[\"~standard\"].validate(value) as unknown;\n const result = raw instanceof Promise ? await raw : raw;\n\n const rec =\n typeof result === \"object\" && result !== null ? (result as Record<string, unknown>) : null;\n const issuesUnknown =\n rec && Object.prototype.hasOwnProperty.call(rec, \"issues\") ? rec.issues : undefined;\n\n if (\n Array.isArray(issuesUnknown) &&\n issuesUnknown.every((issue) => issue && typeof (issue as any).message === \"string\")\n ) {\n const issues = Array.from(\n issuesUnknown as readonly { message: string; path?: ReadonlyArray<unknown> }[],\n ).map((issue) => ({\n message: issue.message,\n path: normalizeStandardSchemaPathSegments(issue.path ?? []),\n }));\n\n return issues.length > 0 ? { ok: false, issues } : { ok: true, issues: [] };\n }\n\n const issues = normalizeStandardSchemaIssues(result);\n return issues.length > 0 ? { ok: false, issues } : { ok: true, issues: [] };\n};\n\n/**\n * Same as `standardSchemaIssuesForUnknown()`, but resolves immediately when the vendor returns sync results.\n *\n * Throws if validation returns a Promise (use `standardSchemaIssuesForUnknown()` / `validateAsync()` instead).\n */\nexport const standardSchemaIssuesForUnknownSync = (\n schema: StandardSchemaLike<unknown>,\n value: unknown,\n): { ok: boolean; issues: StandardSchemaIssue[] } => {\n const raw = schema[\"~standard\"].validate(value) as unknown;\n if (raw instanceof Promise) {\n throw new Error(\n \"[@echojs-ecosystem/form] Schema validation returned a Promise. Use field.validateAsync() / form.validateAsync(), or wrap with async handling.\",\n );\n }\n\n const rec = typeof raw === \"object\" && raw !== null ? (raw as Record<string, unknown>) : null;\n const issuesUnknown =\n rec && Object.prototype.hasOwnProperty.call(rec, \"issues\") ? rec.issues : undefined;\n\n if (\n Array.isArray(issuesUnknown) &&\n issuesUnknown.every((issue) => issue && typeof (issue as any).message === \"string\")\n ) {\n const issues = Array.from(\n issuesUnknown as readonly { message: string; path?: ReadonlyArray<unknown> }[],\n ).map((issue) => ({\n message: issue.message,\n path: normalizeStandardSchemaPathSegments(issue.path ?? []),\n }));\n\n return issues.length > 0 ? { ok: false, issues } : { ok: true, issues: [] };\n }\n\n const issues = normalizeStandardSchemaIssues(raw);\n return issues.length > 0 ? { ok: false, issues } : { ok: true, issues: [] };\n};\n","const isPlainObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst isFieldNode = (value: unknown): value is { $value: { value: () => unknown } } =>\n isPlainObject(value) &&\n typeof (value as any).$value?.value === \"function\" &&\n typeof (value as any).set === \"function\" &&\n typeof (value as any).bind === \"function\";\n\nconst isFieldArrayNode = (\n value: unknown,\n): value is { $items: { value: () => unknown }; append: (x: unknown) => void } =>\n isPlainObject(value) &&\n typeof (value as any).$items?.value === \"function\" &&\n typeof (value as any).append === \"function\";\n\n/** `createFieldSet` — объект с `fields`, без `$value` на корне. */\nconst isFieldSetNode = (value: unknown): value is { fields: Record<string, unknown> } =>\n isPlainObject(value) &&\n isPlainObject((value as any).fields) &&\n typeof (value as any).validate === \"function\" &&\n typeof (value as any).reset === \"function\" &&\n !isFieldNode(value);\n\n/**\n * Собирает «сырое» значение формы из дерева примитивов (`Field` / `FieldSet` / `FieldArray`).\n *\n * Соглашение по форме:\n * - ключи объекта `fields` совпадают с ключами итогового JSON;\n * - `FieldSet` сериализуется как **один уровень** его `fields` (без ключа `fields` в выходе);\n * - `FieldArray` → массив, каждый элемент — объект строки (рекурсивно).\n *\n * Если дерево полей **не совпадает** со схемой (например, `credentials.email` в UI, а в Zod плоский `email`),\n * задайте свой `getValue` во втором аргументе `createForm(fields, { getValue })`.\n */\nexport const collectFormValueFromFields = (node: unknown): unknown => {\n if (node == null) return node;\n\n if (isFieldNode(node)) return node.$value.value();\n\n if (isFieldArrayNode(node)) {\n const raw = node.$items.value();\n if (!Array.isArray(raw)) return [];\n return raw.map((row) => collectFormValueFromFields(row));\n }\n\n if (isFieldSetNode(node)) return collectFormValueFromFields(node.fields);\n\n if (isPlainObject(node)) {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n out[key] = collectFormValueFromFields(value);\n }\n return out;\n }\n\n return node;\n};\n","import type { FieldArray } from \"../types\";\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst isField = (\n v: unknown,\n): v is { set: (x: unknown) => void; $value: { value: () => unknown } } =>\n isPlainObject(v) &&\n typeof (v as any).set === \"function\" &&\n typeof (v as any).$value?.value === \"function\";\n\nconst isFieldSetNode = (v: unknown): v is { fields: Record<string, unknown> } =>\n isPlainObject(v) && isPlainObject((v as any).fields);\n\nconst isFieldArrayNode = (v: unknown): v is FieldArray<unknown> =>\n isPlainObject(v) &&\n typeof (v as any).$items?.value === \"function\" &&\n typeof (v as any).append === \"function\";\n\nconst readItems = (arr: FieldArray<unknown>): unknown[] => {\n const v = arr.$items.value();\n return Array.isArray(v) ? v : [];\n};\n\n/**\n * Рекурсивно записывает `partial` в дерево полей (Field / FieldSet / FieldArray).\n *\n * Для расширения массива нужен `rowFactory` из второго аргумента `createForm(fields, { fieldArrayFactories })`.\n */\nexport const hydrateFormFields = (\n fields: Record<string, unknown>,\n partial: unknown,\n fieldArrayFactories?: Record<string, () => unknown>,\n): void => {\n if (!isPlainObject(partial)) return;\n\n for (const [key, raw] of Object.entries(partial)) {\n if (!(key in fields)) continue;\n const node = fields[key]!;\n hydrateNode(node, raw, fieldArrayFactories?.[key]);\n }\n};\n\nconst hydrateNode = (node: unknown, partial: unknown, rowFactory?: () => unknown): void => {\n if (isField(node)) {\n node.set(partial as never);\n return;\n }\n\n if (isFieldSetNode(node)) {\n if (!isPlainObject(partial)) return;\n hydrateFormFields(node.fields as Record<string, unknown>, partial, undefined);\n return;\n }\n\n if (isFieldArrayNode(node)) {\n if (!Array.isArray(partial)) return;\n\n const target = partial as unknown[];\n const arr = node;\n\n // укорачиваем\n while (readItems(arr).length > target.length) {\n arr.removeAt(readItems(arr).length - 1);\n }\n\n // удлиняем\n while (readItems(arr).length < target.length) {\n if (!rowFactory) break;\n arr.append(rowFactory() as never);\n }\n\n const rows = readItems(arr);\n for (let i = 0; i < target.length && i < rows.length; i++) {\n hydrateNode(rows[i], target[i], undefined);\n }\n return;\n }\n\n // обычный объект-контейнер (редко)\n if (isPlainObject(node) && isPlainObject(partial)) {\n hydrateFormFields(node as Record<string, unknown>, partial, undefined);\n }\n};\n","const isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\n/** True if the value has a `validate()` function (field/fieldSet-ish). */\nconst hasValidateSync = (value: unknown): value is { validate: () => unknown } =>\n isPlainObject(value) && typeof (value as any).validate === \"function\";\n\n/** True if the value has an async `validateAsync()` function (field-ish). */\nconst hasValidateAsync = (value: unknown): value is { validateAsync: () => Promise<unknown> } =>\n isPlainObject(value) && typeof (value as any).validateAsync === \"function\";\n\nconst maybeFieldSetNode = (value: unknown): value is { fields: Record<string, unknown> } =>\n isPlainObject(value) && isPlainObject((value as any).fields);\n\nconst maybeFieldArrayNode = (\n value: unknown,\n): value is {\n $items: { value: () => unknown };\n} => isPlainObject(value) && typeof (value as any).$items?.value === \"function\";\n\nexport const deepValidateSync = (root: unknown): unknown => {\n if (maybeFieldArrayNode(root)) {\n const items = root.$items.value();\n if (!Array.isArray(items)) return items;\n return items.map((row) => deepValidateSync(row));\n }\n\n if (maybeFieldSetNode(root)) {\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(root.fields)) {\n out[key] = deepValidateSync(child);\n }\n return out;\n }\n\n if (hasValidateSync(root)) return root.validate();\n\n if (!isPlainObject(root)) return root;\n\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(root)) {\n out[key] = deepValidateSync(child);\n }\n return out;\n};\n\nexport const deepValidateAsync = async (root: unknown): Promise<unknown> => {\n if (maybeFieldArrayNode(root)) {\n const items = root.$items.value();\n if (!Array.isArray(items)) return items;\n const entries = items.map((row, i) => deepValidateAsync(row).then((v) => [i, v] as const));\n const resolved = await Promise.all(entries);\n return resolved.sort((a, b) => a[0] - b[0]).map(([, v]) => v);\n }\n\n if (maybeFieldSetNode(root)) {\n const entries = Object.entries(root.fields).map(([key, child]) =>\n deepValidateAsync(child).then((v) => [key, v] as const),\n );\n const resolved = await Promise.all(entries);\n return Object.fromEntries(resolved);\n }\n\n if (hasValidateAsync(root)) return root.validateAsync();\n // Back-compat: nested objects may still be sync-only.\n if (hasValidateSync(root) && !hasValidateAsync(root)) return root.validate();\n\n if (!isPlainObject(root)) return root;\n\n const entries = Object.entries(root).map(([key, child]) =>\n deepValidateAsync(child).then((v) => [key , v] as const),\n );\n const resolved = await Promise.all(entries);\n return Object.fromEntries(resolved);\n};\n\nexport const deepReset = (root: unknown): void => {\n if (isPlainObject(root) && typeof (root as any).reset === \"function\") {\n (root as any).reset();\n return;\n }\n\n if (maybeFieldArrayNode(root)) {\n const items = root.$items.value();\n if (Array.isArray(items)) for (const row of items) deepReset(row);\n return;\n }\n\n if (maybeFieldSetNode(root)) {\n for (const child of Object.values(root.fields)) deepReset(child);\n return;\n }\n\n if (!isPlainObject(root)) return;\n for (const child of Object.values(root)) deepReset(child);\n};\n","import { effect, signal } from \"@echojs-ecosystem/reactivity\";\nimport type { Form, FormSubmitResult, FormValidationMode, StandardSchemaLike } from \"../types\";\nimport { flattenFieldErrors } from \"../validation/flatten\";\nimport { standardSchemaIssuesForUnknown } from \"../validation/standard-schema\";\nimport { collectFormValueFromFields } from \"./collect-form-value\";\nimport { hydrateFormFields } from \"./hydrate\";\nimport { deepReset, deepValidateAsync, deepValidateSync } from \"./validation-tree\";\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nexport type CreateFormOptions<\n TValue,\n TFields extends Record<string, any>,\n TArrayActions extends Record<string, unknown> = {},\n> = {\n /** Имя формы (отладка, логирование). */\n name: string;\n\n /**\n * Снимок значения для `submit` / `validationSchema`.\n *\n * Если не указан, используется {@link collectFormValueFromFields}: структура полей должна\n * совпадать с `TValue` (см. JSDoc у `collectFormValueFromFields`). Иначе передайте свою функцию.\n */\n\n validate?: (fields: TFields) => Record<string, unknown>;\n validateAsync?: (fields: TFields) => Promise<Record<string, unknown>>;\n\n /** Back-compat alias for `validationSchema`. */\n schema?: StandardSchemaLike<TValue>;\n\n /** Общая Standard Schema (Zod и др.) при submit: ошибки попадают в `errors.$schema` (плоская карта путей). */\n validationSchema?: StandardSchemaLike<TValue>;\n\n /**\n * When to auto-run validation (incl. `validationSchema`) and keep `$errors/$schemaErrors` updated.\n *\n * Default: \"manual\" (only `submit()` triggers validation).\n */\n validationOn?: FormValidationMode;\n\n /**\n * Override how a submit \"value snapshot\" is built from the field tree.\n *\n * By default we use `collectFormValueFromFields(...)`.\n */\n getValue?: () => TValue;\n\n /**\n * Начальные значения: записываются в дерево полей через `hydrateFormFields` сразу после создания формы.\n */\n defaultValues?: Partial<TValue>;\n /**\n * Асинхронная подгрузка значений (частичный объект). Применяется через `hydrateFormFields`.\n */\n defaultAsyncValues?: () => Promise<Partial<TValue>>;\n\n /**\n * Фабрики строк для `FieldArray` при гидратации `defaultValues` / `defaultAsyncValues`.\n */\n fieldArrayFactories?: Record<string, () => unknown>;\n\n /**\n * Фабрики строк (`createTicket`, …) и append/remove через `arrayGenerator` из `@echojs-ecosystem/form`.\n *\n * @example\n * ```ts\n * arrayActions: (form) => {\n * const createRow = () => ({ title: createField(\"\") });\n * return {\n * createRow,\n * appendRow: arrayGenerator.append(form, createRow, \"items\"),\n * removeRow: arrayGenerator.remove(form, \"items\"),\n * };\n * },\n * ```\n */\n arrayActions?: (form: Form<TValue, TFields, TArrayActions>) => TArrayActions;\n};\n\n/**\n * Обёртка над деревом полей: submit, валидация полей (`createField` / `createFieldArray`) и опционально схема на submit.\n *\n * @example\n * ```ts\n * const form = createForm(\n * { title: createField(\"\"), items: createFieldArray([]) },\n * { name: \"MyForm\", validationSchema: z.object({ ... }), defaultValues: { title: \"a\" } },\n * );\n * ```\n */\nexport function createForm<\n TValue,\n TFields extends Record<string, any>,\n TArrayActions extends Record<string, unknown> = {},\n>(\n fields: TFields,\n opts: CreateFormOptions<TValue, TFields, TArrayActions>,\n): Form<TValue, TFields, TArrayActions> {\n const $submitting = signal(false);\n const $submitCount = signal(0);\n const $errors = signal<Record<string, unknown> | undefined>(undefined);\n const $schemaErrors = signal<Record<string, string[]> | undefined>(undefined);\n\n const resolvedFields = fields;\n const rootSchema = opts.validationSchema ?? opts.schema;\n const validationOn = opts.validationOn ?? \"manual\";\n\n if (opts.defaultValues && Object.keys(opts.defaultValues as object).length > 0) {\n hydrateFormFields(\n resolvedFields as unknown as Record<string, unknown>,\n opts.defaultValues as object,\n opts.fieldArrayFactories,\n );\n }\n\n if (opts.defaultAsyncValues) {\n void opts.defaultAsyncValues().then((extra) => {\n hydrateFormFields(\n resolvedFields as unknown as Record<string, unknown>,\n extra as object,\n );\n });\n }\n\n const snapshotValue = (): TValue =>\n (opts.getValue ? opts.getValue() : (collectFormValueFromFields(resolvedFields) as TValue));\n\n const validate = (): Record<string, unknown> => {\n if (opts.validate) return opts.validate(resolvedFields);\n return deepValidateSync(resolvedFields) as Record<string, unknown>;\n };\n\n const validateAsync = async (): Promise<Record<string, unknown>> => {\n const getFieldTree = (async () => {\n if (opts.validateAsync) return await opts.validateAsync(resolvedFields);\n if (opts.validate) return opts.validate(resolvedFields);\n return await deepValidateAsync(resolvedFields) as Record<string, unknown>;\n })\n\n if (!rootSchema) return await getFieldTree();\n\n const value = snapshotValue();\n const res = await standardSchemaIssuesForUnknown(rootSchema as any, value);\n const schemaFlat = flattenFieldErrors(res.ok ? [] : res.issues);\n const rootSchemaErrors = Object.keys(schemaFlat).length > 0 ? { $schema: schemaFlat } : {};\n\n return { ...(await getFieldTree()), ...rootSchemaErrors };\n };\n\n const updateErrorsSignals = (errs: Record<string, unknown>): void => {\n $errors.set(errs);\n const flat = (errs as { $schema?: Record<string, string[]> }).$schema;\n $schemaErrors.set(flat && Object.keys(flat).length ? flat : undefined);\n };\n\n const runValidation = async (): Promise<Record<string, unknown>> => {\n const errs = await validateAsync();\n updateErrorsSignals(errs);\n return errs;\n };\n\n const trackValidationTriggers = (node: unknown): void => {\n if (node == null) return;\n\n // Field-ish\n if (isPlainObject(node) && (node as any).$value && (node as any).$meta) {\n if (validationOn === \"onChange\" || validationOn === \"all\") (node as any).$value.value();\n if (validationOn === \"onBlur\" || validationOn === \"all\") (node as any).$meta.value().touched;\n if (validationOn === \"onFocus\" || validationOn === \"all\") (node as any).$meta.value().focused;\n return;\n }\n\n // FieldArray-ish\n if (isPlainObject(node) && typeof (node as any).$items?.value === \"function\") {\n const items = (node as any).$items.value();\n if (Array.isArray(items)) for (const row of items) trackValidationTriggers(row);\n return;\n }\n\n // FieldSet-ish\n if (isPlainObject(node) && isPlainObject((node as any).fields)) {\n for (const child of Object.values((node as any).fields)) trackValidationTriggers(child);\n return;\n }\n\n if (!isPlainObject(node)) return;\n for (const child of Object.values(node)) trackValidationTriggers(child);\n };\n\n if (validationOn !== \"manual\") {\n effect(() => {\n trackValidationTriggers(resolvedFields);\n void runValidation();\n });\n }\n\n const reset = (): void => {\n deepReset(resolvedFields);\n };\n\n const getValue = (): TValue => snapshotValue();\n\n const hydrate = (partial: Partial<TValue>): void => {\n hydrateFormFields(\n resolvedFields as unknown as Record<string, unknown>,\n partial as object,\n );\n };\n\n const submit = async (\n handler: (value: TValue) => void | Promise<void>,\n ): Promise<FormSubmitResult<TValue>> => {\n $submitCount.update((n) => n + 1);\n const errors = await runValidation();\n\n const hasErrors = (obj: unknown): boolean => {\n if (obj == null) return false;\n if (Array.isArray(obj)) {\n if (obj.length === 0) return false;\n return obj.some(hasErrors);\n }\n if (typeof obj === \"object\") {\n const entries = Object.values(obj as Record<string, unknown>);\n return entries.some(hasErrors);\n }\n if (typeof obj === \"string\") return obj.length > 0;\n return false;\n };\n\n if (hasErrors(errors)) {\n return { ok: false, errors };\n }\n\n $submitting.set(true);\n try {\n const value = getValue();\n await handler(value);\n return { ok: true, value };\n } catch (error) {\n return { ok: false, errors: { submit: error } };\n } finally {\n $submitting.set(false);\n }\n };\n\n const form = {\n displayName: opts.name,\n fields: resolvedFields,\n $submitting,\n $submitCount,\n $errors,\n $schemaErrors,\n arrayActions: {} as TArrayActions,\n validate,\n validateAsync,\n reset,\n hydrate,\n submit,\n } as Form<TValue, TFields, TArrayActions>;\n\n if (opts.arrayActions) {\n form.arrayActions = opts.arrayActions(form);\n }\n\n return form;\n}\n","import type { Form } from \"../types\";\nimport type { ArrayPath } from \"./array-path\";\n\ntype AnyRecord = Record<string, any>;\n\nconst isPlainObject = (v: unknown): v is AnyRecord => !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst getFieldArray = (node: unknown): { $items: { value: () => unknown[] }; append: (item: unknown) => void } => {\n if (!isPlainObject(node)) throw new Error(\"generateAppendToArray: expected FieldArray node\");\n if (!(\"$items\" in node) || typeof (node as any).append !== \"function\") {\n throw new Error(\"generateAppendToArray: path does not resolve to a FieldArray\");\n }\n return node as any;\n};\n\n/**\n * Generates an append function for a nested FieldArray path.\n *\n * `path` is a dot-separated chain of array names, where the last segment is the target array.\n * Example: \"departments.employees.tickets\" => appendTicket(deptIndex, employeeIndex)\n *\n * The returned function expects N indices where N = segments.length - 1.\n */\nexport const generateAppendToArray = <TValue, TFields extends Record<string, any>, Row>(\n form: Form<TValue, TFields, any>,\n makeRow: () => Row,\n path: ArrayPath<TFields>,\n) => {\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) throw new Error(\"generateAppendToArray: empty path\");\n\n return (...indices: number[]): void => {\n if (indices.length !== Math.max(0, segments.length - 1)) {\n throw new Error(\n `generateAppendToArray: expected ${Math.max(0, segments.length - 1)} indices, got ${indices.length}`,\n );\n }\n\n let cursor: any = form.fields;\n\n for (let index = 0; index < segments.length; index++) {\n const key = segments[index]!;\n const isTarget = index === segments.length - 1;\n\n const next = cursor?.[key];\n if (isTarget) {\n getFieldArray(next).append(makeRow());\n return;\n }\n\n const arr = getFieldArray(next);\n const idx = indices[index]!;\n const items = arr.$items.value();\n const row = items[idx];\n cursor = row;\n }\n };\n};\n\n","import type { Form } from \"../types\";\nimport type { ArrayPath } from \"./array-path\";\n\ntype AnyRecord = Record<string, any>;\n\nconst isPlainObject = (v: unknown): v is AnyRecord => !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst getFieldArray = (\n node: unknown,\n): { $items: { value: () => unknown[] }; removeAt: (index: number) => void } => {\n if (!isPlainObject(node)) throw new Error(\"generateRemoveFromArray: expected FieldArray node\");\n if (!(\"$items\" in node) || typeof (node as any).removeAt !== \"function\") {\n throw new Error(\"generateRemoveFromArray: path does not resolve to a FieldArray\");\n }\n return node as any;\n};\n\n/**\n * Generates a remove function for a nested FieldArray path.\n *\n * `path` is a dot-separated chain of array names, where the last segment is the target array.\n * Example: \"departments.employees.tickets\" => removeTicket(deptIndex, employeeIndex, ticketIndex)\n *\n * The returned function expects N indices where N = segments.length.\n */\nexport const generateRemoveFromArray = <TValue, TFields extends Record<string, any>>(\n form: Form<TValue, TFields, any>,\n path: ArrayPath<TFields>,\n) => {\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) throw new Error(\"generateRemoveFromArray: empty path\");\n\n return (...indices: number[]): void => {\n if (indices.length !== segments.length) {\n throw new Error(\n `generateRemoveFromArray: expected ${segments.length} indices, got ${indices.length}`,\n );\n }\n\n let cursor = form.fields;\n\n for (let index = 0; index < segments.length; index++) {\n const key = segments[index]!;\n const isTarget = index === segments.length - 1;\n const next = cursor?.[key];\n\n const arr = getFieldArray(next);\n\n if (isTarget) {\n const removeIndex = indices[index]!;\n arr.removeAt(removeIndex);\n return;\n }\n\n const parentIndex = indices[index]!;\n const items = arr.$items.value();\n const row = items[parentIndex];\n cursor = row as TFields;\n }\n };\n};\n\n","import type { Form } from \"../types\";\nimport type { ArrayPath } from \"./array-path\";\nimport { generateAppendToArray } from \"./generate-append-to-array\";\nimport { generateRemoveFromArray } from \"./generate-remove-from-array\";\n\n/** Утилиты для append/remove по вложенным `FieldArray` (пути — `ArrayPath`). */\nexport const arrayGenerator = {\n append<TValue, TFields extends Record<string, any>, Row>(\n form: Form<TValue, TFields, any>,\n makeRow: () => Row,\n path: ArrayPath<TFields>,\n ) {\n return generateAppendToArray(form, makeRow, path);\n },\n\n remove<TValue, TFields extends Record<string, any>>(form: Form<TValue, TFields, any>, path: ArrayPath<TFields>) {\n return generateRemoveFromArray(form, path);\n },\n};\n","import { createField } from \"./field\";\nimport { createFieldArray } from \"./fieldArray\";\nimport type {\n Field,\n FieldArray,\n FieldValidator,\n FieldValidationMode,\n StandardSchemaLike,\n} from \"../types\";\nimport type { ZodEnum } from \"zod\";\n\nexport type FieldKitFieldOpts<T> = {\n validationMode?: FieldValidationMode;\n parseDOMValue?: (raw: string) => T;\n parseDOMChecked?: (checked: boolean) => T;\n validate?: FieldValidator<T>[];\n schemaIssuePrefix?: string;\n};\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nconst asRecord = (v: object): Record<string, unknown> => v as Record<string, unknown>;\n\n/**\n * Helpers to build fields from `defaultValues` / `defaultAsyncValues` without repeating\n * `seed.foo ?? \"\"` for every key. Pass as the second argument to the `fields` factory.\n */\nexport type FieldKit<TSeed extends Record<string, unknown>> = {\n str: (\n key: string,\n schema: StandardSchemaLike<string>,\n parent?: object,\n extra?: FieldKitFieldOpts<string>,\n ) => Field<string>;\n num: (\n key: string,\n schema: StandardSchemaLike<number>,\n parent?: object,\n extra?: FieldKitFieldOpts<number>,\n ) => Field<number>;\n bool: (\n key: string,\n schema: StandardSchemaLike<boolean>,\n parent?: object,\n extra?: FieldKitFieldOpts<boolean>,\n ) => Field<boolean>;\n /**\n * `z.enum` / string union fields: reads `parent[key]` when it matches an enum option, else `fallback`.\n */\n pick: <T extends string>(\n key: string,\n schema: ZodEnum<[T, ...T[]]>,\n parent: object | undefined,\n fallback: T,\n extra?: FieldKitFieldOpts<T>,\n ) => Field<T>;\n list: <Row>(\n key: string,\n rowFactory: (rowSeed: Record<string, unknown>, index: number) => Row,\n parent?: object,\n ) => FieldArray<Row>;\n};\n\nexport const createFieldKit = <TSeed extends Record<string, unknown>>(\n seed: TSeed,\n): FieldKit<TSeed> => {\n const str: FieldKit<TSeed>[\"str\"] = (key, _schema, parent, _extra) => {\n const src = asRecord((parent ?? seed) as object);\n const raw = src[key];\n const initial = String(raw ?? \"\");\n return createField(initial);\n };\n\n const num: FieldKit<TSeed>[\"num\"] = (key, _schema, parent, _extra) => {\n const src = asRecord((parent ?? seed) as object);\n const raw = src[key];\n const n = typeof raw === \"number\" ? raw : Number.parseFloat(String(raw));\n const initial = Number.isFinite(n) ? n : 0;\n return createField(initial);\n };\n\n const bool: FieldKit<TSeed>[\"bool\"] = (key, _schema, parent, _extra) => {\n const src = asRecord((parent ?? seed) as object);\n const raw = src[key];\n const initial = Boolean(raw);\n return createField(initial);\n };\n\n function pick<T extends string>(\n key: string,\n _schema: ZodEnum<[T, ...T[]]>,\n parent: object | undefined,\n fallback: T,\n _extra?: FieldKitFieldOpts<T>,\n ): Field<T> {\n const src = asRecord((parent ?? seed) as object);\n const raw = src[key];\n const options = _schema.options as readonly T[];\n const initial = (\n typeof raw === \"string\" && (options as readonly string[]).includes(raw)\n ? (raw as T)\n : fallback\n ) as T;\n return createField(initial);\n }\n\n const list: FieldKit<TSeed>[\"list\"] = (key, rowFactory, parent) => {\n const src = asRecord((parent ?? seed) as object);\n const raw = src[key];\n const arr = Array.isArray(raw) ? raw : [];\n return createFieldArray(\n arr.map((item, index) => rowFactory(isPlainObject(item) ? item : {}, index)),\n );\n };\n\n return { str, num, bool, pick, list };\n};\n","/**\n * Схлопывает дерево результатов `deepValidateSync/Async` в плоскую карту `путь → сообщения`.\n *\n * Пути строятся через точку; индексы массивов — как числовые сегменты (`tags.0.tag`).\n */\nexport const flattenValidationErrors = (node: unknown, prefix = \"\"): Record<string, string[]> => {\n const out: Record<string, string[]> = {};\n const join = (path: string) => (prefix.length ? `${prefix}.${path}` : path);\n const joinIdx = (index: number) => (prefix.length ? `${prefix}.${index}` : String(index));\n\n if (node == null) return out;\n\n if (typeof node === \"string\") {\n if (node.trim().length > 0) out[prefix.length ? prefix : \"$root\"] = [node];\n return out;\n }\n\n if (Array.isArray(node)) {\n if (node.length === 0) return out;\n\n if (node.every((value) => typeof value === \"string\")) {\n const msgs = node.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n if (msgs.length > 0) out[prefix.length ? prefix : \"$root\"] = msgs;\n return out;\n }\n\n for (let i = 0; i < node.length; i++) {\n Object.assign(out, flattenValidationErrors(node[i], joinIdx(i)));\n }\n return out;\n }\n\n if (typeof node === \"object\") {\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n Object.assign(out, flattenValidationErrors(value, join(key)));\n }\n return out;\n }\n\n return out;\n};\n\n/**\n * Оставляет только те ошибки общей `validationSchema`, которые **не перекрыты** ошибками полей.\n *\n * Правило: если у поля есть ошибка по пути `fk`, то отбрасываем любую ошибку схемы по пути `sk`, если\n * `fk === sk`, либо один путь является префиксом другого (вложенность / массивы).\n */\nexport const filterRootSchemaErrorsDeferredToFieldErrors = (\n fieldFlat: Record<string, string[]>,\n schemaFlat: Record<string, string[]>,\n): Record<string, string[]> => {\n const fieldKeysWithErrors = Object.entries(fieldFlat)\n .filter(([, msgs]) => msgs.length > 0)\n .map(([key]) => key);\n\n const filtered: Record<string, string[]> = {};\n for (const [schemaKey, msgs] of Object.entries(schemaFlat)) {\n if (!msgs.length) continue;\n\n const blocked = fieldKeysWithErrors.some((fk) => {\n if (fk === schemaKey) return true;\n if (fk.startsWith(`${schemaKey}.`)) return true;\n if (schemaKey.startsWith(`${fk}.`)) return true;\n return false;\n });\n\n if (!blocked) filtered[schemaKey] = msgs;\n }\n\n return filtered;\n};\n","import type { Field, FieldBinding } from \"../types\";\n\n/** Поле формы для Hyperdom (`createField` / `form.fields.*`). */\nexport type HyperdomFormFieldRef<T> = Field<T>;\n\nconst getBinding = <T>(field: HyperdomFormFieldRef<T>): FieldBinding => field.handlers;\n\nconst readFieldRef = <T>(field: HyperdomFormFieldRef<T>): T => field.value() as T;\n\nconst writeFieldRef = <T>(field: HyperdomFormFieldRef<T>, next: T): void => {\n field.set(next);\n};\n\nconst parseNumericInput = (raw: string): number => {\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) ? n : 0;\n};\n\nconst controlledStringValue = <T>(field: HyperdomFormFieldRef<T>): (() => string) => {\n return () => {\n const v = readFieldRef(field);\n if (v == null) return \"\";\n return String(v);\n };\n};\n\ntype InvalidNumberDisplay = \"empty\" | \"zero\";\n\nconst controlledNumericStringValue = <T>(\n field: HyperdomFormFieldRef<T>,\n whenInvalid: InvalidNumberDisplay,\n): (() => string) => {\n return () => {\n const v = readFieldRef(field);\n if (v == null || (typeof v === \"number\" && Number.isNaN(v))) {\n return whenInvalid === \"empty\" ? \"\" : \"0\";\n }\n return String(v);\n };\n};\n\nconst textLikeHandlers = (b: FieldBinding) =>\n ({\n onInput: b.onInputText,\n onChange: b.onChangeText,\n onFocus: b.onFocus,\n onBlur: b.onBlur,\n }) as const;\n\nconst domNumericInputHandlers = <T>(field: HyperdomFormFieldRef<T>) => {\n const sync = (e: Event & { currentTarget: HTMLInputElement }): void => {\n writeFieldRef(field, parseNumericInput(e.currentTarget.value) as unknown as T);\n };\n return { onInput: sync, onChange: sync } as const;\n};\n\nexport type bindFieldOptions =\n | {\n variant: \"text\" | \"email\" | \"password\" | \"search\" | \"url\";\n controlledValue?: boolean;\n }\n | {\n variant: \"textarea\";\n controlledValue?: boolean;\n }\n | {\n variant: \"checkbox\";\n }\n | {\n variant: \"select\";\n /** По умолчанию `true`: селект почти всегда должен быть controlled. */\n controlledValue?: boolean;\n }\n | {\n variant: \"number\";\n controlledValue?: boolean;\n }\n | {\n variant: \"range\";\n min?: number;\n max?: number;\n step?: number;\n controlledValue?: boolean;\n };\n\n/**\n * Унифицированный биндинг поля `@echojs-ecosystem/form` к пропсам Hyperdom (`input`, `textarea`, `select`, …).\n *\n * Для списков внутри `List` рекомендуется `controlledValue: true` у текстовых вариантов, чтобы значения\n * не терялись при пересоздании DOM.\n *\n * Возвращаемый тип намеренно широкий: Hyperdom различает обработчики `onChange` для `input` / `select` / `textarea`,\n * а контроллер выбирается по `variant` в рантайме.\n */\nexport const bindField = <T>(\n field: HyperdomFormFieldRef<T>,\n opts: bindFieldOptions,\n): any => {\n const b = getBinding(field);\n\n switch (opts.variant) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"search\":\n case \"url\": {\n const base = { type: opts.variant, ...textLikeHandlers(b) } as const;\n if (!opts.controlledValue) return base;\n return { ...base, value: controlledStringValue(field) } as const;\n }\n\n case \"textarea\": {\n const base = { ...textLikeHandlers(b) } as const;\n if (!opts.controlledValue) return base;\n return { ...base, value: controlledStringValue(field) } as const;\n }\n\n case \"checkbox\": {\n return {\n type: \"checkbox\" as const,\n checked: () => Boolean(readFieldRef(field)),\n onChange: b.onChangeText,\n onFocus: b.onFocus,\n onBlur: b.onBlur,\n } as const;\n }\n\n case \"select\": {\n const onChange = (e: Event & { currentTarget: HTMLSelectElement }) => {\n writeFieldRef(field, e.currentTarget.value as unknown as T);\n };\n const base = {\n onChange,\n onFocus: b.onFocus,\n onBlur: b.onBlur,\n } as const;\n if (opts.controlledValue === false) return base;\n return {\n ...base,\n value: controlledStringValue(field),\n } as const;\n }\n\n case \"number\": {\n const numeric = domNumericInputHandlers(field);\n const base = {\n type: \"number\" as const,\n ...numeric,\n onFocus: b.onFocus,\n onBlur: b.onBlur,\n } as const;\n if (!opts.controlledValue) return base;\n return { ...base, value: controlledNumericStringValue(field, \"empty\") } as const;\n }\n\n case \"range\": {\n const numeric = domNumericInputHandlers(field);\n const base = {\n type: \"range\" as const,\n min: opts.min,\n max: opts.max,\n step: opts.step,\n ...numeric,\n onFocus: b.onFocus,\n onBlur: b.onBlur,\n } as const;\n if (!opts.controlledValue) return base;\n return { ...base, value: controlledNumericStringValue(field, \"zero\") } as const;\n }\n }\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@echojs-ecosystem/form",
3
+ "version": "0.1.0",
4
+ "files": [
5
+ "dist"
6
+ ],
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "check-types": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.typing.json --noEmit",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.typing.json --noEmit",
20
+ "test:types": "tsc -p tsconfig.typing.json --noEmit",
21
+ "lint": "oxlint .",
22
+ "lint:fix": "oxlint . --fix",
23
+ "format": "oxfmt --check .",
24
+ "format:fix": "oxfmt .",
25
+ "test": "vitest run",
26
+ "test:vitest": "vitest",
27
+ "test:vitest:run": "vitest run",
28
+ "test:vitest:ui": "vitest ui",
29
+ "test:coverage": "vitest run --coverage"
30
+ },
31
+ "dependencies": {
32
+ "@echojs-ecosystem/persist": "workspace:*",
33
+ "@echojs-ecosystem/reactivity": "workspace:*",
34
+ "@standard-schema/spec": "^1.1.0"
35
+ },
36
+ "devDependencies": {
37
+ "@echojs-ecosystem/oxc-config": "workspace:*",
38
+ "typescript": "5.9.2",
39
+ "vitest": "^4.1.4",
40
+ "zod": "^3.25.28"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/echojs-ecosystem/echojs-core.git",
48
+ "directory": "packages/form"
49
+ }
50
+ }