{"record":{"id":"4d2d8b9d4f673655","repo":"remix-run/remix","slug":"files-transforms-name-param-must-be-true-or-op","errorCode":null,"errorMessage":"files.transforms.${name}.param must be true or \"optional\"","messagePattern":"files\\.transforms\\.(.+?)\\.param must be true or \"optional\"","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/assets/src/lib/files/config.ts","lineNumber":244,"sourceCode":"        `files.transforms keys must use \"transform-name\" format. Received \"${name}\".`,\n      )\n    }\n\n    if (\n      transform === null ||\n      typeof transform !== 'object' ||\n      typeof transform.transform !== 'function'\n    ) {\n      throw new TypeError(`files.transforms.${name} must define a transform() function`)\n    }\n\n    if (\n      'param' in transform &&\n      transform.param !== undefined &&\n      transform.param !== true &&\n      transform.param !== 'optional'\n    ) {\n      throw new TypeError(`files.transforms.${name}.param must be true or \"optional\"`)\n    }\n\n    normalizedTransforms.set(name, {\n      ...transform,\n      extensions: normalizeTransformExtensions(\n        transform.extensions,\n        `files.transforms.${name}.extensions`,\n      ),\n    })\n  }\n\n  let globalTransforms = files.globalTransforms ?? []\n  if (!Array.isArray(globalTransforms)) {\n    throw new TypeError('files.globalTransforms must be an array')\n  }\n\n  let normalizedGlobalTransforms: ResolvedAssetGlobalTransform[] = []\n","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/remix-run/remix/blob/9696913134be3a4423513d2775f7b31d6917c049/packages/assets/src/lib/files/config.ts#L226-L262","documentation":"A transform's optional `param` field controls whether the transform accepts a URL parameter. It must be exactly `true` (required param) or the string `'optional'` (optional param); any other value is rejected. `undefined`/absent is fine and means no param.","triggerScenarios":"Passing `param: false`, `param: 'required'`, `param: 'true'`, or a non-'optional' string on a transform definition.","commonSituations":"Assuming `param: false` is the way to disable params (just omit the field); using the string `'required'` which is not accepted; copy-paste from docs of a different version.","solutions":["Remove the `param` field to disable parameters","Use `param: true` for a required parameter or `param: 'optional'` for an optional one"],"exampleFix":"// before\nfiles: { transforms: { md: { transform: fn, param: 'required' } } }\n// after\nfiles: { transforms: { md: { transform: fn, param: true } } }","handlingStrategy":"validation","validationCode":"for (let t of Object.values(files.transforms ?? {})) {\n  if ('param' in t && t.param !== undefined && t.param !== true && t.param !== 'optional') {\n    delete t.param // or throw\n  }\n}","typeGuard":"function isValidParam(p: unknown): boolean {\n  return p === undefined || p === true || p === 'optional'\n}","tryCatchPattern":null,"preventionTips":["Omit param entirely when no URL parameter is needed","Remember only true and 'optional' are accepted"],"tags":["config","files","transforms","param","validation"],"backgroundTag":"invalid-option-value","analyzedSha":"9696913134be3a4423513d2775f7b31d6917c049","analyzedAt":"2026-08-27T19:55:01.024Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}