{"record":{"id":"c043fee57fb59227","repo":"swc-project/swc","slug":"unable-to-access-unknown-nodes-c043fe","errorCode":null,"errorMessage":"unable to access unknown nodes","messagePattern":"unable to access unknown nodes","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_typescript/src/fast_dts/enum.rs","lineNumber":97,"sourceCode":"            });\n        }\n    }\n\n    fn evaluate(\n        &self,\n        expr: &Expr,\n        enum_name: &Atom,\n        prev_members: &FxHashMap<Wtf8Atom, ConstantValue>,\n    ) -> Option<ConstantValue> {\n        match expr {\n            Expr::Lit(lit) => match lit {\n                Lit::Str(string) => Some(ConstantValue::String(string.value.clone())),\n                Lit::Num(number) => Some(ConstantValue::Number(number.clone())),\n                Lit::Null(_) | Lit::BigInt(_) | Lit::Bool(_) | Lit::Regex(_) | Lit::JSXText(_) => {\n                    None\n                }\n                #[cfg(swc_ast_unknown)]\n                _ => panic!(\"unable to access unknown nodes\"),\n            },\n            Expr::Tpl(template) => {\n                let mut quasis = template.quasis.iter();\n                let first = quasis.next()?.cooked.as_ref()?;\n                let mut value = Wtf8Buf::from(first);\n\n                for (expr, quasi) in template.exprs.iter().zip(quasis) {\n                    self.evaluate(expr, enum_name, prev_members)?\n                        .push_to(&mut value);\n                    value.push_wtf8(quasi.cooked.as_ref()?);\n                }\n\n                Some(ConstantValue::String(Wtf8Atom::from(&*value)))\n            }\n            Expr::Paren(expr) => self.evaluate(&expr.expr, enum_name, prev_members),\n            Expr::Bin(bin_expr) => self.evaluate_binary_expr(bin_expr, enum_name, prev_members),\n            Expr::Unary(unary_expr) => {\n                self.evaluate_unary_expr(unary_expr, enum_name, prev_members)","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_typescript/src/fast_dts/enum.rs#L79-L115","documentation":"fast_dts constant-evaluates enum member initializers; inside Expr::Lit it matches Lit keeping Str and Num as ConstantValue and returning None for Null/BigInt/Bool/Regex/JSXText. Under the swc_ast_unknown cfg (set by `--cfg=swc_ast_unknown` in wasm plugin builds) Lit gains an Unknown(tag, payload) variant; this arm panics because an unknown literal kind cannot be evaluated for enum member auto-numbering and string templates.","triggerScenarios":"fast_dts processes a TS enum whose member initializer deserialized as an unknown literal kind — a plugin compiled with --cfg=swc_ast_unknown against a swc_core older than the host that serialized the AST (e.g. a new literal node kind added upstream).","commonSituations":"Version skew between @swc/core host and plugin swc_core; prebuilt plugin wasm artifacts not rebuilt on host upgrade; new Lit variants in swc_ecma_ast releases.","solutions":["Rebuild the plugin with the swc_core version matching the host","Update swc_core to latest so the literal decodes as a known Lit variant","Skip fast_dts for enums (or files) containing Unknown literals","Resync versions rather than catching and ignoring the panic"],"exampleFix":"# before\n# enum E { A = <new-literal-kind> }  // host emits Lit::Unknown to old plugin\n# fast_dts evaluates initializer -> panic\n\n# after\nswc_core = \"=aligned-with-host\"  # rebuild plugin\n# literal decodes as Str/Num/...; evaluator returns Some/None normally","handlingStrategy":"type-guard","validationCode":"#[cfg(swc_ast_unknown)]\nfn program_contains_unknown_lit(m: &swc_ecma_ast::Module) -> bool {\n    use swc_ecma_ast::*;\n    m.body.iter().any(|i| matches!(i, ModuleItem::Stmt(Stmt::Decl(Decl::TsEnum(e)))\n        if e.members.iter().any(|mem| matches!(&mem.init, Some(\n            box Expr::Lit(Lit::Unknown(..)))))))\n}","typeGuard":"#[cfg(swc_ast_unknown)]\nfn lit_is_unknown(l: &swc_ecma_ast::Lit) -> bool {\n    matches!(l, swc_ecma_ast::Lit::Unknown(..))\n}","tryCatchPattern":"let out = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {\n    run_fast_dts(&mut program)\n}));\nif out.is_err() {\n    return Err(\"unknown literal in enum initializer; realign swc_core\".into());\n}","preventionTips":["Align plugin swc_core with the host @swc/core and rebuild","Skip enums whose initializers contain Unknown literals","Rebuild plugin wasm whenever the host is upgraded","Log the swc_core version alongside fast_dts runs for debugging"],"tags":["fast-dts","swc-plugin","wasm","version-skew","unknown-node","enum","constant-evaluation"],"backgroundTag":"ast-version-mismatch","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","contentChangedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}