Intrepret `type=module` on <script> as a JS type
This commit is contained in:
parent
220a9d02b8
commit
c8973d4eac
|
@ -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).
|
|
@ -19,6 +19,7 @@
|
||||||
"strictNullChecks": true,
|
"strictNullChecks": true,
|
||||||
"strictPropertyInitialization": true,
|
"strictPropertyInitialization": true,
|
||||||
"suppressImplicitAnyIndexErrors": true,
|
"suppressImplicitAnyIndexErrors": true,
|
||||||
"target": "es6"
|
"target": "es6",
|
||||||
|
"useUnknownInCatchVariables": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ lazy_static! {
|
||||||
s.insert(b"application/javascript");
|
s.insert(b"application/javascript");
|
||||||
s.insert(b"application/x-ecmascript");
|
s.insert(b"application/x-ecmascript");
|
||||||
s.insert(b"application/x-javascript");
|
s.insert(b"application/x-javascript");
|
||||||
|
s.insert(b"module");
|
||||||
s.insert(b"text/ecmascript");
|
s.insert(b"text/ecmascript");
|
||||||
s.insert(b"text/javascript");
|
s.insert(b"text/javascript");
|
||||||
s.insert(b"text/javascript1.0");
|
s.insert(b"text/javascript1.0");
|
||||||
|
|
|
@ -460,6 +460,8 @@ fn test_processing_instructions() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_js_minification() {
|
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>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(
|
eval_with_js_min(
|
||||||
br#"
|
br#"
|
||||||
<script>let a = 1;</script>
|
<script>let a = 1;</script>
|
||||||
|
|
|
@ -344,7 +344,8 @@ pub fn minify_attr(
|
||||||
|| default_value.filter(|dv| dv == &value_raw).is_some()
|
|| default_value.filter(|dv| dv == &value_raw).is_some()
|
||||||
|| (tag == b"script"
|
|| (tag == b"script"
|
||||||
&& name == b"type"
|
&& 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;
|
return AttrMinified::Redundant;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use crate::cfg::Cfg;
|
use crate::cfg::Cfg;
|
||||||
use crate::common::gen::attrs::{AttributeMinification, ATTRS};
|
use crate::common::gen::attrs::{AttributeMinification, ATTRS};
|
||||||
use crate::common::gen::codepoints::{TAG_NAME_CHAR, WHITESPACE};
|
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::ns::Namespace;
|
||||||
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
||||||
use crate::common::spec::tag::void::VOID_TAGS;
|
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::content::process_content;
|
||||||
use crate::unit::script::process_script;
|
use crate::unit::script::process_script;
|
||||||
use crate::unit::style::process_style;
|
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)]
|
#[derive(Copy, Clone)]
|
||||||
enum TagType {
|
enum TagType {
|
||||||
|
@ -167,7 +143,9 @@ pub fn process_tag(
|
||||||
.filter(|v| !JAVASCRIPT_MIME_TYPES.contains(&proc[*v]))
|
.filter(|v| !JAVASCRIPT_MIME_TYPES.contains(&proc[*v]))
|
||||||
.is_none();
|
.is_none();
|
||||||
if script_tag_type_is_js {
|
if script_tag_type_is_js {
|
||||||
erase_attr = true;
|
if &proc[value.unwrap()] != b"module" {
|
||||||
|
erase_attr = true;
|
||||||
|
};
|
||||||
} else {
|
} else {
|
||||||
// Tag does not contain JS, don't minify JS.
|
// Tag does not contain JS, don't minify JS.
|
||||||
tag_type = TagType::ScriptData;
|
tag_type = TagType::ScriptData;
|
||||||
|
|
Loading…
Reference in New Issue