@letar/forms 1.0.3 → 1.2.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +331 -0
  2. package/README.md +9 -9
  3. package/README.ru.md +389 -0
  4. package/analytics.js +3 -0
  5. package/analytics.js.map +1 -0
  6. package/chunk-2PSXYC3I.js +1782 -0
  7. package/chunk-2PSXYC3I.js.map +1 -0
  8. package/chunk-5D6S6EGF.js +206 -0
  9. package/chunk-5D6S6EGF.js.map +1 -0
  10. package/chunk-6E7VJAJT.js +78 -0
  11. package/chunk-6E7VJAJT.js.map +1 -0
  12. package/chunk-CGXKRCSM.js +117 -0
  13. package/chunk-CGXKRCSM.js.map +1 -0
  14. package/chunk-DQUVUMCX.js +982 -0
  15. package/chunk-DQUVUMCX.js.map +1 -0
  16. package/chunk-K3J4L26K.js +345 -0
  17. package/chunk-K3J4L26K.js.map +1 -0
  18. package/chunk-MAYUFA5K.js +822 -0
  19. package/chunk-MAYUFA5K.js.map +1 -0
  20. package/{chunk-4V6WBJ76.js → chunk-MVGXZNHP.js} +2 -2
  21. package/{chunk-4V6WBJ76.js.map → chunk-MVGXZNHP.js.map} +1 -1
  22. package/chunk-MZDTJSF7.js +299 -0
  23. package/chunk-MZDTJSF7.js.map +1 -0
  24. package/chunk-Q5EOF36Y.js +709 -0
  25. package/chunk-Q5EOF36Y.js.map +1 -0
  26. package/{chunk-7FEQFDJ7.js → chunk-R2RTCKXY.js} +2 -2
  27. package/{chunk-7FEQFDJ7.js.map → chunk-R2RTCKXY.js.map} +1 -1
  28. package/chunk-XFWLD5EO.js +1045 -0
  29. package/chunk-XFWLD5EO.js.map +1 -0
  30. package/fields/boolean.js +5 -0
  31. package/fields/boolean.js.map +1 -0
  32. package/fields/datetime.js +5 -0
  33. package/fields/datetime.js.map +1 -0
  34. package/fields/number.js +5 -0
  35. package/fields/number.js.map +1 -0
  36. package/fields/selection.js +5 -0
  37. package/fields/selection.js.map +1 -0
  38. package/fields/specialized.js +5 -0
  39. package/fields/specialized.js.map +1 -0
  40. package/fields/text.js +5 -0
  41. package/fields/text.js.map +1 -0
  42. package/hcaptcha-U4XIT3HS.js +64 -0
  43. package/hcaptcha-U4XIT3HS.js.map +1 -0
  44. package/i18n.js +1 -1
  45. package/index.js +3736 -4962
  46. package/index.js.map +1 -1
  47. package/offline.js +1 -1
  48. package/package.json +59 -4
  49. package/recaptcha-PKAUAY2S.js +56 -0
  50. package/recaptcha-PKAUAY2S.js.map +1 -0
  51. package/server-errors.js +3 -0
  52. package/server-errors.js.map +1 -0
  53. package/turnstile-7FXTBSLW.js +36 -0
  54. package/turnstile-7FXTBSLW.js.map +1 -0
  55. package/validators/ru.js +73 -0
  56. package/validators/ru.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/server-errors/parsers.ts","../src/lib/server-errors/map-server-errors.ts"],"names":[],"mappings":"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","file":"chunk-5D6S6EGF.js","sourcesContent":["/**\n * Парсеры серверных ошибок различных форматов.\n * Каждый парсер принимает unknown и возвращает MappedServerErrors | null.\n * null означает \"не мой формат, передай следующему\".\n */\n\nimport type {\n ActionResultError,\n FieldErrorMap,\n MappedServerErrors,\n PrismaError,\n ZenStackError,\n ZodFlatError,\n} from './types'\n\n// --- Детекторы формата ---\n\nfunction isPrismaError(error: unknown): error is PrismaError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as PrismaError).code === 'string' &&\n (error as PrismaError).code.startsWith('P')\n )\n}\n\nfunction isZodFlatError(error: unknown): error is ZodFlatError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'fieldErrors' in error &&\n typeof (error as ZodFlatError).fieldErrors === 'object'\n )\n}\n\nfunction isZenStackError(error: unknown): error is ZenStackError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'reason' in error &&\n typeof (error as ZenStackError).reason === 'string'\n )\n}\n\nfunction isActionResultError(error: unknown): error is ActionResultError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'success' in error &&\n (error as ActionResultError).success === false &&\n 'error' in error\n )\n}\n\n// --- Встроенные сообщения по locale ---\n\nconst PRISMA_MESSAGES = {\n ru: {\n P2002: (fields: string[]) =>\n fields.length === 1 ? `${fields[0]} уже существует` : `Комбинация ${fields.join(' + ')} уже существует`,\n P2003: (field?: string) => (field ? `Связанная запись \"${field}\" не найдена` : 'Связанная запись не найдена'),\n P2025: () => 'Запись не найдена',\n P2014: () => 'Невозможно удалить — есть связанные записи',\n default: () => 'Ошибка базы данных',\n },\n en: {\n P2002: (fields: string[]) =>\n fields.length === 1 ? `${fields[0]} already exists` : `Combination of ${fields.join(' + ')} already exists`,\n P2003: (field?: string) => (field ? `Related record \"${field}\" not found` : 'Related record not found'),\n P2025: () => 'Record not found',\n P2014: () => 'Cannot delete — has related records',\n default: () => 'Database error',\n },\n} as const\n\ntype Locale = keyof typeof PRISMA_MESSAGES\n\n// --- Парсеры ---\n\n/**\n * Парсер Prisma ошибок.\n * P2002 (unique constraint) → маппит meta.target на поле формы.\n * P2003 (foreign key) → маппит meta.field_name.\n * P2025 (not found) → глобальная ошибка.\n */\nexport function parsePrismaError(\n error: unknown,\n fieldMap?: FieldErrorMap,\n locale: Locale = 'ru'\n): MappedServerErrors | null {\n if (!isPrismaError(error)) return null\n\n const msgs = PRISMA_MESSAGES[locale]\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n switch (error.code) {\n case 'P2002': {\n const targets = error.meta?.target ?? []\n // Проверяем кастомный маппинг: по имени constraint или по первому полю\n const constraintKey = targets.join('_')\n const mapped = fieldMap?.[constraintKey] ?? (targets.length === 1 ? fieldMap?.[targets[0]] : undefined)\n\n if (mapped) {\n result.fieldErrors.push({ field: mapped.field, message: mapped.message })\n } else if (targets.length > 0) {\n // Автомаппинг: первое поле target → ошибка\n result.fieldErrors.push({\n field: targets[0],\n message: msgs.P2002(targets),\n })\n } else {\n result.formErrors.push(msgs.P2002([]))\n }\n break\n }\n\n case 'P2003': {\n const field = error.meta?.field_name\n const mapped = field ? fieldMap?.[field] : undefined\n\n if (mapped) {\n result.fieldErrors.push({ field: mapped.field, message: mapped.message })\n } else if (field) {\n result.fieldErrors.push({ field, message: msgs.P2003(field) })\n } else {\n result.formErrors.push(msgs.P2003())\n }\n break\n }\n\n case 'P2025':\n result.formErrors.push(msgs.P2025())\n break\n\n case 'P2014':\n result.formErrors.push(msgs.P2014())\n break\n\n default:\n result.formErrors.push(msgs.default())\n }\n\n return result\n}\n\n/**\n * Парсер ZenStack ошибок.\n * rejected-by-policy → глобальная ошибка \"Нет доступа\".\n * db-query-error → делегируем Prisma парсеру (оборачивает Prisma ошибки).\n */\nexport function parseZenStackError(\n error: unknown,\n fieldMap?: FieldErrorMap,\n locale: Locale = 'ru'\n): MappedServerErrors | null {\n if (!isZenStackError(error)) return null\n\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n switch (error.reason) {\n case 'rejected-by-policy': {\n const message =\n locale === 'ru'\n ? error.rejectedByPolicyReason === 'cannot-read-back'\n ? 'Операция выполнена, но результат недоступен из-за ограничений доступа'\n : 'Нет доступа для выполнения этой операции'\n : error.rejectedByPolicyReason === 'cannot-read-back'\n ? 'Operation succeeded but result is not accessible due to permissions'\n : 'Access denied for this operation'\n result.formErrors.push(message)\n break\n }\n\n case 'db-query-error': {\n // ZenStack оборачивает Prisma ошибки — извлекаем код и meta\n if (error.code) {\n const prismaLike: PrismaError = {\n code: error.code,\n message: error.dbErrorMessage ?? error.message ?? '',\n meta: error.meta,\n }\n const prismaResult = parsePrismaError(prismaLike, fieldMap, locale)\n if (prismaResult) return prismaResult\n }\n result.formErrors.push(error.message ?? (locale === 'ru' ? 'Ошибка базы данных' : 'Database error'))\n break\n }\n\n case 'not-found':\n result.formErrors.push(locale === 'ru' ? 'Запись не найдена' : 'Record not found')\n break\n\n default:\n result.formErrors.push(error.message ?? (locale === 'ru' ? 'Неизвестная ошибка' : 'Unknown error'))\n }\n\n return result\n}\n\n/**\n * Парсер Zod v4 flatten формата.\n * { formErrors: string[], fieldErrors: { email: ['msg1'], name: ['msg2'] } }\n */\nexport function parseZodFlatError(error: unknown): MappedServerErrors | null {\n if (!isZodFlatError(error)) return null\n\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n // Глобальные ошибки формы\n if (Array.isArray(error.formErrors)) {\n result.formErrors.push(...error.formErrors)\n }\n\n // Ошибки по полям\n for (const [field, messages] of Object.entries(error.fieldErrors)) {\n if (Array.isArray(messages)) {\n for (const message of messages) {\n if (typeof message === 'string') {\n result.fieldErrors.push({ field, message })\n }\n }\n }\n }\n\n return result\n}\n\n/**\n * Парсер ActionResult формата (driving-school паттерн).\n * { success: false, error: string | { fieldErrors, formErrors } }\n */\nexport function parseActionResultError(error: unknown): MappedServerErrors | null {\n if (!isActionResultError(error)) return null\n\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n if (typeof error.error === 'string') {\n // Простая строковая ошибка → глобальная\n result.formErrors.push(error.error)\n } else if (typeof error.error === 'object') {\n // Вложенный Zod flatten формат\n const zodResult = parseZodFlatError(error.error)\n if (zodResult) return zodResult\n }\n\n // Дополнительное message\n if (error.message && !result.formErrors.includes(error.message)) {\n result.formErrors.push(error.message)\n }\n\n return result\n}\n\n/**\n * Парсер для обычных Error объектов.\n * Проверяет .info (ZenStack стиль) и .cause.\n */\nexport function parseErrorObject(\n error: unknown,\n fieldMap?: FieldErrorMap,\n locale: Locale = 'ru'\n): MappedServerErrors | null {\n if (!(error instanceof Error)) return null\n\n // ZenStack-стиль: Error с .info\n const info = (error as Error & { info?: unknown }).info\n if (info) {\n const zenResult = parseZenStackError(info, fieldMap, locale)\n if (zenResult) return zenResult\n }\n\n // Error с .cause (цепочка ошибок)\n const cause = (error as Error & { cause?: unknown }).cause\n if (cause) {\n const prismaResult = parsePrismaError(cause, fieldMap, locale)\n if (prismaResult) return prismaResult\n }\n\n return { fieldErrors: [], formErrors: [error.message] }\n}\n","/**\n * mapServerErrors — автоматический маппинг серверных ошибок на поля формы.\n *\n * Поддерживает автодетект формата:\n * - Prisma P2002/P2003/P2025/P2014\n * - ZenStack rejected-by-policy / db-query-error\n * - Zod v4 flatten { fieldErrors, formErrors }\n * - ActionResult { success: false, error: ... }\n * - Error объекты с .info (ZenStack) и .cause (Prisma)\n *\n * @example\n * ```tsx\n * // В onSubmit формы\n * onSubmit={async ({ value }) => {\n * try {\n * await createUser(value)\n * } catch (error) {\n * const mapped = mapServerErrors(error, {\n * fieldMap: {\n * email: { field: 'email', message: 'Этот email уже зарегистрирован' },\n * },\n * })\n * // mapped.fieldErrors → [{ field: 'email', message: '...' }]\n * // mapped.formErrors → ['Глобальная ошибка']\n * }\n * }}\n * ```\n */\n\nimport {\n parseActionResultError,\n parseErrorObject,\n parsePrismaError,\n parseZenStackError,\n parseZodFlatError,\n} from './parsers'\nimport type { MappedServerErrors, MapServerErrorsConfig } from './types'\n\n/**\n * Маппит серверную ошибку на поля формы.\n * Автоматически определяет формат ошибки и извлекает field-level + form-level ошибки.\n *\n * @param error - Ошибка от сервера (любой формат)\n * @param config - Опциональная конфигурация маппинга\n * @returns Структура с fieldErrors и formErrors\n */\nexport function mapServerErrors(error: unknown, config?: MapServerErrorsConfig): MappedServerErrors {\n const { fieldMap, format = 'auto', defaultMessage, locale = 'ru' } = config ?? {}\n\n const fallback: MappedServerErrors = {\n fieldErrors: [],\n formErrors: [defaultMessage ?? (locale === 'ru' ? 'Произошла ошибка' : 'An error occurred')],\n }\n\n if (error == null) return fallback\n\n // Строковая ошибка → глобальная\n if (typeof error === 'string') {\n return { fieldErrors: [], formErrors: [error] }\n }\n\n // Определённый формат\n if (format !== 'auto') {\n const result = parseByFormat(error, format, fieldMap, locale)\n return result ?? fallback\n }\n\n // Автодетект: пробуем парсеры в порядке приоритета\n const parsers = [\n () => parsePrismaError(error, fieldMap, locale),\n () => parseZenStackError(error, fieldMap, locale),\n () => parseZodFlatError(error),\n () => parseActionResultError(error),\n () => parseErrorObject(error, fieldMap, locale),\n ]\n\n for (const parse of parsers) {\n const result = parse()\n if (result) return result\n }\n\n return fallback\n}\n\nfunction parseByFormat(\n error: unknown,\n format: NonNullable<MapServerErrorsConfig['format']>,\n fieldMap?: MapServerErrorsConfig['fieldMap'],\n locale: 'ru' | 'en' = 'ru'\n): MappedServerErrors | null {\n switch (format) {\n case 'prisma':\n return parsePrismaError(error, fieldMap, locale)\n case 'zenstack':\n return parseZenStackError(error, fieldMap, locale)\n case 'zod':\n return parseZodFlatError(error)\n case 'action-result':\n return parseActionResultError(error)\n default:\n return null\n }\n}\n\n/**\n * Применяет MappedServerErrors к TanStack Form инстансу.\n * Устанавливает ошибки на конкретные поля через form.setFieldMeta.\n *\n * @example\n * ```tsx\n * const mapped = mapServerErrors(error)\n * applyServerErrors(form, mapped)\n * ```\n */\nexport function applyServerErrors(\n form: {\n setFieldMeta: (field: string, updater: (prev: { errors: unknown[] }) => { errors: unknown[] }) => void\n setErrorMap: (errorMap: { onSubmit: string }) => void\n },\n mapped: MappedServerErrors\n): void {\n // Устанавливаем ошибки на поля\n for (const { field, message } of mapped.fieldErrors) {\n form.setFieldMeta(field, (prev) => ({\n ...prev,\n errors: [...prev.errors, message],\n }))\n }\n\n // Устанавливаем глобальные ошибки формы\n if (mapped.formErrors.length > 0) {\n form.setErrorMap({ onSubmit: mapped.formErrors.join('. ') })\n }\n}\n"]}
@@ -0,0 +1,78 @@
1
+ import { createField, FieldTooltip, FieldError } from './chunk-XFWLD5EO.js';
2
+ import { Field, Checkbox, HStack, Switch } from '@chakra-ui/react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ var FieldCheckbox = createField({
6
+ displayName: "FieldCheckbox",
7
+ render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }) => /* @__PURE__ */ jsxs(
8
+ Field.Root,
9
+ {
10
+ invalid: hasError,
11
+ required: resolved.required,
12
+ disabled: resolved.disabled,
13
+ readOnly: resolved.readOnly,
14
+ children: [
15
+ /* @__PURE__ */ jsxs(
16
+ Checkbox.Root,
17
+ {
18
+ checked: !!field.state.value,
19
+ onCheckedChange: (e) => field.handleChange(!!e.checked),
20
+ colorPalette: componentProps.colorPalette ?? "brand",
21
+ size: componentProps.size ?? "md",
22
+ disabled: resolved.disabled,
23
+ readOnly: resolved.readOnly,
24
+ "data-field-name": fullPath,
25
+ children: [
26
+ /* @__PURE__ */ jsx(Checkbox.HiddenInput, { onBlur: field.handleBlur }),
27
+ /* @__PURE__ */ jsx(Checkbox.Control, {}),
28
+ resolved.label && /* @__PURE__ */ jsx(Checkbox.Label, { children: resolved.tooltip ? /* @__PURE__ */ jsxs(HStack, { gap: 1, children: [
29
+ /* @__PURE__ */ jsx("span", { children: resolved.label }),
30
+ /* @__PURE__ */ jsx(FieldTooltip, { ...resolved.tooltip })
31
+ ] }) : resolved.label })
32
+ ]
33
+ }
34
+ ),
35
+ /* @__PURE__ */ jsx(FieldError, { hasError, errorMessage, helperText: resolved.helperText })
36
+ ]
37
+ }
38
+ )
39
+ });
40
+ var FieldSwitch = createField({
41
+ displayName: "FieldSwitch",
42
+ render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }) => /* @__PURE__ */ jsxs(
43
+ Field.Root,
44
+ {
45
+ invalid: hasError,
46
+ required: resolved.required,
47
+ disabled: resolved.disabled,
48
+ readOnly: resolved.readOnly,
49
+ children: [
50
+ /* @__PURE__ */ jsxs(
51
+ Switch.Root,
52
+ {
53
+ checked: !!field.state.value,
54
+ onCheckedChange: (e) => field.handleChange(e.checked),
55
+ colorPalette: componentProps.colorPalette ?? "brand",
56
+ size: componentProps.size ?? "md",
57
+ disabled: resolved.disabled,
58
+ readOnly: resolved.readOnly,
59
+ "data-field-name": fullPath,
60
+ children: [
61
+ /* @__PURE__ */ jsx(Switch.HiddenInput, { onBlur: field.handleBlur }),
62
+ /* @__PURE__ */ jsx(Switch.Control, { children: /* @__PURE__ */ jsx(Switch.Thumb, {}) }),
63
+ resolved.label && /* @__PURE__ */ jsx(Switch.Label, { children: resolved.tooltip ? /* @__PURE__ */ jsxs(HStack, { gap: 1, children: [
64
+ /* @__PURE__ */ jsx("span", { children: resolved.label }),
65
+ /* @__PURE__ */ jsx(FieldTooltip, { ...resolved.tooltip })
66
+ ] }) : resolved.label })
67
+ ]
68
+ }
69
+ ),
70
+ /* @__PURE__ */ jsx(FieldError, { hasError, errorMessage, helperText: resolved.helperText })
71
+ ]
72
+ }
73
+ )
74
+ });
75
+
76
+ export { FieldCheckbox, FieldSwitch };
77
+ //# sourceMappingURL=chunk-6E7VJAJT.js.map
78
+ //# sourceMappingURL=chunk-6E7VJAJT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/declarative/form-fields/boolean/field-checkbox.tsx","../src/lib/declarative/form-fields/boolean/field-switch.tsx"],"names":["jsxs","Field","jsx","HStack"],"mappings":"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","file":"chunk-6E7VJAJT.js","sourcesContent":["'use client'\n\nimport { Checkbox, Field, HStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { CheckboxFieldProps } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Form.Field.Checkbox - Boolean checkbox field\n *\n * Renders a Chakra Checkbox with automatic form integration and error display.\n *\n * @example\n * ```tsx\n * <Form.Field.Checkbox name=\"active\" label=\"Active\" />\n * ```\n *\n * @example With color palette\n * ```tsx\n * <Form.Field.Checkbox name=\"terms\" label=\"Accept terms\" colorPalette=\"green\" />\n * ```\n */\nexport const FieldCheckbox = createField<CheckboxFieldProps, boolean>({\n displayName: 'FieldCheckbox',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Checkbox.Root\n checked={!!field.state.value}\n onCheckedChange={(e) => field.handleChange(!!e.checked)}\n colorPalette={componentProps.colorPalette ?? 'brand'}\n size={componentProps.size ?? 'md'}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n data-field-name={fullPath}\n >\n <Checkbox.HiddenInput onBlur={field.handleBlur} />\n <Checkbox.Control />\n {resolved.label && (\n <Checkbox.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </Checkbox.Label>\n )}\n </Checkbox.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n ),\n})\n","'use client'\n\nimport { Field, HStack, Switch } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { SwitchFieldProps } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Form.Field.Switch - Boolean switch/toggle field\n *\n * Renders a Chakra Switch with automatic form integration and error display.\n *\n * @example\n * ```tsx\n * <Form.Field.Switch name=\"notifications\" label=\"Enable notifications\" />\n * ```\n *\n * @example With color palette and size\n * ```tsx\n * <Form.Field.Switch name=\"darkMode\" label=\"Dark mode\" colorPalette=\"purple\" size=\"lg\" />\n * ```\n */\nexport const FieldSwitch = createField<SwitchFieldProps, boolean>({\n displayName: 'FieldSwitch',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Switch.Root\n checked={!!field.state.value}\n onCheckedChange={(e) => field.handleChange(e.checked)}\n colorPalette={componentProps.colorPalette ?? 'brand'}\n size={componentProps.size ?? 'md'}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n data-field-name={fullPath}\n >\n <Switch.HiddenInput onBlur={field.handleBlur} />\n <Switch.Control>\n <Switch.Thumb />\n </Switch.Control>\n {resolved.label && (\n <Switch.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </Switch.Label>\n )}\n </Switch.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n ),\n})\n"]}
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod/v4';
2
+
3
+ // src/lib/validators/ru/bik.ts
4
+
5
+ // src/lib/validators/ru/checksum.ts
6
+ function extractDigits(value) {
7
+ return value.replace(/\D/g, "").split("").map(Number);
8
+ }
9
+ function weightedChecksum(digits, weights) {
10
+ const sum = weights.reduce((acc, w, i) => acc + w * digits[i], 0);
11
+ const remainder = sum % 11;
12
+ return remainder > 9 ? 0 : remainder;
13
+ }
14
+ function isDigitsOfLength(value, length) {
15
+ const digits = value.replace(/\D/g, "");
16
+ return digits.length === length && /^\d+$/.test(digits);
17
+ }
18
+ function isDigitsOfLengths(value, lengths) {
19
+ const digits = value.replace(/\D/g, "");
20
+ return lengths.includes(digits.length) && /^\d+$/.test(digits);
21
+ }
22
+
23
+ // src/lib/validators/ru/bik.ts
24
+ function validateBik(value) {
25
+ const digits = value.replace(/\D/g, "");
26
+ if (!isDigitsOfLength(digits, 9)) return false;
27
+ return digits.startsWith("04");
28
+ }
29
+ function bikSchema() {
30
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 9), { message: "\u0411\u0418\u041A \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 9 \u0446\u0438\u0444\u0440" }).refine((v) => v.startsWith("04"), { message: '\u0411\u0418\u041A \u0434\u043E\u043B\u0436\u0435\u043D \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 "04"' });
31
+ }
32
+ var WEIGHTS_10 = [2, 4, 10, 3, 5, 9, 4, 6, 8];
33
+ var WEIGHTS_12_1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8];
34
+ var WEIGHTS_12_2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8];
35
+ function validateInn10(value) {
36
+ const digits = extractDigits(value);
37
+ if (digits.length !== 10) return false;
38
+ const check = weightedChecksum(digits, WEIGHTS_10);
39
+ return check === digits[9];
40
+ }
41
+ function validateInn12(value) {
42
+ const digits = extractDigits(value);
43
+ if (digits.length !== 12) return false;
44
+ const check1 = weightedChecksum(digits, WEIGHTS_12_1);
45
+ const check2 = weightedChecksum(digits, WEIGHTS_12_2);
46
+ return check1 === digits[10] && check2 === digits[11];
47
+ }
48
+ function innLegalSchema() {
49
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 10), { message: "\u0418\u041D\u041D \u044E\u0440\u043B\u0438\u0446\u0430 \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 10 \u0446\u0438\u0444\u0440" }).refine(validateInn10, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0418\u041D\u041D" });
50
+ }
51
+ function innIndividualSchema() {
52
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 12), { message: "\u0418\u041D\u041D \u0444\u0438\u0437\u043B\u0438\u0446\u0430 \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 12 \u0446\u0438\u0444\u0440" }).refine(validateInn12, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0418\u041D\u041D" });
53
+ }
54
+ function innSchema() {
55
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLengths(v, [10, 12]), { message: "\u0418\u041D\u041D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 10 \u0438\u043B\u0438 12 \u0446\u0438\u0444\u0440" }).refine(
56
+ (v) => {
57
+ if (v.length === 10) return validateInn10(v);
58
+ if (v.length === 12) return validateInn12(v);
59
+ return false;
60
+ },
61
+ { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0418\u041D\u041D" }
62
+ );
63
+ }
64
+ function validateKpp(value) {
65
+ return /^\d{4}[\dA-Z]{2}\d{3}$/.test(value);
66
+ }
67
+ function kppSchema() {
68
+ return z.string().transform((v) => v.replace(/[\s-]/g, "").toUpperCase()).refine((v) => v.length === 9, { message: "\u041A\u041F\u041F \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 9 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432" }).refine(validateKpp, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u041A\u041F\u041F (NNNNPPXXX)" });
69
+ }
70
+ function validateOgrn(value) {
71
+ const digits = extractDigits(value);
72
+ if (digits.length !== 13) return false;
73
+ const number = Number(value.replace(/\D/g, "").slice(0, 12));
74
+ const check = number % 11;
75
+ return check % 10 === digits[12];
76
+ }
77
+ function validateOgrnip(value) {
78
+ const digits = extractDigits(value);
79
+ if (digits.length !== 15) return false;
80
+ const number = Number(value.replace(/\D/g, "").slice(0, 14));
81
+ const check = number % 13;
82
+ return check % 10 === digits[14];
83
+ }
84
+ function ogrnSchema() {
85
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 13), { message: "\u041E\u0413\u0420\u041D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 13 \u0446\u0438\u0444\u0440" }).refine(validateOgrn, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u041E\u0413\u0420\u041D" });
86
+ }
87
+ function ogrnipSchema() {
88
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 15), { message: "\u041E\u0413\u0420\u041D\u0418\u041F \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 15 \u0446\u0438\u0444\u0440" }).refine(validateOgrnip, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u041E\u0413\u0420\u041D\u0418\u041F" });
89
+ }
90
+ function validateSnils(value) {
91
+ const digits = extractDigits(value);
92
+ if (digits.length !== 11) return false;
93
+ const number = Number(digits.slice(0, 9).join(""));
94
+ if (number <= 1001998) return true;
95
+ let sum = 0;
96
+ for (let i = 0; i < 9; i++) {
97
+ sum += digits[i] * (9 - i);
98
+ }
99
+ let checkNumber;
100
+ if (sum < 100) {
101
+ checkNumber = sum;
102
+ } else if (sum === 100 || sum === 101) {
103
+ checkNumber = 0;
104
+ } else {
105
+ checkNumber = sum % 101;
106
+ if (checkNumber === 100) checkNumber = 0;
107
+ }
108
+ const actualCheck = digits[9] * 10 + digits[10];
109
+ return checkNumber === actualCheck;
110
+ }
111
+ function snilsSchema() {
112
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 11), { message: "\u0421\u041D\u0418\u041B\u0421 \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 11 \u0446\u0438\u0444\u0440" }).refine(validateSnils, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0421\u041D\u0418\u041B\u0421" });
113
+ }
114
+
115
+ export { bikSchema, innIndividualSchema, innLegalSchema, innSchema, isDigitsOfLength, kppSchema, ogrnSchema, ogrnipSchema, snilsSchema, validateBik, validateInn10, validateInn12, validateKpp, validateOgrn, validateOgrnip, validateSnils };
116
+ //# sourceMappingURL=chunk-CGXKRCSM.js.map
117
+ //# sourceMappingURL=chunk-CGXKRCSM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/validators/ru/checksum.ts","../src/lib/validators/ru/bik.ts","../src/lib/validators/ru/inn.ts","../src/lib/validators/ru/kpp.ts","../src/lib/validators/ru/ogrn.ts","../src/lib/validators/ru/snils.ts"],"names":["z"],"mappings":"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","file":"chunk-CGXKRCSM.js","sourcesContent":["/**\n * Общие функции контрольных сумм для российских документов.\n */\n\n/**\n * Извлечь массив цифр из строки (убирая всё кроме цифр).\n */\nexport function extractDigits(value: string): number[] {\n return value.replace(/\\D/g, '').split('').map(Number)\n}\n\n/**\n * Взвешенная контрольная сумма.\n * Используется в ИНН, СНИЛС.\n *\n * @param digits — массив цифр\n * @param weights — массив весов\n * @returns remainder mod 11\n */\nexport function weightedChecksum(digits: number[], weights: number[]): number {\n const sum = weights.reduce((acc, w, i) => acc + w * digits[i], 0)\n const remainder = sum % 11\n return remainder > 9 ? 0 : remainder\n}\n\n/**\n * Проверить что строка содержит только цифры заданной длины.\n */\nexport function isDigitsOfLength(value: string, length: number): boolean {\n const digits = value.replace(/\\D/g, '')\n return digits.length === length && /^\\d+$/.test(digits)\n}\n\n/**\n * Проверить что строка содержит только цифры одной из заданных длин.\n */\nexport function isDigitsOfLengths(value: string, lengths: number[]): boolean {\n const digits = value.replace(/\\D/g, '')\n return lengths.includes(digits.length) && /^\\d+$/.test(digits)\n}\n","/**\n * Валидация БИК (Банковский идентификационный код).\n *\n * 9 цифр, первые 2 = \"04\" (код России).\n */\nimport { z } from 'zod/v4'\nimport { isDigitsOfLength } from './checksum'\n\n/**\n * Проверить формат БИК.\n */\nexport function validateBik(value: string): boolean {\n const digits = value.replace(/\\D/g, '')\n if (!isDigitsOfLength(digits, 9)) return false\n return digits.startsWith('04')\n}\n\n/**\n * Zod-схема БИК (9 цифр, начинается с \"04\").\n */\nexport function bikSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 9), { message: 'БИК должен содержать 9 цифр' })\n .refine((v) => v.startsWith('04'), { message: 'БИК должен начинаться с \"04\"' })\n}\n","/**\n * Валидация ИНН (Идентификационный номер налогоплательщика).\n *\n * ИНН юрлица — 10 цифр, ИНН физлица — 12 цифр.\n * Контрольные суммы по алгоритму ФНС.\n */\nimport { z } from 'zod/v4'\nimport { extractDigits, isDigitsOfLength, isDigitsOfLengths, weightedChecksum } from './checksum'\n\n// Веса для ИНН-10 (юрлицо)\nconst WEIGHTS_10 = [2, 4, 10, 3, 5, 9, 4, 6, 8]\n\n// Веса для ИНН-12 (физлицо), два раунда\nconst WEIGHTS_12_1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]\nconst WEIGHTS_12_2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]\n\n/**\n * Проверить контрольную сумму ИНН юрлица (10 цифр).\n */\nexport function validateInn10(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 10) return false\n\n const check = weightedChecksum(digits, WEIGHTS_10)\n return check === digits[9]\n}\n\n/**\n * Проверить контрольную сумму ИНН физлица (12 цифр).\n */\nexport function validateInn12(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 12) return false\n\n const check1 = weightedChecksum(digits, WEIGHTS_12_1)\n const check2 = weightedChecksum(digits, WEIGHTS_12_2)\n\n return check1 === digits[10] && check2 === digits[11]\n}\n\n/**\n * Zod-схема ИНН юрлица (10 цифр).\n */\nexport function innLegalSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 10), { message: 'ИНН юрлица должен содержать 10 цифр' })\n .refine(validateInn10, { message: 'Неверная контрольная сумма ИНН' })\n}\n\n/**\n * Zod-схема ИНН физлица (12 цифр).\n */\nexport function innIndividualSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 12), { message: 'ИНН физлица должен содержать 12 цифр' })\n .refine(validateInn12, { message: 'Неверная контрольная сумма ИНН' })\n}\n\n/**\n * Zod-схема ИНН (10 или 12 цифр).\n */\nexport function innSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLengths(v, [10, 12]), { message: 'ИНН должен содержать 10 или 12 цифр' })\n .refine(\n (v) => {\n if (v.length === 10) return validateInn10(v)\n if (v.length === 12) return validateInn12(v)\n return false\n },\n { message: 'Неверная контрольная сумма ИНН' }\n )\n}\n","/**\n * Валидация КПП (Код причины постановки на учёт).\n *\n * 9 символов: NNNNPPXXX.\n * NNNN — код налогового органа (цифры).\n * PP — причина постановки (цифры или буквы A-Z).\n * XXX — порядковый номер (цифры).\n */\nimport { z } from 'zod/v4'\n\n/**\n * Проверить формат КПП.\n */\nexport function validateKpp(value: string): boolean {\n // 4 цифры + 2 символа (цифры или A-Z) + 3 цифры\n return /^\\d{4}[\\dA-Z]{2}\\d{3}$/.test(value)\n}\n\n/**\n * Zod-схема КПП (9 символов).\n */\nexport function kppSchema() {\n return z\n .string()\n .transform((v) => v.replace(/[\\s-]/g, '').toUpperCase())\n .refine((v) => v.length === 9, { message: 'КПП должен содержать 9 символов' })\n .refine(validateKpp, { message: 'Неверный формат КПП (NNNNPPXXX)' })\n}\n","/**\n * Валидация ОГРН и ОГРНИП.\n *\n * ОГРН — 13 цифр: первые 12 mod 11, младший разряд = 13-я цифра.\n * ОГРНИП — 15 цифр: первые 14 mod 13, младший разряд = 15-я цифра.\n */\nimport { z } from 'zod/v4'\nimport { extractDigits, isDigitsOfLength } from './checksum'\n\n/**\n * Проверить контрольную сумму ОГРН (13 цифр).\n */\nexport function validateOgrn(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 13) return false\n\n const number = Number(value.replace(/\\D/g, '').slice(0, 12))\n const check = number % 11\n return check % 10 === digits[12]\n}\n\n/**\n * Проверить контрольную сумму ОГРНИП (15 цифр).\n */\nexport function validateOgrnip(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 15) return false\n\n const number = Number(value.replace(/\\D/g, '').slice(0, 14))\n const check = number % 13\n return check % 10 === digits[14]\n}\n\n/**\n * Zod-схема ОГРН (13 цифр).\n */\nexport function ogrnSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 13), { message: 'ОГРН должен содержать 13 цифр' })\n .refine(validateOgrn, { message: 'Неверная контрольная сумма ОГРН' })\n}\n\n/**\n * Zod-схема ОГРНИП (15 цифр).\n */\nexport function ogrnipSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 15), { message: 'ОГРНИП должен содержать 15 цифр' })\n .refine(validateOgrnip, { message: 'Неверная контрольная сумма ОГРНИП' })\n}\n","/**\n * Валидация СНИЛС (Страховой номер индивидуального лицевого счёта).\n *\n * 11 цифр. Формат: XXX-XXX-XXX YY.\n * Контрольная сумма: модуль 101.\n */\nimport { z } from 'zod/v4'\nimport { extractDigits, isDigitsOfLength } from './checksum'\n\n/**\n * Проверить контрольную сумму СНИЛС.\n *\n * Алгоритм: сумма (digit[i] × (9-i)) для i=0..8, mod 101.\n * Если результат < 100 — это контрольное число.\n * Если 100 или 101 — контрольное число = 00.\n */\nexport function validateSnils(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 11) return false\n\n // СНИЛС 001-001-998 и ниже — специальные номера, не проверяем\n const number = Number(digits.slice(0, 9).join(''))\n if (number <= 1001998) return true\n\n let sum = 0\n for (let i = 0; i < 9; i++) {\n sum += digits[i] * (9 - i)\n }\n\n let checkNumber: number\n if (sum < 100) {\n checkNumber = sum\n } else if (sum === 100 || sum === 101) {\n checkNumber = 0\n } else {\n checkNumber = sum % 101\n if (checkNumber === 100) checkNumber = 0\n }\n\n const actualCheck = digits[9] * 10 + digits[10]\n return checkNumber === actualCheck\n}\n\n/**\n * Zod-схема СНИЛС (11 цифр).\n */\nexport function snilsSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 11), { message: 'СНИЛС должен содержать 11 цифр' })\n .refine(validateSnils, { message: 'Неверная контрольная сумма СНИЛС' })\n}\n"]}