csskit_transform 0.0.21-canary.fc80f623b7

AST transformation and minification utilities for CSS.
Documentation
#[cfg(test)]
macro_rules! assert_transform {
	($features: ident :: $transform: ident, $atoms: ident, $node: ident, $str: literal, $expected: literal) => {{
		use bumpalo::Bump;
		use css_lexer::{Lexer, QuoteStyle};
		use css_parse::{CursorOverlaySink, CursorPrettyWriteSink, Parser, ToCursors};

		let source_text = $str;

		let allocator = Bump::default();
		let lexer = Lexer::new(&$atoms::ATOMS, source_text);
		let mut parser = Parser::new(&allocator, source_text, lexer);
		let mut result = parser.parse_entirely::<$node>();
		assert!(result.errors.is_empty(), "({:?}) saw error {:?}", source_text, result.errors[0]);

		let expected = $expected;
		let elexer = Lexer::new(&$atoms::ATOMS, expected);
		let mut eparser = Parser::new(&allocator, expected, elexer);
		let eresult = eparser.parse_entirely::<$node>();
		assert!(eresult.errors.is_empty(), "({:?}) saw error {:?}", expected, result.errors[0]);

		let mut transformer: $crate::Transformer<_, $node, $crate::$features> =
			$crate::Transformer::new_in(&allocator, $crate::$features::$transform, &$atoms::ATOMS, source_text);
		let mut actual = String::new();
		if let Some(ref mut output) = result.output {
			transformer.transform(output);
			let overlays = transformer.overlays();
			let mut overlay_stream = CursorOverlaySink::new(
				source_text,
				&*overlays,
				CursorPrettyWriteSink::new(source_text, &mut actual, None, QuoteStyle::Double),
			);
			result.output.to_cursors(&mut overlay_stream);

			assert!(transformer.has_changed(), "Transformer did not transform {}", source_text);
		} else {
			panic!("Transformer could not transform result {:?}", result.output);
		}

		let lexer = Lexer::new(&$atoms::ATOMS, &actual);
		let mut parser = Parser::new(&allocator, &actual, lexer);
		let result = parser.parse_entirely::<$node>();
		assert!(result.errors.is_empty(), "Minified code '({:?})' saw error {:?}", source_text, result.errors[0]);

		let mut expected_pretty = String::new();
		let mut expected_sink = CursorPrettyWriteSink::new(&expected, &mut expected_pretty, None, QuoteStyle::Double);
		eresult.output.to_cursors(&mut expected_sink);

		assert!(
			actual == expected_pretty,
			"\n\nDid not match expected format:\n\n```pre-transformed\n{}```\n```transformed\n{}```\n```expected\n{}\n```",
			source_text,
			actual,
			expected_pretty
		);
	}};
}

#[cfg(test)]
pub(crate) use assert_transform;

#[cfg(test)]
macro_rules! assert_no_transform {
	($features: ident :: $transform: ident, $atoms: ident, $node: ident, $str: literal) => {{
		use bumpalo::Bump;
		use css_lexer::{Lexer, QuoteStyle};
		use css_parse::{CursorOverlaySink, CursorPrettyWriteSink, Parser, ToCursors};

		let source_text = $str;

		let allocator = Bump::default();
		let lexer = Lexer::new(&$atoms::ATOMS, source_text);
		let mut parser = Parser::new(&allocator, source_text, lexer);
		let mut result = parser.parse_entirely::<$node>();
		assert!(result.errors.is_empty(), "({:?}) saw error {:?}", source_text, result.errors[0]);

		let mut transformer: $crate::Transformer<_, $node, $crate::$features> =
			$crate::Transformer::new_in(&allocator, $crate::$features::$transform, &$atoms::ATOMS, source_text);
		let mut actual = String::new();
		if let Some(ref mut output) = result.output {
			transformer.transform(output);
			let overlays = transformer.overlays();
			let mut overlay_stream = CursorOverlaySink::new(
				source_text,
				&*overlays,
				CursorPrettyWriteSink::new(source_text, &mut actual, None, QuoteStyle::Double),
			);
			result.output.to_cursors(&mut overlay_stream);

			assert!(!transformer.has_changed(), "Transformer claims to have changed! {} \"{}\"", source_text, actual);
		} else {
			panic!("Transformer could not transform result {:?}", result.output);
		}
	}};
}

#[cfg(test)]
pub(crate) use assert_no_transform;