-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(es/minifier): Make sequential inliner respect resolution order (#…
- Loading branch information
Showing
21 changed files
with
242 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
crates/swc_ecma_minifier/tests/fixture/issues/6509/config.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"toplevel": true, | ||
"defaults": false, | ||
"inline": true, | ||
"sequences": true, | ||
"conditionals": true | ||
} |
113 changes: 113 additions & 0 deletions
113
crates/swc_ecma_minifier/tests/fixture/issues/6509/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
|
||
|
||
function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { | ||
var offsets = [0, 0]; | ||
|
||
// Use height if placement is left or right and index is 0 otherwise use width | ||
// in this way the first offset will use an axis and the second one | ||
// will use the other one | ||
var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; | ||
|
||
// Split the offset string to obtain a list of values and operands | ||
// The regex addresses values with the plus or minus sign in front (+10, -20, etc) | ||
var fragments = offset.split(/(\+|\-)/).map(function (frag) { | ||
return frag.trim(); | ||
}); | ||
|
||
// Detect if the offset string contains a pair of values or a single one | ||
// they could be separated by comma or space | ||
var divider = fragments.indexOf(find(fragments, function (frag) { | ||
return frag.search(/,|\s/) !== -1; | ||
})); | ||
|
||
if (fragments[divider] && fragments[divider].indexOf(',') === -1) { | ||
console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); | ||
} | ||
|
||
// If divider is found, we divide the list of values and operands to divide | ||
// them by ofset X and Y. | ||
var splitRegex = /\s*,\s*|\s+/; | ||
var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; | ||
|
||
// Convert the values with units to absolute pixels to allow our computations | ||
ops = ops.map(function (op, index) { | ||
// Most of the units rely on the orientation of the popper | ||
var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; | ||
var mergeWithPrevious = false; | ||
return op | ||
// This aggregates any `+` or `-` sign that aren't considered operators | ||
// e.g.: 10 + +5 => [10, +, +5] | ||
.reduce(function (a, b) { | ||
if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { | ||
a[a.length - 1] = b; | ||
mergeWithPrevious = true; | ||
return a; | ||
} else if (mergeWithPrevious) { | ||
a[a.length - 1] += b; | ||
mergeWithPrevious = false; | ||
return a; | ||
} else { | ||
return a.concat(b); | ||
} | ||
}, []) | ||
// Here we convert the string values into number values (in px) | ||
.map(function (str) { | ||
return toValue(str, measurement, popperOffsets, referenceOffsets); | ||
}); | ||
}); | ||
|
||
// Loop trough the offsets arrays and execute the operations | ||
ops.forEach(function (op, index) { | ||
op.forEach(function (frag, index2) { | ||
if (isNumeric(frag)) { | ||
offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); | ||
} | ||
}); | ||
}); | ||
return offsets; | ||
} | ||
|
||
function offset(data, _ref) { | ||
var offset = _ref.offset; | ||
var placement = data.placement, | ||
_data$offsets = data.offsets, | ||
popper = _data$offsets.popper, | ||
reference = _data$offsets.reference; | ||
|
||
var basePlacement = placement.split('-')[0]; | ||
|
||
var offsets = void 0; | ||
if (isNumeric(+offset)) { | ||
offsets = [+offset, 0]; | ||
} else { | ||
offsets = parseOffset(offset, popper, reference, basePlacement); | ||
} | ||
|
||
if (basePlacement === 'left') { | ||
popper.top += offsets[0]; | ||
popper.left -= offsets[1]; | ||
} else if (basePlacement === 'right') { | ||
popper.top += offsets[0]; | ||
popper.left += offsets[1]; | ||
} else if (basePlacement === 'top') { | ||
popper.left += offsets[0]; | ||
popper.top -= offsets[1]; | ||
} else if (basePlacement === 'bottom') { | ||
popper.left += offsets[0]; | ||
popper.top += offsets[1]; | ||
} | ||
|
||
data.popper = popper; | ||
return data; | ||
} | ||
|
||
|
||
export var modifiers = { | ||
offset: { | ||
order: 200, | ||
enabled: true, | ||
fn: offset, | ||
offset: 0 | ||
}, | ||
}; | ||
|
63 changes: 63 additions & 0 deletions
63
crates/swc_ecma_minifier/tests/fixture/issues/6509/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
export var modifiers = { | ||
offset: { | ||
order: 200, | ||
enabled: true, | ||
fn: function(data, _ref) { | ||
var offset = _ref.offset; | ||
var placement = data.placement, _data$offsets = data.offsets, popper = _data$offsets.popper, reference = _data$offsets.reference; | ||
var basePlacement = placement.split('-')[0]; | ||
var offsets = void 0; | ||
if (isNumeric(+offset)) offsets = [ | ||
+offset, | ||
0 | ||
]; | ||
else { | ||
var offsets1; | ||
var useHeight; | ||
var fragments; | ||
var divider; | ||
var splitRegex; | ||
var ops; | ||
offsets1 = [ | ||
0, | ||
0 | ||
], useHeight = -1 !== [ | ||
'right', | ||
'left' | ||
].indexOf(basePlacement), divider = (fragments = offset.split(/(\+|\-)/).map(function(frag) { | ||
return frag.trim(); | ||
})).indexOf(find(fragments, function(frag) { | ||
return -1 !== frag.search(/,|\s/); | ||
})), fragments[divider] && -1 === fragments[divider].indexOf(',') && console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'), splitRegex = /\s*,\s*|\s+/, (ops = (-1 !== divider ? [ | ||
fragments.slice(0, divider).concat([ | ||
fragments[divider].split(splitRegex)[0] | ||
]), | ||
[ | ||
fragments[divider].split(splitRegex)[1] | ||
].concat(fragments.slice(divider + 1)) | ||
] : [ | ||
fragments | ||
]).map(function(op, index) { | ||
var measurement = (1 === index ? !useHeight : useHeight) ? 'height' : 'width'; | ||
var mergeWithPrevious = false; | ||
return op.reduce(function(a, b) { | ||
if ('' === a[a.length - 1] && -1 !== [ | ||
'+', | ||
'-' | ||
].indexOf(b)) return a[a.length - 1] = b, mergeWithPrevious = true, a; | ||
if (mergeWithPrevious) return a[a.length - 1] += b, mergeWithPrevious = false, a; | ||
return a.concat(b); | ||
}, []).map(function(str) { | ||
return toValue(str, measurement, popper, reference); | ||
}); | ||
})).forEach(function(op, index) { | ||
op.forEach(function(frag, index2) { | ||
isNumeric(frag) && (offsets1[index] += frag * ('-' === op[index2 - 1] ? -1 : 1)); | ||
}); | ||
}), offsets = offsets1; | ||
} | ||
return 'left' === basePlacement ? (popper.top += offsets[0], popper.left -= offsets[1]) : 'right' === basePlacement ? (popper.top += offsets[0], popper.left += offsets[1]) : 'top' === basePlacement ? (popper.left += offsets[0], popper.top -= offsets[1]) : 'bottom' === basePlacement && (popper.left += offsets[0], popper.top += offsets[1]), data.popper = popper, data; | ||
}, | ||
offset: 0 | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
27ae59e
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Benchmark
es/full/bugs-1
341625
ns/iter (± 25478
)350508
ns/iter (± 29305
)0.97
es/full/minify/libraries/antd
1966387121
ns/iter (± 78100252
)2111879218
ns/iter (± 98075579
)0.93
es/full/minify/libraries/d3
425075683
ns/iter (± 10580068
)477253912
ns/iter (± 23150529
)0.89
es/full/minify/libraries/echarts
1713521769
ns/iter (± 41812674
)1768784942
ns/iter (± 44996832
)0.97
es/full/minify/libraries/jquery
111480275
ns/iter (± 4014781
)120848711
ns/iter (± 1356858
)0.92
es/full/minify/libraries/lodash
128800553
ns/iter (± 3316350
)139617902
ns/iter (± 9597166
)0.92
es/full/minify/libraries/moment
64739075
ns/iter (± 1349941
)69739935
ns/iter (± 3553422
)0.93
es/full/minify/libraries/react
21808633
ns/iter (± 731131
)22974476
ns/iter (± 143473
)0.95
es/full/minify/libraries/terser
331808118
ns/iter (± 10949519
)397168315
ns/iter (± 43026278
)0.84
es/full/minify/libraries/three
600709409
ns/iter (± 8130627
)659201334
ns/iter (± 35529274
)0.91
es/full/minify/libraries/typescript
3687546872
ns/iter (± 61290690
)3985253857
ns/iter (± 60110808
)0.93
es/full/minify/libraries/victory
897428408
ns/iter (± 19344686
)956683828
ns/iter (± 30089334
)0.94
es/full/minify/libraries/vue
163375698
ns/iter (± 11900145
)185152232
ns/iter (± 4541908
)0.88
es/full/codegen/es3
34336
ns/iter (± 4348
)33985
ns/iter (± 1272
)1.01
es/full/codegen/es5
34350
ns/iter (± 497
)34084
ns/iter (± 656
)1.01
es/full/codegen/es2015
34403
ns/iter (± 969
)34032
ns/iter (± 631
)1.01
es/full/codegen/es2016
34328
ns/iter (± 672
)33974
ns/iter (± 802
)1.01
es/full/codegen/es2017
34364
ns/iter (± 3109
)34080
ns/iter (± 1291
)1.01
es/full/codegen/es2018
34309
ns/iter (± 1607
)34071
ns/iter (± 648
)1.01
es/full/codegen/es2019
34695
ns/iter (± 1505
)34126
ns/iter (± 374
)1.02
es/full/codegen/es2020
34282
ns/iter (± 409
)34227
ns/iter (± 1533
)1.00
es/full/all/es3
190879705
ns/iter (± 7592810
)205468621
ns/iter (± 11777873
)0.93
es/full/all/es5
176483638
ns/iter (± 6194266
)187566358
ns/iter (± 14030526
)0.94
es/full/all/es2015
140163774
ns/iter (± 3081952
)148442741
ns/iter (± 11936301
)0.94
es/full/all/es2016
139584940
ns/iter (± 2700492
)146573299
ns/iter (± 9311702
)0.95
es/full/all/es2017
138687736
ns/iter (± 2575811
)145423013
ns/iter (± 8809769
)0.95
es/full/all/es2018
136956861
ns/iter (± 3000282
)145189265
ns/iter (± 8078586
)0.94
es/full/all/es2019
136426344
ns/iter (± 5033853
)144159830
ns/iter (± 8356838
)0.95
es/full/all/es2020
131369065
ns/iter (± 3631371
)138094151
ns/iter (± 7190825
)0.95
es/full/parser
693589
ns/iter (± 20979
)730601
ns/iter (± 47270
)0.95
es/full/base/fixer
25421
ns/iter (± 1346
)26442
ns/iter (± 734
)0.96
es/full/base/resolver_and_hygiene
88031
ns/iter (± 2547
)91909
ns/iter (± 3392
)0.96
serialization of ast node
211
ns/iter (± 4
)217
ns/iter (± 7
)0.97
serialization of serde
216
ns/iter (± 12
)221
ns/iter (± 2
)0.98
This comment was automatically generated by workflow using github-action-benchmark.