{"record":{"id":"b99616268cd46bc6","repo":"swc-project/swc","slug":"unknown-key-k","errorCode":null,"errorMessage":"unknown key: {k}","messagePattern":"unknown key: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/preset_env_base/src/lib.rs","lineNumber":86,"sourceCode":"    pub hermes: T,\n    #[serde(default)]\n    pub oculus: T,\n    #[serde(default)]\n    pub bun: T,\n}\n\nimpl<T> BrowserData<T>\nwhere\n    T: Default,\n{\n    pub fn insert(&mut self, k: &str, v: T) -> T {\n        for (key, value) in self.iter_mut() {\n            if k == key {\n                return std::mem::replace(value, v);\n            }\n        }\n\n        panic!(\"unknown key: {k}\")\n    }\n}\n\n/// A map of browser names to data for feature support in browser.\n///\n/// This type mainly stores `minimum version for each browsers with support for\n/// a feature`.\npub type Versions = BrowserData<Option<Version>>;\n\nimpl BrowserData<Option<Version>> {\n    /// Returns true if all fields are [None].\n    pub fn is_any_target(&self) -> bool {\n        self.iter().all(|(_, v)| v.is_none())\n    }\n\n    /// Parses the value returned from `browserslist` as [Versions].\n    pub fn parse_versions(distribs: Vec<browserslist::Distrib>) -> Result<Self, Error> {\n        fn remap(key: &str) -> &str {","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/preset_env_base/src/lib.rs#L68-L104","documentation":"Runtime panic from swc's preset_env_base. `BrowserData` is a fixed, allocation-free struct map with a closed set of keys (chrome, chrome-android, firefox-android, opera-android, quest, react-native, and_chr, and_ff, op_mob, ie, edge, firefox, safari, node, ios, samsung, opera, android, electron, phantom, opera_mobile, rhino, deno, hermes, oculus, bun). `insert` linearly scans those keys and panics with `unknown key: {k}` for anything else — typically a browserslist query result naming an unmapped browser.","triggerScenarios":"A browserslist query (e.g. `defaults`, `> 0.5%`, `cover 95%`) resolves to a browser id that has no field, such as `op_mini`, `kaios`, `and_qq`, `and_uc`, or `baidu`; query.rs then calls `BrowserData::insert` with that name and panics.","commonSituations":"A browserslist/caniuse database update introduces or surfaces browser ids the static map does not know; using broad market-share queries in swc preset-env / parcel-css style tooling that pull in regional browsers.","solutions":["Narrow the browserslist query (e.g. explicit `chrome >= 90, firefox >= 100` instead of `defaults`/percentile queries)","Pin the browserslist/caniuse database version so new browser ids cannot appear","Map or filter the unsupported key before insert (see validation below)","Upstream: extend BrowserData with the new browser field and its serde rename"],"exampleFix":"// before\nlet query = Query::from_str(\"> 0.5%\", ...); // may include op_mini/kaios -> panic on insert\n\n// after\nlet query = Query::from_str(\"chrome >= 90, firefox >= 100\", ...); // only mapped keys","handlingStrategy":"validation","validationCode":"const KNOWN: &[&str] = &[\n    \"chrome\", \"chrome-android\", \"firefox-android\", \"opera-android\", \"quest\",\n    \"react-native\", \"and_chr\", \"and_ff\", \"op_mob\", \"ie\", \"edge\", \"firefox\",\n    \"safari\", \"node\", \"ios\", \"samsung\", \"opera\", \"android\", \"electron\",\n    \"phantom\", \"opera_mobile\", \"rhino\", \"deno\", \"hermes\", \"oculus\", \"bun\",\n];\n\nfn known_key(k: &str) -> bool {\n    KNOWN.contains(&k)\n}\n\n// before inserting a browserslist result:\nlet value = if known_key(name) {\n    data.insert(name, version)\n} else {\n    // skip, log, or map the unsupported browser instead of panicking\n    log::warn!(\"ignoring unsupported browser target: {name}\");\n    Default::default()\n};","typeGuard":"fn is_supported_browser(name: &str) -> bool {\n    matches!(\n        name,\n        \"chrome\" | \"chrome-android\" | \"firefox-android\" | \"opera-android\" | \"quest\"\n            | \"react-native\" | \"and_chr\" | \"and_ff\" | \"op_mob\" | \"ie\" | \"edge\"\n            | \"firefox\" | \"safari\" | \"node\" | \"ios\" | \"samsung\" | \"opera\" | \"android\"\n            | \"electron\" | \"phantom\" | \"opera_mobile\" | \"rhino\" | \"deno\" | \"hermes\"\n            | \"oculus\" | \"bun\"\n    )\n}","tryCatchPattern":null,"preventionTips":["Pin the browserslist/caniuse database version in CI to avoid new browser ids appearing overnight","Prefer explicit browser lists over percentile/`defaults` queries that can pull in unmapped browsers","When vendoring preset_env_base, keep the key-mapping table in query.rs in sync with BrowserData fields"],"tags":["swc","preset-env","browserslist","browser-targets","panic"],"backgroundTag":"unknown-config-key","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}