{"record":{"id":"485899d98354ffd2","repo":"withastro/astro","slug":"invalid-route-file-parameter-name-must-match-485899","errorCode":null,"errorMessage":"Invalid route ${file} — parameter name must match /^[a-zA-Z0-9_$]+$/","messagePattern":"Invalid route (.+?) — parameter name must match /\\^\\[a-zA-Z0-9_\\$\\]\\+\\$/","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/astro/src/core/routing/parts.ts","lineNumber":17,"sourceCode":"import type { RoutePart } from '../../types/public/index.js';\n\n// Disable eslint as we're not sure how to improve this regex yet\n// eslint-disable-next-line regexp/no-super-linear-backtracking\nconst ROUTE_DYNAMIC_SPLIT = /\\[(.+?\\(.+?\\)|.+?)\\]/;\nconst ROUTE_SPREAD = /^\\.{3}.+$/;\n\nexport function getParts(part: string, file: string) {\n\tconst result: RoutePart[] = [];\n\tpart.split(ROUTE_DYNAMIC_SPLIT).map((str, i) => {\n\t\tif (!str) return;\n\t\tconst dynamic = i % 2 === 1;\n\n\t\tconst [, content] = dynamic ? /([^(]+)$/.exec(str) || [null, null] : [null, str];\n\n\t\tif (!content || (dynamic && !/^(?:\\.\\.\\.)?[\\w$]+$/.test(content))) {\n\t\t\tthrow new Error(`Invalid route ${file} — parameter name must match /^[a-zA-Z0-9_$]+$/`);\n\t\t}\n\n\t\tresult.push({\n\t\t\tcontent,\n\t\t\tdynamic,\n\t\t\tspread: dynamic && ROUTE_SPREAD.test(content),\n\t\t});\n\t});\n\n\treturn result;\n}\n","sourceCodeStart":1,"sourceCodeEnd":29,"githubUrl":"https://github.com/withastro/astro/blob/d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca/packages/astro/src/core/routing/parts.ts#L1-L29","documentation":"getParts() in routing/parts.ts rejected an invalid dynamic parameter name. Identical logic to the create-manifest guard: bracketed param names must match /^(?:\\.{3})?[\\w$]+$/ (alphanumerics, underscore, dollar; optional ... rest prefix). Thrown as a plain Error during route parsing.","triggerScenarios":"A page file like src/pages/[user.name].astro (dot), [two-words].astro (hyphen), [spa ce].astro, or malformed brackets; an integration or content layer generating invalid route filenames.","commonSituations":"Naming dynamic files with non-alphanumeric characters; tooling that emits REST-style or kebab-case param names; copy-paste from other frameworks using :param-name syntax.","solutions":["Rename so the bracketed token matches [A-Za-z0-9_$]+, e.g. [userName].astro.","Keep rest params as [...name].astro with no spaces.","Remove any stray punctuation inside the brackets."],"exampleFix":"// before — src/pages/users/[user-name].astro\n\n// after — src/pages/users/[userName].astro","handlingStrategy":"validation","validationCode":"function isValidParamContent(content: string): boolean {\n  return /^(?:\\.\\.\\.)?[\\w$]+$/.test(content);\n}\n// validate generated route filenames before writing them","typeGuard":"function isValidDynamicName(name: string): boolean {\n  return /^(?:\\.\\.\\.)?[A-Za-z0-9_$]+$/.test(name);\n}","tryCatchPattern":null,"preventionTips":["Limit bracketed param names to [A-Za-z0-9_$].","Sanitize names when scaffolding routes from data.","CI-check src/pages for brackets containing dots, hyphens, or spaces."],"tags":["routing","filesystem","validation","dynamic-routes"],"backgroundTag":null,"analyzedSha":"d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca","analyzedAt":"2026-08-12T13:37:29.035Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}