swc_sourcemap 10.0.0

Forked from https://github.com/getsentry/rust-sourcemap
Documentation
use std::{io, io::BufRead};

use swc_sourcemap::{decode_data_url, DecodedMap, SourceMap, Token};

#[test]
fn test_no_header() {
    let input: &[_] = br#"[1, 2, 3]"#;
    let mut reader = io::BufReader::new(input);
    let mut text = String::new();
    reader.read_line(&mut text).ok();
    assert_eq!(text, "[1, 2, 3]");
}

#[test]
fn test_no_header_object() {
    let input: &[_] = br#"{"x": [1, 2, 3]}"#;
    let mut reader = io::BufReader::new(input);
    let mut text = String::new();
    reader.read_line(&mut text).ok();
    assert_eq!(text, r#"{"x": [1, 2, 3]}"#);
}

#[test]
fn test_basic_sourcemap() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": ["coolstuff.js"],
        "names": ["x","alert"],
        "mappings": "AAAA,GAAIA,GAAI,EACR,IAAIA,GAAK,EAAG,CACVC,MAAM"
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();
    let mut iter = sm.tokens().filter(Token::has_name);
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("coolstuff.js", 0, 4, Some("x"))
    );
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("coolstuff.js", 1, 4, Some("x"))
    );
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("coolstuff.js", 2, 2, Some("alert"))
    );
    assert!(iter.next().is_none());
}

#[test]
fn test_basic_sourcemap_with_root() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": ["coolstuff.js"],
        "sourceRoot": "x",
        "names": ["x","alert"],
        "mappings": "AAAA,GAAIA,GAAI,EACR,IAAIA,GAAK,EAAG,CACVC,MAAM"
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();
    let mut iter = sm.tokens().filter(Token::has_name);
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("x/coolstuff.js", 0, 4, Some("x"))
    );
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("x/coolstuff.js", 1, 4, Some("x"))
    );
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("x/coolstuff.js", 2, 2, Some("alert"))
    );
    assert!(iter.next().is_none());
}

#[test]
fn test_basic_sourcemap_with_absolute_uri_root() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": ["coolstuff.js", "./evencoolerstuff.js"],
        "sourceRoot": "webpack:///",
        "names": ["x","alert"],
        "mappings": "AAAA,GAAIA,GAAI,EACR,ICAIA,GAAK,EAAG,CACVC,MAAM"
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();
    let mut iter = sm.tokens().filter(Token::has_name);
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("webpack:///coolstuff.js", 0, 4, Some("x"))
    );
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("webpack:///./evencoolerstuff.js", 1, 4, Some("x"))
    );
    assert_eq!(
        iter.next().unwrap().to_tuple(),
        ("webpack:///./evencoolerstuff.js", 2, 2, Some("alert"))
    );
    assert!(iter.next().is_none());
}

#[test]
fn test_basic_sourcemap_source_root_logic() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": ["coolstuff.js", "/evencoolerstuff.js", "https://awesome.js"],
        "sourceRoot": "webpack:///",
        "mappings": ""
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();
    let mut iter = sm.sources();
    assert_eq!(iter.next().unwrap(), "webpack:///coolstuff.js");
    assert_eq!(iter.next().unwrap(), "/evencoolerstuff.js");
    assert_eq!(iter.next().unwrap(), "https://awesome.js");
    assert!(iter.next().is_none());
}

#[test]
fn test_sourcemap_data_url() {
    let url = "data:application/json;base64,\
               eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvb2xzdHVmZi5qcyJdLCJzb3VyY2VSb290I\
               joieCIsIm5hbWVzIjpbIngiLCJhbGVydCJdLCJtYXBwaW5ncyI6IkFBQUEsR0FBSUEsR0\
               FBSSxFQUNSLElBQUlBLEdBQUssRUFBRyxDQUNWQyxNQUFNIn0=";
    match decode_data_url(url).unwrap() {
        DecodedMap::Regular(sm) => {
            let mut iter = sm.tokens().filter(Token::has_name);
            assert_eq!(
                iter.next().unwrap().to_tuple(),
                ("x/coolstuff.js", 0, 4, Some("x"))
            );
            assert_eq!(
                iter.next().unwrap().to_tuple(),
                ("x/coolstuff.js", 1, 4, Some("x"))
            );
            assert_eq!(
                iter.next().unwrap().to_tuple(),
                ("x/coolstuff.js", 2, 2, Some("alert"))
            );
            assert!(iter.next().is_none());
        }
        _ => {
            panic!("did not get sourcemap");
        }
    }
}

#[test]
fn test_sourcemap_nofiles() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": [null],
        "names": ["x","alert"],
        "mappings": "AAAA,GAAIA,GAAI,EACR,IAAIA,GAAK,EAAG,CACVC,MAAM"
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();
    let mut iter = sm.tokens().filter(Token::has_name);
    assert_eq!(iter.next().unwrap().to_tuple(), ("", 0, 4, Some("x")));
    assert_eq!(iter.next().unwrap().to_tuple(), ("", 1, 4, Some("x")));
    assert_eq!(iter.next().unwrap().to_tuple(), ("", 2, 2, Some("alert")));
    assert!(iter.next().is_none());
}

#[test]
fn test_sourcemap_range_mappings() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": [null],
        "names": ["console","log","ab"],
        "mappings": "AACAA,QAAQC,GAAG,CAAC,OAAM,OAAM,QACxBD,QAAQC,GAAG,CAAC,QAEZD,QAAQC,GAAG,CAJD;IAACC,IAAI;AAAI,IAKnBF,QAAQC,GAAG,CAAC,YACZD,QAAQC,GAAG,CAAC",
        "rangeMappings": "AAB;;g"
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();

    let mut iter = sm.tokens().filter(Token::is_range);

    assert_eq!(sm.tokens().filter(Token::is_range).count(), 2);

    assert_eq!(iter.next().unwrap().to_tuple(), ("", 4, 11, None));

    assert_eq!(iter.next().unwrap().to_tuple(), ("", 6, 0, Some("console")));
    assert!(iter.next().is_none());
}

#[test]
fn test_sourcemap_scopes() {
    let input: &[_] = br#"{
        "version": 3,
        "sources": ["coolstuff.js"],
        "names": [],
        "mappings": "AAAA",
        "scopes": "B,A,A,C,A,A"
    }"#;
    let sm = SourceMap::from_reader(input).unwrap();
    assert_eq!(sm.get_scopes().map(|v| &**v), Some("B,A,A,C,A,A"));
}