Skip to content

Update vendored JShrink to v1.8.1 (fixes regex character-class minification)#3130

Merged
xirvik merged 1 commit into
Novik:masterfrom
xirvik:fix/jshrink-v1.8.1-regex-character-class
Jul 24, 2026
Merged

Update vendored JShrink to v1.8.1 (fixes regex character-class minification)#3130
xirvik merged 1 commit into
Novik:masterfrom
xirvik:fix/jshrink-v1.8.1-regex-character-class

Conversation

@xirvik

@xirvik xirvik commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

The bundled JShrink minifier's saveRegex() treated the first unescaped '/' as the end of a regex literal, but a '/' inside a character class ([...]) is a literal slash. So a pattern like /[^/]/ was cut mid-regex and the rest of the file mangled, producing an "unterminated regular expression literal" SyntaxError in the browser.

getplugins.php minifies the entire concatenated plugin bundle in a single pass, so one such regex in any plugin breaks the whole minified bundle and leaves the UI unable to load (empty torrent list). Several bundled plugins use class-internal slashes, e.g. /themes/([^/]+)// and the [^:/?#] announce-URL parser.

JShrink v1.8.1 tracks the character class and only ends the regex on a '/' outside a class. It is namespaced (JShrink\Minifier), so getplugins.php now references \JShrink\Minifier::minify(); the class autoloader already strips namespaces, so nothing else needs to change.

Adds tests/php/MinifierTest.php locking in the character-class behaviour and guarding plain regexes and division operators from being mis-parsed.

…cation)

The bundled JShrink minifier's saveRegex() treated the first unescaped '/'
as the end of a regex literal, but a '/' inside a character class ([...]) is
a literal slash. So a pattern like /[^/]/ was cut mid-regex and the rest of
the file mangled, producing an "unterminated regular expression literal"
SyntaxError in the browser.

getplugins.php minifies the entire concatenated plugin bundle in a single
pass, so one such regex in any plugin breaks the whole minified bundle and
leaves the UI unable to load (empty torrent list). Several bundled plugins
use class-internal slashes, e.g. /themes\/([^/]+)\// and the [^:/?#]
announce-URL parser.

JShrink v1.8.1 tracks the character class and only ends the regex on a '/'
outside a class. It is namespaced (JShrink\Minifier), so getplugins.php now
references \JShrink\Minifier::minify(); the class autoloader already strips
namespaces, so nothing else needs to change.

Adds tests/php/MinifierTest.php locking in the character-class behaviour and
guarding plain regexes and division operators from being mis-parsed.
@xirvik
xirvik force-pushed the fix/jshrink-v1.8.1-regex-character-class branch from 2e22808 to d5a0ce2 Compare July 24, 2026 05:28
@xirvik
xirvik merged commit 3ce5727 into Novik:master Jul 24, 2026
4 checks passed
@xirvik
xirvik deleted the fix/jshrink-v1.8.1-regex-character-class branch July 24, 2026 05:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant