Intrepret `type=module` on <script> as a JS type

This commit is contained in:
Wilson Lin 2021-10-23 13:27:48 +11:00
parent 220a9d02b8
commit c8973d4eac
6 changed files with 16 additions and 28 deletions

5
CHANGELOG.md Normal file
View File

@ -0,0 +1,5 @@
# minify-html changelog
## 0.6.9
- Intrepret `type=module` on `<script>` tags as a JavaScript MIME eligible for its contents to be minified as JavaScript (previously it would not be and so its contents would be considered data and never minified as JavaScript).

View File

@ -19,6 +19,7 @@
"strictNullChecks": true,
"strictPropertyInitialization": true,
"suppressImplicitAnyIndexErrors": true,
"target": "es6"
"target": "es6",
"useUnknownInCatchVariables": false
}
}

View File

@ -8,6 +8,7 @@ lazy_static! {
s.insert(b"application/javascript");
s.insert(b"application/x-ecmascript");
s.insert(b"application/x-javascript");
s.insert(b"module");
s.insert(b"text/ecmascript");
s.insert(b"text/javascript");
s.insert(b"text/javascript1.0");

View File

@ -460,6 +460,8 @@ fn test_processing_instructions() {
#[test]
fn test_js_minification() {
eval_with_js_min(b"<script>let a = 1;</script>", b"<script>let a=1;</script>");
eval_with_js_min(b"<script type=text/javascript>let a = 1;</script>", b"<script>let a=1;</script>");
eval_with_js_min(b"<script type=module>let a = 1;</script>", b"<script type=module>let a=1;</script>");
eval_with_js_min(
br#"
<script>let a = 1;</script>

View File

@ -344,7 +344,8 @@ pub fn minify_attr(
|| default_value.filter(|dv| dv == &value_raw).is_some()
|| (tag == b"script"
&& name == b"type"
&& JAVASCRIPT_MIME_TYPES.contains(value_raw.as_slice()))
&& JAVASCRIPT_MIME_TYPES.contains(value_raw.as_slice())
&& value_raw.as_slice() != b"module")
{
return AttrMinified::Redundant;
};

View File

@ -1,6 +1,7 @@
use crate::cfg::Cfg;
use crate::common::gen::attrs::{AttributeMinification, ATTRS};
use crate::common::gen::codepoints::{TAG_NAME_CHAR, WHITESPACE};
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
use crate::common::spec::tag::ns::Namespace;
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
use crate::common::spec::tag::void::VOID_TAGS;
@ -14,31 +15,6 @@ use crate::unit::attr::{process_attr, AttrType, ProcessedAttr};
use crate::unit::content::process_content;
use crate::unit::script::process_script;
use crate::unit::style::process_style;
use lazy_static::lazy_static;
use std::collections::HashSet;
lazy_static! {
pub static ref JAVASCRIPT_MIME_TYPES: HashSet<&'static [u8]> = {
let mut s = HashSet::<&'static [u8]>::new();
s.insert(b"application/ecmascript");
s.insert(b"application/javascript");
s.insert(b"application/x-ecmascript");
s.insert(b"application/x-javascript");
s.insert(b"text/ecmascript");
s.insert(b"text/javascript");
s.insert(b"text/javascript1.0");
s.insert(b"text/javascript1.1");
s.insert(b"text/javascript1.2");
s.insert(b"text/javascript1.3");
s.insert(b"text/javascript1.4");
s.insert(b"text/javascript1.5");
s.insert(b"text/jscript");
s.insert(b"text/livescript");
s.insert(b"text/x-ecmascript");
s.insert(b"text/x-javascript");
s
};
}
#[derive(Copy, Clone)]
enum TagType {
@ -167,7 +143,9 @@ pub fn process_tag(
.filter(|v| !JAVASCRIPT_MIME_TYPES.contains(&proc[*v]))
.is_none();
if script_tag_type_is_js {
erase_attr = true;
if &proc[value.unwrap()] != b"module" {
erase_attr = true;
};
} else {
// Tag does not contain JS, don't minify JS.
tag_type = TagType::ScriptData;