2020-01-10 02:30:49 -05:00
|
|
|
use crate::err::ProcessingResult;
|
2020-01-25 02:04:02 -05:00
|
|
|
use crate::proc::MatchAction::*;
|
|
|
|
use crate::proc::MatchMode::*;
|
2020-07-21 03:59:56 -04:00
|
|
|
use crate::proc::Processor;
|
|
|
|
#[cfg(feature = "js-esbuild")]
|
|
|
|
use crate::proc::JsMinSection;
|
2020-07-10 11:15:56 -04:00
|
|
|
use crate::cfg::Cfg;
|
2020-07-11 08:52:27 -04:00
|
|
|
#[cfg(feature = "js-esbuild")]
|
|
|
|
use crate::proc::checkpoint::Checkpoint;
|
2020-07-21 03:59:56 -04:00
|
|
|
#[cfg(feature = "js-esbuild")]
|
2020-07-21 03:57:39 -04:00
|
|
|
use esbuild_rs::{TransformOptionsBuilder, TransformOptions};
|
2020-07-21 03:59:56 -04:00
|
|
|
#[cfg(feature = "js-esbuild")]
|
2020-07-21 03:57:39 -04:00
|
|
|
use std::sync::Arc;
|
2020-07-21 03:59:56 -04:00
|
|
|
#[cfg(feature = "js-esbuild")]
|
2020-07-21 03:57:39 -04:00
|
|
|
use lazy_static::lazy_static;
|
|
|
|
|
2020-07-21 03:59:56 -04:00
|
|
|
#[cfg(feature = "js-esbuild")]
|
2020-07-21 03:57:39 -04:00
|
|
|
lazy_static! {
|
|
|
|
static ref TRANSFORM_OPTIONS: Arc<TransformOptions> = {
|
|
|
|
let mut builder = TransformOptionsBuilder::new();
|
|
|
|
builder.minify_identifiers = true;
|
|
|
|
builder.minify_syntax = true;
|
|
|
|
builder.minify_whitespace = true;
|
|
|
|
builder.build()
|
|
|
|
};
|
|
|
|
}
|
2020-01-10 02:30:49 -05:00
|
|
|
|
2020-07-10 11:15:56 -04:00
|
|
|
pub fn process_script(proc: &mut Processor, cfg: &Cfg) -> ProcessingResult<()> {
|
2020-07-11 08:20:17 -04:00
|
|
|
#[cfg(feature = "js-esbuild")]
|
2020-07-11 08:52:27 -04:00
|
|
|
let start = Checkpoint::new(proc);
|
|
|
|
loop {
|
|
|
|
proc.require_not_at_end()?;
|
|
|
|
// Use fast memchr. Unfortunately all characters in "</script>" are common in JS code.
|
|
|
|
proc.m(WhileNotChar(b'<'), Keep);
|
|
|
|
// `process_tag` will require closing tag.
|
|
|
|
if proc.m(IsSeq(b"</script"), MatchOnly).nonempty() {
|
|
|
|
#[cfg(feature = "js-esbuild")]
|
|
|
|
if cfg.minify_js {
|
2020-07-21 03:57:39 -04:00
|
|
|
let (wg, results) = proc.new_script_section();
|
2020-07-21 09:27:56 -04:00
|
|
|
let src = start.written_range(proc);
|
2020-07-21 03:57:39 -04:00
|
|
|
// TODO Optimise: Avoid copying to new Vec.
|
2020-07-21 09:27:56 -04:00
|
|
|
let src = Arc::new(proc[src].to_vec());
|
2020-07-21 03:57:39 -04:00
|
|
|
esbuild_rs::transform(src, TRANSFORM_OPTIONS.clone(), move |result| {
|
|
|
|
results.lock().unwrap().push(JsMinSection {
|
2020-07-21 09:27:56 -04:00
|
|
|
src,
|
2020-07-21 03:57:39 -04:00
|
|
|
result,
|
|
|
|
});
|
|
|
|
drop(wg);
|
|
|
|
});
|
|
|
|
return Ok(());
|
2020-07-11 08:52:27 -04:00
|
|
|
};
|
|
|
|
break;
|
2020-07-10 11:15:56 -04:00
|
|
|
};
|
2020-07-11 08:52:27 -04:00
|
|
|
// Consume '<'.
|
|
|
|
proc.accept_expect();
|
2020-07-10 11:15:56 -04:00
|
|
|
};
|
2020-01-10 02:30:49 -05:00
|
|
|
Ok(())
|
|
|
|
}
|