Skip to content

Commit a7c5255

Browse files
authoredFeb 2, 2024
fix(es/minifier): Fix top-level check (#8583)
**Description:** Our logic for checking top-level was wrong.
1 parent ef21736 commit a7c5255

File tree

15 files changed

+120
-126
lines changed

15 files changed

+120
-126
lines changed
 

‎crates/swc_ecma_minifier/src/compress/optimize/mod.rs

+13-3
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,8 @@ struct Ctx {
178178

179179
impl Ctx {
180180
pub fn is_top_level_for_block_level_vars(self) -> bool {
181-
if self.top_level {
182-
return true;
181+
if !self.top_level {
182+
return false;
183183
}
184184

185185
if self.in_fn_like || self.in_block {
@@ -1663,6 +1663,7 @@ impl VisitMut for Optimizer<'_> {
16631663
}
16641664
}
16651665

1666+
#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
16661667
fn visit_mut_class_expr(&mut self, e: &mut ClassExpr) {
16671668
if !self.options.keep_classnames {
16681669
if e.ident.is_some() && !contains_eval(&e.class, true) {
@@ -2255,6 +2256,7 @@ impl VisitMut for Optimizer<'_> {
22552256
}
22562257
}
22572258

2259+
#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
22582260
fn visit_mut_module_item(&mut self, s: &mut ModuleItem) {
22592261
s.visit_mut_children_with(self);
22602262

@@ -2269,8 +2271,14 @@ impl VisitMut for Optimizer<'_> {
22692271
}
22702272
}
22712273

2274+
#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
22722275
fn visit_mut_script(&mut self, s: &mut Script) {
2273-
s.visit_mut_children_with(self);
2276+
let ctx = Ctx {
2277+
top_level: true,
2278+
skip_standalone: true,
2279+
..self.ctx
2280+
};
2281+
s.visit_mut_children_with(&mut *self.with_ctx(ctx));
22742282

22752283
if self.vars.inline_with_multi_replacer(s) {
22762284
self.changed = true;
@@ -2279,6 +2287,7 @@ impl VisitMut for Optimizer<'_> {
22792287
drop_invalid_stmts(&mut s.body);
22802288
}
22812289

2290+
#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
22822291
fn visit_mut_module_items(&mut self, stmts: &mut Vec<ModuleItem>) {
22832292
let ctx = Ctx {
22842293
top_level: true,
@@ -2701,6 +2710,7 @@ impl VisitMut for Optimizer<'_> {
27012710
debug_assert_valid(s);
27022711
}
27032712

2713+
#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
27042714
fn visit_mut_stmts(&mut self, stmts: &mut Vec<Stmt>) {
27052715
// Skip if `use asm` exists.
27062716
if maybe_par!(

‎crates/swc_ecma_minifier/src/option/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ impl CompressOptions {
352352
return true;
353353
}
354354

355-
self.top_level.map(|v| v.functions).unwrap_or(false)
355+
self.top_level.map(|v| v.functions).unwrap_or(false) || self.module
356356
}
357357
}
358358

‎crates/swc_ecma_minifier/tests/compress.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use swc_ecma_minifier::{
3131
optimize,
3232
option::{
3333
terser::TerserCompressorOptions, CompressOptions, ExtraOptions, MangleOptions,
34-
MinifyOptions,
34+
MinifyOptions, TopLevelOptions,
3535
},
3636
};
3737
use swc_ecma_parser::{
@@ -150,7 +150,7 @@ fn run(
150150
HANDLER.set(handler, || {
151151
let disable_hygiene = mangle.is_some() || skip_hygiene;
152152

153-
let (_module, config) = parse_compressor_config(cm.clone(), config);
153+
let (_module, mut config) = parse_compressor_config(cm.clone(), config);
154154

155155
let fm = cm.load_file(input).expect("failed to load input.js");
156156
let comments = SingleThreadedComments::default();
@@ -213,6 +213,14 @@ fn run(
213213
_ => return None,
214214
};
215215

216+
if config.top_level.is_none() {
217+
if program.is_module() {
218+
config.top_level = Some(TopLevelOptions { functions: true });
219+
} else {
220+
config.top_level = Some(TopLevelOptions { functions: false });
221+
}
222+
}
223+
216224
let optimization_start = Instant::now();
217225
let mut output = optimize(
218226
program,

‎crates/swc_ecma_minifier/tests/fixture/issues/7402/output.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ export const myFunc = function() {
1111
return mutate(temp), out[0] = 1 / temp[0], out[1] = 1 / temp[1], out[2] = 1 / temp[2], out;
1212
};
1313
}();
14-
const out = [
14+
myFunc([
1515
1,
1616
2,
1717
3
18-
];
19-
myFunc(out);
18+
]);
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import { m } from "../index.f66dda46.js";
2-
const value$1 = "it works", value = "it works";
3-
function AliasOutside() {
2+
export default function() {
43
return m`<div><p>Inside: ${"it works"}</p><p>Outside: ${"it works"}</p></div>`;
54
}
6-
export default AliasOutside;

‎crates/swc_ecma_minifier/tests/fixture/projects/wmr/archive-1/chunks/class-fields.43d5f69c/output.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { _, m } from "../index.f66dda46.js";
2-
class ClassFields extends _ {
2+
export default class extends _ {
33
state = {
44
value: 1
55
};
@@ -12,4 +12,3 @@ class ClassFields extends _ {
1212
return m`<div><p> State: <span>${this.state.value}</span></p><button onClick=${this.onClick}>click me</button></div>`;
1313
}
1414
}
15-
export default ClassFields;

‎crates/swc_ecma_minifier/tests/fixture/projects/wmr/archive-1/chunks/hoofd.module.6c5395cb/output.js

+70-77
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { D, F, y, b as s } from "../index.f66dda46.js";
2-
var isServerSide = "undefined" == typeof document, META = "M", TITLE = "T", LINK = "L", TEMPLATE = "P", SCRIPT = "S", applyTitleTemplate = function(title, template) {
2+
var lang, linkQueue, scriptQueue, titleQueue, titleTemplateQueue, metaQueue, currentTitleIndex, currentTitleTemplateIndex, currentMetaIndex, timeout, processQueue, isServerSide = "undefined" == typeof document, applyTitleTemplate = function(title, template) {
33
return template ? template.replace(/%s/g, title || "") : title;
44
}, changeOrCreateMetaTag = function(meta) {
55
var result = document.head.querySelectorAll(meta.charset ? "meta[" + meta.keyword + "]" : "meta[" + meta.keyword + '="' + meta[meta.keyword] + '"]');
@@ -8,70 +8,67 @@ var isServerSide = "undefined" == typeof document, META = "M", TITLE = "T", LINK
88
var metaTag = document.createElement("meta");
99
meta.charset ? metaTag.setAttribute(meta.keyword, meta.charset) : (metaTag.setAttribute(meta.keyword, meta[meta.keyword]), metaTag.setAttribute("content", meta.content)), document.head.appendChild(metaTag);
1010
}
11-
}, createDispatcher = function() {
12-
var timeout, lang, linkQueue = [], scriptQueue = [], titleQueue = [], titleTemplateQueue = [], metaQueue = [], currentTitleIndex = 0, currentTitleTemplateIndex = 0, currentMetaIndex = 0, processQueue = function() {
13-
clearTimeout(timeout), timeout = setTimeout(function() {
14-
timeout = null;
15-
var visited = new Set();
16-
document.title = applyTitleTemplate(titleQueue[0], titleTemplateQueue[0]), metaQueue.forEach(function(meta) {
17-
visited.has(meta.charset ? meta.keyword : meta[meta.keyword]) || (visited.add(meta.charset ? meta.keyword : meta[meta.keyword]), changeOrCreateMetaTag(meta));
18-
}), currentTitleIndex = currentTitleTemplateIndex = currentMetaIndex = 0;
19-
}, 1000 / 60);
20-
};
21-
return {
22-
_setLang: function(l) {
23-
lang = l;
24-
},
25-
_addToQueue: function(type, payload) {
26-
isServerSide || processQueue(), type === SCRIPT ? scriptQueue.push(payload) : type === TITLE ? titleQueue.splice(currentTitleIndex++, 0, payload) : type === TEMPLATE ? titleTemplateQueue.splice(currentTitleTemplateIndex++, 0, payload) : type === META ? metaQueue.splice(currentMetaIndex++, 0, payload) : linkQueue.push(payload);
27-
},
28-
_removeFromQueue: function(type, payload) {
29-
if (type === TITLE || type === TEMPLATE) {
30-
var queue = type === TEMPLATE ? titleTemplateQueue : titleQueue, index = queue.indexOf(payload);
31-
queue.splice(index, 1), 0 === index && (document.title = applyTitleTemplate(titleQueue[0] || "", titleTemplateQueue[0]));
32-
} else {
33-
var oldMeta = metaQueue[metaQueue.indexOf(payload)];
34-
if (oldMeta) {
35-
metaQueue.splice(metaQueue.indexOf(payload), 1);
36-
var newMeta = metaQueue.find(function(m) {
37-
return m.keyword === oldMeta.keyword && (m.charset || m[m.keyword] === oldMeta[m.keyword]);
38-
});
39-
if (newMeta) changeOrCreateMetaTag(newMeta);
40-
else {
41-
var result = document.head.querySelectorAll(oldMeta.charset ? "meta[" + oldMeta.keyword + "]" : "meta[" + oldMeta.keyword + '="' + oldMeta[oldMeta.keyword] + '"]');
42-
document.head.removeChild(result[0]);
43-
}
11+
}, defaultDispatcher = (linkQueue = [], scriptQueue = [], titleQueue = [], titleTemplateQueue = [], metaQueue = [], currentTitleIndex = 0, currentTitleTemplateIndex = 0, currentMetaIndex = 0, processQueue = function() {
12+
clearTimeout(timeout), timeout = setTimeout(function() {
13+
timeout = null;
14+
var visited = new Set();
15+
document.title = applyTitleTemplate(titleQueue[0], titleTemplateQueue[0]), metaQueue.forEach(function(meta) {
16+
visited.has(meta.charset ? meta.keyword : meta[meta.keyword]) || (visited.add(meta.charset ? meta.keyword : meta[meta.keyword]), changeOrCreateMetaTag(meta));
17+
}), currentTitleIndex = currentTitleTemplateIndex = currentMetaIndex = 0;
18+
}, 1000 / 60);
19+
}, {
20+
_setLang: function(l) {
21+
lang = l;
22+
},
23+
_addToQueue: function(type, payload) {
24+
isServerSide || processQueue(), "S" === type ? scriptQueue.push(payload) : "T" === type ? titleQueue.splice(currentTitleIndex++, 0, payload) : "P" === type ? titleTemplateQueue.splice(currentTitleTemplateIndex++, 0, payload) : "M" === type ? metaQueue.splice(currentMetaIndex++, 0, payload) : linkQueue.push(payload);
25+
},
26+
_removeFromQueue: function(type, payload) {
27+
if ("T" === type || "P" === type) {
28+
var queue = "P" === type ? titleTemplateQueue : titleQueue, index = queue.indexOf(payload);
29+
queue.splice(index, 1), 0 === index && (document.title = applyTitleTemplate(titleQueue[0] || "", titleTemplateQueue[0]));
30+
} else {
31+
var oldMeta = metaQueue[metaQueue.indexOf(payload)];
32+
if (oldMeta) {
33+
metaQueue.splice(metaQueue.indexOf(payload), 1);
34+
var newMeta = metaQueue.find(function(m) {
35+
return m.keyword === oldMeta.keyword && (m.charset || m[m.keyword] === oldMeta[m.keyword]);
36+
});
37+
if (newMeta) changeOrCreateMetaTag(newMeta);
38+
else {
39+
var result = document.head.querySelectorAll(oldMeta.charset ? "meta[" + oldMeta.keyword + "]" : "meta[" + oldMeta.keyword + '="' + oldMeta[oldMeta.keyword] + '"]');
40+
document.head.removeChild(result[0]);
4441
}
4542
}
46-
},
47-
_change: function(type, prevPayload, payload) {
48-
if (type === TITLE || type === TEMPLATE) {
49-
var queue = type === TEMPLATE ? titleTemplateQueue : titleQueue;
50-
queue[queue.indexOf(prevPayload)] = payload, 0 === queue.indexOf(payload) && (document.title = applyTitleTemplate(queue[queue.indexOf(payload)], titleTemplateQueue[0]));
51-
} else changeOrCreateMetaTag(metaQueue[metaQueue.indexOf(prevPayload)] = payload);
52-
},
53-
_reset: void 0,
54-
toStatic: function() {
55-
var title = applyTitleTemplate(titleQueue[titleQueue.length - 1], titleTemplateQueue[titleTemplateQueue.length - 1]), visited = new Set(), links = [].concat(linkQueue), scripts = [].concat(scriptQueue);
56-
metaQueue.reverse();
57-
var metas = [].concat(metaQueue).filter(function(meta) {
58-
if (!visited.has(meta.charset ? meta.keyword : meta[meta.keyword])) return visited.add(meta.charset ? meta.keyword : meta[meta.keyword]), !0;
59-
});
60-
return titleQueue = [], titleTemplateQueue = [], metaQueue = [], linkQueue = [], scriptQueue = [], currentTitleIndex = currentTitleTemplateIndex = currentMetaIndex = 0, {
61-
lang: lang,
62-
title: title,
63-
links: links,
64-
scripts: scripts,
65-
metas: metas.map(function(meta) {
66-
var _ref;
67-
return "charset" === meta.keyword ? {
68-
charset: meta[meta.keyword]
69-
} : ((_ref = {})[meta.keyword] = meta[meta.keyword], _ref.content = meta.content, _ref);
70-
})
71-
};
7243
}
73-
};
74-
}, defaultDispatcher = createDispatcher(), DispatcherContext = D(defaultDispatcher), useLang = function(language) {
44+
},
45+
_change: function(type, prevPayload, payload) {
46+
if ("T" === type || "P" === type) {
47+
var queue = "P" === type ? titleTemplateQueue : titleQueue;
48+
queue[queue.indexOf(prevPayload)] = payload, 0 === queue.indexOf(payload) && (document.title = applyTitleTemplate(queue[queue.indexOf(payload)], titleTemplateQueue[0]));
49+
} else changeOrCreateMetaTag(metaQueue[metaQueue.indexOf(prevPayload)] = payload);
50+
},
51+
_reset: void 0,
52+
toStatic: function() {
53+
var title = applyTitleTemplate(titleQueue[titleQueue.length - 1], titleTemplateQueue[titleTemplateQueue.length - 1]), visited = new Set(), links = [].concat(linkQueue), scripts = [].concat(scriptQueue);
54+
metaQueue.reverse();
55+
var metas = [].concat(metaQueue).filter(function(meta) {
56+
if (!visited.has(meta.charset ? meta.keyword : meta[meta.keyword])) return visited.add(meta.charset ? meta.keyword : meta[meta.keyword]), !0;
57+
});
58+
return titleQueue = [], titleTemplateQueue = [], metaQueue = [], linkQueue = [], scriptQueue = [], currentTitleIndex = currentTitleTemplateIndex = currentMetaIndex = 0, {
59+
lang: lang,
60+
title: title,
61+
links: links,
62+
scripts: scripts,
63+
metas: metas.map(function(meta) {
64+
var _ref;
65+
return "charset" === meta.keyword ? {
66+
charset: meta[meta.keyword]
67+
} : ((_ref = {})[meta.keyword] = meta[meta.keyword], _ref.content = meta.content, _ref);
68+
})
69+
};
70+
}
71+
}), DispatcherContext = D(defaultDispatcher), useLang = function(language) {
7572
var dispatcher = F(DispatcherContext);
7673
isServerSide && dispatcher._setLang(language), y(function() {
7774
document.getElementsByTagName("html")[0].setAttribute("lang", language);
@@ -80,7 +77,7 @@ var isServerSide = "undefined" == typeof document, META = "M", TITLE = "T", LINK
8077
]);
8178
}, useLink = function(options) {
8279
var dispatcher = F(DispatcherContext), hasMounted = s(!1), node = s(), originalOptions = s();
83-
isServerSide && !hasMounted.current && dispatcher._addToQueue(LINK, options), y(function() {
80+
isServerSide && !hasMounted.current && dispatcher._addToQueue("L", options), y(function() {
8481
hasMounted.current && Object.keys(options).forEach(function(key) {
8582
node.current.setAttribute(key, options[key]);
8683
});
@@ -108,21 +105,17 @@ var isServerSide = "undefined" == typeof document, META = "M", TITLE = "T", LINK
108105
}) : document.head.removeChild(node.current);
109106
};
110107
}, []);
111-
};
112-
function extractKeyword(meta) {
113-
return meta.charset ? "charset" : meta.name ? "name" : meta.property ? "property" : "http-equiv";
114-
}
115-
var useMeta = function(options) {
108+
}, useMeta = function(options) {
116109
var dispatcher = F(DispatcherContext), hasMounted = s(!1), keyword = s(), metaObject = s({
117-
keyword: keyword.current = extractKeyword(options),
110+
keyword: keyword.current = options.charset ? "charset" : options.name ? "name" : options.property ? "property" : "http-equiv",
118111
name: options.name,
119112
charset: options.charset,
120113
"http-equiv": options.httpEquiv,
121114
property: options.property,
122115
content: options.content
123116
});
124-
isServerSide && !hasMounted.current && dispatcher._addToQueue(META, metaObject.current), y(function() {
125-
hasMounted.current && dispatcher._change(META, metaObject.current, metaObject.current = {
117+
isServerSide && !hasMounted.current && dispatcher._addToQueue("M", metaObject.current), y(function() {
118+
hasMounted.current && dispatcher._change("M", metaObject.current, metaObject.current = {
126119
keyword: keyword.current,
127120
name: options.name,
128121
charset: options.charset,
@@ -133,20 +126,20 @@ var useMeta = function(options) {
133126
}, [
134127
options.content
135128
]), y(function() {
136-
return dispatcher._addToQueue(META, metaObject.current), hasMounted.current = !0, function() {
137-
hasMounted.current = !1, dispatcher._removeFromQueue(META, metaObject.current);
129+
return dispatcher._addToQueue("M", metaObject.current), hasMounted.current = !0, function() {
130+
hasMounted.current = !1, dispatcher._removeFromQueue("M", metaObject.current);
138131
};
139132
}, []);
140133
}, useTitle = function(title, template) {
141134
var dispatcher = F(DispatcherContext), hasMounted = s(!1), prevTitle = s();
142-
isServerSide && !hasMounted.current && dispatcher._addToQueue(template ? TEMPLATE : TITLE, title), y(function() {
143-
hasMounted.current && dispatcher._change(template ? TEMPLATE : TITLE, prevTitle.current, prevTitle.current = title);
135+
isServerSide && !hasMounted.current && dispatcher._addToQueue(template ? "P" : "T", title), y(function() {
136+
hasMounted.current && dispatcher._change(template ? "P" : "T", prevTitle.current, prevTitle.current = title);
144137
}, [
145138
title,
146139
template
147140
]), y(function() {
148-
return hasMounted.current = !0, dispatcher._addToQueue(template ? TEMPLATE : TITLE, prevTitle.current = title), function() {
149-
hasMounted.current = !1, dispatcher._removeFromQueue(template ? TEMPLATE : TITLE, prevTitle.current);
141+
return hasMounted.current = !0, dispatcher._addToQueue(template ? "P" : "T", prevTitle.current = title), function() {
142+
hasMounted.current = !1, dispatcher._removeFromQueue(template ? "P" : "T", prevTitle.current);
150143
};
151144
}, [
152145
template
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { m } from "../index.f66dda46.js";
22
const jpg = "/assets/img.2dae108d.jpg";
3-
function Files() {
3+
export default function() {
44
return m`<div style="padding: 2rem;"><h1>Files</h1><p> jpg: ${jpg}<br/><img src=${jpg} alt="" height="320"/></p></div>`;
55
}
6-
export default Files;

‎crates/swc_ecma_minifier/tests/fixture/projects/wmr/archive-1/chunks/index.bf24abaa/output.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
import { s as style, m } from "../index.f66dda46.js";
1+
import { m } from "../index.f66dda46.js";
22
const process = {
3-
browser: !0,
43
env: {
54
FOO: "bar",
65
OVERRIDE: "11",
76
EMPTY: "",
87
FOO_LOCAL: "bar",
98
NODE_ENV: "production"
109
}
11-
}, foo = 42;
10+
};
1211
function Environment() {
1312
return m`<table><thead><tr><th>Name ${42}</th><th>Value</th></tr></thead><tbody>${Object.keys(process.env).sort().map((key)=>m`<tr key=${key}><td>${key}</td><td>${String(process.env[key])}</td></tr>`)}</tbody></table>`;
1413
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
import { s as style, y, m } from "../index.f66dda46.js";
2-
const styles = {
3-
about: "about_migxty"
4-
};
5-
function About({ query, title }) {
1+
import { y, m } from "../index.f66dda46.js";
2+
export default function({ query, title }) {
63
return y(()=>(console.log("Mounted About: ", title), ()=>{
74
console.log("Unmounting About: ", title);
85
}), []), m`<section class=${"about_migxty"}><h1>${title || "About"}</h1><p>My name is Jason.</p><pre>${JSON.stringify(query)}</pre></section>`;
96
}
10-
export default About;

‎crates/swc_ecma_minifier/tests/fixture/projects/wmr/archive-1/chunks/prerender.93c6f601/output.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import "../index.f66dda46.js";
22
import { t as toStatic } from "./hoofd.module.6c5395cb.js";
3-
function prerender$1(vnode, options) {
4-
return import("../prerender.daa73035/input.js").then((m)=>m.default(vnode, options));
5-
}
63
async function prerender(vnode) {
7-
const res = await prerender$1(vnode), head = toStatic(), elements = new Set([
4+
const res = await import("../prerender.daa73035/input.js").then((m)=>m.default(vnode, void 0)), head = toStatic(), elements = new Set([
85
...head.links.map((props)=>({
96
type: "link",
107
props
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
function f() {
22
return 2;
33
}
4-
console.log(
5-
f(),
6-
(function () {
7-
return 3;
8-
})()
9-
);
4+
console.log(f(), function() {
5+
return 3;
6+
}());

‎crates/swc_ecma_minifier/tests/terser/compress/export/issue_333/output.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
function shortOut() {
2-
return function () {};
3-
}
4-
var setToString = shortOut();
5-
var _setToString = setToString;
1+
var setToString;
2+
var _setToString = function shortOut() {
3+
return function() {};
4+
}();
65
export function baseRest() {
76
return _setToString();
87
}

‎crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html

+7-7
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727

2828

2929
<div>breaker</div>
30-
<script type=module>var a="test";console.log(a)</script><script>var b="test";console.log(b)</script>
30+
<script type=module>console.log("test")</script><script>var b="test";console.log(b)</script>
3131

3232

3333
<div>breaker</div>
34-
<script type=module>var a="test";console.log(a);var b="test";console.log(b)</script>
34+
<script type=module>console.log("test"),console.log("test")</script>
3535

3636

3737
<div>breaker</div>
@@ -51,22 +51,22 @@
5151
<script>var a="test";console.log(a);var b="test";console.log(b)</script>
5252

5353
<div>breaker</div>
54-
<script type=module>var a="test";console.log(a);var a1="test";console.log(a1)</script>
54+
<script type=module>console.log("test"),console.log("test")</script>
5555

5656
<div>breaker</div>
57-
<script type=module>var a="test";console.log(a)</script><script>var a="test";console.log(a)</script>
57+
<script type=module>console.log("test")</script><script>var a="test";console.log(a)</script>
5858

5959
<div>breaker</div>
60-
<script type=module>var a="test";console.log(a);var a1="test";console.log(a1)</script>
60+
<script type=module>console.log("test"),console.log("test")</script>
6161

6262
<div>breaker</div>
63-
<script type=module>var a="test";console.log(a);var a1="test";console.log(a1)</script>
63+
<script type=module>console.log("test"),console.log("test")</script>
6464

6565
<div>breaker</div>
6666
<script>let a="test";console.log(a);let b="test";console.log(b);let a="test";console.log(a);let b="test";console.log(b)</script>
6767

6868
<div>breaker</div>
69-
<script type=module>let a="test";console.log(a);const b="test";console.log("test");let a1="test";console.log(a1);const b1="test";console.log("test")</script>
69+
<script type=module>console.log("test"),console.log("test"),console.log("test"),console.log("test")</script>
7070

7171
<div>breaker</div>
7272
<script>let foo=[1,2,3];[()=>{console.log("test")},2,3][0]()</script>

‎crates/swc_html_minifier/tests/fixture/element/script/output.min.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
</script><script id=data type=application/json>{"foo":"bar"}</script><script>
2121
broken broken
22-
</script><script>var a=3,a=9</script><script type=module>import t from"foo.js";let test=58800,test1="testtest"</script><script>let d=new Date;alert("Today's date is "+d)</script><script src=javascript.js>
22+
</script><script>var a=3,a=9</script><script type=module>import"foo.js"</script><script>let d=new Date;alert("Today's date is "+d)</script><script src=javascript.js>
2323

2424

2525

@@ -60,4 +60,4 @@
6060
<div>topLevel - script</div>
6161
<script>var topLevel=function(){let o="bar";o&&(o+="baz"),console.log(o)}</script>
6262
<div>topLevel - module</div>
63-
<script type=module>var topLevel=function(){let o="bar";o&&(o+="baz"),console.log(o)}</script>
63+
<script type=module></script>

0 commit comments

Comments
 (0)
Please sign in to comment.