From 0277066fc9c9bbaad15a545f75635b09d1d25d4c Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 26 Nov 2024 10:46:52 +0100 Subject: [PATCH] fix(js): Resolve conflict between "debugId" and "debug_id" (#877) Using an alias causes deserialization to fail when both keys are set. Therefore we now read both fields and implement the logic explicitly. --- CHANGELOG.md | 6 ++++++ symbolic-debuginfo/src/js.rs | 30 ++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 855b7b17..282cd4ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +**Fixes** +- js: Fixed an error when reading debug IDs from sourcemaps with + both `"debugId"` and `"debug_id"` keys ([#877](https://github.com/getsentry/symbolic/pull/877)). + ## 12.12.1 **Features**: diff --git a/symbolic-debuginfo/src/js.rs b/symbolic-debuginfo/src/js.rs index 3356a702..5da34c8e 100644 --- a/symbolic-debuginfo/src/js.rs +++ b/symbolic-debuginfo/src/js.rs @@ -30,17 +30,22 @@ pub fn discover_sourcemaps_location(contents: &str) -> Option<&str> { /// Quickly reads the embedded `debug_id` key from a source map. /// -/// Both `debug_id` and `debugId` are supported as field names. +/// Both `debugId` and `debug_id` are supported as field names. If both +/// are set, the former takes precedence. pub fn discover_sourcemap_embedded_debug_id(contents: &str) -> Option { + // Deserialize from `"debugId"` or `"debug_id"`, + // preferring the former. #[derive(Deserialize)] struct DebugIdInSourceMap { - #[serde(alias = "debugId")] - debug_id: Option, + #[serde(rename = "debugId")] + debug_id_new: Option, + #[serde(rename = "debug_id")] + debug_id_old: Option, } serde_json::from_str(contents) .ok() - .and_then(|x: DebugIdInSourceMap| x.debug_id) + .and_then(|x: DebugIdInSourceMap| x.debug_id_new.or(x.debug_id_old)) } /// Parses a `debugId` comment in a file to discover a sourcemap's debug ID. @@ -90,4 +95,21 @@ mod tests { Some(DebugId::default()) ); } + + #[test] + fn test_debugid_both() { + let input = r#"{ + "version":3, + "sources":["coolstuff.js"], + "names":["x","alert"], + "mappings":"AAAA,GAAIA,GAAI,EACR,IAAIA,GAAK,EAAG,CACVC,MAAM", + "debugId":"00000000-0000-0000-0000-000000000000", + "debug_id":"11111111-1111-1111-1111-111111111111" + }"#; + + assert_eq!( + discover_sourcemap_embedded_debug_id(input), + Some(DebugId::default()) + ); + } }