{"version":3,"file":"ngwr-validators.mjs","sources":["../../../projects/lib/validators/wr-validators.ts","../../../projects/lib/validators/ngwr-validators.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type AbstractControl, type ValidationErrors, type ValidatorFn } from '@angular/forms';\n\nfunction stringValue(control: AbstractControl): string {\n  const v: unknown = control.value;\n  if (v == null) return '';\n  if (typeof v === 'string') return v.trim();\n  if (typeof v === 'number' || typeof v === 'boolean') return String(v).trim();\n  return '';\n}\n\n/** Like {@link stringValue} but preserves whitespace — for checks that inspect spacing. */\nfunction rawStringValue(control: AbstractControl): string {\n  const v: unknown = control.value;\n  if (v == null) return '';\n  if (typeof v === 'string') return v;\n  if (typeof v === 'number' || typeof v === 'boolean') return String(v);\n  return '';\n}\n\n/** Luhn checksum. Returns true when the digit string is a valid card number. */\nfunction luhn(digits: string): boolean {\n  let sum = 0;\n  let dbl = false;\n  for (let i = digits.length - 1; i >= 0; i--) {\n    let d = digits.charCodeAt(i) - 48;\n    if (dbl) {\n      d *= 2;\n      if (d > 9) d -= 9;\n    }\n    sum += d;\n    dbl = !dbl;\n  }\n  return sum % 10 === 0;\n}\n\n/** ISO 13616 mod-97 check for IBANs. Returns the remainder; valid IBANs yield 1. */\nfunction mod97(iban: string): number {\n  // Move first 4 chars to the end + convert letters to digits (A=10..Z=35).\n  const rearranged = iban.slice(4) + iban.slice(0, 4);\n  let expanded = '';\n  for (let i = 0; i < rearranged.length; i++) {\n    const code = rearranged.charCodeAt(i);\n    if (code >= 65 && code <= 90) expanded += (code - 55).toString();\n    else expanded += rearranged.charAt(i);\n  }\n  // Apply mod 97 in chunks — BigInt isn't necessary.\n  let remainder = 0;\n  for (let i = 0; i < expanded.length; i += 7) {\n    const slice = remainder.toString() + expanded.substring(i, i + 7);\n    remainder = Number.parseInt(slice, 10) % 97;\n  }\n  return remainder;\n}\n\nfunction toMs(value: unknown): number {\n  if (value instanceof Date) return value.getTime();\n  if (typeof value === 'string' || typeof value === 'number') return new Date(value).getTime();\n  return Number.NaN;\n}\n\n/**\n * Bundled `ValidatorFn`s — pure functions, no DOM, no DI. Mirrors the\n * API shape of Angular's built-in `Validators` so it composes cleanly:\n *\n * ```ts\n * import { Validators } from '@angular/forms';\n * import { WrValidators } from 'ngwr/validators';\n *\n * new FormControl('', [\n *   Validators.required,\n *   WrValidators.cardNumber,\n *   WrValidators.cvc(3),\n *   WrValidators.match('password'),\n *   WrValidators.oneOf(['xs', 'sm', 'md', 'lg', 'xl']),\n * ]);\n * ```\n *\n * Each error is keyed under the validator name (e.g. `cardNumber`,\n * `cvc`, `iban`) so consumers can branch in templates.\n *\n * Anything Angular already ships (`required`, `email`, `min`, `max`,\n * `pattern`, …) is deliberately NOT duplicated here.\n *\n * @see https://ngwr.dev/validators\n */\nexport const WrValidators = {\n  // String shape\n\n  /** No whitespace anywhere in the value. */\n  noWhitespace: (control: AbstractControl): ValidationErrors | null => {\n    const v = rawStringValue(control);\n    if (v === '') return null;\n    return /\\s/.test(v) ? { noWhitespace: true } : null;\n  },\n\n  /** 3, 4, 6, or 8-digit hex colour (`#abc`, `#1a2b3c`, `#1a2b3c4d`). */\n  hexColor: (control: AbstractControl): ValidationErrors | null => {\n    const v = stringValue(control);\n    if (v === '') return null;\n    return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(v) ? null : { hexColor: true };\n  },\n\n  // Network / payments\n\n  /**\n   * Valid URL. Accepts any scheme by default; pass `{ protocols: ['https'] }`\n   * to restrict. A scheme is required by default; pass `{ requireProtocol: false }`\n   * to also accept bare domains (e.g. `ngwr.dev`), assuming `https`.\n   */\n  url: (options: { readonly protocols?: readonly string[]; readonly requireProtocol?: boolean } = {}): ValidatorFn => {\n    const allow = options.protocols?.map(p => p.replace(/:$/, '').toLowerCase());\n    const requireProtocol = options.requireProtocol ?? true;\n    return (control: AbstractControl): ValidationErrors | null => {\n      const v = stringValue(control);\n      if (v === '') return null;\n      let parsed: URL;\n      try {\n        parsed = new URL(v);\n      } catch {\n        // Bare domain support: when protocols aren't required and the input has\n        // no scheme, retry assuming `https://`.\n        if (!requireProtocol && !/^[a-z][a-z0-9+.-]*:/i.test(v)) {\n          let retried: URL;\n          try {\n            retried = new URL(`https://${v}`);\n          } catch {\n            return { url: true };\n          }\n          if (retried.host === '') {\n            return { url: true };\n          }\n          if (allow && !allow.includes('https')) {\n            return { url: { allowed: allow } };\n          }\n          return null;\n        }\n        return { url: true };\n      }\n      const protocol = parsed.protocol.replace(/:$/, '').toLowerCase();\n      // WHATWG auto-inserts the authority for \"special\" schemes, so `http:host`\n      // (missing `//`) still parses. Require the explicit `//` for those.\n      const needsAuthority = ['http', 'https', 'ws', 'wss', 'ftp', 'file'].includes(protocol);\n      if (needsAuthority && !/^[a-z][a-z0-9+.-]*:\\/\\//i.test(v)) {\n        return { url: true };\n      }\n      if (allow && !allow.includes(protocol)) {\n        return { url: { allowed: allow } };\n      }\n      return null;\n    };\n  },\n\n  /** Credit card number — Luhn check + 13-19 digit length. Spaces and dashes are stripped first. */\n  cardNumber: (control: AbstractControl): ValidationErrors | null => {\n    const raw = stringValue(control).replace(/[\\s-]/g, '');\n    if (raw === '') return null;\n    if (!/^\\d{13,19}$/.test(raw)) return { cardNumber: true };\n    return luhn(raw) ? null : { cardNumber: true };\n  },\n\n  /** CVC / CVV — N digits (default 3). Common: 3 for Visa/MC, 4 for Amex. */\n  cvc: (length = 3): ValidatorFn => {\n    const re = new RegExp(`^\\\\d{${length}}$`);\n    return (control: AbstractControl): ValidationErrors | null => {\n      const v = stringValue(control);\n      if (v === '') return null;\n      return re.test(v) ? null : { cvc: { length } };\n    };\n  },\n\n  /**\n   * IBAN — basic structure (CC + 2 digits + up to 30 alphanumerics) +\n   * the mod-97 check. Country-length tables not enforced.\n   */\n  iban: (control: AbstractControl): ValidationErrors | null => {\n    const raw = stringValue(control).replace(/\\s/g, '').toUpperCase();\n    if (raw === '') return null;\n    if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{4,30}$/.test(raw)) return { iban: true };\n    return mod97(raw) === 1 ? null : { iban: true };\n  },\n\n  // Cross-field\n\n  /**\n   * Value must equal a sibling control's value (e.g. confirm-password).\n   * The target lookup uses `control.parent.get(name)`, so it works\n   * inside `FormGroup` and nested groups.\n   */\n  match: (targetName: string): ValidatorFn => {\n    return (control: AbstractControl): ValidationErrors | null => {\n      const target = control.parent?.get(targetName);\n      if (!target) return null;\n      return control.value === target.value ? null : { match: { target: targetName } };\n    };\n  },\n\n  // Choice\n\n  /** Value must be one of the allowed entries (strict equality). */\n  oneOf: <T>(allowed: readonly T[]): ValidatorFn => {\n    return (control: AbstractControl): ValidationErrors | null => {\n      const v = control.value as T;\n      if (v == null || (v as unknown) === '') return null;\n      return allowed.includes(v) ? null : { oneOf: { allowed } };\n    };\n  },\n\n  // Date bounds\n\n  /** Value (Date | parseable) must be ≥ `min`. */\n  minDate: (min: Date | string | number): ValidatorFn => {\n    const minMs = toMs(min);\n    return (control: AbstractControl): ValidationErrors | null => {\n      const v: unknown = control.value;\n      if (v == null || v === '') return null;\n      const got = toMs(v);\n      if (Number.isNaN(got)) return { minDate: { min } };\n      return got >= minMs ? null : { minDate: { min } };\n    };\n  },\n\n  /** Value (Date | parseable) must be ≤ `max`. */\n  maxDate: (max: Date | string | number): ValidatorFn => {\n    const maxMs = toMs(max);\n    return (control: AbstractControl): ValidationErrors | null => {\n      const v: unknown = control.value;\n      if (v == null || v === '') return null;\n      const got = toMs(v);\n      if (Number.isNaN(got)) return { maxDate: { max } };\n      return got <= maxMs ? null : { maxDate: { max } };\n    };\n  },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}