Page MenuHomePhabricator

Add native support for ES2018-ES2020 to the minifier
Closed, ResolvedPublic

Description

Previous: T277675: Add native support for ES2016-ES2017 to the minifier | Next: T425099: Add native support for ES2021 to the minifier

Notable syntax features in later versions:

Event Timeline

Krinkle renamed this task from Add native support for ES2018-ES2020 or higher versions to the minifier to Add native support for ES2018-ES2020 to the minifier.Feb 14 2025, 11:37 PM

Change #1130172 had a related patch set uploaded (by Hokwelum; author: Hokwelum):

[mediawiki/libs/Minify@master] JavaScriptMinifier: Update class documentation for ES2017 support

https://gerrit.wikimedia.org/r/1130172

Krinkle updated the task description. (Show Details)

Change #1155362 had a related patch set uploaded (by Novem Linguae; author: Novem Linguae):

[mediawiki/libs/Minify@master] tests: add ES2018 RegEx lookbehinds

https://gerrit.wikimedia.org/r/1155362

Change #1155362 merged by jenkins-bot:

[mediawiki/libs/Minify@master] tests: Add tests for ES2018 syntax

https://gerrit.wikimedia.org/r/1155362

Change #1277151 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] JavaScriptMinifier: Update class documentation for ES2018 support

https://gerrit.wikimedia.org/r/1277151

Change #1277155 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] Add tests for ES2019 optional catch binding

https://gerrit.wikimedia.org/r/1277155

Change #1277156 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] JavaScriptMinifier: Update class documentation for ES2019 support

https://gerrit.wikimedia.org/r/1277156

Change #1277165 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] JavaScriptMinifier: Support minifying ES2020 optional chaining operator

https://gerrit.wikimedia.org/r/1277165

Change #1277171 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] JavaScriptMinifier: Support ES2020 BigInt literals

https://gerrit.wikimedia.org/r/1277171

Change #1277227 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] Support new forms of import/export from ES2020

https://gerrit.wikimedia.org/r/1277227

Change #1277228 had a related patch set uploaded (by SD0001; author: SD0001):

[mediawiki/libs/Minify@master] Update class documentation for ES2020 support

https://gerrit.wikimedia.org/r/1277228

Change #1195387 had a related patch set uploaded (by Krinkle; author: SD0001):

[mediawiki/libs/Minify@master] tests: Expand tests for `...` object spread and array rest operator

https://gerrit.wikimedia.org/r/1195387

Change #1195387 merged by jenkins-bot:

[mediawiki/libs/Minify@master] tests: Expand tests for `...` object spread and array rest operator

https://gerrit.wikimedia.org/r/1195387

Change #1277151 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Update class documentation for ES2018 support

https://gerrit.wikimedia.org/r/1277151

Change #1277155 merged by jenkins-bot:

[mediawiki/libs/Minify@master] tests: Add coverage for ES2019 optional catch binding

https://gerrit.wikimedia.org/r/1277155

Krinkle updated the task description. (Show Details)

ES2018: regex lookbehind

As additional test I looked at acorn, a popular JS parser, for some funky test cases.

https://github.com/acornjs/acorn/blob/3f40dbe68408f95c4502b2a03127f91d7c563503/test/tests-regexp-2018.js#L119C7-L119C16

test("/(?<!a)/u", {}, { ecmaVersion: 2018 })

... combined a division on either side, and some nesting, for extra potential confusion of the state machine. This is ultimately doing 1 / Number(RegExp) / 2 which is syntactically valid, albeit logically nonsense.

echo 'var x = [([ 1 / /(?<!a)/u / 2 ])]; console.log(x[0][0]);' | node
NaN
echo 'var x = [([ 1 / /(?<!a)/u / 2 ])]; console.log(x[0][0]);' | bin/minify js | node
NaN
echo 'var x = [([ 1 / /(?<!a)/u / 2 ])]; console.log(x[0][0]);' | bin/minify jsdebug
| stack                                         | last | state                  | token             | type            
| --------------------------------------------- | ---- | ---------------------- | ----------------- | ----------------
|                                               | ;    | STATEMENT              | @0   var          | TYPE_VAR        
|                                               | r    | EXPRESSION             | @4   x            | TYPE_LITERAL    
|                                               | x    | EXPRESSION_OP          | @6   =            | TYPE_BIN_OP     
|                                               | =    | EXPRESSION             | @8   [            | TYPE_PAREN_OPEN 
| EXPRESSION_OP                                 | [    | PAREN_EXPRESSION       | @9   (            | TYPE_PAREN_OPEN 
| EXPRESSION_OP, PAREN_EXPRESSION_OP            | (    | PAREN_EXPRESSION       | @10  [            | TYPE_PAREN_OPEN 
| 2 ..., PAREN_EXPRESSION_OP                    | [    | PAREN_EXPRESSION       | @12  1            | TYPE_LITERAL    
| 2 ..., PAREN_EXPRESSION_OP                    | 1    | PAREN_EXPRESSION_OP    | @14  /            | TYPE_BIN_OP     
| 2 ..., PAREN_EXPRESSION_OP                    | /    | PAREN_EXPRESSION       | @16  /(?<!a)/u    | TYPE_LITERAL    
| 2 ..., PAREN_EXPRESSION_OP                    | u    | PAREN_EXPRESSION_OP    | @26  /            | TYPE_BIN_OP     
| 2 ..., PAREN_EXPRESSION_OP                    | /    | PAREN_EXPRESSION       | @28  2            | TYPE_LITERAL    
| 2 ..., PAREN_EXPRESSION_OP                    | 2    | PAREN_EXPRESSION_OP    | @30  ]            | TYPE_PAREN_CLOSE
| EXPRESSION_OP, PAREN_EXPRESSION_OP            | ]    | PAREN_EXPRESSION_OP    | @31  )            | TYPE_PAREN_CLOSE
| EXPRESSION_OP                                 | )    | PAREN_EXPRESSION_OP    | @32  ]            | TYPE_PAREN_CLOSE
|                                               | ]    | EXPRESSION_OP          | @33  ;            | TYPE_SEMICOLON  
|                                               | ;    | STATEMENT              | @35  console      | TYPE_LITERAL    
|                                               | e    | EXPRESSION_OP          | @42  .            | TYPE_DOT        
|                                               | .    | EXPRESSION_DOT         | @43  log          | TYPE_LITERAL    
|                                               | g    | EXPRESSION_OP          | @46  (            | TYPE_PAREN_OPEN 
| EXPRESSION_OP                                 | (    | PAREN_EXPRESSION       | @47  x            | TYPE_LITERAL    
| EXPRESSION_OP                                 | x    | PAREN_EXPRESSION_OP    | @48  [            | TYPE_PAREN_OPEN 
| EXPRESSION_OP, PAREN_EXPRESSION_OP            | [    | PAREN_EXPRESSION       | @49  0            | TYPE_LITERAL    
| EXPRESSION_OP, PAREN_EXPRESSION_OP            | 0    | PAREN_EXPRESSION_OP    | @50  ]            | TYPE_PAREN_CLOSE
| EXPRESSION_OP                                 | ]    | PAREN_EXPRESSION_OP    | @51  [            | TYPE_PAREN_OPEN 
| EXPRESSION_OP, PAREN_EXPRESSION_OP            | [    | PAREN_EXPRESSION       | @52  0            | TYPE_LITERAL    
| EXPRESSION_OP, PAREN_EXPRESSION_OP            | 0    | PAREN_EXPRESSION_OP    | @53  ]            | TYPE_PAREN_CLOSE
| EXPRESSION_OP                                 | ]    | PAREN_EXPRESSION_OP    | @54  )            | TYPE_PAREN_CLOSE
|                                               | )    | EXPRESSION_OP          | @55  ;            | TYPE_SEMICOLON  
var x=[([1/ /(?<!a)/u/2])];console.log(x[0][0]);

The key part being that the regex literal is parsed as a single literal token and not taken apart or combined with anything.

Change #1278715 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/libs/Minify@master] tests: Add coverage for ES2019 U+2028 or U+2029 in string literal

https://gerrit.wikimedia.org/r/1278715

Change #1277156 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Update class documentation for ES2019 support

https://gerrit.wikimedia.org/r/1277156

Change #1277165 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Support ES2020 optional chaining operator

https://gerrit.wikimedia.org/r/1277165

Change #1287502 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/libs/Minify@master] JavaScriptMinifier: Strip space after exponent and implied zero fraction

https://gerrit.wikimedia.org/r/1287502

Change #1277171 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Support ES2020 BigInt literals

https://gerrit.wikimedia.org/r/1277171

Change #1287502 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Strip space after exponent and implied zero fraction

https://gerrit.wikimedia.org/r/1287502

Change #1277227 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Support new forms of import/export from ES2020

https://gerrit.wikimedia.org/r/1277227

Change #1277228 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Update class documentation for ES2020 support

https://gerrit.wikimedia.org/r/1277228

Krinkle claimed this task.
Krinkle reassigned this task from Krinkle to SD0001.
Krinkle updated the task description. (Show Details)
Krinkle updated Other Assignee, added: Krinkle.

Change #1278715 merged by jenkins-bot:

[mediawiki/libs/Minify@master] JavaScriptMinifier: Document unimplemented whitespace and line terminators (ES2019)

https://gerrit.wikimedia.org/r/1278715

Change #1305924 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/libs/Minify@master] tests: Add test for ASI after yield without expression (ES2019)

https://gerrit.wikimedia.org/r/1305924

Change #1305929 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] ResourceLoader: Update wikimedia/minify to 2.11.0

https://gerrit.wikimedia.org/r/1305929

Change #1305924 merged by jenkins-bot:

[mediawiki/libs/Minify@master] tests: Add test for ASI after yield without expression (ES2019)

https://gerrit.wikimedia.org/r/1305924

Change #1305929 merged by jenkins-bot:

[mediawiki/core@master] ResourceLoader: Update wikimedia/minify to 2.11.0

https://gerrit.wikimedia.org/r/1305929