{"version":3,"file":"index.esm.mjs","sources":["../lib/form-pattern.ts","../lib/form-request-validation.ts"],"sourcesContent":["export const NumericPattern = '0-9'\nexport const SpecialCharacterPattern = `!?@#$%*()_;:'|,\\\\.\\\\- `\n\nexport const LatinAlphabetPattern = 'a-zA-Z'\nexport const CyrillicPattern = '\\\\u0400-\\\\u04FF' // Russian, Bulgarian, Ukrainian\nexport const EstonianPattern = `${LatinAlphabetPattern}ÕÄÖÜŠŽõäöüšž`\nexport const FrenchPattern = `${LatinAlphabetPattern}ÉÈÊËÇÀÂÎÏéèêëçàâîï`\nexport const RomanianPattern = `${LatinAlphabetPattern}ĂȘȚÂÎășțâî`\nexport const SpanishPattern = `${LatinAlphabetPattern}ÁÉÍÓÚÑÜáéíóúñü`\nexport const LatvianPattern = `${LatinAlphabetPattern}ĀČĒĢĪĶĻŅŠŪŽāčēģīķļņšūž`\nexport const LithuanianPattern = `${LatinAlphabetPattern}ĄČĘĖĮŠŲŪŽąčęėįšųūž`\nexport const PolishPattern = `${LatinAlphabetPattern}ĄĆĘŁŃÓŚŹŻąćęłńóśźż`\nexport const HungarianPattern = `${LatinAlphabetPattern}ÁÉÍÓÖŐÚÜŰáéíóöőúüű`\nexport const CroatianPattern = `${LatinAlphabetPattern}ČĆĐŽŠčćđžš`\nexport const CzechPattern = `${LatinAlphabetPattern}ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽáčďéěíňóřšťúůýž`\nexport const SlovenianPattern = `${LatinAlphabetPattern}ČŠŽčšž`\nexport const ArabicPattern = '\\\\u0600-\\\\u06FF'\n\nexport const EmailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\nexport const PhonePattern = /^\\+?[1-9]\\d{1,14}([-\\s()]?\\d{1,15})*$/\n\nexport const ValidationRules = {\n  NumericPattern,\n  SpecialCharacterPattern,\n  EmailPattern,\n  PhonePattern,\n}\n\nexport const LanguageValidationRules = {\n  LatinAlphabetPattern,\n  CyrillicPattern,\n  EstonianPattern,\n  FrenchPattern,\n  RomanianPattern,\n  SpanishPattern,\n  LatvianPattern,\n  LithuanianPattern,\n  PolishPattern,\n  HungarianPattern,\n  CroatianPattern,\n  CzechPattern,\n  SlovenianPattern,\n  ArabicPattern,\n}\n\nexport const createValidationRegex = (\n  ...validationRules: (RegExp | string)[]\n): RegExp => {\n  return new RegExp(`^[${validationRules.join('')}]+$`, 'u')\n}\n","import type { DefaultFieldOptions, FormRequest, FieldOptions } from './types'\n\ninterface ValidateFormRequest {\n  field: string\n  errorMessage: string\n}\n\nexport const validateFormRequest = <T extends object>(\n  emailRequest: FormRequest<T>,\n  fieldOptions?: DefaultFieldOptions,\n  defaultFieldOptions?: DefaultFieldOptions,\n): ValidateFormRequest[] => {\n  const newOptions = { ...defaultFieldOptions, ...fieldOptions }\n  return Object.entries(newOptions).flatMap(([fieldName]) => {\n    const fieldKey = fieldName\n    const fieldOption = getFieldOptions<T>(\n      fieldKey,\n      fieldOptions,\n      defaultFieldOptions,\n    )\n    const fieldValue = emailRequest[fieldKey]\n    const error = validateField(fieldValue, fieldOption)\n    return error ? [{ field: fieldKey, errorMessage: error }] : []\n  })\n}\n\nconst getFieldOptions = <T extends object>(\n  fieldName: keyof FormRequest<T>,\n  customFieldOptions: DefaultFieldOptions | undefined,\n  defaultFieldOptions: DefaultFieldOptions,\n): FieldOptions => {\n  if (customFieldOptions && fieldName in customFieldOptions) {\n    return customFieldOptions[fieldName as keyof DefaultFieldOptions]\n  }\n\n  if (fieldName in defaultFieldOptions) {\n    return defaultFieldOptions[fieldName as keyof DefaultFieldOptions]\n  }\n\n  throw new Error(\n    `Field '${fieldName.toString()}' not found in either custom or default field options.`,\n  )\n}\n\nconst validateField = (\n  value: string | string[] | null | undefined,\n  fieldOptions: FieldOptions,\n): string | null => {\n  const { name, required, validation } = fieldOptions\n\n  if (required && isEmpty(value)) {\n    return `${name} is required.`\n  }\n\n  if (validation && value) {\n    const valueStr = Array.isArray(value) ? value.join(',') : String(value)\n\n    return (\n      validateLength(valueStr, fieldOptions) ||\n      validatePattern(valueStr, fieldOptions)\n    )\n  }\n\n  return null\n}\n\nconst validateLength = (\n  valueStr: string,\n  fieldOptions: FieldOptions,\n): string | null => {\n  const { name, minLength, maxLength } = fieldOptions\n\n  if (minLength && valueStr.length < minLength) {\n    return `${name} should be at least ${minLength} characters long.`\n  }\n\n  if (maxLength && valueStr.length > maxLength) {\n    return `${name} should be no more than ${maxLength} characters long.`\n  }\n\n  return null\n}\n\nconst validatePattern = (\n  valueStr: string,\n  fieldOptions: FieldOptions,\n): string | null => {\n  const { name, pattern, errorMessage } = fieldOptions\n\n  if (pattern && !pattern.test(valueStr)) {\n    return errorMessage || `${name} is invalid.`\n  }\n\n  return null\n}\n\nconst isEmpty = (value: string | string[] | null | undefined): boolean =>\n  value === null || value === undefined || value === ''\n"],"names":["LatinAlphabetPattern","ValidationRules","NumericPattern","SpecialCharacterPattern","EmailPattern","PhonePattern","LanguageValidationRules","CyrillicPattern","EstonianPattern","FrenchPattern","RomanianPattern","SpanishPattern","LatvianPattern","LithuanianPattern","PolishPattern","HungarianPattern","CroatianPattern","CzechPattern","SlovenianPattern","ArabicPattern","createValidationRegex","validationRules","RegExp","join","validateFormRequest","emailRequest","fieldOptions","defaultFieldOptions","newOptions","Object","entries","flatMap","fieldName","fieldKey","fieldOption","getFieldOptions","fieldValue","error","validateField","field","errorMessage","customFieldOptions","Error","toString","value","name","required","validation","isEmpty","valueStr","Array","isArray","String","validateLength","validatePattern","minLength","maxLength","length","pattern","test"],"mappings":"AAAO,MAGMA,EAAuB,SAkBvBC,EAAkB,CAC7BC,eAtB4B,MAuB5BC,wBAtBqC,yBAuBrCC,aAN0B,mDAO1BC,aAN0B,yCASfC,EAA0B,CACrCN,uBACAO,gBA1B6B,kBA2B7BC,gBA1B6B,GAAGR,gBA2BhCS,cA1B2B,GAAGT,sBA2B9BU,gBA1B6B,GAAGV,cA2BhCW,eA1B4B,GAAGX,kBA2B/BY,eA1B4B,GAAGZ,0BA2B/Ba,kBA1B+B,GAAGb,sBA2BlCc,cA1B2B,GAAGd,sBA2B9Be,iBA1B8B,GAAGf,sBA2BjCgB,gBA1B6B,GAAGhB,cA2BhCiB,aA1B0B,GAAGjB,kCA2B7BkB,iBA1B8B,GAAGlB,UA2BjCmB,cA1B2B,mBA6BhBC,EAAwB,IAChCC,IAEI,IAAIC,OAAO,KAAKD,EAAgBE,KAAK,SAAU,KCzC3CC,EAAsB,CACjCC,EACAC,EACAC,KAEA,MAAMC,EAAa,IAAKD,KAAwBD,GACzC,OAAAG,OAAOC,QAAQF,GAAYG,SAAQ,EAAEC,MAC1C,MAAMC,EAAWD,EACXE,EAAcC,EAClBF,EACAP,EACAC,GAEIS,EAAaX,EAAaQ,GAC1BI,EAAQC,EAAcF,EAAYF,GACjC,OAAAG,EAAQ,CAAC,CAAEE,MAAON,EAAUO,aAAcH,IAAW,EAAC,GAC9D,EAGGF,EAAkB,CACtBH,EACAS,EACAd,KAEI,GAAAc,GAAsBT,KAAaS,EACrC,OAAOA,EAAmBT,GAG5B,GAAIA,KAAaL,EACf,OAAOA,EAAoBK,GAG7B,MAAM,IAAIU,MACR,UAAUV,EAAUW,mEACtB,EAGIL,EAAgB,CACpBM,EACAlB,KAEA,MAAMmB,KAAEA,EAAAC,SAAMA,EAAUC,WAAAA,GAAerB,EAEnC,GAAAoB,GAAYE,EAAQJ,GACtB,MAAO,GAAGC,iBAGZ,GAAIE,GAAcH,EAAO,CACjB,MAAAK,EAAWC,MAAMC,QAAQP,GAASA,EAAMrB,KAAK,KAAO6B,OAAOR,GAEjE,OACES,EAAeJ,EAAUvB,IACzB4B,EAAgBL,EAAUvB,EAE9B,CAEO,OAAA,IAAA,EAGH2B,EAAiB,CACrBJ,EACAvB,KAEA,MAAMmB,KAAEA,EAAAU,UAAMA,EAAWC,UAAAA,GAAc9B,EAEnC,OAAA6B,GAAaN,EAASQ,OAASF,EAC1B,GAAGV,wBAA2BU,qBAGnCC,GAAaP,EAASQ,OAASD,EAC1B,GAAGX,4BAA+BW,qBAGpC,IAAA,EAGHF,EAAkB,CACtBL,EACAvB,KAEA,MAAMmB,KAAEA,EAAAa,QAAMA,EAASlB,aAAAA,GAAiBd,EAExC,OAAIgC,IAAYA,EAAQC,KAAKV,GACpBT,GAAgB,GAAGK,gBAGrB,IAAA,EAGHG,EAAWJ,GACfA,SAAmD,KAAVA"}