brk_string_wizard 0.2.3

manipulate string like a wizard
Documentation
use oxc_sourcemap::SourcemapVisualizer;
use string_wizard::{Hires, MagicString, ReplaceOptions, SourceMapOptions, UpdateOptions};

#[test]
fn basic() {
  let input = "<div>\n  hello, world\n</div>";
  let mut s = MagicString::new(input);
  let update_options = UpdateOptions { keep_original: true, ..Default::default() };
  s.update_with(1, 2, "v", update_options.clone())
    .update_with(3, 4, "d", update_options.clone())
    .update_with(input.len() - 4, input.len() - 1, "h1", update_options.clone());

  let sm = s.source_map(SourceMapOptions { include_content: true, ..Default::default() });
  insta::assert_snapshot!("basic1", sm.to_json_string());

  s.prepend("import React from 'react';\n");
  let sm = s.source_map(SourceMapOptions { include_content: true, ..Default::default() });
  insta::assert_snapshot!("basic2", sm.to_json_string());

  let sm = s.source_map(SourceMapOptions {
    include_content: true,
    hires: Hires::True,
    ..Default::default()
  });
  insta::assert_snapshot!("basic3", sm.to_json_string());
}

#[test]
fn test_hires() {
  let code = r#"
function test() {
  console.log("foo")
  console.error("bar")
}
"#;
  let mut s = MagicString::new(code);

  s.replace_with("foo", "hello", ReplaceOptions::default());
  s.replace_with("bar", "world", ReplaceOptions::default());
  let output = s.to_string();
  assert_eq!(
    s.to_string(),
    r#"
function test() {
  console.log("hello")
  console.error("world")
}
"#
  );

  fn visualize(s: &MagicString, hires: Hires, output: &str) -> String {
    let sourcemap = s.source_map(SourceMapOptions { hires, ..Default::default() });
    let visualizer = SourcemapVisualizer::new(output, &sourcemap);
    visualizer.get_text()
  }

  insta::assert_snapshot!("hires_false", visualize(&s, Hires::False, &output));
  insta::assert_snapshot!("hires_true", visualize(&s, Hires::True, &output));
  insta::assert_snapshot!("hires_boundary", visualize(&s, Hires::Boundary, &output));
}