{"version":3,"file":"parse.cjs","names":[],"sources":["../../src/date/parse.ts"],"sourcesContent":["/**\n * Parses a date string according to the given format string.\n *\n * Supported format tokens:\n * - YYYY: 4-digit year\n * - MM: 2-digit month (01-12)\n * - DD: 2-digit day (01-31)\n * - HH: 2-digit hour (00-23)\n * - mm: 2-digit minute (00-59)\n * - ss: 2-digit second (00-59)\n * - SSS: 3-digit millisecond (000-999)\n *\n * @param dateStr - The date string to parse\n * @param formatStr - The format string (default: 'YYYY-MM-DD HH:mm:ss')\n * @returns The parsed Date object, or null if parsing fails\n *\n * @example\n * parse('2024-01-15 14:30:45') // => Date object\n * parse('2024/01/15', 'YYYY/MM/DD') // => Date object\n * parse('15-01-2024', 'DD-MM-YYYY') // => Date object\n */\nexport function parse(dateStr: string, formatStr: string = 'YYYY-MM-DD HH:mm:ss'): Date | null {\n  if (typeof dateStr !== 'string') {\n    return null;\n  }\n\n  if (typeof formatStr !== 'string') {\n    return null;\n  }\n\n  // Use placeholders to avoid issues with token replacement and escaping\n  let pattern = formatStr;\n  const positions: Record<string, number> = {};\n  const placeholders: Record<string, string> = {};\n  let groupIndex = 1;\n\n  // First pass: replace tokens with unique placeholders\n  const tokens = ['YYYY', 'SSS', 'MM', 'DD', 'HH', 'mm', 'ss'];\n  for (const token of tokens) {\n    if (pattern.includes(token)) {\n      const placeholder = `__${token}__`;\n      placeholders[placeholder] = token;\n      positions[token] = groupIndex;\n      pattern = pattern.replace(new RegExp(token, 'g'), placeholder);\n      groupIndex++;\n    }\n  }\n\n  // Second pass: escape special regex characters\n  pattern = pattern.replace(/[.+*?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n  // Third pass: replace placeholders with regex patterns\n  pattern = pattern.replace(/__YYYY__/g, '(\\\\d{4})');\n  pattern = pattern.replace(/__SSS__/g, '(\\\\d{1,3})');\n  pattern = pattern.replace(/__MM__/g, '(\\\\d{1,2})');\n  pattern = pattern.replace(/__DD__/g, '(\\\\d{1,2})');\n  pattern = pattern.replace(/__HH__/g, '(\\\\d{1,2})');\n  pattern = pattern.replace(/__mm__/g, '(\\\\d{1,2})');\n  pattern = pattern.replace(/__ss__/g, '(\\\\d{1,2})');\n\n  const regex = new RegExp(`^${pattern}$`);\n  const match = dateStr.match(regex);\n\n  if (!match) {\n    return null;\n  }\n\n  // Extract values from match groups\n  const year = positions.YYYY !== undefined ? parseInt(match[positions.YYYY], 10) : 1970;\n  const month = positions.MM !== undefined ? parseInt(match[positions.MM], 10) - 1 : 0;\n  const day = positions.DD !== undefined ? parseInt(match[positions.DD], 10) : 1;\n  const hour = positions.HH !== undefined ? parseInt(match[positions.HH], 10) : 0;\n  const minute = positions.mm !== undefined ? parseInt(match[positions.mm], 10) : 0;\n  const second = positions.ss !== undefined ? parseInt(match[positions.ss], 10) : 0;\n  const millisecond = positions.SSS !== undefined ? parseInt(match[positions.SSS], 10) : 0;\n\n  // Validate extracted values\n  if (\n    month < 0 ||\n    month > 11 ||\n    day < 1 ||\n    day > 31 ||\n    hour < 0 ||\n    hour > 23 ||\n    minute < 0 ||\n    minute > 59 ||\n    second < 0 ||\n    second > 59 ||\n    millisecond < 0 ||\n    millisecond > 999\n  ) {\n    return null;\n  }\n\n  const date = new Date(year, month, day, hour, minute, second, millisecond);\n\n  if (isNaN(date.getTime())) {\n    return null;\n  }\n\n  return date;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,MAAM,SAAiB,YAAoB,uBAAoC;CAC7F,IAAI,OAAO,YAAY,UACrB,OAAO;CAGT,IAAI,OAAO,cAAc,UACvB,OAAO;CAIT,IAAI,UAAU;CACd,MAAM,YAAoC,CAAC;CAC3C,MAAM,eAAuC,CAAC;CAC9C,IAAI,aAAa;CAIjB,KAAK,MAAM,SAAS;EADJ;EAAQ;EAAO;EAAM;EAAM;EAAM;EAAM;CAC9B,GACvB,IAAI,QAAQ,SAAS,KAAK,GAAG;EAC3B,MAAM,cAAc,KAAK,MAAM;EAC/B,aAAa,eAAe;EAC5B,UAAU,SAAS;EACnB,UAAU,QAAQ,QAAQ,IAAI,OAAO,OAAO,GAAG,GAAG,WAAW;EAC7D;CACF;CAIF,UAAU,QAAQ,QAAQ,uBAAuB,MAAM;CAGvD,UAAU,QAAQ,QAAQ,aAAa,UAAU;CACjD,UAAU,QAAQ,QAAQ,YAAY,YAAY;CAClD,UAAU,QAAQ,QAAQ,WAAW,YAAY;CACjD,UAAU,QAAQ,QAAQ,WAAW,YAAY;CACjD,UAAU,QAAQ,QAAQ,WAAW,YAAY;CACjD,UAAU,QAAQ,QAAQ,WAAW,YAAY;CACjD,UAAU,QAAQ,QAAQ,WAAW,YAAY;CAEjD,MAAM,QAAQ,IAAI,OAAO,IAAI,QAAQ,EAAE;CACvC,MAAM,QAAQ,QAAQ,MAAM,KAAK;CAEjC,IAAI,CAAC,OACH,OAAO;CAIT,MAAM,OAAO,UAAU,SAAS,KAAA,IAAY,SAAS,MAAM,UAAU,OAAO,EAAE,IAAI;CAClF,MAAM,QAAQ,UAAU,OAAO,KAAA,IAAY,SAAS,MAAM,UAAU,KAAK,EAAE,IAAI,IAAI;CACnF,MAAM,MAAM,UAAU,OAAO,KAAA,IAAY,SAAS,MAAM,UAAU,KAAK,EAAE,IAAI;CAC7E,MAAM,OAAO,UAAU,OAAO,KAAA,IAAY,SAAS,MAAM,UAAU,KAAK,EAAE,IAAI;CAC9E,MAAM,SAAS,UAAU,OAAO,KAAA,IAAY,SAAS,MAAM,UAAU,KAAK,EAAE,IAAI;CAChF,MAAM,SAAS,UAAU,OAAO,KAAA,IAAY,SAAS,MAAM,UAAU,KAAK,EAAE,IAAI;CAChF,MAAM,cAAc,UAAU,QAAQ,KAAA,IAAY,SAAS,MAAM,UAAU,MAAM,EAAE,IAAI;CAGvF,IACE,QAAQ,KACR,QAAQ,MACR,MAAM,KACN,MAAM,MACN,OAAO,KACP,OAAO,MACP,SAAS,KACT,SAAS,MACT,SAAS,KACT,SAAS,MACT,cAAc,KACd,cAAc,KAEd,OAAO;CAGT,MAAM,OAAO,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,WAAW;CAEzE,IAAI,MAAM,KAAK,QAAQ,CAAC,GACtB,OAAO;CAGT,OAAO;AACT"}