{"record":{"id":"e84158d3bb375f35","repo":"remix-run/remix","slug":"optionpath-must-use-version-components-between","errorCode":null,"errorMessage":"${optionPath} must use version components between 0 and 255","messagePattern":"(.+?) must use version components between 0 and 255","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/assets/src/lib/target.ts","lineNumber":183,"sourceCode":"  return `es${normalizedValue}`\n}\n\nfunction normalizeBrowserTargetVersion(value: unknown, optionPath: string): AssetTargetVersion {\n  if (typeof value !== 'string') {\n    throw new TypeError(`${optionPath} must be a string`)\n  }\n\n  if (value.trim().length === 0) {\n    throw new TypeError(`${optionPath} must be a non-empty string`)\n  }\n\n  if (!/^\\d+(\\.\\d+){0,2}$/.test(value)) {\n    throw new TypeError(`${optionPath} must use \"X\", \"X.Y\", or \"X.Y.Z\" version format`)\n  }\n\n  let segments = value.split('.').map(Number)\n  if (segments.some((segment) => segment > 255)) {\n    throw new TypeError(`${optionPath} must use version components between 0 and 255`)\n  }\n\n  return value as AssetTargetVersion\n}\n\nfunction toLightningCssTargetVersion(version: AssetTargetVersion): number {\n  let [major, minor = 0, patch = 0] = version.split('.').map(Number)\n  return major * 65536 + minor * 256 + patch\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","sourceCodeStart":165,"sourceCodeEnd":197,"githubUrl":"https://github.com/remix-run/remix/blob/9696913134be3a4423513d2775f7b31d6917c049/packages/assets/src/lib/target.ts#L165-L197","documentation":"Thrown when a browser target version has a component greater than 255. Versions are packed into a compact numeric representation, so each of the up-to-three components must fit in one byte (0–255). Values like '300' or '90.999' pass the format check but exceed the component limit.","triggerScenarios":"`{ script: { chrome: '300' } }`, `{ style: { safari: '16.999' } }`, or any component numerically above 255 even if well-formatted.","commonSituations":"Typos (extra digit) in version numbers; future-dated or nonsense versions from generated config; copying build numbers like '1234' into a version field.","solutions":["Correct the version to a plausible browser release (all current browsers are well under 255)","Sanity-check generated config: reject components > 255 before calling the assets API","If the value came from a User-Agent parse, verify you extracted the browser version, not a build/patch number"],"exampleFix":"// before\nlet target = { script: { chrome: '3000' } }\n// after\nlet target = { script: { chrome: '90' } }","handlingStrategy":"validation","validationCode":"let isValidVersion = (value: string) =>\n  /^\\d+(\\.\\d+){0,2}$/.test(value) && value.split('.').every((s) => Number(s) <= 255)\nif (!isValidVersion(version)) throw new Error('version components must be 0-255')","typeGuard":"let isByteVersion = (value: unknown): value is string =>\n  typeof value === 'string' &&\n  /^\\d+(\\.\\d+){0,2}$/.test(value) &&\n  value.split('.').every((s) => Number(s) <= 255)","tryCatchPattern":null,"preventionTips":["Sanity-check versions against plausible browser releases before config build","Reject any component above 255 in your config validator"],"tags":["config","validation","version-range"],"backgroundTag":"invalid-config-value","analyzedSha":"9696913134be3a4423513d2775f7b31d6917c049","analyzedAt":"2026-08-27T19:55:01.024Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}