{"version":3,"file":"route-param-names.utils.cjs","names":[],"sources":["../../../../src/rules/route-param-names/route-param-names.utils.ts"],"sourcesContent":["import { VALID_PARAM_NAME_REGEX } from './constants'\n\nexport interface ExtractedParam {\n  /** The full param string including $ prefix (e.g., \"$userId\", \"-$optional\") */\n  fullParam: string\n  /** The param name without $ prefix (e.g., \"userId\", \"optional\") */\n  paramName: string\n  /** Whether this is an optional param (prefixed with -$) */\n  isOptional: boolean\n  /** Whether this param name is valid */\n  isValid: boolean\n}\n\n/**\n * Extracts param names from a route path segment.\n *\n * Handles these patterns:\n * - $paramName                     -> extract \"paramName\"\n * - {$paramName}                   -> extract \"paramName\"\n * - prefix{$paramName}suffix       -> extract \"paramName\"\n * - {-$paramName}                  -> extract \"paramName\" (optional)\n * - prefix{-$paramName}suffix      -> extract \"paramName\" (optional)\n * - $ or {$}                       -> wildcard, skip validation\n */\nexport function extractParamsFromSegment(\n  segment: string,\n): Array<ExtractedParam> {\n  const params: Array<ExtractedParam> = []\n\n  // Skip empty segments\n  if (!segment || !segment.includes('$')) {\n    return params\n  }\n\n  // Check for wildcard ($ alone or {$})\n  if (segment === '$' || segment === '{$}') {\n    return params // Wildcard, no param name to validate\n  }\n\n  // Pattern 1: Simple $paramName (entire segment starts with $)\n  if (segment.startsWith('$') && !segment.includes('{')) {\n    const paramName = segment.slice(1)\n    if (paramName) {\n      params.push({\n        fullParam: segment,\n        paramName,\n        isOptional: false,\n        isValid: VALID_PARAM_NAME_REGEX.test(paramName),\n      })\n    }\n    return params\n  }\n\n  // Pattern 2: Braces pattern {$paramName} or {-$paramName} with optional prefix/suffix\n  // Match patterns like: prefix{$param}suffix, {$param}, {-$param}\n  const bracePattern = /\\{(-?\\$)([^}]*)\\}/g\n  let match\n\n  while ((match = bracePattern.exec(segment)) !== null) {\n    const prefix = match[1] // \"$\" or \"-$\"\n    const paramName = match[2] // The param name after $ or -$\n\n    if (!paramName) {\n      // This is a wildcard {$} or {-$}, skip\n      continue\n    }\n\n    const isOptional = prefix === '-$'\n\n    params.push({\n      fullParam: `${prefix}${paramName}`,\n      paramName,\n      isOptional,\n      isValid: VALID_PARAM_NAME_REGEX.test(paramName),\n    })\n  }\n\n  return params\n}\n\n/**\n * Extracts all params from a route path.\n *\n * @param path - The route path (e.g., \"/users/$userId/posts/$postId\")\n * @returns Array of extracted params with validation info\n */\nexport function extractParamsFromPath(path: string): Array<ExtractedParam> {\n  if (!path || !path.includes('$')) {\n    return []\n  }\n\n  const segments = path.split('/')\n  const allParams: Array<ExtractedParam> = []\n\n  for (const segment of segments) {\n    const params = extractParamsFromSegment(segment)\n    allParams.push(...params)\n  }\n\n  return allParams\n}\n\n/**\n * Validates a single param name.\n *\n * @param paramName - The param name to validate (without $ prefix)\n * @returns Whether the param name is valid\n */\nexport function isValidParamName(paramName: string): boolean {\n  return VALID_PARAM_NAME_REGEX.test(paramName)\n}\n\n/**\n * Gets all invalid params from a route path.\n *\n * @param path - The route path\n * @returns Array of invalid param info\n */\nexport function getInvalidParams(path: string): Array<ExtractedParam> {\n  const params = extractParamsFromPath(path)\n  return params.filter((p) => !p.isValid)\n}\n"],"mappings":";;;;;;;;;;;;;AAwBA,SAAgB,yBACd,SACuB;CACvB,MAAM,SAAgC,EAAE;AAGxC,KAAI,CAAC,WAAW,CAAC,QAAQ,SAAS,IAAI,CACpC,QAAO;AAIT,KAAI,YAAY,OAAO,YAAY,MACjC,QAAO;AAIT,KAAI,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,EAAE;EACrD,MAAM,YAAY,QAAQ,MAAM,EAAE;AAClC,MAAI,UACF,QAAO,KAAK;GACV,WAAW;GACX;GACA,YAAY;GACZ,SAAS,kBAAA,uBAAuB,KAAK,UAAU;GAChD,CAAC;AAEJ,SAAO;;CAKT,MAAM,eAAe;CACrB,IAAI;AAEJ,SAAQ,QAAQ,aAAa,KAAK,QAAQ,MAAM,MAAM;EACpD,MAAM,SAAS,MAAM;EACrB,MAAM,YAAY,MAAM;AAExB,MAAI,CAAC,UAEH;EAGF,MAAM,aAAa,WAAW;AAE9B,SAAO,KAAK;GACV,WAAW,GAAG,SAAS;GACvB;GACA;GACA,SAAS,kBAAA,uBAAuB,KAAK,UAAU;GAChD,CAAC;;AAGJ,QAAO;;;;;;;;AAST,SAAgB,sBAAsB,MAAqC;AACzE,KAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,CAC9B,QAAO,EAAE;CAGX,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,MAAM,YAAmC,EAAE;AAE3C,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,SAAS,yBAAyB,QAAQ;AAChD,YAAU,KAAK,GAAG,OAAO;;AAG3B,QAAO;;;;;;;;AAmBT,SAAgB,iBAAiB,MAAqC;AAEpE,QADe,sBAAsB,KAAK,CAC5B,QAAQ,MAAM,CAAC,EAAE,QAAQ"}