diff --git a/crates/swc_ecma_parser/src/lib.rs b/crates/swc_ecma_parser/src/lib.rs index e969a6fa6264..72c0e5a77dca 100644 --- a/crates/swc_ecma_parser/src/lib.rs +++ b/crates/swc_ecma_parser/src/lib.rs @@ -246,7 +246,7 @@ impl Syntax { } } - pub fn allow_super_outside_method(self) -> bool { + pub(crate) fn allow_super_outside_method(self) -> bool { match self { Syntax::Es(EsConfig { allow_super_outside_method, @@ -256,6 +256,16 @@ impl Syntax { } } + pub(crate) fn allow_return_outside_function(self) -> bool { + match self { + Syntax::Es(EsConfig { + allow_return_outside_function, + .. + }) => allow_return_outside_function, + Syntax::Typescript(_) => false, + } + } + pub(crate) fn early_errors(self) -> bool { match self { Syntax::Typescript(t) => !t.no_early_errors, @@ -315,6 +325,9 @@ pub struct EsConfig { #[serde(default, rename = "allowSuperOutsideMethod")] pub allow_super_outside_method: bool, + + #[serde(default, rename = "allowReturnOutsideFunction")] + pub allow_return_outside_function: bool, } /// Syntactic context. diff --git a/crates/swc_ecma_parser/src/parser/stmt.rs b/crates/swc_ecma_parser/src/parser/stmt.rs index f73c2b39e62e..42810ee461ff 100644 --- a/crates/swc_ecma_parser/src/parser/stmt.rs +++ b/crates/swc_ecma_parser/src/parser/stmt.rs @@ -562,7 +562,7 @@ impl<'a, I: Tokens> Parser { })) }); - if !self.ctx().in_function { + if !self.ctx().in_function && !self.input.syntax().allow_return_outside_function() { self.emit_err(span!(self, start), SyntaxError::ReturnNotAllowed); } diff --git a/crates/swc_html_minifier/src/lib.rs b/crates/swc_html_minifier/src/lib.rs index 769e4bb3d1fc..a637f4da8bca 100644 --- a/crates/swc_html_minifier/src/lib.rs +++ b/crates/swc_html_minifier/src/lib.rs @@ -1055,13 +1055,17 @@ impl Minifier { // TODO source map url output for JS and CSS? // TODO allow preserve comments - fn minify_js(&self, data: String, is_module: bool) -> Option { + fn minify_js(&self, data: String, is_module: bool, is_attribute: bool) -> Option { let mut errors: Vec<_> = vec![]; let cm = Lrc::new(SourceMap::new(FilePathMapping::empty())); let fm = cm.new_source_file(FileName::Anon, data); - let syntax = swc_ecma_parser::Syntax::Es(Default::default()); + let syntax = swc_ecma_parser::Syntax::Es(swc_ecma_parser::EsConfig { + allow_return_outside_function: !is_module && is_attribute, + ..Default::default() + }); + let target = swc_ecma_ast::EsVersion::latest(); let mut program = if is_module { match swc_ecma_parser::parse_file_as_module(&fm, syntax, target, None, &mut errors) { @@ -1075,6 +1079,11 @@ impl Minifier { } }; + // Avoid compress potential invalid JS + if !errors.is_empty() { + return None; + } + let unresolved_mark = Mark::new(); let top_level_mark = Mark::new(); @@ -1083,11 +1092,6 @@ impl Minifier { &mut swc_ecma_transforms_base::resolver(unresolved_mark, top_level_mark, false), ); - // Avoid compress potential invalid JS - if !errors.is_empty() { - return None; - } - let options = swc_ecma_minifier::option::MinifyOptions { compress: Some(swc_ecma_minifier::option::CompressOptions { ecma: target, @@ -1657,8 +1661,8 @@ impl VisitMut for Minifier { } value = values.join(" "); - } else if self.minify_js && self.is_event_handler_attribute(&n.name) { - value = match self.minify_js(value.clone(), false) { + } else if self.is_event_handler_attribute(&n.name) { + value = match self.minify_js(value.clone(), false, true) { Some(minified) => minified, _ => value, }; @@ -1681,13 +1685,13 @@ impl VisitMut for Minifier { match minifier_type { Some(MinifierType::JsScript) if self.minify_js => { - value = match self.minify_js(value.clone(), false) { + value = match self.minify_js(value.clone(), false, true) { Some(minified) => minified, _ => value, }; } Some(MinifierType::JsModule) if self.minify_js => { - value = match self.minify_js(value.clone(), true) { + value = match self.minify_js(value.clone(), true, true) { Some(minified) => minified, _ => value, }; @@ -1818,7 +1822,7 @@ impl VisitMut for Minifier { match text_type { Some(MinifierType::JsScript) => { - let minified = match self.minify_js(n.data.to_string(), false) { + let minified = match self.minify_js(n.data.to_string(), false, false) { Some(minified) => minified, None => return, }; @@ -1826,7 +1830,7 @@ impl VisitMut for Minifier { n.data = minified.into(); } Some(MinifierType::JsModule) => { - let minified = match self.minify_js(n.data.to_string(), true) { + let minified = match self.minify_js(n.data.to_string(), true, false) { Some(minified) => minified, None => return, }; @@ -1937,7 +1941,6 @@ fn create_minifier(context_element: Option<&Element>, options: &MinifyOptions) - minify_js: options.minify_js, minify_json: options.minify_json, minify_css: options.minify_css, - minify_additional_attributes: options.minify_additional_attributes.clone(), minify_additional_scripts_content: options.minify_additional_scripts_content.clone(), } diff --git a/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/input.html b/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/input.html index b346389aa5c9..567f610501f0 100644 --- a/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/input.html +++ b/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/input.html @@ -15,5 +15,8 @@ style="width:100%; height:100%; position:absolute; top:0; left:0; z-index:-1;"> +
test
+ Click me + Click me \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/output.min.html b/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/output.min.html index cca9e1eefac3..b90baa91fc16 100644 --- a/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/attribute/javascript-prefix/output.min.html @@ -6,4 +6,7 @@
test
- \ No newline at end of file + +
test
+ Click me + Click me \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/attribute/onclick/output.min.html b/crates/swc_html_minifier/tests/fixture/attribute/onclick/output.min.html index 6bd2a105a686..b495c04ed9c5 100644 --- a/crates/swc_html_minifier/tests/fixture/attribute/onclick/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/attribute/onclick/output.min.html @@ -1,2 +1,2 @@ -DocumentGoogle +DocumentGoogle Google \ No newline at end of file