1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use emit::emit_js;
use error::SyntaxError;
use lex::Lexer;
use minify::minify_js;
use parse::{parser::Parser, toplevel::parse_top_level};
use std::io::{self, Write};
mod ast;
mod char;
mod emit;
mod error;
mod lex;
mod minify;
mod num;
mod operator;
mod parse;
#[cfg(test)]
mod serialise;
mod source;
mod symbol;
mod token;
mod update;
mod util;
pub use parse::toplevel::TopLevelMode;
#[derive(Debug)]
pub enum MinifyError {
Syntax(SyntaxError),
IO(io::Error),
}
pub fn minify<T: Write>(
top_level_mode: TopLevelMode,
source: Vec<u8>,
output: &mut T,
) -> Result<(), MinifyError> {
let lexer = Lexer::new(source);
let mut parser = Parser::new(lexer);
let parsed =
parse_top_level(&mut parser, top_level_mode).map_err(|err| MinifyError::Syntax(err))?;
let (mut node_map, mut scope_map) = parser.take();
minify_js(
&mut scope_map,
&mut node_map,
parsed.top_level_scope_id,
parsed.top_level_node_id,
);
emit_js(output, &node_map, parsed.top_level_node_id).map_err(|err| MinifyError::IO(err))?;
Ok(())
}