{"version":3,"file":"validation-23babaa5.js","sources":["../../../app/javascript/javascripts/utils/custom_validators.ts","../../../app/javascript/javascripts/composables/inquiry/validation.ts"],"sourcesContent":["// Vuelidateで使うカスタムバリデーション関数\n\nimport { helpers } from '@vuelidate/validators';\n\n/**\n * 電話番号の桁数が正しい\n */\nexport const telDigitLength = (tel: number | string) => {\n  if(!helpers.req(tel)) return true;\n\n  // ハイフンなどを取り除く\n  const numOnly = tel.toString().replace(/[--ー―]/g, \"\");\n\n  // 正しい桁数:携帯電話の場合は11桁、それ以外は10桁\n  const validLength = /^(090|080|070|050|090|080|070|050)/.test(numOnly) ? 11 : 10;\n\n  return numOnly.length === validLength;\n}\n\n/**\n * 電話番号のフォーマットが正しい\n */\nexport const telFormat = (tel: number | string) => {\n  return !helpers.req(tel) || !telDigitLength(tel) || /^[00][0-90-9]{1,4}[--ー―]{0,1}[0-90-9]{2,4}[--ー―]{0,1}[0-90-9]{4}$/.test(tel.toString())\n}\n\n/**\n * 年収のフォーマットが正しい\n */\nexport const annualIncomeFormat = (num: number | string) => {\n  // 半角数字のみを許容し、0で始まらないことを確認する正規表現\n  const regex = /^(?!0)[0-9]+$/;\n  return regex.test(num.toString());\n}\n\nexport default {\n  telDigitLength,\n  telFormat,\n  annualIncomeFormat\n};\n","// 問い合わせフォームのバリデーション\n// vuelidateのラッパーなので、利用の際はvuelidateのドキュメント(https://vuelidate-next.netlify.app/)も参照ください。\n\nimport { useVuelidate } from '@vuelidate/core';\nimport { required, maxLength, email, helpers } from '@vuelidate/validators';\nimport { telDigitLength, telFormat } from '@/javascripts/utils/custom_validators';\n\nimport type { Ref } from 'vue';\nimport type { Validation, ValidationRuleCollection } from '@vuelidate/core';\nimport type Inquiry from '@/javascripts/utils/inquiry';\n\n/** バリデーションする項目 */\nexport type ValidationKey =\n  'employmentTypeCd' | 'wishfulTimeCd' | 'prefectureCd' |\n  'lastName' | 'firstName' | 'lastNameKana' | 'firstNameKana' |\n  'birthYearCd' | 'phone' | 'email' | 'comment';\n\n/** お名前のバリデーションルール */\nconst nameValidators: ValidationRuleCollection<string> = {\n  required: helpers.withMessage('お名前を入力してください', required),\n  maxLength: helpers.withMessage('30文字以内で入力してください', maxLength(30))\n};\n\n/** ふりがなのバリデーションルール */\nconst kanaValidators: ValidationRuleCollection<string> = {\n  required: helpers.withMessage('ふりがなを入力してください', required),\n  maxLength: helpers.withMessage('30文字以内で入力してください', maxLength(30))\n};\n\n/** バリデーションルールのテンプレート */\nexport type ValidationRules = {\n  [keys in ValidationKey]: ValidationRuleCollection<Inquiry[keys]>\n};\n\nexport const rules: ValidationRules = {\n  employmentTypeCd: {\n    required: helpers.withMessage('ご希望の雇用形態を選択してください', required)\n  },\n  wishfulTimeCd: {\n    required: helpers.withMessage('ご希望の転職時期を選択してください', required)\n  },\n  prefectureCd: {\n    required: helpers.withMessage('お住まいの都道府県を選択してください', required)\n  },\n  lastName: nameValidators,\n  firstName: nameValidators,\n  lastNameKana: kanaValidators,\n  firstNameKana: kanaValidators,\n  birthYearCd: {\n    required: helpers.withMessage('生まれ年を選択してください', required)\n  },\n  phone: {\n    required: helpers.withMessage('電話番号を入力してください', required),\n    telDigitLength: helpers.withMessage('電話番号の桁数が正しくありません', telDigitLength),\n    telFormat: helpers.withMessage('電話番号が正しくありません', telFormat)\n  },\n  email: {\n    email: helpers.withMessage('メールアドレスが正しくありません', email),\n    maxLength: helpers.withMessage('80文字以内で入力してください', maxLength(80))\n  },\n  comment: {\n    maxLength: helpers.withMessage('400文字以内で入力してください', maxLength(400))\n  }\n}\n\n/** バリデーション対象となる問い合わせオブジェクト */\ntype InquiryObj = Pick<Inquiry, ValidationKey>;\n\n/** 問い合わせバリデーション */\nexport type InquiryValidation = Validation<ValidationRules, InquiryObj>;\n\n/** バリデーションルール(バリデーション項目を指定) */\nexport type PickValidationRules<T extends ValidationKey> = Pick<ValidationRules, T>;\n/** 問い合わせバリデーション(バリデーション項目を指定) */\nexport type PickInquiryValidation<T extends ValidationKey> = Validation<PickValidationRules<T>, InquiryObj>;\n\n/**\n * 問い合わせフォームのバリデーションに関するコンポーザブル関数\n * @param inquiry バリデーションする問い合わせインスタンス\n */\nexport function useInquiryValidation(inquiry: InquiryObj | Ref<InquiryObj>): Ref<InquiryValidation>;\n\n/**\n * 問い合わせフォームのバリデーションに関するコンポーザブル関数(バリデーション項目を指定)\n * @param inquiry バリデーションする問い合わせインスタンス\n * @param validationFields バリデーションする項目\n */\nexport function useInquiryValidation<T extends ValidationKey>(\n  inquiry: InquiryObj | Ref<InquiryObj>,\n  validationFields: T[]\n): Ref<PickInquiryValidation<T>>;\n\n// オーバーロード関数の実装\nexport function useInquiryValidation<T extends ValidationKey>(\n  inquiry: InquiryObj | Ref<InquiryObj>,\n  validationFields?: T[]\n) {\n  if (validationFields) {\n    const pickRules = validationFields.reduce((obj, key) => {\n      obj[key] = rules[key];\n      return obj;\n    }, {} as PickValidationRules<T>);\n    return useVuelidate(pickRules, inquiry, { $autoDirty: true });\n  }\n  else {\n    return useVuelidate(rules, inquiry, { $autoDirty: true });\n  }\n}\n\nexport default useInquiryValidation;\n"],"names":["telDigitLength","tel","helpers","numOnly","validLength","telFormat","annualIncomeFormat","num","nameValidators","required","maxLength","kanaValidators","rules","email","useInquiryValidation","inquiry","validationFields","pickRules","obj","key","useVuelidate"],"mappings":"+XAOa,MAAAA,EAAkBC,GAAyB,CACnD,GAAA,CAACC,EAAQ,IAAID,CAAG,EAAU,MAAA,GAG7B,MAAME,EAAUF,EAAI,SAAA,EAAW,QAAQ,UAAW,EAAE,EAG9CG,EAAc,qCAAqC,KAAKD,CAAO,EAAI,GAAK,GAE9E,OAAOA,EAAQ,SAAWC,CAC5B,EAKaC,EAAaJ,GACjB,CAACC,EAAQ,IAAID,CAAG,GAAK,CAACD,EAAeC,CAAG,GAAK,oEAAoE,KAAKA,EAAI,SAAU,CAAA,EAMhIK,EAAsBC,GAEnB,gBACD,KAAKA,EAAI,SAAU,CAAA,ECd5BC,EAAmD,CACvD,SAAUN,EAAQ,YAAY,eAAgBO,CAAQ,EACtD,UAAWP,EAAQ,YAAY,kBAAmBQ,EAAU,EAAE,CAAC,CACjE,EAGMC,EAAmD,CACvD,SAAUT,EAAQ,YAAY,gBAAiBO,CAAQ,EACvD,UAAWP,EAAQ,YAAY,kBAAmBQ,EAAU,EAAE,CAAC,CACjE,EAOaE,EAAyB,CACpC,iBAAkB,CAChB,SAAUV,EAAQ,YAAY,oBAAqBO,CAAQ,CAC7D,EACA,cAAe,CACb,SAAUP,EAAQ,YAAY,oBAAqBO,CAAQ,CAC7D,EACA,aAAc,CACZ,SAAUP,EAAQ,YAAY,qBAAsBO,CAAQ,CAC9D,EACA,SAAUD,EACV,UAAWA,EACX,aAAcG,EACd,cAAeA,EACf,YAAa,CACX,SAAUT,EAAQ,YAAY,gBAAiBO,CAAQ,CACzD,EACA,MAAO,CACL,SAAUP,EAAQ,YAAY,gBAAiBO,CAAQ,EACvD,eAAgBP,EAAQ,YAAY,mBAAoBF,CAAc,EACtE,UAAWE,EAAQ,YAAY,gBAAiBG,CAAS,CAC3D,EACA,MAAO,CACL,MAAOH,EAAQ,YAAY,mBAAoBW,CAAK,EACpD,UAAWX,EAAQ,YAAY,kBAAmBQ,EAAU,EAAE,CAAC,CACjE,EACA,QAAS,CACP,UAAWR,EAAQ,YAAY,mBAAoBQ,EAAU,GAAG,CAAC,CACnE,CACF,EA8BgB,SAAAI,EACdC,EACAC,EACA,CACA,GAAIA,EAAkB,CACpB,MAAMC,EAAYD,EAAiB,OAAO,CAACE,EAAKC,KAC1CD,EAAAC,CAAG,EAAIP,EAAMO,CAAG,EACbD,GACN,CAA4B,CAAA,EAC/B,OAAOE,EAAaH,EAAWF,EAAS,CAAE,WAAY,GAAM,CAAA,KAG5D,QAAOK,EAAaR,EAAOG,EAAS,CAAE,WAAY,GAAM,CAE5D"}