{"id":"04cea1d7270cd2a2","repo":"vitejs/vite","slug":"input-cannot-contain-glob-characters-they-are-r","errorCode":null,"errorMessage":"`input` cannot contain glob characters. They are reserved, so the ${JSON.stringify(value)} is not allowed. Please escape them with a backslash (\\)","messagePattern":"`input` cannot contain glob characters\\. They are reserved, so the (.+?) is not allowed\\. Please escape them with a backslash \\(\\\\\\)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vite/src/node/config.ts","lineNumber":952,"sourceCode":"  if (typeof input === 'string') {\n    return unescapeGlobCharacters(input)\n  }\n  if (Array.isArray(input)) {\n    return input.map(unescapeGlobCharacters)\n  }\n  const resolved: Record<string, string> = {}\n  for (const key in input) {\n    resolved[key] = unescapeGlobCharacters(input[key])\n  }\n  return resolved\n}\n\nconst escapedGlobCharactersRE = /\\\\([*?[\\]{}()!+@|])/g\n\nfunction unescapeGlobCharacters(value: string): string {\n  if (isDynamicPattern(value)) {\n    // so that it could later be changed to accept globs without a breaking change\n    throw new Error(\n      `\\`input\\` cannot contain glob characters. They are reserved, ` +\n        `so the ${JSON.stringify(value)} is not allowed. Please escape them with a backslash (\\\\)`,\n    )\n  }\n  // unescape glob characters\n  return value.replace(escapedGlobCharactersRE, '$1')\n}\n\nexport function resolveDevEnvironmentOptions(\n  dev: DevEnvironmentOptions | undefined,\n  environmentName: string | undefined,\n  consumer: 'client' | 'server' | undefined,\n  // Backward compatibility\n  preTransformRequest?: boolean,\n): ResolvedDevEnvironmentOptions {\n  const resolved = mergeWithDefaults(\n    {\n      ...configDefaults.dev,","sourceCodeStart":934,"sourceCodeEnd":970,"githubUrl":"https://github.com/vitejs/vite/blob/89620f09afcfef6b35e7bb8660132ab5b4d0cd3b/packages/vite/src/node/config.ts#L934-L970","documentation":"In unescapeGlobCharacters (config.ts:949-956), Vite rejects any input value that isDynamicPattern (contains unescaped glob characters like *, ?, [], {}, etc.). Glob characters are reserved so Vite can later enable glob inputs without a breaking change; they must be escaped with a backslash if you mean them literally.","triggerScenarios":"Setting rollupOptions/rolldownOptions.input (or top-level input) to a path containing unescaped glob metacharacters, e.g. 'src/[dir]/main.ts' or 'src/app*(legacy).ts'.","commonSituations":"Pathnames with square brackets (Next.js-style dynamic routes like [id].tsx), literal asterisks, or accidentally pasting a glob into input.","solutions":["Escape the glob characters with a backslash, e.g. 'src/\\[id\\].tsx'.","Rename the file to avoid glob metacharacters if possible.","List explicit entries instead of relying on a glob-like path."],"exampleFix":"// before\nbuild: { rollupOptions: { input: 'src/pages/[id].tsx' } }\n// after\nbuild: { rollupOptions: { input: 'src/pages/\\[id\\].tsx' } }","handlingStrategy":"validation","validationCode":"import isDynamicPattern from 'tinyglobby'\nfunction assertNoGlobInput(input: unknown) {\n  const list = typeof input === 'string' ? [input] : Array.isArray(input) ? input : input ? Object.values(input as any) : []\n  for (const v of list) if (isDynamicPattern(v as string)) throw new Error(`Glob chars in input: ${v}`)\n}","typeGuard":"function isGlobFreeInput(input: unknown): boolean {\n  const list = typeof input === 'string' ? [input] : Array.isArray(input) ? input : input ? Object.values(input as any) : []\n  // simplistic check; Vite uses tinyglobby isDynamicPattern\n  return !list.some((v: any) => /[*?\\[\\]{}!+@|]/.test(v) && !v.includes('\\\\'))\n}","tryCatchPattern":null,"preventionTips":["Escape literal glob metacharacters (e.g. brackets in [id].tsx) with backslashes.","Rename files that contain glob characters when feasible.","Avoid pasting glob patterns into input; use explicit entry lists."],"tags":["config","input","glob","validation"],"analyzedSha":"89620f09afcfef6b35e7bb8660132ab5b4d0cd3b","analyzedAt":"2026-08-03T19:28:02.920Z","schemaVersion":2}