{"record":{"id":"aacc2f6ef43f6926","repo":"swc-project/swc","slug":"failed-to-parse-pure-funcs-of-minifier-options","errorCode":null,"errorMessage":"failed to parse `pure_funcs` of minifier options: {err:?}","messagePattern":"failed to parse `pure_funcs` of minifier options: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_ecma_minifier/src/option/terser.rs","lineNumber":416,"sourceCode":"            unused: self.unused.unwrap_or(self.defaults),\n            const_to_let: self.const_to_let.unwrap_or(self.defaults),\n            pristine_globals: self.pristine_globals.unwrap_or(self.defaults),\n            pure_funcs: self\n                .pure_funcs\n                .into_iter()\n                .map(|input| {\n                    let fm = cm.new_source_file(FileName::Anon.into(), input);\n\n                    parse_file_as_expr(\n                        &fm,\n                        Default::default(),\n                        Default::default(),\n                        None,\n                        &mut Vec::new(),\n                    )\n                    .map(drop_span)\n                    .unwrap_or_else(|err| {\n                        panic!(\"failed to parse `pure_funcs` of minifier options: {err:?}\")\n                    })\n                })\n                .collect(),\n            experimental: self\n                .experimental\n                .map(|experimental| {\n                    CompressExperimentalOptions::from_terser_with_defaults(\n                        experimental,\n                        self.defaults,\n                    )\n                })\n                .unwrap_or(CompressExperimentalOptions::from_defaults(self.defaults)),\n        }\n    }\n}\n\nimpl From<TerserTopLevelOptions> for TopLevelOptions {\n    fn from(c: TerserTopLevelOptions) -> Self {","sourceCodeStart":398,"sourceCodeEnd":434,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_ecma_minifier/src/option/terser.rs#L398-L434","documentation":"Each entry in the terser-compatible `pure_funcs` compress option is parsed as a JavaScript expression (parse_file_as_expr) when converting TerserCompressOptions into CompressOptions. An entry with invalid expression syntax panics with the parser error.","triggerScenarios":"pure_funcs entries like \"foo bar\", \"a(\", \"\", \"function f(){}\" (statement-level text), or strings with stray punctuation that fail expression parsing.","commonSituations":"Passing function declarations instead of references (\"function f(){}\" instead of \"f\"), trailing semicolons/commas from templated config, empty strings produced by YAML/JSON templating, copy-paste of terser CLI quoting artifacts.","solutions":["Use plain dotted identifier references: \"Object.freeze\", \"_track\", \"MyClass.method\"","Remove empty strings and entries with statement syntax; pure_funcs marks call targets as side-effect free, it only needs the callee path","Validate every entry against ^[A-Za-z_$][A-Za-z0-9_$.]*$ (allowing quoted segments) before constructing the options"],"exampleFix":"// before\ncompress: { pure_funcs: [\"function f(){}\", \"\"] } // panic: failed to parse `pure_funcs`\n\n// after\ncompress: { pure_funcs: [\"_track\", \"Object.freeze\"] }","handlingStrategy":"validation","validationCode":"// JS: pure_funcs entries must be dotted member paths\nconst pureOk = s => /^[A-Za-z_$][\\w$]*(\\.[A-Za-z_$][\\w$]*)*$/.test(s);\nconst bad = pureFuncs.filter(s => !pureOk(s));\nif (bad.length) throw new Error(`invalid pure_funcs entries: ${bad.join(', ')}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Store only callee references (Object.freeze, _track) in pure_funcs, never declarations","Reject empty strings at config load","Prefer annotations (/*#__PURE__*/) for call-site purity instead of long pure_funcs lists"],"tags":["minifier","terser","pure-funcs","config","parse-error"],"backgroundTag":"config-expression-parse-failed","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"}