{"version":3,"file":"validate-route-params.cjs","names":[],"sources":["../../src/validate-route-params.ts"],"sourcesContent":["import type { Logger } from './logger'\n\n/**\n * Regex for valid JavaScript identifier (param name)\n * Must start with letter, underscore, or dollar sign\n * Can contain letters, numbers, underscores, or dollar signs\n */\nconst VALID_PARAM_NAME_REGEX = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/\n\ninterface ExtractedParam {\n  /** The param name without $ prefix (e.g., \"userId\", \"optional\") */\n  paramName: string\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 */\nfunction extractParamsFromSegment(segment: string): 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        paramName,\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 paramName = match[2] // The param name after $ or -$\n\n    if (!paramName) {\n      // This is a wildcard {$} or {-$}, skip\n      continue\n    }\n\n    params.push({\n      paramName,\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 */\nfunction 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 route params and logs warnings for invalid param names.\n *\n * @param routePath - The route path to validate\n * @param filePath - The file path for error messages\n * @param logger - Logger instance for warnings\n */\nexport function validateRouteParams(\n  routePath: string,\n  filePath: string,\n  logger: Logger,\n): void {\n  const params = extractParamsFromPath(routePath)\n  const invalidParams = params.filter((p) => !p.isValid)\n\n  for (const param of invalidParams) {\n    logger.warn(\n      `WARNING: Invalid param name \"${param.paramName}\" in route \"${routePath}\" (file: ${filePath}). ` +\n        `Param names must be valid JavaScript identifiers (match /[a-zA-Z_$][a-zA-Z0-9_$]*/).`,\n    )\n  }\n}\n"],"mappings":";;;;;;AAOA,IAAM,yBAAyB;;;;;;;;;;;;AAoB/B,SAAS,yBAAyB,SAAwC;CACxE,MAAM,SAAgC,CAAC;CAGvC,IAAI,CAAC,WAAW,CAAC,QAAQ,SAAS,GAAG,GACnC,OAAO;CAIT,IAAI,YAAY,OAAO,YAAY,OACjC,OAAO;CAIT,IAAI,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,SAAS,GAAG,GAAG;EACrD,MAAM,YAAY,QAAQ,MAAM,CAAC;EACjC,IAAI,WACF,OAAO,KAAK;GACV;GACA,SAAS,uBAAuB,KAAK,SAAS;EAChD,CAAC;EAEH,OAAO;CACT;CAIA,MAAM,eAAe;CACrB,IAAI;CAEJ,QAAQ,QAAQ,aAAa,KAAK,OAAO,OAAO,MAAM;EACpD,MAAM,YAAY,MAAM;EAExB,IAAI,CAAC,WAEH;EAGF,OAAO,KAAK;GACV;GACA,SAAS,uBAAuB,KAAK,SAAS;EAChD,CAAC;CACH;CAEA,OAAO;AACT;;;;;;;AAQA,SAAS,sBAAsB,MAAqC;CAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,GAAG,GAC7B,OAAO,CAAC;CAGV,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,MAAM,YAAmC,CAAC;CAE1C,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,SAAS,yBAAyB,OAAO;EAC/C,UAAU,KAAK,GAAG,MAAM;CAC1B;CAEA,OAAO;AACT;;;;;;;;AASA,SAAgB,oBACd,WACA,UACA,QACM;CAEN,MAAM,gBADS,sBAAsB,SACf,EAAO,QAAQ,MAAM,CAAC,EAAE,OAAO;CAErD,KAAK,MAAM,SAAS,eAClB,OAAO,KACL,gCAAgC,MAAM,UAAU,cAAc,UAAU,WAAW,SAAS,wFAE9F;AAEJ"}