{"version":3,"sources":["../../src/plate/regions.ts","../../src/plate/utils.ts","../../src/plate/errors.ts","../../src/plate/parse.ts","../../src/plate/mask.ts","../../src/plate/clean.ts","../../src/plate/type-check.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Mapping of Indonesian license plate prefixes to their regions.\n */\nexport const PLATE_REGIONS: Record<string, string> = {\n  A: 'Banten',\n  B: 'Jakarta, Depok, Tangerang, Bekasi',\n  D: 'Bandung, Cimahi',\n  E: 'Cirebon, Indramayu, Majalengka, Kuningan',\n  F: 'Bogor, Cianjur, Sukabumi',\n  G: 'Pekalongan, Pemalang, Batang, Tegal, Brebes',\n  H: 'Semarang, Salatiga, Kendal, Demak',\n  K: 'Pati, Kudus, Jepara, Rembang, Blora, Grobogan',\n  L: 'Surabaya',\n  M: 'Madura',\n  N: 'Malang, Probolinggo, Pasuruan, Lumajang, Batu',\n  P: 'Besuki, Bondowoso, Situbondo, Jember, Banyuwangi',\n  R: 'Banyumas, Cilacap, Purbalinggo, Banjarnegara',\n  S: 'Bojonegoro, Tuban, Lamongan, Jombang, Mojokerto',\n  T: 'Purwakarta, Subang, Karawang',\n  AA: 'Kedu, Magelang, Purworejo, Kebumen, Temanggung, Wonosobo',\n  AB: 'Yogyakarta',\n  AD: 'Surakarta, Boyolali, Sukoharjo, Karanganyar, Wonogiri, Sragen, Klaten',\n  AE: 'Madiun, Ngawi, Magetan, Ponorogo, Pacitan',\n  AG: 'Kediri, Blitar, Tulungagung, Nganjuk, Trenggalek',\n  BA: 'Sumatera Barat',\n  BB: 'Sumatera Utara (Pantai Barat)',\n  BD: 'Bengkulu',\n  BE: 'Lampung',\n  BG: 'Sumatera Selatan',\n  BH: 'Jambi',\n  BK: 'Sumatera Utara (Pantai Timur)',\n  BL: 'Aceh',\n  BM: 'Riau',\n  BN: 'Kepulauan Bangka Belitung',\n  BP: 'Kepulauan Riau',\n  DA: 'Kalimantan Selatan',\n  DB: 'Sulawesi Utara (Daratan)',\n  DC: 'Sulawesi Barat',\n  DD: 'Sulawesi Selatan (Selatan)',\n  DE: 'Maluku',\n  DF: 'Timor Timur (Historical)',\n  DG: 'Maluku Utara',\n  DH: 'NTT (Timor)',\n  DK: 'Bali',\n  DL: 'Sulawesi Utara (Kepulauan)',\n  DM: 'Gorontalo',\n  DN: 'Sulawesi Tengah',\n  DP: 'Sulawesi Selatan (Utara)',\n  DR: 'NTB (Lombok)',\n  DS: 'Papua',\n  DT: 'Sulawesi Tenggara',\n  EA: 'NTB (Sumbawa)',\n  EB: 'NTT (Flores)',\n  ED: 'NTT (Sumba)',\n  KB: 'Kalimantan Barat',\n  KH: 'Kalimantan Tengah',\n  KT: 'Kalimantan Timur',\n  KU: 'Kalimantan Utara',\n  PA: 'Papua',\n  PB: 'Papua Barat',\n};\n","import { PLATE_REGIONS } from './regions';\n\n/**\n * Validates an Indonesian license plate number format.\n * Format: [1-2 letters] [1-4 digits] [1-3 letters]\n *\n * @param plate - The plate number string to validate\n * @returns `true` if valid, `false` otherwise\n *\n * @example\n * ```typescript\n * validatePlate('B 1234 ABC'); // true\n * validatePlate('AB 1 CD'); // true\n * ```\n */\nexport function validatePlate(plate: string): boolean {\n  if (!plate || typeof plate !== 'string') {\n    return false;\n  }\n\n  const cleaned = plate.replace(/\\s+/g, '').toUpperCase();\n  const regex = /^[A-Z]{1,2}\\d{1,4}[A-Z]{1,3}$/;\n\n  return regex.test(cleaned);\n}\n\n/**\n * Gets the region name from a license plate number.\n *\n * @param plate - The plate number\n * @returns Region name or null if not found\n */\nexport function getRegionFromPlate(plate: string): string | null {\n  if (!plate || typeof plate !== 'string') {\n    return null;\n  }\n\n  const cleaned = plate.replace(/\\s+/g, '').toUpperCase();\n  const match = cleaned.match(/^([A-Z]{1,2})/);\n\n  if (!match) {\n    return null;\n  }\n\n  const prefix = match[1];\n  return PLATE_REGIONS[prefix] || null;\n}\n\n/**\n * Formats a license plate number with spaces (e.g., B 1234 ABC).\n *\n * @param plate - The plate number\n * @returns Formatted plate string\n */\nexport function formatPlate(plate: string): string {\n  if (!plate) return '';\n\n  const cleaned = plate.replace(/\\s+/g, '').toUpperCase();\n  const match = cleaned.match(/^([A-Z]{1,2})(\\d{1,4})([A-Z]{1,3})$/);\n\n  if (!match) {\n    return cleaned;\n  }\n\n  return `${match[1]} ${match[2]} ${match[3]}`;\n}\n","/**\n * Error thrown when an invalid vehicle plate is provided to a function.\n * Extends native Error with a `code` property for programmatic error handling.\n *\n * @example\n * ```typescript\n * try {\n *   requirePlate('invalid');\n * } catch (error) {\n *   if (error instanceof InvalidPlateError) {\n *     console.log(error.code); // 'INVALID_PLATE'\n *   }\n * }\n * ```\n *\n * @public\n */\nexport class InvalidPlateError extends Error {\n  readonly code = 'INVALID_PLATE' as const;\n\n  constructor(message: string = 'Invalid plate provided') {\n    super(message);\n    this.name = 'InvalidPlateError';\n  }\n}\n","import { validatePlate, formatPlate } from './utils';\nimport type { PlateInfo } from './types';\n\n/**\n * Parses an Indonesian license plate number into its component parts.\n *\n * Extracts the prefix (region code), number, and suffix (optional letters)\n * from a plate number. Also determines the plate type and returns a\n * formatted representation.\n *\n * @param plate - The plate string to parse\n * @returns PlateInfo object with extracted components, or null if invalid\n *\n * @example\n * Private plate:\n * ```typescript\n * parsePlate('B 1234 ABC');\n * // {\n * //   prefix: 'B',\n * //   number: '1234',\n * //   suffix: 'ABC',\n * //   type: 'private',\n * //   formatted: 'B 1234 ABC',\n * //   isValid: true\n * // }\n * ```\n *\n * @example\n * Public transport plate:\n * ```typescript\n * parsePlate('AB 1 CD');\n * // {\n * //   prefix: 'AB',\n * //   number: '1',\n * //   suffix: 'CD',\n * //   type: 'public',\n * //   formatted: 'AB 1 CD',\n * //   isValid: true\n * // }\n * ```\n *\n * @example\n * Invalid plate returns null:\n * ```typescript\n * parsePlate('invalid');\n * // null\n * ```\n *\n * @public\n */\nexport function parsePlate(plate: string): PlateInfo | null {\n  if (!plate || typeof plate !== 'string') {\n    return null;\n  }\n\n  const cleaned = plate.replace(/\\s+/g, '').toUpperCase();\n\n  const privatePlateRegex = /^[A-Z]{1,2}\\d{1,4}[A-Z]{1,3}$/;\n  const publicPlateRegex = /^[A-Z]{1,2}\\d{1,4}[A-Z]{0,3}$/;\n\n  if (!privatePlateRegex.test(cleaned) && !publicPlateRegex.test(cleaned)) {\n    return null;\n  }\n\n  const isValid = validatePlate(plate);\n\n  const match = cleaned.match(/^([A-Z]{1,2})(\\d{1,4})([A-Z]{0,3})$/);\n\n  if (!match) {\n    return null;\n  }\n\n  const prefix = match[1];\n  const number = match[2];\n  const suffix = match[3] || '';\n\n  const type = determinePlateType(cleaned);\n\n  return {\n    prefix,\n    number,\n    suffix,\n    type,\n    formatted: formatPlate(plate),\n    isValid,\n  };\n}\n\n/**\n * Determines the type of plate based on the plate string.\n *\n * @internal\n */\nfunction determinePlateType(\n  plate: string\n): 'private' | 'public' | 'diplomat' | null {\n  const cleaned = plate.replace(/\\s+/g, '').toUpperCase();\n\n  if (\n    cleaned.startsWith('CD') ||\n    cleaned.startsWith('CC') ||\n    cleaned.startsWith('KL')\n  ) {\n    return 'diplomat';\n  }\n\n  if (/^[A-Z]{1,2}\\d{1,4}[A-Z]{0,3}$/.test(cleaned)) {\n    const numDigits = cleaned.match(/\\d+/)?.[0].length || 0;\n    if (numDigits <= 4) {\n      return 'private';\n    }\n  }\n\n  if (/^[A-Z]{1,2}\\d{1,4}[A-Z]{0,3}$/.test(cleaned)) {\n    return 'public';\n  }\n\n  return null;\n}\n","import { formatPlate, validatePlate } from './utils';\nimport type { PlateMaskOptions } from './types';\n\n/**\n * Masks a license plate number for privacy.\n *\n * By default, shows 1 character at start and 3 at end, masking the middle.\n * Returns the masked cleaned string (without spaces).\n *\n * @param plate - The license plate to mask\n * @param options - Mask options (visibleStart, visibleEnd, maskChar)\n * @returns Masked plate string, or empty string if invalid\n *\n * @example\n * Default masking:\n * ```typescript\n * maskPlate('B 1234 ABC'); // 'B****ABC'\n * maskPlate('DA 1234 T');  // 'DA****T'\n * ```\n *\n * @example\n * Custom visibility:\n * ```typescript\n * maskPlate('B 1234 ABC', { visibleStart: 2 }); // 'B1***ABC'\n * maskPlate('B 1234 ABC', { visibleEnd: 4 });  // 'B***4ABC'\n * ```\n *\n * @example\n * Custom mask character:\n * ```typescript\n * maskPlate('B 1234 ABC', { maskChar: '#' }); // 'B####ABC'\n * ```\n *\n * @example\n * Empty or invalid input:\n * ```typescript\n * maskPlate('');      // ''\n * maskPlate('invalid'); // ''\n * ```\n *\n * @public\n */\nexport function maskPlate(\n  plate: string,\n  options: PlateMaskOptions = {}\n): string {\n  if (!plate || typeof plate !== 'string') {\n    return '';\n  }\n\n  if (!validatePlate(plate)) {\n    return '';\n  }\n\n  const formatted = formatPlate(plate);\n  if (!formatted) {\n    return '';\n  }\n\n  const { visibleStart = 1, visibleEnd = 3, maskChar = '*' } = options;\n\n  if (visibleStart < 0 || visibleEnd < 0) {\n    return '';\n  }\n\n  const cleaned = formatted.replace(/\\s+/g, '');\n  const totalLength = cleaned.length;\n\n  if (visibleStart + visibleEnd >= totalLength) {\n    return cleaned;\n  }\n\n  const maskLength = totalLength - visibleStart - visibleEnd;\n  const mask = maskChar.repeat(maskLength);\n\n  return (\n    cleaned.substring(0, visibleStart) +\n    mask +\n    cleaned.substring(visibleStart + maskLength)\n  );\n}\n","/**\n * Cleans a license plate by removing all non-alphanumeric characters\n * and converting to uppercase.\n *\n * @param plate - The license plate to clean\n * @returns Cleaned plate string (alphanumeric only, uppercase), or empty string if empty input\n *\n * @example\n * ```typescript\n * cleanPlate('B 1234 ABC');  // 'B1234ABC'\n * cleanPlate('da-1234-xyz'); // 'DA1234XYZ'\n * cleanPlate('');           // ''\n * ```\n *\n * @public\n */\nexport function cleanPlate(plate: string): string {\n  if (typeof plate !== 'string') {\n    return '';\n  }\n\n  const cleaned = plate.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();\n\n  return cleaned;\n}\n","import { parsePlate } from './parse';\n\n/**\n * Checks if a license plate is a private vehicle plate.\n *\n * Private plates follow the standard format: letters-numbers-letters\n * (e.g., B 1234 ABC).\n *\n * @param plate - The license plate to check\n * @returns true if valid private plate, false otherwise\n *\n * @example\n * ```typescript\n * isPrivatePlate('B 1234 ABC'); // true\n * isPrivatePlate('B 1234 U');  // false (public suffix)\n * isPrivatePlate('CD 1234 AB'); // false (diplomat)\n * isPrivatePlate('invalid');    // false\n * ```\n *\n * @public\n */\nexport function isPrivatePlate(plate: string): boolean {\n  if (!plate || typeof plate !== 'string') {\n    return false;\n  }\n\n  const info = parsePlate(plate);\n  return info?.type === 'private' && info.isValid;\n}\n\n/**\n * Checks if a license plate is a public transportation plate.\n *\n * Public plates typically have specific suffix indicators\n * (single letters like U, T, H, K, R).\n *\n * @param plate - The license plate to check\n * @returns true if valid public plate, false otherwise\n *\n * @example\n * ```typescript\n * isPublicPlate('B 1234 U');  // true\n * isPublicPlate('B 1234 T'); // true\n * isPublicPlate('B 1234 ABC'); // false (private)\n * isPublicPlate('invalid');    // false\n * ```\n *\n * @public\n */\nexport function isPublicPlate(plate: string): boolean {\n  if (!plate || typeof plate !== 'string') {\n    return false;\n  }\n\n  const info = parsePlate(plate);\n  return info?.type === 'public' && info.isValid;\n}\n\n/**\n * Checks if a license plate is a diplomat plate.\n *\n * Diplomat plates start with 'CD', 'CC', or 'KL' prefix.\n *\n * @param plate - The license plate to check\n * @returns true if valid diplomat plate, false otherwise\n *\n * @example\n * ```typescript\n * isDiplomatPlate('CD 1234 12'); // true\n * isDiplomatPlate('CC 1234 AB'); // true\n * isDiplomatPlate('KL 1234 XY'); // true\n * isDiplomatPlate('B 1234 ABC'); // false\n * isDiplomatPlate('invalid');    // false\n * ```\n *\n * @public\n */\nexport function isDiplomatPlate(plate: string): boolean {\n  if (!plate || typeof plate !== 'string') {\n    return false;\n  }\n\n  const info = parsePlate(plate);\n  return info?.type === 'diplomat' && info.isValid;\n}\n"]}