From 90d2d090224c52e6a1a29a1add3e195f3bd05cc3 Mon Sep 17 00:00:00 2001 From: underfin Date: Mon, 20 May 2024 22:35:14 +0800 Subject: [PATCH] feat(sourcemap): add Sourcemap#from_json method (#3361) The rolldown plugin hook could return an object map, cast it to string at node, and decode it has unnecessary json overhead at rust. So here export an new function to let rolldown could using `JSONSourceMap` to generate `Sourcemap`. --- crates/oxc_sourcemap/src/decode.rs | 11 +++++++---- crates/oxc_sourcemap/src/lib.rs | 1 + crates/oxc_sourcemap/src/sourcemap.rs | 14 +++++++++++--- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/crates/oxc_sourcemap/src/decode.rs b/crates/oxc_sourcemap/src/decode.rs index 70fe0c442..8e2f668fb 100644 --- a/crates/oxc_sourcemap/src/decode.rs +++ b/crates/oxc_sourcemap/src/decode.rs @@ -3,9 +3,9 @@ use crate::error::{Error, Result}; use crate::{SourceMap, Token}; -#[derive(serde::Deserialize)] +#[derive(serde::Deserialize, Default)] #[serde(rename_all = "camelCase")] -struct JSONSourceMap { +pub struct JSONSourceMap { // An optional name of the generated code that this source map is associated with. file: Option, // A string with the encoded mapping data. @@ -20,8 +20,7 @@ struct JSONSourceMap { names: Option>, } -pub fn decode(value: &str) -> Result { - let json: JSONSourceMap = serde_json::from_str(value)?; +pub fn decode(json: JSONSourceMap) -> Result { let file = json.file.map(Into::into); let names = json.names.map(|v| v.into_iter().map(Into::into).collect::>()).unwrap_or_default(); @@ -37,6 +36,10 @@ pub fn decode(value: &str) -> Result { Ok(SourceMap::new(file, names, source_root, sources, source_contents, tokens, None)) } +pub fn decode_from_string(value: &str) -> Result { + decode(serde_json::from_str(value)?) +} + #[allow(clippy::cast_possible_truncation)] fn decode_mapping(mapping: &str, names_len: usize, sources_len: usize) -> Result> { let mut tokens = vec![]; diff --git a/crates/oxc_sourcemap/src/lib.rs b/crates/oxc_sourcemap/src/lib.rs index 837893944..0cb5e0a3d 100644 --- a/crates/oxc_sourcemap/src/lib.rs +++ b/crates/oxc_sourcemap/src/lib.rs @@ -9,6 +9,7 @@ mod sourcemap_visualizer; mod token; pub use concat_sourcemap_builder::ConcatSourceMapBuilder; +pub use decode::JSONSourceMap; pub use error::Error; pub use sourcemap::SourceMap; pub use sourcemap_builder::SourceMapBuilder; diff --git a/crates/oxc_sourcemap/src/sourcemap.rs b/crates/oxc_sourcemap/src/sourcemap.rs index 652e39063..858853b6e 100644 --- a/crates/oxc_sourcemap/src/sourcemap.rs +++ b/crates/oxc_sourcemap/src/sourcemap.rs @@ -1,5 +1,5 @@ use crate::{ - decode::decode, + decode::{decode, decode_from_string, JSONSourceMap}, encode::encode, error::Result, token::{Token, TokenChunk}, @@ -45,17 +45,25 @@ impl SourceMap { } } - /// Convert `SourceMap` to vlq sourcemap string. + /// Convert the vlq sourcemap to to `SourceMap`. /// # Errors /// /// The `serde_json` deserialize Error. - pub fn from_json_string(value: &str) -> Result { + pub fn from_json(value: JSONSourceMap) -> Result { decode(value) } /// Convert the vlq sourcemap string to `SourceMap`. /// # Errors /// + /// The `serde_json` deserialize Error. + pub fn from_json_string(value: &str) -> Result { + decode_from_string(value) + } + + /// Convert `SourceMap` to vlq sourcemap string. + /// # Errors + /// /// The `serde_json` serialization Error. pub fn to_json_string(&self) -> Result { encode(self)