From 050da4835b0ddb1bf1dc6ba45fdb44d8a6f50481 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Jul 2023 12:36:59 +0200 Subject: [PATCH 1/4] feat: Support debug ids --- Cargo.toml | 1 + src/builder.rs | 17 ++++++++++++++++- src/decoder.rs | 9 ++++++++- src/encoder.rs | 2 ++ src/jsontypes.rs | 3 +++ src/types.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cdca4a86..439b839c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,7 @@ unicode-id = "0.3" if_chain = "1.0.0" scroll = { version = "0.10.1", features = ["derive"], optional = true } data-encoding = "2.3.3" +debugid = {version = "0.8.0", features = ["serde"] } [build-dependencies] rustc_version = "0.2.3" diff --git a/src/builder.rs b/src/builder.rs index bcfc5ab3..926d481e 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -7,6 +7,7 @@ use std::fs; use std::io::Read; use std::path::{Path, PathBuf}; +use debugid::DebugId; use url::Url; use crate::errors::Result; @@ -27,6 +28,7 @@ pub struct SourceMapBuilder { sources: Vec, source_contents: Vec>, sources_mapping: Vec, + debug_id: Option, } #[cfg(any(unix, windows, target_os = "redox"))] @@ -59,9 +61,15 @@ impl SourceMapBuilder { sources: vec![], source_contents: vec![], sources_mapping: vec![], + debug_id: None, } } + /// Sets the debug id for the sourcemap (optional) + pub fn set_debug_id(&mut self, debug_id: Option) { + self.debug_id = debug_id; + } + /// Sets the file for the sourcemap (optional) pub fn set_file>(&mut self, value: Option) { self.file = value.map(Into::into); @@ -283,7 +291,14 @@ impl SourceMapBuilder { None }; - let mut sm = SourceMap::new(self.file, self.tokens, self.names, self.sources, contents); + let mut sm = SourceMap::new( + self.file, + self.tokens, + self.names, + self.sources, + contents, + self.debug_id, + ); sm.set_source_root(self.source_root); sm diff --git a/src/decoder.rs b/src/decoder.rs index 7f462467..e82e74b2 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -232,7 +232,14 @@ pub fn decode_regular(rsm: RawSourceMap) -> Result { _ => "".into(), }); - let mut sm = SourceMap::new(file, tokens, names, sources, rsm.sources_content); + let mut sm = SourceMap::new( + file, + tokens, + names, + sources, + rsm.sources_content, + rsm.debug_id, + ); sm.set_source_root(rsm.source_root); Ok(sm) diff --git a/src/encoder.rs b/src/encoder.rs index 919b9f57..c86f80ec 100644 --- a/src/encoder.rs +++ b/src/encoder.rs @@ -93,6 +93,7 @@ impl Encodable for SourceMap { x_facebook_offsets: None, x_metro_module_paths: None, x_facebook_sources: None, + debug_id: self.get_debug_id(), } } } @@ -124,6 +125,7 @@ impl Encodable for SourceMapIndex { x_facebook_offsets: None, x_metro_module_paths: None, x_facebook_sources: None, + debug_id: None, } } } diff --git a/src/jsontypes.rs b/src/jsontypes.rs index 72dab2b3..00630c07 100644 --- a/src/jsontypes.rs +++ b/src/jsontypes.rs @@ -1,3 +1,4 @@ +use debugid::DebugId; use serde::de::IgnoredAny; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -49,6 +50,8 @@ pub struct RawSourceMap { pub x_metro_module_paths: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub x_facebook_sources: FacebookSources, + #[serde(skip_serializing_if = "Option::is_none")] + pub debug_id: Option, } #[derive(Deserialize)] diff --git a/src/types.rs b/src/types.rs index 995ff116..e7d040ce 100644 --- a/src/types.rs +++ b/src/types.rs @@ -12,6 +12,8 @@ use crate::hermes::SourceMapHermes; use crate::sourceview::SourceView; use crate::utils::{find_common_prefix, greatest_lower_bound}; +use debugid::DebugId; + /// Controls the `SourceMap::rewrite` behavior /// /// Default configuration: @@ -461,6 +463,7 @@ pub struct SourceMap { source_root: Option, sources: Vec, sources_content: Vec>>, + debug_id: Option, } impl SourceMap { @@ -550,6 +553,7 @@ impl SourceMap { names: Vec, sources: Vec, sources_content: Option>>, + debug_id: Option, ) -> SourceMap { let mut index: Vec<_> = tokens .iter() @@ -569,9 +573,20 @@ impl SourceMap { .into_iter() .map(|opt| opt.map(SourceView::from_string)) .collect(), + debug_id, } } + /// Returns the embedded debug id. + pub fn get_debug_id(&self) -> Option { + self.debug_id + } + + /// Sets a new value for the debug id. + pub fn set_debug_id(&mut self, debug_id: Option) { + self.debug_id = debug_id + } + /// Returns the embedded filename in case there is one. pub fn get_file(&self) -> Option<&str> { self.file.as_deref() @@ -766,6 +781,7 @@ impl SourceMap { options: &RewriteOptions<'_>, ) -> Result<(SourceMap, Vec)> { let mut builder = SourceMapBuilder::new(self.get_file()); + builder.set_debug_id(self.debug_id); for token in self.tokens() { let raw = builder.add_token(&token, options.with_names); @@ -1065,3 +1081,33 @@ impl SourceMapSection { self.map = sm.map(Box::new); } } + +#[cfg(test)] +mod tests { + use super::{RewriteOptions, SourceMap}; + use debugid::DebugId; + + #[test] + fn test_rewrite_debugid() { + let input: &[_] = br#"{ + "version":3, + "sources":["coolstuff.js"], + "names":["x","alert"], + "mappings":"AAAA,GAAIA,GAAI,EACR,IAAIA,GAAK,EAAG,CACVC,MAAM", + "debug_id":"00000000-0000-0000-0000-000000000000" + }"#; + + let sm = SourceMap::from_slice(input).unwrap(); + + assert_eq!(sm.debug_id, Some(DebugId::default())); + + let new_sm = sm + .rewrite(&RewriteOptions { + with_names: false, + ..Default::default() + }) + .unwrap(); + + assert_eq!(new_sm.debug_id, Some(DebugId::default())); + } +} From a4c357b74031452dbf854fff69f6982f3ad05b60 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Jul 2023 13:16:08 +0200 Subject: [PATCH 2/4] changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5183780..ed76b096 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Various fixes & improvements + +- feat: Sourcemaps now support debug ids (#66) by @loewenheim + ## 6.2.3 ### Various fixes & improvements From fd5db4266181774cb316cccb4a1dbd43d5322306 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Wed, 19 Jul 2023 12:43:15 +0200 Subject: [PATCH 3/4] Don't pass debugid in SourceMap::new --- src/builder.rs | 10 ++-------- src/decoder.rs | 10 ++-------- src/types.rs | 3 +-- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 926d481e..b9a47917 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -291,15 +291,9 @@ impl SourceMapBuilder { None }; - let mut sm = SourceMap::new( - self.file, - self.tokens, - self.names, - self.sources, - contents, - self.debug_id, - ); + let mut sm = SourceMap::new(self.file, self.tokens, self.names, self.sources, contents); sm.set_source_root(self.source_root); + sm.set_debug_id(self.debug_id); sm } diff --git a/src/decoder.rs b/src/decoder.rs index e82e74b2..32f7f9ce 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -232,15 +232,9 @@ pub fn decode_regular(rsm: RawSourceMap) -> Result { _ => "".into(), }); - let mut sm = SourceMap::new( - file, - tokens, - names, - sources, - rsm.sources_content, - rsm.debug_id, - ); + let mut sm = SourceMap::new(file, tokens, names, sources, rsm.sources_content); sm.set_source_root(rsm.source_root); + sm.set_debug_id(rsm.debug_id); Ok(sm) } diff --git a/src/types.rs b/src/types.rs index e7d040ce..0c4a3c9e 100644 --- a/src/types.rs +++ b/src/types.rs @@ -553,7 +553,6 @@ impl SourceMap { names: Vec, sources: Vec, sources_content: Option>>, - debug_id: Option, ) -> SourceMap { let mut index: Vec<_> = tokens .iter() @@ -573,7 +572,7 @@ impl SourceMap { .into_iter() .map(|opt| opt.map(SourceView::from_string)) .collect(), - debug_id, + debug_id: None, } } From 590842edecc0579e253dd3350cd3b1c59e6aac8e Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Wed, 19 Jul 2023 12:51:19 +0200 Subject: [PATCH 4/4] Debug, Clone --- src/types.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types.rs b/src/types.rs index 0c4a3c9e..d37d2fb5 100644 --- a/src/types.rs +++ b/src/types.rs @@ -21,6 +21,7 @@ use debugid::DebugId; /// * `with_names`: true /// * `with_source_contents`: true /// * `load_local_source_contents`: false +#[derive(Debug, Clone)] pub struct RewriteOptions<'a> { /// If enabled, names are kept in the rewritten sourcemap. pub with_names: bool,