chore: drop the qs resolution and nine unused dependencies - #2146
Merged
Conversation
The qs resolution existed because express 4 caps qs at ~6.14.0. Express 5
declares ^6.14.0 instead, so upgrading it lets the pin go and qs resolves
to 6.16.0 on its own. Express 5 routes through path-to-regexp v8, where a
bare '*' is no longer a valid path, so the standalone server's catch-all
becomes '/{*splat}' - the braces keep it matching the root path.
The @types/react resolution stays: @types/react-infinite-scroller asks for
@types/react as *, which resolves to v19 and puts a second copy of the
React types in the tree, breaking the build. Neither packageExtensions nor
yarn dedupe can express that, so the pin holds until this app moves to
React 19. Recorded that next to it, since JSON cannot carry a comment.
Nothing imports clsx, prop-types, punycode, @types/d3-scale,
@types/d3-shape, @types/prop-types, @types/punycode,
@types/react-transition-group or ts-node, so they go too. Only the last
two of those leave the install - the rest are pulled in by MUI or by the
URL parsers that actually use them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
Changes are cohesive dependency hygiene plus a small, validated Express 5 compatibility update, with only a minor changelog grammar nit noted.
Pull request overview
This PR cleans up the webui workspace dependency graph by removing an unneeded qs resolution (enabled by upgrading to Express 5), dropping nine unused direct dependencies, and updating the standalone frontend server’s catch-all route for Express 5 / path-to-regexp v8.
Changes:
- Upgrade
expressto^5.1.0(and@types/expressto^5.0.0), allowingqsto resolve without a manual resolution pin. - Remove unused direct dependencies from
webui/package.json(runtime and dev) and updateyarn.lockaccordingly. - Update the standalone server SPA fallback route to
app.get('/{*splat}', …)and document the change inCHANGELOG.md.
File summaries
| File | Description |
|---|---|
| webui/yarn.lock | Updates the lockfile for Express 5 and the dependency removals, including qs resolving to a newer version without a resolution override. |
| webui/src/default/server.ts | Adjusts the SPA catch-all route syntax to be compatible with Express 5 / path-to-regexp v8. |
| webui/package.json | Removes the qs resolution and unused dependencies; keeps the @types/react resolution with an inline explanation key. |
| webui/CHANGELOG.md | Documents the dependency cleanup and Express upgrade for the webui changelog. |
Review details
- Files reviewed: 3/4 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
Author
|
The starting point for that PR was to remove the pinned resolution for qs, while upgrading express some unused deps were detected that are safe to remove. |
gnugomez
approved these changes
Sep 3, 2026
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cleans up
webui/package.json: theqsresolution goes away, and nine dependencies nothing imports go with it.The
qsresolutionresolutions.qs: ^6.14.1existed because express 4 caps qs at~6.14.0. That ceiling is not something a version range on express can lift —^4.21.0already resolves to 4.22.1, and 4.22.1 is the version that declares~6.14.0.Express 5.1.0+ declares
qs: ^6.14.0, so upgrading it lets the pin go and qs resolves to 6.16.0 on its own — ahead of the 6.15.2 the resolution was forcing.Express 5 routes through path-to-regexp v8, where a bare
'*'is no longer a valid path:So the standalone frontend server's catch-all becomes
app.get('/{*splat}', …). The braces matter — a bare/*splatdoes not match the root path.The
@types/reactresolution stays@types/react-infinite-scroller@1.2.5declares its dependency as"@types/react": "*". Yarn resolves each descriptor independently, so*becomes the newest release (19.2.18); it cannot satisfy^18.2.0, so a second copy of the React types lands nested under that package andtscfails withTS2786onInfiniteScrollandTS2742on an inferredcsstypereference.Two alternatives were tried and neither works:
packageExtensionsonly adds missing dependencies; it does not override a range a package already declares. The nested v19 stayed.yarn dedupeonly has a "highest" strategy, so it keeps 19 rather than collapsing onto 18.3.x.The pin therefore holds until this app moves to React 19. Since JSON carries no comments, the reason sits in a
"//resolutions"key that yarn ignores, right above the block.Unused dependencies
depcheckflagged these; each was confirmed by searchingsrc,test,configs,eslint.config.mjsand the scripts, and by removing them and running the full pipeline.clsx^1.2.1, a stale majorprop-types@mui/material,@mui/private-themingpunycodetr46,uri-js@types/d3-scale@mui/x-charts-vendor@types/d3-shape@mui/x-charts-vendor@types/prop-types@mui/utils,@types/react@types/react-transition-group@mui/material,@mui/x-date-pickers@types/punycodets-nodeThe only
prop-typesmatch in the codebase is'react/prop-types': 'off'ineslint.config.mjs, which is an eslint rule name rather than the package.depcheckalso flaggedrimraf, which is a false positive — thecleanscript uses it. It stays.Note that
clsx,prop-typesandpunycodewere runtimedependencies, so this narrows the published package's dependency contract. Nothing in the library imports them, but a consumer who happened to get them transitively fromopenvsx-webuino longer will.Lockfile
251 insertions, 263 deletions, all of it express's own subtree moving from the 4.x generation to 5.x: 4 packages added (
router,is-promise,once,wrappy), 6 removed (array-flatten,destroy,methods,mime,safe-buffer,utils-merge), 28 version changes. The two that matter areqs: 6.15.2 -> 6.16.0andpath-to-regexp: 0.1.13 -> 8.4.2. React, MUI, vite and eslint are untouched.Testing
yarn lint— cleanyarn build(tsc + lint) — cleanyarn test— 260 tests in 50 files, all passingyarn build:default— vite builds the appyarn install --immutable— passes, so CI will accept the lockfiledist:/,/index.html,/extension/foo/bar,/user-settings/profileand/deep/pathall return the SPA index, and with-ratelimit -ratelimit-limit 3the fourth request returns 429, confirming express-rate-limit 7.5.1 still works on Express 5src/default/server.tshas no unit test: it callsapp.listenat import time and has no existing harness, so the route change was verified by running the server as described above.