{"record":{"id":"2e1a2b5d71a01d74","repo":"rolldown/rolldown","slug":"invalid-preset-for-generatedcode-option-s","errorCode":null,"errorMessage":"Invalid preset for `generatedCode` option: ${s}","messagePattern":"Invalid preset for `generatedCode` option: (.+?)","errorType":"validation","errorClass":"napi::Error","httpStatus":null,"severity":"error","filePath":"crates/rolldown_binding/src/utils/normalize_binding_options.rs","lineNumber":57,"sourceCode":"use rolldown_plugin::__inner::SharedPluginable;\nuse rolldown_utils::indexmap::FxIndexMap;\nuse rolldown_utils::rustc_hash::FxHashMapExt;\nuse rustc_hash::FxHashMap;\nuse std::path::PathBuf;\nuse url::Url;\n\n#[cfg(not(target_family = \"wasm\"))]\nuse crate::{options::plugin::ParallelJsPlugin, worker_manager::WorkerManager};\nuse std::sync::Arc;\n\nfn normalize_generated_code_option(\n  value: BindingGeneratedCodeOptions,\n) -> napi::Result<GeneratedCodeOptions> {\n  let v = match value.preset {\n    Some(s) if s == \"es5\" => GeneratedCodeOptions::es5(),\n    Some(s) if s == \"es2015\" => GeneratedCodeOptions::es2015(),\n    Some(s) => {\n      return Err(napi::Error::new(\n        napi::Status::InvalidArg,\n        format!(\"Invalid preset for `generatedCode` option: {s}\"),\n      ));\n    }\n    None => GeneratedCodeOptions::default(),\n  };\n  Ok(GeneratedCodeOptions { symbols: value.symbols.unwrap_or(v.symbols) })\n}\n\nfn normalize_addon_option(\n  addon_option: Option<crate::options::AddonOutputOption>,\n  name: &'static str,\n) -> Option<AddonOutputOption> {\n  addon_option.map(move |value| match value {\n    // Static string - no JS function call needed\n    Either::A(string) => AddonOutputOption::String(Some(string)),\n    // Dynamic function\n    Either::B(fn_js) => AddonOutputOption::Fn(Arc::new(move |chunk| {","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/rolldown/rolldown/blob/91b44b9d7bcfb5725533478e044e3891a251b2c5/crates/rolldown_binding/src/utils/normalize_binding_options.rs#L39-L75","documentation":"Napi-side validation in normalize_generated_code_option: the `generatedCode.preset` string matched neither 'es5' nor 'es2015'. The value comes from the JS `generatedCode` option object; any other preset string is rejected as invalid.","triggerScenarios":"Calling with `generatedCode: { preset: 'es2020' }`, `'es6'`, `'modern'`, or any string other than 'es5'/'es2015'.","commonSituations":"Assuming arbitrary year presets exist, copying `es6` from other tools' terminology, or typos in the preset name.","solutions":["Use preset 'es5' or 'es2015' exactly.","If you need finer control than those presets, drop the `preset` field and set the individual generatedCode flags instead.","Omit `preset` entirely to get defaults."],"exampleFix":"// before\ngeneratedCode: { preset: 'es6' }\n// after\ngeneratedCode: { preset: 'es2015' }","handlingStrategy":"validation","validationCode":"const VALID_PRESETS = ['es5', 'es2015'];\nif (opts.generatedCode?.preset != null && !VALID_PRESETS.includes(opts.generatedCode.preset)) {\n  throw new Error(`generatedCode preset must be one of ${VALID_PRESETS.join(', ')}`);\n}","typeGuard":"const isGeneratedCodePreset = (v) =>\n  v == null || v === 'es5' || v === 'es2015';","tryCatchPattern":"try {\n  await build(opts);\n} catch (e) {\n  if (String(e.message).startsWith('Invalid preset for `generatedCode`')) {\n    delete opts.generatedCode.preset; // fall back to per-flag config\n  } else throw e;\n}","preventionTips":["Only use 'es5' or 'es2015' presets; set individual flags for anything else.","Type the preset as `'es5' | 'es2015' | undefined`.","Omit `preset` when unsure — defaults are applied."],"tags":["options","validation","enum","generated-code"],"backgroundTag":"invalid-enum-value","analyzedSha":"91b44b9d7bcfb5725533478e044e3891a251b2c5","analyzedAt":"2026-09-07T16:04:13.504Z","contentChangedAt":"2026-09-07T16:04:13.504Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}