mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
feat(sourcemap): optional JSONSourceMap fileds (#2910)
Support optional JSONSourceMap fileds to support js side complex typing.
This commit is contained in:
parent
d87cf179a6
commit
96f02e6e21
1 changed files with 23 additions and 9 deletions
|
|
@ -7,20 +7,25 @@ use crate::{SourceMap, Token};
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct JSONSourceMap {
|
struct JSONSourceMap {
|
||||||
file: Option<String>,
|
file: Option<String>,
|
||||||
mappings: String,
|
mappings: Option<String>,
|
||||||
sources: Vec<String>,
|
sources: Option<Vec<Option<String>>>,
|
||||||
sources_content: Option<Vec<String>>,
|
sources_content: Option<Vec<Option<String>>>,
|
||||||
names: Vec<String>,
|
names: Option<Vec<String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn decode(value: &str) -> Result<SourceMap> {
|
pub fn decode(value: &str) -> Result<SourceMap> {
|
||||||
let json: JSONSourceMap = serde_json::from_str(value)?;
|
let json: JSONSourceMap = serde_json::from_str(value)?;
|
||||||
let file = json.file.map(Into::into);
|
let file = json.file.map(Into::into);
|
||||||
let names = json.names.into_iter().map(Into::into).collect::<Vec<_>>();
|
let names =
|
||||||
let sources = json.sources.into_iter().map(Into::into).collect::<Vec<_>>();
|
json.names.map(|v| v.into_iter().map(Into::into).collect::<Vec<_>>()).unwrap_or_default();
|
||||||
let source_contents =
|
let sources = json
|
||||||
json.sources_content.map(|v| v.into_iter().map(Into::into).collect::<Vec<_>>());
|
.sources
|
||||||
let tokens = decode_mapping(&json.mappings, names.len(), sources.len())?;
|
.map(|v| v.into_iter().map(Option::unwrap_or_default).map(Into::into).collect::<Vec<_>>())
|
||||||
|
.unwrap_or_default();
|
||||||
|
let source_contents = json
|
||||||
|
.sources_content
|
||||||
|
.map(|v| v.into_iter().map(Option::unwrap_or_default).map(Into::into).collect::<Vec<_>>());
|
||||||
|
let tokens = decode_mapping(&json.mappings.unwrap_or_default(), names.len(), sources.len())?;
|
||||||
Ok(SourceMap::new(file, names, sources, source_contents, tokens, None))
|
Ok(SourceMap::new(file, names, sources, source_contents, tokens, None))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,3 +146,12 @@ fn test_decode_sourcemap() {
|
||||||
assert_eq!(iter.next().unwrap().to_tuple(), (Some("coolstuff.js"), 2, 2, Some("alert")));
|
assert_eq!(iter.next().unwrap().to_tuple(), (Some("coolstuff.js"), 2, 2, Some("alert")));
|
||||||
assert!(iter.next().is_none());
|
assert!(iter.next().is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decode_sourcemap_optional_filed() {
|
||||||
|
let input = r#"{
|
||||||
|
"sources": [null],
|
||||||
|
"sourcesContent": [null]
|
||||||
|
}"#;
|
||||||
|
SourceMap::from_json_string(input).expect("should success");
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue