{"record":{"id":"9e798b913ca7d55c","repo":"remix-run/remix","slug":"files-extensions-cannot-include-compiled-asset-ext","errorCode":null,"errorMessage":"files.extensions cannot include compiled asset extensions like \"${normalizedExtension}\".","messagePattern":"files\\.extensions cannot include compiled asset extensions like \"(.+?)\"\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/assets/src/lib/files/config.ts","lineNumber":203,"sourceCode":"  }\n\n  let normalizedExtensions: string[] = []\n  let seen = new Set<string>()\n\n  for (let extension of files.extensions) {\n    if (typeof extension !== 'string') {\n      throw new TypeError('files.extensions values must be strings')\n    }\n\n    let normalizedExtension = extension.trim().toLowerCase()\n    if (!/^\\.[A-Za-z0-9_-]+$/.test(normalizedExtension)) {\n      throw new TypeError(\n        `files.extensions values must use \".ext\" format. Received \"${extension}\".`,\n      )\n    }\n\n    if (reservedFileExtensions.has(normalizedExtension)) {\n      throw new TypeError(\n        `files.extensions cannot include compiled asset extensions like \"${normalizedExtension}\".`,\n      )\n    }\n\n    if (seen.has(normalizedExtension)) continue\n    seen.add(normalizedExtension)\n    normalizedExtensions.push(normalizedExtension)\n  }\n\n  let transforms = files.transforms ?? {}\n  if (transforms === null || typeof transforms !== 'object' || Array.isArray(transforms)) {\n    throw new TypeError('files.transforms must be an object')\n  }\n\n  let normalizedTransforms = new Map<\n    string,\n    AssetRequestTransform<string, AssetRequestTransformParamMode>\n  >()","sourceCodeStart":185,"sourceCodeEnd":221,"githubUrl":"https://github.com/remix-run/remix/blob/9696913134be3a4423513d2775f7b31d6917c049/packages/assets/src/lib/files/config.ts#L185-L221","documentation":"The asset server reserves compiled/built asset extensions (e.g. `.js`, `.css` output types) for its own pipeline. Listing one of them in `files.extensions` (which is for raw source files served as-is) would collide with compiled asset routing, so it is rejected.","triggerScenarios":"Including a reserved extension such as `.js`, `.mjs`, `.css`, or similar compiled-output extension in `files.extensions`.","commonSituations":"Trying to serve raw `.js`/`.css` source files through the files pipeline instead of the transform pipeline; migrating configs that listed every extension the app uses, including build outputs.","solutions":["Remove the reserved compiled-asset extension from `files.extensions`","If you need to transform those files, use `files.transforms` / `globalTransforms` which target compiled assets properly"],"exampleFix":"// before\nfiles: { extensions: ['.md', '.css'] }\n// after\nfiles: { extensions: ['.md'] }","handlingStrategy":"validation","validationCode":"const RESERVED = new Set(['.js', '.mjs', '.cjs', '.css']) // consult library's reserved set\nlet safe = extensions.filter((e) => !RESERVED.has(e))","typeGuard":"function isReservedExt(e: string, reserved: Set<string>): boolean {\n  return reserved.has(e.trim().toLowerCase())\n}","tryCatchPattern":null,"preventionTips":["Keep files.extensions limited to raw source formats (.md, .txt, .csv)","Use transforms/globalTransforms for anything that compiles to js/css"],"tags":["config","files","extensions","reserved"],"backgroundTag":"conflicting-config-options","analyzedSha":"9696913134be3a4423513d2775f7b31d6917c049","analyzedAt":"2026-08-27T19:55:01.024Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}