{"record":{"id":"47aa246403fe0c8e","repo":"swc-project/swc","slug":"expected-dpi-dpcm-dppx-or-x-units","errorCode":null,"errorMessage":"Expected 'dpi', 'dpcm', 'dppx' or 'x' units","messagePattern":"Expected 'dpi', 'dpcm', 'dppx' or 'x' units","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"crates/swc_css_parser/src/parser/values_and_units/mod.rs","lineNumber":2222,"sourceCode":"\n        if !is!(self, Dimension) {\n            return Err(Error::new(span, ErrorKind::Expected(\"dimension token\")));\n        }\n\n        match bump!(self) {\n            Token::Dimension {\n                dimension: dimension_token,\n            } => {\n                let DimensionToken {\n                    value,\n                    unit,\n                    raw_value,\n                    raw_unit,\n                    ..\n                } = *dimension_token;\n\n                if !is_resolution_unit(&unit) {\n                    return Err(Error::new(\n                        span,\n                        ErrorKind::Expected(\"'dpi', 'dpcm', 'dppx' or 'x' units\"),\n                    ));\n                }\n\n                let unit_len = raw_unit.len() as u32;\n\n                Ok(Resolution {\n                    span,\n                    value: Number {\n                        span: Span::new(span.lo, span.hi - BytePos(unit_len)),\n                        value,\n                        raw: Some(raw_value),\n                    },\n                    unit: Ident {\n                        span: Span::new(span.hi - BytePos(unit_len), span.hi),\n                        value: unit,\n                        raw: Some(raw_unit),","sourceCodeStart":2204,"sourceCodeEnd":2240,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_css_parser/src/parser/values_and_units/mod.rs#L2204-L2240","documentation":"Thrown by Parse<Resolution> in swc_css_parser when the token is a dimension but its unit is not a resolution unit. After bumping Token::Dimension it checks is_resolution_unit(&unit), which accepts only dpi, dpcm, dppx, and x (ASCII case-insensitive). Units like 'ppi', 'px', 'dpr', or 'dp' produce this error spanning the entire dimension token.","triggerScenarios":"Values like '(min-resolution: 96ppi)', '(resolution: 2dpr)', '(min-resolution: 10px)', or unit strings coming from a device-descriptor map that uses non-CSS names.","commonSituations":"Porting Android (dp) or print (ppi) terminology into media queries, and tooling that emits device-pixel-ratio units under a different name than CSS's 'x'/'dppx'.","solutions":["Map to CSS units: ppi/dpr->dpi or dppx, dp is a length not a resolution (use dp-equivalent px instead if a length is meant).","Use exactly dpi, dpcm, dppx, or x.","Whitelist-validate resolution units before generating the media query."],"exampleFix":"/* before */\n@media (min-resolution: 96ppi) { ... }\n\n/* after */\n@media (min-resolution: 96dpi) { ... }","handlingStrategy":"validation","validationCode":"const RES_UNITS = new Set([\"dpi\", \"dpcm\", \"dppx\", \"x\"]);\nfunction hasValidResolutionUnit(v: string): boolean {\n  const i = [...v].findIndex(c => /[a-zA-Z]/.test(c));\n  return i > 0 && RES_UNITS.has(v.slice(i).toLowerCase());\n}","typeGuard":"fn valid_resolution_unit(unit: &str) -> bool {\n    matches!(unit.to_ascii_lowercase().as_str(), \"dpi\" | \"dpcm\" | \"dppx\" | \"x\")\n}","tryCatchPattern":"use swc_css_parser::error::ErrorKind;\nif let Err(e) = parse_input::<Stylesheet>(src, opts) {\n    if matches!(e.kind(), ErrorKind::Expected(\"'dpi', 'dpcm', 'dppx' or 'x' units\")) {\n        return Err(format!(\"bad resolution unit at {:?}\", e.span()).into());\n    }\n    return Err(e.into());\n}","preventionTips":["Map platform units to CSS: ppi->dpi, dpr->x/dppx; reject 'dp' as a resolution.","Keep a unit alias table next to media-query generation code.","Property-test resolution strings coming from device databases."],"tags":["css","swc","parser","resolution","units","media-query"],"backgroundTag":"css-invalid-resolution-unit","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","contentChangedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}