{"record":{"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/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab/packages/vite/src/node/config.ts#L934-L970","documentation":"When Vite normalizes build.rollupOptions.input it calls unescapeGlobCharacters, which uses isDynamicPattern to detect glob metacharacters (* ? [ ] { } ( ) ! + @ |). Because input keys are reserved for future glob support, Vite throws rather than silently misinterpreting them. The fix is to backslash-escape any literal metacharacter.","triggerScenarios":"Passing an input path that contains a literal *, ?, [], {}, etc. - e.g. a file named 'config[dev].ts' or 'v1@2.ts'. Most often from generated filenames or path templates.","commonSituations":"Build pipelines that pass parameterized paths (e.g. 'src/entries/[name].ts'); monorepo tools that produce bracketed paths; Windows builds with weird artifact names.","solutions":["Backslash-escape each metacharacter in the input string, e.g. 'src/entries/\\[name\\].ts'.","Rename the source file to avoid glob metacharacters if you control it.","Pass input as an object whose values are escaped paths."],"exampleFix":"// before\nbuild: { rollupOptions: { input: 'src/entries/[name].ts' } }\n// after\nbuild: { rollupOptions: { input: 'src/entries/\\\\[name\\\\].ts' } }","handlingStrategy":"validation","validationCode":"const globChars = /[*?\\[\\]{}()!+@|]/;\nfunction validateInput(value) {\n  const vals = Array.isArray(value) ? value : typeof value === 'object' ? Object.values(value) : [value];\n  return vals.map((v) => ({ value: v, ok: !globChars.test(String(v)) }));\n}","typeGuard":"function isGlobFree(value) {\n  const vals = Array.isArray(value) ? value : typeof value === 'object' ? Object.values(value) : [value];\n  return vals.every((v) => !/[*?\\[\\]{}()!+@|]/.test(String(v)));\n}","tryCatchPattern":null,"preventionTips":["Backslash-escape literal glob metacharacters in input paths.","Avoid bracketed/parameterized filenames for build entries."],"tags":["build","config","input","glob"],"backgroundTag":null,"analyzedSha":"b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab","analyzedAt":"2026-08-11T11:49:19.515Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}