@famgia/omnify-react 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -0
- package/dist/components/index.cjs +686 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +95 -0
- package/dist/components/index.d.ts +95 -0
- package/dist/components/index.js +657 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.cjs +81 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +20 -0
- package/dist/hooks/index.d.ts +20 -0
- package/dist/hooks/index.js +54 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +1005 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +947 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/index.cjs +479 -0
- package/dist/lib/index.cjs.map +1 -0
- package/dist/lib/index.d.cts +209 -0
- package/dist/lib/index.d.ts +209 -0
- package/dist/lib/index.js +425 -0
- package/dist/lib/index.js.map +1 -0
- package/package.json +110 -0
- package/scripts/postinstall.cjs +121 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts","../../src/lib/zod-i18n.ts","../../src/lib/form-validation.ts","../../src/lib/rules/kana.ts"],"sourcesContent":["/**\n * @famgia/omnify-react/lib\n *\n * Form validation utilities and i18n support\n */\n\n// Zod i18n\nexport {\n setZodLocale,\n getZodLocale,\n setZodFallbackLocale,\n getZodFallbackLocale,\n addZodMessages,\n getZodMessage,\n getZodMessages,\n} from './zod-i18n';\n\n// Form validation\nexport { zodRule, requiredRule, isZodRequired } from './form-validation';\n\n// Japanese validation rules\nexport * from './rules';\n","/**\n * Zod i18n - Localization for Zod validation messages\n *\n * This module provides locale-aware validation messages for Zod schemas.\n * It works independently of generated schemas and can be configured at runtime.\n *\n * @example\n * ```typescript\n * import { setZodLocale, getZodMessage } from '@famgia/omnify-react/lib';\n *\n * // Set locale once at app level\n * setZodLocale('ja');\n *\n * // Get translated message\n * const msg = getZodMessage('required', { displayName: 'Email' });\n * ```\n */\n\n// Default validation messages for all supported locales\nconst DEFAULT_MESSAGES: Record<string, Record<string, string>> = {\n required: {\n en: '${displayName} is required',\n ja: '${displayName}は必須です',\n vi: '${displayName} là bắt buộc',\n ko: '${displayName}은(는) 필수입니다',\n 'zh-CN': '${displayName}是必填项',\n 'zh-TW': '${displayName}為必填欄位',\n th: '${displayName} จำเป็นต้องกรอก',\n es: '${displayName} es obligatorio',\n },\n minLength: {\n en: '${displayName} must be at least ${min} characters',\n ja: '${displayName}は${min}文字以上で入力してください',\n vi: '${displayName} phải có ít nhất ${min} ký tự',\n ko: '${displayName}은(는) ${min}자 이상이어야 합니다',\n 'zh-CN': '${displayName}至少需要${min}个字符',\n 'zh-TW': '${displayName}至少需要${min}個字元',\n th: '${displayName} ต้องมีอย่างน้อย ${min} ตัวอักษร',\n es: '${displayName} debe tener al menos ${min} caracteres',\n },\n maxLength: {\n en: '${displayName} must be at most ${max} characters',\n ja: '${displayName}は${max}文字以内で入力してください',\n vi: '${displayName} không được quá ${max} ký tự',\n ko: '${displayName}은(는) ${max}자 이하여야 합니다',\n 'zh-CN': '${displayName}最多${max}个字符',\n 'zh-TW': '${displayName}最多${max}個字元',\n th: '${displayName} ต้องไม่เกิน ${max} ตัวอักษร',\n es: '${displayName} debe tener como máximo ${max} caracteres',\n },\n min: {\n en: '${displayName} must be at least ${min}',\n ja: '${displayName}は${min}以上で入力してください',\n vi: '${displayName} phải lớn hơn hoặc bằng ${min}',\n ko: '${displayName}은(는) ${min} 이상이어야 합니다',\n 'zh-CN': '${displayName}必须大于等于${min}',\n 'zh-TW': '${displayName}必須大於等於${min}',\n th: '${displayName} ต้องมากกว่าหรือเท่ากับ ${min}',\n es: '${displayName} debe ser al menos ${min}',\n },\n max: {\n en: '${displayName} must be at most ${max}',\n ja: '${displayName}は${max}以下で入力してください',\n vi: '${displayName} phải nhỏ hơn hoặc bằng ${max}',\n ko: '${displayName}은(는) ${max} 이하여야 합니다',\n 'zh-CN': '${displayName}必须小于等于${max}',\n 'zh-TW': '${displayName}必須小於等於${max}',\n th: '${displayName} ต้องน้อยกว่าหรือเท่ากับ ${max}',\n es: '${displayName} debe ser como máximo ${max}',\n },\n email: {\n en: 'Please enter a valid email address',\n ja: '有効なメールアドレスを入力してください',\n vi: 'Vui lòng nhập địa chỉ email hợp lệ',\n ko: '유효한 이메일 주소를 입력하세요',\n 'zh-CN': '请输入有效的电子邮件地址',\n 'zh-TW': '請輸入有效的電子郵件地址',\n th: 'กรุณากรอกอีเมลที่ถูกต้อง',\n es: 'Por favor, introduce una dirección de correo electrónico válida',\n },\n url: {\n en: 'Please enter a valid URL',\n ja: '有効なURLを入力してください',\n vi: 'Vui lòng nhập URL hợp lệ',\n ko: '유효한 URL을 입력하세요',\n 'zh-CN': '请输入有效的URL',\n 'zh-TW': '請輸入有效的網址',\n th: 'กรุณากรอก URL ที่ถูกต้อง',\n es: 'Por favor, introduce una URL válida',\n },\n pattern: {\n en: '${displayName} format is invalid',\n ja: '${displayName}の形式が正しくありません',\n vi: '${displayName} không đúng định dạng',\n ko: '${displayName} 형식이 올바르지 않습니다',\n 'zh-CN': '${displayName}格式不正确',\n 'zh-TW': '${displayName}格式不正確',\n th: 'รูปแบบ${displayName}ไม่ถูกต้อง',\n es: 'El formato de ${displayName} no es válido',\n },\n};\n\n// State\nlet currentLocale = 'ja';\nlet fallbackLocale = 'en';\nlet customMessages: Record<string, Record<string, string>> = {};\n\n/**\n * Reset all settings to defaults (for testing)\n * @internal\n */\nexport function resetZodI18n(): void {\n currentLocale = 'ja';\n fallbackLocale = 'en';\n customMessages = {};\n}\n\n/**\n * Set current locale for Zod validation messages\n */\nexport function setZodLocale(locale: string): void {\n currentLocale = locale;\n}\n\n/**\n * Get current locale\n */\nexport function getZodLocale(): string {\n return currentLocale;\n}\n\n/**\n * Set fallback locale (used when message not found in current locale)\n */\nexport function setZodFallbackLocale(locale: string): void {\n fallbackLocale = locale;\n}\n\n/**\n * Get fallback locale\n */\nexport function getZodFallbackLocale(): string {\n return fallbackLocale;\n}\n\n/**\n * Add custom validation messages\n * @param messages - Object with message keys and locale values\n */\nexport function addZodMessages(messages: Record<string, Record<string, string>>): void {\n for (const [key, locales] of Object.entries(messages)) {\n customMessages[key] = { ...customMessages[key], ...locales };\n }\n}\n\n/**\n * Get translated validation message\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getZodMessage('required', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getZodMessage(\n key: string,\n params: Record<string, string | number> = {}\n): string {\n // Try custom messages first, then defaults\n const messages = customMessages[key] ?? DEFAULT_MESSAGES[key];\n if (!messages) return key;\n\n let message =\n messages[currentLocale] ??\n messages[fallbackLocale] ??\n messages['en'] ??\n key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\\\{${param}\\\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all messages for a specific locale\n */\nexport function getZodMessages(locale?: string): Record<string, string> {\n const targetLocale = locale ?? currentLocale;\n const result: Record<string, string> = {};\n\n // Start with defaults\n for (const [key, locales] of Object.entries(DEFAULT_MESSAGES)) {\n result[key] = locales[targetLocale] ?? locales[fallbackLocale] ?? locales['en'] ?? key;\n }\n\n // Override with custom\n for (const [key, locales] of Object.entries(customMessages)) {\n if (locales[targetLocale]) {\n result[key] = locales[targetLocale];\n }\n }\n\n return result;\n}\n","/**\n * Form validation utilities for Ant Design + Zod\n *\n * Compatible with Zod v3.x and v4.x\n *\n * @example\n * ```typescript\n * import { zodRule, requiredRule } from '@famgia/omnify-react/lib';\n *\n * <Form.Item\n * name=\"email\"\n * rules={[zodRule(customerSchemas.email, 'メールアドレス')]}\n * >\n * <Input />\n * </Form.Item>\n * ```\n */\n\nimport type { RuleObject } from 'antd/es/form';\nimport type { z } from 'zod';\nimport { getZodMessage } from './zod-i18n';\n\n/**\n * Convert Zod schema to Ant Design Form rule with i18n support\n *\n * @example\n * // Set locale once at component level\n * setZodLocale('ja');\n *\n * // Use without passing locale\n * <Form.Item\n * name=\"email\"\n * rules={[zodRule(customerSchemas.email, 'メールアドレス')]}\n * >\n * <Input />\n * </Form.Item>\n */\nexport function zodRule<T extends z.ZodTypeAny>(\n schema: T,\n displayName?: string\n): RuleObject {\n const field = displayName ?? 'この項目';\n\n return {\n validator: async (_, value) => {\n // 空チェック - 必須として扱う\n if (value === undefined || value === null || value === '') {\n if (schema.safeParse(undefined).success) return;\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n\n const result = schema.safeParse(value);\n if (result.success) return;\n\n // 最初のZodエラーを取得\n const issue = result.error.issues[0];\n if (!issue) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n\n // エラータイプに基づいて翻訳(Zod v3/v4対応)\n const issueAny = issue as unknown as Record<string, unknown>;\n switch (issue.code) {\n case 'too_small': {\n const origin = issueAny.origin as string | undefined;\n const minimum = issueAny.minimum as number;\n if (origin === 'string' && minimum === 1) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n if (origin === 'string') {\n throw new Error(getZodMessage('minLength', { displayName: field, min: minimum }));\n }\n throw new Error(getZodMessage('min', { displayName: field, min: minimum }));\n }\n\n case 'too_big': {\n const origin = issueAny.origin as string | undefined;\n const maximum = issueAny.maximum as number;\n if (origin === 'string') {\n throw new Error(getZodMessage('maxLength', { displayName: field, max: maximum }));\n }\n throw new Error(getZodMessage('max', { displayName: field, max: maximum }));\n }\n\n // Zod v4: 'invalid_string' → 'invalid_format'\n case 'invalid_format': {\n const format = issueAny.format as string | undefined;\n if (format === 'email') {\n throw new Error(getZodMessage('email', { displayName: field }));\n }\n if (format === 'url') {\n throw new Error(getZodMessage('url', { displayName: field }));\n }\n if (format === 'regex') {\n throw new Error(getZodMessage('pattern', { displayName: field }));\n }\n break;\n }\n\n // Zod v3: 'invalid_string' (handled via default case for forward compatibility)\n default: {\n // Zod v3 compatibility: handle invalid_string code\n if ((issue.code as string) === 'invalid_string') {\n const validation = issueAny.validation as string | undefined;\n if (validation === 'email') {\n throw new Error(getZodMessage('email', { displayName: field }));\n }\n if (validation === 'url') {\n throw new Error(getZodMessage('url', { displayName: field }));\n }\n if (validation === 'regex') {\n throw new Error(getZodMessage('pattern', { displayName: field }));\n }\n }\n break;\n }\n\n case 'invalid_type': {\n const expected = issueAny.expected as string | undefined;\n if (expected && value === undefined) {\n throw new Error(getZodMessage('required', { displayName: field }));\n }\n break;\n }\n }\n\n // フォールバック: Zodのオリジナルメッセージを使用\n throw new Error(issue.message);\n },\n };\n}\n\n/**\n * Create required rule with i18n message\n *\n * @example\n * <Form.Item\n * name=\"name\"\n * rules={[requiredRule('名前')]}\n * >\n * <Input />\n * </Form.Item>\n */\nexport function requiredRule(displayName: string): RuleObject {\n return {\n required: true,\n message: getZodMessage('required', { displayName }),\n };\n}\n\n/**\n * Check if a Zod schema represents a required field\n */\nexport function isZodRequired(schema: z.ZodTypeAny): boolean {\n const schemaDesc = (schema as any)?._def?.typeName;\n const inner = (schema as any)?._def?.innerType;\n\n if (schemaDesc === 'ZodOptional' || schemaDesc === 'ZodNullable') return false;\n if (inner?._def?.typeName === 'ZodOptional' || inner?._def?.typeName === 'ZodNullable') return false;\n\n return true;\n}\n","/**\n * Japanese Kana Validation Rules\n *\n * Provides configurable validation for Japanese character input:\n * - 全角カタカナ (Full-width Katakana) - default\n * - 半角カタカナ (Half-width Katakana)\n * - ひらがな (Hiragana)\n * - Mixed modes\n *\n * @example\n * ```typescript\n * import { kanaString, KATAKANA_PATTERN } from '@famgia/omnify-react/lib';\n * import { z } from 'zod';\n *\n * // Method 1: Use kanaString helper\n * const schema = z.object({\n * name_kana: kanaString(), // 全角カタカナ (default)\n * });\n *\n * // Method 2: Use pattern directly\n * const schema2 = z.object({\n * name_kana: z.string().regex(KATAKANA_PATTERN, '全角カタカナで入力してください'),\n * });\n * ```\n */\n\nimport { z } from 'zod';\n\nexport interface KanaRuleOptions {\n /** Allow full-width katakana (ア-ン) - default: true */\n fullWidthKatakana?: boolean;\n /** Allow half-width katakana (ア-ン) - default: false */\n halfWidthKatakana?: boolean;\n /** Allow hiragana (あ-ん) - default: false */\n hiragana?: boolean;\n /** Allow numbers (0-9, 0-9) - default: false */\n allowNumbers?: boolean;\n /** Allow full-width numbers (0-9) - default: false */\n fullWidthNumbers?: boolean;\n /** Allow half-width numbers (0-9) - default: false */\n halfWidthNumbers?: boolean;\n /** Allow spaces (full-width and half-width) - default: true */\n allowSpaces?: boolean;\n /** Allow specific special characters - default: ['ー', '・'] */\n allowSpecialChars?: string[];\n /** Custom error message */\n message?: string;\n}\n\n// Character ranges\nconst CHAR_RANGES = {\n // Full-width Katakana: ァ-ヶ (U+30A1-U+30F6) + ー (U+30FC)\n fullWidthKatakana: 'ァ-ヶー',\n // Half-width Katakana: ヲ-゚ (U+FF66-U+FF9F)\n halfWidthKatakana: 'ヲ-゚',\n // Hiragana: ぁ-ゖ (U+3041-U+3096)\n hiragana: 'ぁ-ゖ',\n // Full-width numbers: 0-9\n fullWidthNumbers: '0-9',\n // Half-width numbers: 0-9\n halfWidthNumbers: '0-9',\n // Full-width space: (U+3000)\n fullWidthSpace: ' ',\n // Half-width space\n halfWidthSpace: ' ',\n // Common special chars for names\n defaultSpecialChars: ['ー', '・'],\n} as const;\n\n// Default options: 全角カタカナ + spaces + ー・\nconst DEFAULT_OPTIONS: Required<KanaRuleOptions> = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowNumbers: false,\n fullWidthNumbers: false,\n halfWidthNumbers: false,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n message: '',\n};\n\n/**\n * Build regex pattern from options\n */\nfunction buildKanaPattern(options: KanaRuleOptions = {}): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const parts: string[] = [];\n\n if (opts.fullWidthKatakana) {\n parts.push(CHAR_RANGES.fullWidthKatakana);\n }\n if (opts.halfWidthKatakana) {\n parts.push(CHAR_RANGES.halfWidthKatakana);\n }\n if (opts.hiragana) {\n parts.push(CHAR_RANGES.hiragana);\n }\n if (opts.allowNumbers || opts.fullWidthNumbers) {\n parts.push(CHAR_RANGES.fullWidthNumbers);\n }\n if (opts.allowNumbers || opts.halfWidthNumbers) {\n parts.push(CHAR_RANGES.halfWidthNumbers);\n }\n if (opts.allowSpaces) {\n parts.push(CHAR_RANGES.fullWidthSpace);\n parts.push(CHAR_RANGES.halfWidthSpace);\n }\n if (opts.allowSpecialChars && opts.allowSpecialChars.length > 0) {\n // Escape special regex chars\n const escaped = opts.allowSpecialChars\n .map((c) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('');\n parts.push(escaped);\n }\n\n return `^[${parts.join('')}]*$`;\n}\n\n/**\n * Get default error message based on options\n */\nfunction getDefaultMessage(options: KanaRuleOptions = {}, locale = 'ja'): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const messages: Record<string, Record<string, string>> = {\n ja: {\n fullWidthKatakana: '全角カタカナ',\n halfWidthKatakana: '半角カタカナ',\n hiragana: 'ひらがな',\n mixed: 'カナ文字',\n },\n en: {\n fullWidthKatakana: 'full-width katakana',\n halfWidthKatakana: 'half-width katakana',\n hiragana: 'hiragana',\n mixed: 'kana characters',\n },\n };\n\n const msg = messages[locale] ?? messages['ja'];\n\n // Determine what type to show in message\n let type = msg.mixed;\n if (opts.fullWidthKatakana && !opts.halfWidthKatakana && !opts.hiragana) {\n type = msg.fullWidthKatakana;\n } else if (opts.halfWidthKatakana && !opts.fullWidthKatakana && !opts.hiragana) {\n type = msg.halfWidthKatakana;\n } else if (opts.hiragana && !opts.fullWidthKatakana && !opts.halfWidthKatakana) {\n type = msg.hiragana;\n }\n\n if (locale === 'ja') {\n return `${type}で入力してください`;\n }\n return `Please enter in ${type}`;\n}\n\n/**\n * Create a kana validation regex\n */\nexport function createKanaRegex(options: KanaRuleOptions = {}): RegExp {\n return new RegExp(buildKanaPattern(options));\n}\n\n/**\n * Validate a string against kana rules\n */\nexport function validateKana(value: string, options: KanaRuleOptions = {}): boolean {\n if (!value) return true; // Empty is valid (use required for that)\n const regex = createKanaRegex(options);\n return regex.test(value);\n}\n\n/**\n * Get kana validation pattern string (for Zod .regex())\n */\nexport function getKanaPattern(options: KanaRuleOptions = {}): string {\n return buildKanaPattern(options);\n}\n\n/**\n * Get error message for kana validation\n */\nexport function getKanaErrorMessage(options: KanaRuleOptions = {}, locale = 'ja'): string {\n return options.message ?? getDefaultMessage(options, locale);\n}\n\n// ============================================================================\n// Preset configurations\n// ============================================================================\n\n/** 全角カタカナ (Full-width Katakana) - Default for Japanese names */\nexport const KATAKANA_FULL_WIDTH: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n};\n\n/** 半角カタカナ (Half-width Katakana) - Legacy systems */\nexport const KATAKANA_HALF_WIDTH: KanaRuleOptions = {\n fullWidthKatakana: false,\n halfWidthKatakana: true,\n hiragana: false,\n allowSpaces: true,\n allowSpecialChars: ['ー'], // Half-width prolonged sound mark\n};\n\n/** ひらがな (Hiragana) */\nexport const HIRAGANA: KanaRuleOptions = {\n fullWidthKatakana: false,\n halfWidthKatakana: false,\n hiragana: true,\n allowSpaces: true,\n allowSpecialChars: ['ー'],\n};\n\n/** カタカナ + ひらがな (Any kana) */\nexport const KANA_ANY: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: true,\n hiragana: true,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・', 'ー'],\n};\n\n/** 全角カタカナ + 数字 (Full-width katakana with numbers) */\nexport const KATAKANA_WITH_NUMBERS: KanaRuleOptions = {\n fullWidthKatakana: true,\n halfWidthKatakana: false,\n hiragana: false,\n allowNumbers: true,\n allowSpaces: true,\n allowSpecialChars: ['ー', '・'],\n};\n\n// ============================================================================\n// Pattern strings for Zod .regex()\n// ============================================================================\n\n/** Pattern: 全角カタカナ + スペース + ー・ (for z.string().regex()) */\nexport const KATAKANA_PATTERN = /^[ァ-ヶー・ ]*$/;\n\n/** Pattern: 半角カタカナ (for z.string().regex()) */\nexport const KATAKANA_HALF_PATTERN = /^[ヲ-゚ー ]*$/;\n\n/** Pattern: ひらがな (for z.string().regex()) */\nexport const HIRAGANA_PATTERN = /^[ぁ-ゖー ]*$/;\n\n/** Pattern: すべてのかな (for z.string().regex()) */\nexport const KANA_ANY_PATTERN = /^[ァ-ヶぁ-ゖヲ-゚ー・ー ]*$/;\n\n// ============================================================================\n// Zod refinement helpers\n// ============================================================================\n\n/**\n * Create Zod string schema with kana validation\n * @example\n * const schema = z.object({\n * name_kana: kanaString(), // 全角カタカナ (default)\n * name_kana2: kanaString({ hiragana: true }), // カタカナ + ひらがな\n * });\n */\nexport function kanaString(options: KanaRuleOptions = {}) {\n const opts = { ...KATAKANA_FULL_WIDTH, ...options };\n const regex = createKanaRegex(opts);\n const message = getKanaErrorMessage(opts);\n\n return z.string().regex(regex, { message });\n}\n\n/**\n * Add kana validation to existing Zod string schema\n * @example\n * const schema = z.string().min(1).pipe(withKana());\n */\nexport function withKana(options: KanaRuleOptions = {}) {\n return kanaString(options);\n}\n\n// Default export\nexport const kanaRules = {\n createRegex: createKanaRegex,\n validate: validateKana,\n getPattern: getKanaPattern,\n getMessage: getKanaErrorMessage,\n // Zod helpers\n string: kanaString,\n // Presets\n presets: {\n fullWidthKatakana: KATAKANA_FULL_WIDTH,\n halfWidthKatakana: KATAKANA_HALF_WIDTH,\n hiragana: HIRAGANA,\n any: KANA_ANY,\n withNumbers: KATAKANA_WITH_NUMBERS,\n },\n // Pattern constants for direct use\n patterns: {\n katakana: KATAKANA_PATTERN,\n katakanaHalf: KATAKANA_HALF_PATTERN,\n hiragana: HIRAGANA_PATTERN,\n any: KANA_ANY_PATTERN,\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACmBA,IAAM,mBAA2D;AAAA,EAC/D,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACF;AAGA,IAAI,gBAAgB;AACpB,IAAI,iBAAiB;AACrB,IAAI,iBAAyD,CAAC;AAevD,SAAS,aAAa,QAAsB;AACjD,kBAAgB;AAClB;AAKO,SAAS,eAAuB;AACrC,SAAO;AACT;AAKO,SAAS,qBAAqB,QAAsB;AACzD,mBAAiB;AACnB;AAKO,SAAS,uBAA+B;AAC7C,SAAO;AACT;AAMO,SAAS,eAAe,UAAwD;AACrF,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,mBAAe,GAAG,IAAI,EAAE,GAAG,eAAe,GAAG,GAAG,GAAG,QAAQ;AAAA,EAC7D;AACF;AAaO,SAAS,cACd,KACA,SAA0C,CAAC,GACnC;AAER,QAAM,WAAW,eAAe,GAAG,KAAK,iBAAiB,GAAG;AAC5D,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,UACF,SAAS,aAAa,KACtB,SAAS,cAAc,KACvB,SAAS,IAAI,KACb;AAGF,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,cAAU,QAAQ,QAAQ,IAAI,OAAO,SAAS,KAAK,OAAO,GAAG,GAAG,OAAO,KAAK,CAAC;AAAA,EAC/E;AAEA,SAAO;AACT;AAKO,SAAS,eAAe,QAAyC;AACtE,QAAM,eAAe,UAAU;AAC/B,QAAM,SAAiC,CAAC;AAGxC,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AAC7D,WAAO,GAAG,IAAI,QAAQ,YAAY,KAAK,QAAQ,cAAc,KAAK,QAAQ,IAAI,KAAK;AAAA,EACrF;AAGA,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC3D,QAAI,QAAQ,YAAY,GAAG;AACzB,aAAO,GAAG,IAAI,QAAQ,YAAY;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;;;AC3KO,SAAS,QACd,QACA,aACY;AACZ,QAAM,QAAQ,eAAe;AAE7B,SAAO;AAAA,IACL,WAAW,OAAO,GAAG,UAAU;AAE7B,UAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,YAAI,OAAO,UAAU,MAAS,EAAE,QAAS;AACzC,cAAM,IAAI,MAAM,cAAc,YAAY,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,MACnE;AAEA,YAAM,SAAS,OAAO,UAAU,KAAK;AACrC,UAAI,OAAO,QAAS;AAGpB,YAAM,QAAQ,OAAO,MAAM,OAAO,CAAC;AACnC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,cAAc,YAAY,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,MACnE;AAGA,YAAM,WAAW;AACjB,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK,aAAa;AAChB,gBAAM,SAAS,SAAS;AACxB,gBAAM,UAAU,SAAS;AACzB,cAAI,WAAW,YAAY,YAAY,GAAG;AACxC,kBAAM,IAAI,MAAM,cAAc,YAAY,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,UACnE;AACA,cAAI,WAAW,UAAU;AACvB,kBAAM,IAAI,MAAM,cAAc,aAAa,EAAE,aAAa,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,UAClF;AACA,gBAAM,IAAI,MAAM,cAAc,OAAO,EAAE,aAAa,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,QAC5E;AAAA,QAEA,KAAK,WAAW;AACd,gBAAM,SAAS,SAAS;AACxB,gBAAM,UAAU,SAAS;AACzB,cAAI,WAAW,UAAU;AACvB,kBAAM,IAAI,MAAM,cAAc,aAAa,EAAE,aAAa,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,UAClF;AACA,gBAAM,IAAI,MAAM,cAAc,OAAO,EAAE,aAAa,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,QAC5E;AAAA;AAAA,QAGA,KAAK,kBAAkB;AACrB,gBAAM,SAAS,SAAS;AACxB,cAAI,WAAW,SAAS;AACtB,kBAAM,IAAI,MAAM,cAAc,SAAS,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,UAChE;AACA,cAAI,WAAW,OAAO;AACpB,kBAAM,IAAI,MAAM,cAAc,OAAO,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,UAC9D;AACA,cAAI,WAAW,SAAS;AACtB,kBAAM,IAAI,MAAM,cAAc,WAAW,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,UAClE;AACA;AAAA,QACF;AAAA;AAAA,QAGA,SAAS;AAEP,cAAK,MAAM,SAAoB,kBAAkB;AAC/C,kBAAM,aAAa,SAAS;AAC5B,gBAAI,eAAe,SAAS;AAC1B,oBAAM,IAAI,MAAM,cAAc,SAAS,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,YAChE;AACA,gBAAI,eAAe,OAAO;AACxB,oBAAM,IAAI,MAAM,cAAc,OAAO,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,YAC9D;AACA,gBAAI,eAAe,SAAS;AAC1B,oBAAM,IAAI,MAAM,cAAc,WAAW,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,YAClE;AAAA,UACF;AACA;AAAA,QACF;AAAA,QAEA,KAAK,gBAAgB;AACnB,gBAAM,WAAW,SAAS;AAC1B,cAAI,YAAY,UAAU,QAAW;AACnC,kBAAM,IAAI,MAAM,cAAc,YAAY,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,UACnE;AACA;AAAA,QACF;AAAA,MACF;AAGA,YAAM,IAAI,MAAM,MAAM,OAAO;AAAA,IAC/B;AAAA,EACF;AACF;AAaO,SAAS,aAAa,aAAiC;AAC5D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,cAAc,YAAY,EAAE,YAAY,CAAC;AAAA,EACpD;AACF;AAKO,SAAS,cAAc,QAA+B;AAC3D,QAAM,aAAc,QAAgB,MAAM;AAC1C,QAAM,QAAS,QAAgB,MAAM;AAErC,MAAI,eAAe,iBAAiB,eAAe,cAAe,QAAO;AACzE,MAAI,OAAO,MAAM,aAAa,iBAAiB,OAAO,MAAM,aAAa,cAAe,QAAO;AAE/F,SAAO;AACT;;;ACvIA,iBAAkB;AAwBlB,IAAM,cAAc;AAAA;AAAA,EAElB,mBAAmB;AAAA;AAAA,EAEnB,mBAAmB;AAAA;AAAA,EAEnB,UAAU;AAAA;AAAA,EAEV,kBAAkB;AAAA;AAAA,EAElB,kBAAkB;AAAA;AAAA,EAElB,gBAAgB;AAAA;AAAA,EAEhB,gBAAgB;AAAA;AAAA,EAEhB,qBAAqB,CAAC,UAAK,QAAG;AAChC;AAGA,IAAM,kBAA6C;AAAA,EACjD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,mBAAmB,CAAC,UAAK,QAAG;AAAA,EAC5B,SAAS;AACX;AAKA,SAAS,iBAAiB,UAA2B,CAAC,GAAW;AAC/D,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,QAAM,QAAkB,CAAC;AAEzB,MAAI,KAAK,mBAAmB;AAC1B,UAAM,KAAK,YAAY,iBAAiB;AAAA,EAC1C;AACA,MAAI,KAAK,mBAAmB;AAC1B,UAAM,KAAK,YAAY,iBAAiB;AAAA,EAC1C;AACA,MAAI,KAAK,UAAU;AACjB,UAAM,KAAK,YAAY,QAAQ;AAAA,EACjC;AACA,MAAI,KAAK,gBAAgB,KAAK,kBAAkB;AAC9C,UAAM,KAAK,YAAY,gBAAgB;AAAA,EACzC;AACA,MAAI,KAAK,gBAAgB,KAAK,kBAAkB;AAC9C,UAAM,KAAK,YAAY,gBAAgB;AAAA,EACzC;AACA,MAAI,KAAK,aAAa;AACpB,UAAM,KAAK,YAAY,cAAc;AACrC,UAAM,KAAK,YAAY,cAAc;AAAA,EACvC;AACA,MAAI,KAAK,qBAAqB,KAAK,kBAAkB,SAAS,GAAG;AAE/D,UAAM,UAAU,KAAK,kBAClB,IAAI,CAAC,MAAM,EAAE,QAAQ,uBAAuB,MAAM,CAAC,EACnD,KAAK,EAAE;AACV,UAAM,KAAK,OAAO;AAAA,EACpB;AAEA,SAAO,KAAK,MAAM,KAAK,EAAE,CAAC;AAC5B;AAKA,SAAS,kBAAkB,UAA2B,CAAC,GAAG,SAAS,MAAc;AAC/E,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAE9C,QAAM,WAAmD;AAAA,IACvD,IAAI;AAAA,MACF,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,IAAI;AAAA,MACF,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,SAAS,MAAM,KAAK,SAAS,IAAI;AAG7C,MAAI,OAAO,IAAI;AACf,MAAI,KAAK,qBAAqB,CAAC,KAAK,qBAAqB,CAAC,KAAK,UAAU;AACvE,WAAO,IAAI;AAAA,EACb,WAAW,KAAK,qBAAqB,CAAC,KAAK,qBAAqB,CAAC,KAAK,UAAU;AAC9E,WAAO,IAAI;AAAA,EACb,WAAW,KAAK,YAAY,CAAC,KAAK,qBAAqB,CAAC,KAAK,mBAAmB;AAC9E,WAAO,IAAI;AAAA,EACb;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,mBAAmB,IAAI;AAChC;AAKO,SAAS,gBAAgB,UAA2B,CAAC,GAAW;AACrE,SAAO,IAAI,OAAO,iBAAiB,OAAO,CAAC;AAC7C;AAKO,SAAS,aAAa,OAAe,UAA2B,CAAC,GAAY;AAClF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,gBAAgB,OAAO;AACrC,SAAO,MAAM,KAAK,KAAK;AACzB;AAKO,SAAS,eAAe,UAA2B,CAAC,GAAW;AACpE,SAAO,iBAAiB,OAAO;AACjC;AAKO,SAAS,oBAAoB,UAA2B,CAAC,GAAG,SAAS,MAAc;AACxF,SAAO,QAAQ,WAAW,kBAAkB,SAAS,MAAM;AAC7D;AAOO,IAAM,sBAAuC;AAAA,EAClD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,mBAAmB,CAAC,UAAK,QAAG;AAC9B;AAGO,IAAM,sBAAuC;AAAA,EAClD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,mBAAmB,CAAC,QAAG;AAAA;AACzB;AAGO,IAAM,WAA4B;AAAA,EACvC,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,mBAAmB,CAAC,QAAG;AACzB;AAGO,IAAM,WAA4B;AAAA,EACvC,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,mBAAmB,CAAC,UAAK,UAAK,QAAG;AACnC;AAGO,IAAM,wBAAyC;AAAA,EACpD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB,CAAC,UAAK,QAAG;AAC9B;AAOO,IAAM,mBAAmB;AAGzB,IAAM,wBAAwB;AAG9B,IAAM,mBAAmB;AAGzB,IAAM,mBAAmB;AAczB,SAAS,WAAW,UAA2B,CAAC,GAAG;AACxD,QAAM,OAAO,EAAE,GAAG,qBAAqB,GAAG,QAAQ;AAClD,QAAM,QAAQ,gBAAgB,IAAI;AAClC,QAAM,UAAU,oBAAoB,IAAI;AAExC,SAAO,aAAE,OAAO,EAAE,MAAM,OAAO,EAAE,QAAQ,CAAC;AAC5C;AAOO,SAAS,SAAS,UAA2B,CAAC,GAAG;AACtD,SAAO,WAAW,OAAO;AAC3B;AAGO,IAAM,YAAY;AAAA,EACvB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAEZ,QAAQ;AAAA;AAAA,EAER,SAAS;AAAA,IACP,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,aAAa;AAAA,EACf;AAAA;AAAA,EAEA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,IACd,UAAU;AAAA,IACV,KAAK;AAAA,EACP;AACF;","names":[]}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { RuleObject } from 'antd/es/form';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Set current locale for Zod validation messages
|
|
6
|
+
*/
|
|
7
|
+
declare function setZodLocale(locale: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Get current locale
|
|
10
|
+
*/
|
|
11
|
+
declare function getZodLocale(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Set fallback locale (used when message not found in current locale)
|
|
14
|
+
*/
|
|
15
|
+
declare function setZodFallbackLocale(locale: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get fallback locale
|
|
18
|
+
*/
|
|
19
|
+
declare function getZodFallbackLocale(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Add custom validation messages
|
|
22
|
+
* @param messages - Object with message keys and locale values
|
|
23
|
+
*/
|
|
24
|
+
declare function addZodMessages(messages: Record<string, Record<string, string>>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get translated validation message
|
|
27
|
+
*
|
|
28
|
+
* @param key - Message key (e.g., 'required', 'minLength')
|
|
29
|
+
* @param params - Template parameters to replace
|
|
30
|
+
* @returns Formatted message string
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* getZodMessage('required', { displayName: '氏名' })
|
|
34
|
+
* // => '氏名は必須です'
|
|
35
|
+
*/
|
|
36
|
+
declare function getZodMessage(key: string, params?: Record<string, string | number>): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get all messages for a specific locale
|
|
39
|
+
*/
|
|
40
|
+
declare function getZodMessages(locale?: string): Record<string, string>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Form validation utilities for Ant Design + Zod
|
|
44
|
+
*
|
|
45
|
+
* Compatible with Zod v3.x and v4.x
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* import { zodRule, requiredRule } from '@famgia/omnify-react/lib';
|
|
50
|
+
*
|
|
51
|
+
* <Form.Item
|
|
52
|
+
* name="email"
|
|
53
|
+
* rules={[zodRule(customerSchemas.email, 'メールアドレス')]}
|
|
54
|
+
* >
|
|
55
|
+
* <Input />
|
|
56
|
+
* </Form.Item>
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Convert Zod schema to Ant Design Form rule with i18n support
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Set locale once at component level
|
|
65
|
+
* setZodLocale('ja');
|
|
66
|
+
*
|
|
67
|
+
* // Use without passing locale
|
|
68
|
+
* <Form.Item
|
|
69
|
+
* name="email"
|
|
70
|
+
* rules={[zodRule(customerSchemas.email, 'メールアドレス')]}
|
|
71
|
+
* >
|
|
72
|
+
* <Input />
|
|
73
|
+
* </Form.Item>
|
|
74
|
+
*/
|
|
75
|
+
declare function zodRule<T extends z.ZodTypeAny>(schema: T, displayName?: string): RuleObject;
|
|
76
|
+
/**
|
|
77
|
+
* Create required rule with i18n message
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* <Form.Item
|
|
81
|
+
* name="name"
|
|
82
|
+
* rules={[requiredRule('名前')]}
|
|
83
|
+
* >
|
|
84
|
+
* <Input />
|
|
85
|
+
* </Form.Item>
|
|
86
|
+
*/
|
|
87
|
+
declare function requiredRule(displayName: string): RuleObject;
|
|
88
|
+
/**
|
|
89
|
+
* Check if a Zod schema represents a required field
|
|
90
|
+
*/
|
|
91
|
+
declare function isZodRequired(schema: z.ZodTypeAny): boolean;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Japanese Kana Validation Rules
|
|
95
|
+
*
|
|
96
|
+
* Provides configurable validation for Japanese character input:
|
|
97
|
+
* - 全角カタカナ (Full-width Katakana) - default
|
|
98
|
+
* - 半角カタカナ (Half-width Katakana)
|
|
99
|
+
* - ひらがな (Hiragana)
|
|
100
|
+
* - Mixed modes
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* import { kanaString, KATAKANA_PATTERN } from '@famgia/omnify-react/lib';
|
|
105
|
+
* import { z } from 'zod';
|
|
106
|
+
*
|
|
107
|
+
* // Method 1: Use kanaString helper
|
|
108
|
+
* const schema = z.object({
|
|
109
|
+
* name_kana: kanaString(), // 全角カタカナ (default)
|
|
110
|
+
* });
|
|
111
|
+
*
|
|
112
|
+
* // Method 2: Use pattern directly
|
|
113
|
+
* const schema2 = z.object({
|
|
114
|
+
* name_kana: z.string().regex(KATAKANA_PATTERN, '全角カタカナで入力してください'),
|
|
115
|
+
* });
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
interface KanaRuleOptions {
|
|
120
|
+
/** Allow full-width katakana (ア-ン) - default: true */
|
|
121
|
+
fullWidthKatakana?: boolean;
|
|
122
|
+
/** Allow half-width katakana (ア-ン) - default: false */
|
|
123
|
+
halfWidthKatakana?: boolean;
|
|
124
|
+
/** Allow hiragana (あ-ん) - default: false */
|
|
125
|
+
hiragana?: boolean;
|
|
126
|
+
/** Allow numbers (0-9, 0-9) - default: false */
|
|
127
|
+
allowNumbers?: boolean;
|
|
128
|
+
/** Allow full-width numbers (0-9) - default: false */
|
|
129
|
+
fullWidthNumbers?: boolean;
|
|
130
|
+
/** Allow half-width numbers (0-9) - default: false */
|
|
131
|
+
halfWidthNumbers?: boolean;
|
|
132
|
+
/** Allow spaces (full-width and half-width) - default: true */
|
|
133
|
+
allowSpaces?: boolean;
|
|
134
|
+
/** Allow specific special characters - default: ['ー', '・'] */
|
|
135
|
+
allowSpecialChars?: string[];
|
|
136
|
+
/** Custom error message */
|
|
137
|
+
message?: string;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a kana validation regex
|
|
141
|
+
*/
|
|
142
|
+
declare function createKanaRegex(options?: KanaRuleOptions): RegExp;
|
|
143
|
+
/**
|
|
144
|
+
* Validate a string against kana rules
|
|
145
|
+
*/
|
|
146
|
+
declare function validateKana(value: string, options?: KanaRuleOptions): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Get kana validation pattern string (for Zod .regex())
|
|
149
|
+
*/
|
|
150
|
+
declare function getKanaPattern(options?: KanaRuleOptions): string;
|
|
151
|
+
/**
|
|
152
|
+
* Get error message for kana validation
|
|
153
|
+
*/
|
|
154
|
+
declare function getKanaErrorMessage(options?: KanaRuleOptions, locale?: string): string;
|
|
155
|
+
/** 全角カタカナ (Full-width Katakana) - Default for Japanese names */
|
|
156
|
+
declare const KATAKANA_FULL_WIDTH: KanaRuleOptions;
|
|
157
|
+
/** 半角カタカナ (Half-width Katakana) - Legacy systems */
|
|
158
|
+
declare const KATAKANA_HALF_WIDTH: KanaRuleOptions;
|
|
159
|
+
/** ひらがな (Hiragana) */
|
|
160
|
+
declare const HIRAGANA: KanaRuleOptions;
|
|
161
|
+
/** カタカナ + ひらがな (Any kana) */
|
|
162
|
+
declare const KANA_ANY: KanaRuleOptions;
|
|
163
|
+
/** 全角カタカナ + 数字 (Full-width katakana with numbers) */
|
|
164
|
+
declare const KATAKANA_WITH_NUMBERS: KanaRuleOptions;
|
|
165
|
+
/** Pattern: 全角カタカナ + スペース + ー・ (for z.string().regex()) */
|
|
166
|
+
declare const KATAKANA_PATTERN: RegExp;
|
|
167
|
+
/** Pattern: 半角カタカナ (for z.string().regex()) */
|
|
168
|
+
declare const KATAKANA_HALF_PATTERN: RegExp;
|
|
169
|
+
/** Pattern: ひらがな (for z.string().regex()) */
|
|
170
|
+
declare const HIRAGANA_PATTERN: RegExp;
|
|
171
|
+
/** Pattern: すべてのかな (for z.string().regex()) */
|
|
172
|
+
declare const KANA_ANY_PATTERN: RegExp;
|
|
173
|
+
/**
|
|
174
|
+
* Create Zod string schema with kana validation
|
|
175
|
+
* @example
|
|
176
|
+
* const schema = z.object({
|
|
177
|
+
* name_kana: kanaString(), // 全角カタカナ (default)
|
|
178
|
+
* name_kana2: kanaString({ hiragana: true }), // カタカナ + ひらがな
|
|
179
|
+
* });
|
|
180
|
+
*/
|
|
181
|
+
declare function kanaString(options?: KanaRuleOptions): z.ZodString;
|
|
182
|
+
/**
|
|
183
|
+
* Add kana validation to existing Zod string schema
|
|
184
|
+
* @example
|
|
185
|
+
* const schema = z.string().min(1).pipe(withKana());
|
|
186
|
+
*/
|
|
187
|
+
declare function withKana(options?: KanaRuleOptions): z.ZodString;
|
|
188
|
+
declare const kanaRules: {
|
|
189
|
+
createRegex: typeof createKanaRegex;
|
|
190
|
+
validate: typeof validateKana;
|
|
191
|
+
getPattern: typeof getKanaPattern;
|
|
192
|
+
getMessage: typeof getKanaErrorMessage;
|
|
193
|
+
string: typeof kanaString;
|
|
194
|
+
presets: {
|
|
195
|
+
fullWidthKatakana: KanaRuleOptions;
|
|
196
|
+
halfWidthKatakana: KanaRuleOptions;
|
|
197
|
+
hiragana: KanaRuleOptions;
|
|
198
|
+
any: KanaRuleOptions;
|
|
199
|
+
withNumbers: KanaRuleOptions;
|
|
200
|
+
};
|
|
201
|
+
patterns: {
|
|
202
|
+
katakana: RegExp;
|
|
203
|
+
katakanaHalf: RegExp;
|
|
204
|
+
hiragana: RegExp;
|
|
205
|
+
any: RegExp;
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
export { HIRAGANA, HIRAGANA_PATTERN, KANA_ANY, KANA_ANY_PATTERN, KATAKANA_FULL_WIDTH, KATAKANA_HALF_PATTERN, KATAKANA_HALF_WIDTH, KATAKANA_PATTERN, KATAKANA_WITH_NUMBERS, type KanaRuleOptions, addZodMessages, createKanaRegex, getKanaErrorMessage, getKanaPattern, getZodFallbackLocale, getZodLocale, getZodMessage, getZodMessages, isZodRequired, getKanaPattern as kanaPattern, createKanaRegex as kanaRegex, kanaRules, kanaString, requiredRule, setZodFallbackLocale, setZodLocale, validateKana, withKana, zodRule };
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { RuleObject } from 'antd/es/form';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Set current locale for Zod validation messages
|
|
6
|
+
*/
|
|
7
|
+
declare function setZodLocale(locale: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Get current locale
|
|
10
|
+
*/
|
|
11
|
+
declare function getZodLocale(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Set fallback locale (used when message not found in current locale)
|
|
14
|
+
*/
|
|
15
|
+
declare function setZodFallbackLocale(locale: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get fallback locale
|
|
18
|
+
*/
|
|
19
|
+
declare function getZodFallbackLocale(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Add custom validation messages
|
|
22
|
+
* @param messages - Object with message keys and locale values
|
|
23
|
+
*/
|
|
24
|
+
declare function addZodMessages(messages: Record<string, Record<string, string>>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get translated validation message
|
|
27
|
+
*
|
|
28
|
+
* @param key - Message key (e.g., 'required', 'minLength')
|
|
29
|
+
* @param params - Template parameters to replace
|
|
30
|
+
* @returns Formatted message string
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* getZodMessage('required', { displayName: '氏名' })
|
|
34
|
+
* // => '氏名は必須です'
|
|
35
|
+
*/
|
|
36
|
+
declare function getZodMessage(key: string, params?: Record<string, string | number>): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get all messages for a specific locale
|
|
39
|
+
*/
|
|
40
|
+
declare function getZodMessages(locale?: string): Record<string, string>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Form validation utilities for Ant Design + Zod
|
|
44
|
+
*
|
|
45
|
+
* Compatible with Zod v3.x and v4.x
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* import { zodRule, requiredRule } from '@famgia/omnify-react/lib';
|
|
50
|
+
*
|
|
51
|
+
* <Form.Item
|
|
52
|
+
* name="email"
|
|
53
|
+
* rules={[zodRule(customerSchemas.email, 'メールアドレス')]}
|
|
54
|
+
* >
|
|
55
|
+
* <Input />
|
|
56
|
+
* </Form.Item>
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Convert Zod schema to Ant Design Form rule with i18n support
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Set locale once at component level
|
|
65
|
+
* setZodLocale('ja');
|
|
66
|
+
*
|
|
67
|
+
* // Use without passing locale
|
|
68
|
+
* <Form.Item
|
|
69
|
+
* name="email"
|
|
70
|
+
* rules={[zodRule(customerSchemas.email, 'メールアドレス')]}
|
|
71
|
+
* >
|
|
72
|
+
* <Input />
|
|
73
|
+
* </Form.Item>
|
|
74
|
+
*/
|
|
75
|
+
declare function zodRule<T extends z.ZodTypeAny>(schema: T, displayName?: string): RuleObject;
|
|
76
|
+
/**
|
|
77
|
+
* Create required rule with i18n message
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* <Form.Item
|
|
81
|
+
* name="name"
|
|
82
|
+
* rules={[requiredRule('名前')]}
|
|
83
|
+
* >
|
|
84
|
+
* <Input />
|
|
85
|
+
* </Form.Item>
|
|
86
|
+
*/
|
|
87
|
+
declare function requiredRule(displayName: string): RuleObject;
|
|
88
|
+
/**
|
|
89
|
+
* Check if a Zod schema represents a required field
|
|
90
|
+
*/
|
|
91
|
+
declare function isZodRequired(schema: z.ZodTypeAny): boolean;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Japanese Kana Validation Rules
|
|
95
|
+
*
|
|
96
|
+
* Provides configurable validation for Japanese character input:
|
|
97
|
+
* - 全角カタカナ (Full-width Katakana) - default
|
|
98
|
+
* - 半角カタカナ (Half-width Katakana)
|
|
99
|
+
* - ひらがな (Hiragana)
|
|
100
|
+
* - Mixed modes
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* import { kanaString, KATAKANA_PATTERN } from '@famgia/omnify-react/lib';
|
|
105
|
+
* import { z } from 'zod';
|
|
106
|
+
*
|
|
107
|
+
* // Method 1: Use kanaString helper
|
|
108
|
+
* const schema = z.object({
|
|
109
|
+
* name_kana: kanaString(), // 全角カタカナ (default)
|
|
110
|
+
* });
|
|
111
|
+
*
|
|
112
|
+
* // Method 2: Use pattern directly
|
|
113
|
+
* const schema2 = z.object({
|
|
114
|
+
* name_kana: z.string().regex(KATAKANA_PATTERN, '全角カタカナで入力してください'),
|
|
115
|
+
* });
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
interface KanaRuleOptions {
|
|
120
|
+
/** Allow full-width katakana (ア-ン) - default: true */
|
|
121
|
+
fullWidthKatakana?: boolean;
|
|
122
|
+
/** Allow half-width katakana (ア-ン) - default: false */
|
|
123
|
+
halfWidthKatakana?: boolean;
|
|
124
|
+
/** Allow hiragana (あ-ん) - default: false */
|
|
125
|
+
hiragana?: boolean;
|
|
126
|
+
/** Allow numbers (0-9, 0-9) - default: false */
|
|
127
|
+
allowNumbers?: boolean;
|
|
128
|
+
/** Allow full-width numbers (0-9) - default: false */
|
|
129
|
+
fullWidthNumbers?: boolean;
|
|
130
|
+
/** Allow half-width numbers (0-9) - default: false */
|
|
131
|
+
halfWidthNumbers?: boolean;
|
|
132
|
+
/** Allow spaces (full-width and half-width) - default: true */
|
|
133
|
+
allowSpaces?: boolean;
|
|
134
|
+
/** Allow specific special characters - default: ['ー', '・'] */
|
|
135
|
+
allowSpecialChars?: string[];
|
|
136
|
+
/** Custom error message */
|
|
137
|
+
message?: string;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a kana validation regex
|
|
141
|
+
*/
|
|
142
|
+
declare function createKanaRegex(options?: KanaRuleOptions): RegExp;
|
|
143
|
+
/**
|
|
144
|
+
* Validate a string against kana rules
|
|
145
|
+
*/
|
|
146
|
+
declare function validateKana(value: string, options?: KanaRuleOptions): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Get kana validation pattern string (for Zod .regex())
|
|
149
|
+
*/
|
|
150
|
+
declare function getKanaPattern(options?: KanaRuleOptions): string;
|
|
151
|
+
/**
|
|
152
|
+
* Get error message for kana validation
|
|
153
|
+
*/
|
|
154
|
+
declare function getKanaErrorMessage(options?: KanaRuleOptions, locale?: string): string;
|
|
155
|
+
/** 全角カタカナ (Full-width Katakana) - Default for Japanese names */
|
|
156
|
+
declare const KATAKANA_FULL_WIDTH: KanaRuleOptions;
|
|
157
|
+
/** 半角カタカナ (Half-width Katakana) - Legacy systems */
|
|
158
|
+
declare const KATAKANA_HALF_WIDTH: KanaRuleOptions;
|
|
159
|
+
/** ひらがな (Hiragana) */
|
|
160
|
+
declare const HIRAGANA: KanaRuleOptions;
|
|
161
|
+
/** カタカナ + ひらがな (Any kana) */
|
|
162
|
+
declare const KANA_ANY: KanaRuleOptions;
|
|
163
|
+
/** 全角カタカナ + 数字 (Full-width katakana with numbers) */
|
|
164
|
+
declare const KATAKANA_WITH_NUMBERS: KanaRuleOptions;
|
|
165
|
+
/** Pattern: 全角カタカナ + スペース + ー・ (for z.string().regex()) */
|
|
166
|
+
declare const KATAKANA_PATTERN: RegExp;
|
|
167
|
+
/** Pattern: 半角カタカナ (for z.string().regex()) */
|
|
168
|
+
declare const KATAKANA_HALF_PATTERN: RegExp;
|
|
169
|
+
/** Pattern: ひらがな (for z.string().regex()) */
|
|
170
|
+
declare const HIRAGANA_PATTERN: RegExp;
|
|
171
|
+
/** Pattern: すべてのかな (for z.string().regex()) */
|
|
172
|
+
declare const KANA_ANY_PATTERN: RegExp;
|
|
173
|
+
/**
|
|
174
|
+
* Create Zod string schema with kana validation
|
|
175
|
+
* @example
|
|
176
|
+
* const schema = z.object({
|
|
177
|
+
* name_kana: kanaString(), // 全角カタカナ (default)
|
|
178
|
+
* name_kana2: kanaString({ hiragana: true }), // カタカナ + ひらがな
|
|
179
|
+
* });
|
|
180
|
+
*/
|
|
181
|
+
declare function kanaString(options?: KanaRuleOptions): z.ZodString;
|
|
182
|
+
/**
|
|
183
|
+
* Add kana validation to existing Zod string schema
|
|
184
|
+
* @example
|
|
185
|
+
* const schema = z.string().min(1).pipe(withKana());
|
|
186
|
+
*/
|
|
187
|
+
declare function withKana(options?: KanaRuleOptions): z.ZodString;
|
|
188
|
+
declare const kanaRules: {
|
|
189
|
+
createRegex: typeof createKanaRegex;
|
|
190
|
+
validate: typeof validateKana;
|
|
191
|
+
getPattern: typeof getKanaPattern;
|
|
192
|
+
getMessage: typeof getKanaErrorMessage;
|
|
193
|
+
string: typeof kanaString;
|
|
194
|
+
presets: {
|
|
195
|
+
fullWidthKatakana: KanaRuleOptions;
|
|
196
|
+
halfWidthKatakana: KanaRuleOptions;
|
|
197
|
+
hiragana: KanaRuleOptions;
|
|
198
|
+
any: KanaRuleOptions;
|
|
199
|
+
withNumbers: KanaRuleOptions;
|
|
200
|
+
};
|
|
201
|
+
patterns: {
|
|
202
|
+
katakana: RegExp;
|
|
203
|
+
katakanaHalf: RegExp;
|
|
204
|
+
hiragana: RegExp;
|
|
205
|
+
any: RegExp;
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
export { HIRAGANA, HIRAGANA_PATTERN, KANA_ANY, KANA_ANY_PATTERN, KATAKANA_FULL_WIDTH, KATAKANA_HALF_PATTERN, KATAKANA_HALF_WIDTH, KATAKANA_PATTERN, KATAKANA_WITH_NUMBERS, type KanaRuleOptions, addZodMessages, createKanaRegex, getKanaErrorMessage, getKanaPattern, getZodFallbackLocale, getZodLocale, getZodMessage, getZodMessages, isZodRequired, getKanaPattern as kanaPattern, createKanaRegex as kanaRegex, kanaRules, kanaString, requiredRule, setZodFallbackLocale, setZodLocale, validateKana, withKana, zodRule };
|