Skip to content

Commit

Permalink
feat(es/codegen): Support preamble (#7551)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7475.
  • Loading branch information
kdy1 committed Jun 20, 2023
1 parent f27d6ea commit 6e5d8b3
Show file tree
Hide file tree
Showing 17 changed files with 118 additions and 3 deletions.
1 change: 1 addition & 0 deletions bindings/binding_core_node/src/bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ impl Task for BundleTask {
None,
true,
false,
Default::default(),
)?;

Ok((k, output))
Expand Down
2 changes: 2 additions & 0 deletions bindings/binding_core_node/src/print.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ impl Task for PrintTask {
None,
options.config.emit_source_map_columns.into_bool(),
false,
Default::default(),
)
.convert_err()
})
Expand Down Expand Up @@ -112,6 +113,7 @@ pub fn print_sync(program: String, options: Buffer) -> napi::Result<TransformOut
None,
options.config.emit_source_map_columns.into_bool(),
false,
Default::default(),
)
.convert_err()
})
Expand Down
1 change: 1 addition & 0 deletions crates/binding_macros/src/wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ macro_rules! build_print_sync {
None,
opts.config.emit_source_map_columns.into_bool(),
false,
Default::default(),
),"failed to print code")?;

serde_wasm_bindgen::to_value(&s)
Expand Down
1 change: 1 addition & 0 deletions crates/swc/benches/typescript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ fn bench_codegen(b: &mut Bencher, _target: EsVersion) {
None,
false,
false,
Default::default(),
)
.unwrap()
}));
Expand Down
14 changes: 13 additions & 1 deletion crates/swc/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,15 @@ impl Options {
}
});

let preamble = if !cfg.jsc.output.preamble.is_empty() {
cfg.jsc.output.preamble
} else {
js_minify
.as_ref()
.map(|v| v.format.preamble.clone())
.unwrap_or_default()
};

let pass = PassBuilder::new(
cm,
handler,
Expand Down Expand Up @@ -842,7 +851,7 @@ impl Options {
comments: comments.cloned(),
preserve_comments,
emit_source_map_columns: cfg.emit_source_map_columns.into_bool(),
output: JscOutputConfig { charset },
output: JscOutputConfig { charset, preamble },
})
}
}
Expand Down Expand Up @@ -1401,6 +1410,9 @@ pub struct JscConfig {
pub struct JscOutputConfig {
#[serde(default)]
pub charset: Option<OutputCharset>,

#[serde(default)]
pub preamble: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
Expand Down
9 changes: 7 additions & 2 deletions crates/swc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,7 @@ impl Compiler {
comments: Option<&dyn Comments>,
emit_source_map_columns: bool,
ascii_only: bool,
preamble: &str,
) -> Result<TransformOutput, Error>
where
T: Node + VisitWith<IdentCollector>,
Expand All @@ -518,7 +519,7 @@ impl Compiler {
let src = {
let mut buf = vec![];
{
let mut wr = Box::new(swc_ecma_codegen::text_writer::JsWriter::new(
let mut w = swc_ecma_codegen::text_writer::JsWriter::new(
self.cm.clone(),
"\n",
&mut buf,
Expand All @@ -527,7 +528,9 @@ impl Compiler {
} else {
None
},
)) as Box<dyn WriteJs>;
);
w.preamble(preamble).unwrap();
let mut wr = Box::new(w) as Box<dyn WriteJs>;

if minify {
wr = Box::new(swc_ecma_codegen::text_writer::omit_trailing_semi(wr));
Expand Down Expand Up @@ -1158,6 +1161,7 @@ impl Compiler {
Some(&comments),
opts.emit_source_map_columns,
opts.format.ascii_only,
&opts.format.preamble,
)
})
}
Expand Down Expand Up @@ -1236,6 +1240,7 @@ impl Compiler {
.charset
.map(|v| matches!(v, OutputCharset::Ascii))
.unwrap_or(false),
&config.output.preamble,
)
})
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"format": {
"preamble": "/** @license */\n"
}
}
5 changes: 5 additions & 0 deletions crates/swc/tests/minify/issue-7475/1-with-preamble/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
function foo() {
console.log('Foo')
}

foo()
2 changes: 2 additions & 0 deletions crates/swc/tests/minify/issue-7475/1-with-preamble/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/** @license */
function foo(){console.log("Foo")}foo();
15 changes: 15 additions & 0 deletions crates/swc/tests/minify/issue-7475/1-with-preamble/output.map
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"mappings": ";AAAA,SAASA,MACLC,QAAQC,GAAG,CAAC,MAChB,CAEAF",
"names": [
"foo",
"console",
"log"
],
"sources": [
"$DIR/tests/minify/issue-7475/1-with-preamble/input.js"
],
"sourcesContent": [
"function foo() {\n console.log('Foo')\n}\n\nfoo()"
],
"version": 3
}
3 changes: 3 additions & 0 deletions crates/swc/tests/minify/issue-7475/2-no-preamble/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"format": {}
}
5 changes: 5 additions & 0 deletions crates/swc/tests/minify/issue-7475/2-no-preamble/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
function foo() {
console.log('Foo')
}

foo()
1 change: 1 addition & 0 deletions crates/swc/tests/minify/issue-7475/2-no-preamble/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
function foo(){console.log("Foo")}foo();
15 changes: 15 additions & 0 deletions crates/swc/tests/minify/issue-7475/2-no-preamble/output.map
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"mappings": "AAAA,SAASA,MACLC,QAAQC,GAAG,CAAC,MAChB,CAEAF",
"names": [
"foo",
"console",
"log"
],
"sources": [
"$DIR/tests/minify/issue-7475/2-no-preamble/input.js"
],
"sourcesContent": [
"function foo() {\n console.log('Foo')\n}\n\nfoo()"
],
"version": 3
}
34 changes: 34 additions & 0 deletions crates/swc/tests/projects.rs
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,7 @@ fn should_visit() {
Some(&comments),
config.emit_source_map_columns,
false,
Default::default(),
)
.unwrap()
.code)
Expand Down Expand Up @@ -1130,3 +1131,36 @@ fn issue_7513_2() {
println!("{}", output.code);
assert_eq!(output.code, "const a={ignoreBOM:!0,fatal:!0};");
}

#[testing::fixture("tests/minify/**/input.js")]
fn minify(input_js: PathBuf) {
let input_dir = input_js.parent().unwrap();
let config_json_path = input_dir.join("config.json");

testing::run_test2(false, |cm, handler| {
let c = Compiler::new(cm);
let fm = c.cm.load_file(&input_js).unwrap();

let mut config: JsMinifyOptions =
serde_json::from_str(&std::fs::read_to_string(&config_json_path).unwrap()).unwrap();

config.source_map = BoolOrDataConfig::from_bool(true);
let output = c.minify(fm, &handler, &config).unwrap();

NormalizedOutput::from(output.code)
.compare_to_file(input_dir.join("output.js"))
.unwrap();

let map = output.map.map(|json| {
let json: serde_json::Value = serde_json::from_str(&json).unwrap();
serde_json::to_string_pretty(&json).unwrap()
});

NormalizedOutput::from(map.unwrap())
.compare_to_file(input_dir.join("output.map"))
.unwrap();

Ok(())
})
.unwrap()
}
7 changes: 7 additions & 0 deletions crates/swc_ecma_codegen/src/text_writer/basic_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ impl<'a, W: Write> JsWriter<'a, W> {
}
}

pub fn preamble(&mut self, s: &str) -> Result {
self.raw_write(s)?;
self.update_pos(s);

Ok(())
}

/// Sets the indentation string. Defaults to four spaces.
pub fn set_indent_str(&mut self, indent_str: &'static str) {
self.indent_str = indent_str;
Expand Down
1 change: 1 addition & 0 deletions crates/swc_node_bundler/tests/fixture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ fn pass(input_dir: PathBuf) {
Some(&comments),
false,
false,
Default::default(),
)
.expect("failed to print?")
.code;
Expand Down

1 comment on commit 6e5d8b3

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 6e5d8b3 Previous: 1d9f972 Ratio
es/full/bugs-1 374417 ns/iter (± 12906) 316290 ns/iter (± 7873) 1.18
es/full/minify/libraries/antd 2146905995 ns/iter (± 31022751) 1469987432 ns/iter (± 5561398) 1.46
es/full/minify/libraries/d3 458019398 ns/iter (± 20375984) 315728175 ns/iter (± 4268394) 1.45
es/full/minify/libraries/echarts 1739869667 ns/iter (± 46565211) 1184262386 ns/iter (± 5559691) 1.47
es/full/minify/libraries/jquery 113149990 ns/iter (± 1302806) 95027552 ns/iter (± 260650) 1.19
es/full/minify/libraries/lodash 138005168 ns/iter (± 1776251) 112756927 ns/iter (± 333243) 1.22
es/full/minify/libraries/moment 69317021 ns/iter (± 2911808) 55846668 ns/iter (± 219419) 1.24
es/full/minify/libraries/react 24207797 ns/iter (± 650982) 20018235 ns/iter (± 67261) 1.21
es/full/minify/libraries/terser 334742032 ns/iter (± 9697064) 244634825 ns/iter (± 642604) 1.37
es/full/minify/libraries/three 593107006 ns/iter (± 10659853) 432561203 ns/iter (± 882985) 1.37
es/full/minify/libraries/typescript 4314130384 ns/iter (± 129987928) 2995232414 ns/iter (± 9159317) 1.44
es/full/minify/libraries/victory 898601471 ns/iter (± 20412538) 629338607 ns/iter (± 14512555) 1.43
es/full/minify/libraries/vue 167290559 ns/iter (± 2674260) 135562637 ns/iter (± 202674) 1.23
es/full/codegen/es3 41810 ns/iter (± 82) 35929 ns/iter (± 107) 1.16
es/full/codegen/es5 41849 ns/iter (± 108) 36139 ns/iter (± 130) 1.16
es/full/codegen/es2015 41933 ns/iter (± 81) 36064 ns/iter (± 85) 1.16
es/full/codegen/es2016 41915 ns/iter (± 115) 36017 ns/iter (± 99) 1.16
es/full/codegen/es2017 41931 ns/iter (± 66) 35977 ns/iter (± 90) 1.17
es/full/codegen/es2018 41917 ns/iter (± 70) 36003 ns/iter (± 68) 1.16
es/full/codegen/es2019 41841 ns/iter (± 67) 36055 ns/iter (± 67) 1.16
es/full/codegen/es2020 41875 ns/iter (± 111) 36188 ns/iter (± 113) 1.16
es/full/all/es3 210522788 ns/iter (± 3692829) 179703631 ns/iter (± 863706) 1.17
es/full/all/es5 201533904 ns/iter (± 3755300) 169668890 ns/iter (± 380717) 1.19
es/full/all/es2015 158910523 ns/iter (± 2363631) 126468094 ns/iter (± 332183) 1.26
es/full/all/es2016 158281789 ns/iter (± 1846758) 125170792 ns/iter (± 424045) 1.26
es/full/all/es2017 156764246 ns/iter (± 2119447) 124393777 ns/iter (± 598085) 1.26
es/full/all/es2018 153186677 ns/iter (± 1531012) 122314795 ns/iter (± 536454) 1.25
es/full/all/es2019 152916457 ns/iter (± 1781199) 122284908 ns/iter (± 654134) 1.25
es/full/all/es2020 151964315 ns/iter (± 3060253) 117511627 ns/iter (± 664901) 1.29
es/full/parser 620177 ns/iter (± 14854) 508551 ns/iter (± 5346) 1.22
es/full/base/fixer 24688 ns/iter (± 49) 18926 ns/iter (± 190) 1.30
es/full/base/resolver_and_hygiene 105167 ns/iter (± 179) 91989 ns/iter (± 296) 1.14
serialization of serde 257 ns/iter (± 0) 295 ns/iter (± 0) 0.87
css/minify/libraries/bootstrap 39660822 ns/iter (± 596261) 31125476 ns/iter (± 57045) 1.27
css/visitor/compare/clone 2371276 ns/iter (± 10621) 1960866 ns/iter (± 24862) 1.21
css/visitor/compare/visit_mut_span 2554937 ns/iter (± 5424) 2061138 ns/iter (± 10418) 1.24
css/visitor/compare/visit_mut_span_panic 2649818 ns/iter (± 7273) 2121527 ns/iter (± 11386) 1.25
css/visitor/compare/fold_span 3385218 ns/iter (± 63592) 2843244 ns/iter (± 14802) 1.19
css/visitor/compare/fold_span_panic 3571571 ns/iter (± 69680) 3069907 ns/iter (± 11526) 1.16
css/lexer/bootstrap_5_1_3 5593730 ns/iter (± 3696) 5015191 ns/iter (± 6865) 1.12
css/lexer/foundation_6_7_4 4708198 ns/iter (± 3240) 4017363 ns/iter (± 2923) 1.17
css/lexer/tailwind_3_1_1 892693 ns/iter (± 736) 982296 ns/iter (± 738) 0.91
css/parser/bootstrap_5_1_3 23941891 ns/iter (± 112974) 20327362 ns/iter (± 47147) 1.18
css/parser/foundation_6_7_4 19942380 ns/iter (± 85664) 16385733 ns/iter (± 14844) 1.22
css/parser/tailwind_3_1_1 3670059 ns/iter (± 2238) 3172898 ns/iter (± 4131) 1.16
es/codegen/colors 743415 ns/iter (± 403312) 736637 ns/iter (± 400810) 1.01
es/codegen/large 3101716 ns/iter (± 1620078) 2968763 ns/iter (± 1550391) 1.04
es/codegen/with-parser/colors 58368 ns/iter (± 549) 49552 ns/iter (± 170) 1.18
es/codegen/with-parser/large 590936 ns/iter (± 1858) 531070 ns/iter (± 1455) 1.11
es/minify/libraries/antd 2061689699 ns/iter (± 30234949) 1296957002 ns/iter (± 13830003) 1.59
es/minify/libraries/d3 348613192 ns/iter (± 6058495) 278561816 ns/iter (± 290913) 1.25
es/minify/libraries/echarts 1423076238 ns/iter (± 17994345) 1022901087 ns/iter (± 3251581) 1.39
es/minify/libraries/jquery 104459522 ns/iter (± 3073439) 83801823 ns/iter (± 127013) 1.25
es/minify/libraries/lodash 129971220 ns/iter (± 1495999) 102693525 ns/iter (± 180973) 1.27
es/minify/libraries/moment 59174156 ns/iter (± 1346518) 49544610 ns/iter (± 85585) 1.19
es/minify/libraries/react 20800080 ns/iter (± 138286) 18045415 ns/iter (± 66305) 1.15
es/minify/libraries/terser 269877796 ns/iter (± 5410273) 212199799 ns/iter (± 368110) 1.27
es/minify/libraries/three 537214239 ns/iter (± 47881948) 364799698 ns/iter (± 905205) 1.47
es/minify/libraries/typescript 3647340241 ns/iter (± 76130108) 2556049742 ns/iter (± 8447709) 1.43
es/minify/libraries/victory 773407934 ns/iter (± 45070154) 532700473 ns/iter (± 2115023) 1.45
es/minify/libraries/vue 159608280 ns/iter (± 3360406) 124102630 ns/iter (± 223481) 1.29
es/visitor/compare/clone 2449361 ns/iter (± 25533) 2072388 ns/iter (± 6405) 1.18
es/visitor/compare/visit_mut_span 2781676 ns/iter (± 25717) 2399229 ns/iter (± 4282) 1.16
es/visitor/compare/visit_mut_span_panic 2840230 ns/iter (± 4128) 2438632 ns/iter (± 3866) 1.16
es/visitor/compare/fold_span 3968927 ns/iter (± 53739) 3478431 ns/iter (± 4147) 1.14
es/visitor/compare/fold_span_panic 4126013 ns/iter (± 125989) 3617450 ns/iter (± 6555) 1.14
es/lexer/colors 14577 ns/iter (± 22) 13117 ns/iter (± 1119) 1.11
es/lexer/angular 6955523 ns/iter (± 12401) 6282318 ns/iter (± 16834) 1.11
es/lexer/backbone 847173 ns/iter (± 320) 806559 ns/iter (± 2636) 1.05
es/lexer/jquery 4772851 ns/iter (± 3689) 4557972 ns/iter (± 2941) 1.05
es/lexer/jquery mobile 7363627 ns/iter (± 32240) 6976123 ns/iter (± 3022) 1.06
es/lexer/mootools 3744768 ns/iter (± 1638) 3591239 ns/iter (± 3204) 1.04
es/lexer/underscore 704026 ns/iter (± 855) 669738 ns/iter (± 2144) 1.05
es/lexer/three 22359801 ns/iter (± 26796) 21262699 ns/iter (± 27333) 1.05
es/lexer/yui 4287515 ns/iter (± 2146) 4070744 ns/iter (± 1337) 1.05
es/parser/colors 33526 ns/iter (± 71) 29110 ns/iter (± 61) 1.15
es/parser/angular 18876960 ns/iter (± 358123) 14440785 ns/iter (± 72100) 1.31
es/parser/backbone 2449653 ns/iter (± 8616) 2150646 ns/iter (± 7112) 1.14
es/parser/jquery 13480904 ns/iter (± 74062) 11689291 ns/iter (± 37814) 1.15
es/parser/jquery mobile 20838603 ns/iter (± 299020) 17788967 ns/iter (± 45948) 1.17
es/parser/mootools 10106795 ns/iter (± 27328) 8973169 ns/iter (± 13389) 1.13
es/parser/underscore 2105748 ns/iter (± 15834) 1864676 ns/iter (± 8983) 1.13
es/parser/three 66869975 ns/iter (± 303585) 49518983 ns/iter (± 73570) 1.35
es/parser/yui 10469749 ns/iter (± 117113) 9009570 ns/iter (± 29756) 1.16
es/preset-env/usage/builtin_type 152703 ns/iter (± 33562) 145916 ns/iter (± 32999) 1.05
es/preset-env/usage/property 29719 ns/iter (± 116) 19478 ns/iter (± 54) 1.53
es/resolver/typescript 152544662 ns/iter (± 5236321) 93717358 ns/iter (± 463320) 1.63
es/fixer/typescript 109010309 ns/iter (± 1395956) 64712810 ns/iter (± 419432) 1.68
es/hygiene/typescript 243684196 ns/iter (± 4302475) 141398187 ns/iter (± 540594) 1.72
es/resolver_with_hygiene/typescript 484889339 ns/iter (± 7292606) 302258554 ns/iter (± 1542444) 1.60
es/visitor/base-perf/module_clone 85429 ns/iter (± 550) 61358 ns/iter (± 198) 1.39
es/visitor/base-perf/fold_empty 94569 ns/iter (± 409) 65007 ns/iter (± 252) 1.45
es/visitor/base-perf/fold_noop_impl_all 94721 ns/iter (± 316) 65212 ns/iter (± 327) 1.45
es/visitor/base-perf/fold_noop_impl_vec 95063 ns/iter (± 354) 65307 ns/iter (± 195) 1.46
es/visitor/base-perf/boxing_boxed_clone 60 ns/iter (± 0) 56 ns/iter (± 0) 1.07
es/visitor/base-perf/boxing_unboxed_clone 44 ns/iter (± 0) 41 ns/iter (± 0) 1.07
es/visitor/base-perf/boxing_boxed 110 ns/iter (± 0) 108 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed 82 ns/iter (± 0) 77 ns/iter (± 0) 1.06
es/visitor/base-perf/visit_contains_this 3545 ns/iter (± 85) 2608 ns/iter (± 10) 1.36
es/base/parallel/resolver/typescript 7703272047 ns/iter (± 560278471) 4298308214 ns/iter (± 295157183) 1.79
es/base/parallel/hygiene/typescript 2858919350 ns/iter (± 42135501) 1585120820 ns/iter (± 11653946) 1.80
misc/visitors/time-complexity/time 5 104 ns/iter (± 0) 109 ns/iter (± 0) 0.95
misc/visitors/time-complexity/time 10 339 ns/iter (± 3) 268 ns/iter (± 0) 1.26
misc/visitors/time-complexity/time 15 631 ns/iter (± 12) 519 ns/iter (± 7) 1.22
misc/visitors/time-complexity/time 20 1169 ns/iter (± 33) 931 ns/iter (± 2) 1.26
misc/visitors/time-complexity/time 40 6020 ns/iter (± 3) 3783 ns/iter (± 12) 1.59
misc/visitors/time-complexity/time 60 15392 ns/iter (± 78) 7829 ns/iter (± 33) 1.97
es/full-target/es2016 270985 ns/iter (± 396) 240215 ns/iter (± 672) 1.13
es/full-target/es2017 261207 ns/iter (± 491) 224149 ns/iter (± 652) 1.17
es/full-target/es2018 250335 ns/iter (± 452) 214309 ns/iter (± 836) 1.17
es2020_nullish_coalescing 97666 ns/iter (± 547) 71181 ns/iter (± 436) 1.37
es2020_optional_chaining 115342 ns/iter (± 380) 83871 ns/iter (± 173) 1.38
es2022_class_properties 156589 ns/iter (± 397) 121512 ns/iter (± 427) 1.29
es2018_object_rest_spread 100085 ns/iter (± 325) 76421 ns/iter (± 172) 1.31
es2019_optional_catch_binding 88659 ns/iter (± 232) 64142 ns/iter (± 165) 1.38
es2017_async_to_generator 89094 ns/iter (± 246) 64772 ns/iter (± 232) 1.38
es2016_exponentiation 95958 ns/iter (± 271) 70498 ns/iter (± 155) 1.36
es2015_arrow 98985 ns/iter (± 206) 72887 ns/iter (± 169) 1.36
es2015_block_scoped_fn 96759 ns/iter (± 237) 69416 ns/iter (± 154) 1.39
es2015_block_scoping 184000 ns/iter (± 498) 131831 ns/iter (± 473) 1.40

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.