build(deps): Bump qs and express#1009
Conversation
Bumps [qs](https://github.com/ljharb/qs) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together. Updates `qs` from 6.14.2 to 6.15.2 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](ljharb/qs@v6.14.2...v6.15.2) Updates `express` from 4.22.1 to 4.22.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v4.22.2/History.md) - [Commits](expressjs/express@v4.22.1...v4.22.2) --- updated-dependencies: - dependency-name: qs dependency-version: 6.15.2 dependency-type: indirect - dependency-name: express dependency-version: 4.22.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
🤖 Cursor Dependency AnalysisSupply-Chain Malware ReviewReviewing how This is a routine paired transitive update ( Checklist review
Scanner interpretation (disagreement noted)Status warn is driven entirely by false positives:
No IOC findings. Changed files match published release notes (parse/stringify bugfixes, nested bracket handling, express Recommendation: Approve from a supply-chain perspective. Scanner warnings can be dismissed as heuristic noise on a mature, heavily used library. Optional functional note: express 4.22.2 changes Compatibility AnalysisI'll trace how Compatibility & adoption analysis — PR #1009 (
|
| Package | Resolved version | Path |
|---|---|---|
express |
4.22.2 | @docusaurus/core → webpack-dev-server → express |
qs |
6.15.2 | express and body-parser (both under webpack-dev-server) |
No application imports of express or qs in src/, config, or scripts. Repo scripts use Docusaurus (start, build, serve); only docusaurus start pulls in the webpack dev server that uses Express.
CI (npm ci + npm run build) does not run the dev server, so these packages are not on the production/deploy path.
2) Intersection with changed APIs
| Change | Relevant to this repo? |
|---|---|
express 4.22.2 — restore req.query parsing for repeated keys (>20); unify indexed-notation cap to 1000 |
Indirect only. Express calls qs.parse(str, { allowPrototypes: true, arrayLimit: 1000 }). No app code reads req.query. |
qs 6.15.x parse — nested bracket fix, strictMerge (default true), duplicates bracket fix |
Indirect only. Express does not pass strictMerge; qs 6.15+ defaults it to true. Could change edge-case query parsing inside the dev server, not in app logic. |
| qs 6.15.x stringify — null/undefined, delimiter, formatter fixes | No intersection. No direct qs.stringify usage. |
| body-parser 1.20.5 (via express) | No intersection. Used for request-body parsing in the dev server; normal doc browsing does not exercise it. |
src/utils/stringify.ts is React text extraction, unrelated to the qs package.
3) Risks / unknowns
- Production/runtime: None expected — packages are not bundled into the static site.
- Build: Low — lockfile-only bump;
docusaurus buildshould be unaffected. - Dev server: Low — patch/minor bugfix release; main behavior change is more correct query-array parsing.
- Theoretical edge case: qs 6.15’s default
strictMerge: truemay alter parsing when the same key mixes objects and primitives. Unlikely to matter for static-file dev serving. - Verification gap: No automated test in this repo covers
docusaurus startor Express query parsing; rely on upstream fixes + CI build passing.
4) Recommendation: merge
Routine paired transitive update (express 4.22.2 requires qs ~6.15.x). No direct usage, no production exposure, and changes are bug fixes aligned with Express’s own arrayLimit: 1000 setting. Safe to merge once CI (npm run build) is green; optional smoke check of npm start is sufficient, not required.
Malware Scan Summary
- Status: warn
- Warn only mode:
true - Changed upstream files scanned:
9 - Resolution strategy:
commit_list - Changed node/vendor paths:
0 - Changed lockfiles:
0 - Resolved refs: from=
n/ato=n/a - Unicode findings (post-allowlist):
0 - Confusable findings (post-allowlist):
2 - IOC findings (post-allowlist):
0 - Heuristic findings (post-allowlist):
10
Top findings
README.md:703confusable ::var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });README.md:712confusable ::assert.deepEqual(obj, { a: 'こんにちは!' });dist/qs.js:8codepoint_decoder ::"use strict";var utils=require(5),has=Object.prototype.hasOwnProperty,isArray=Array.isArray,defaults={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:utils.decode,delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictDepth:!1,strictMerge:!0,strictNullHandling:!1,throwOnLimitExceeded:!1},interpretNumer...[truncated]dist/qs.js:14codepoint_decoder ::"use strict";var formats=require(1),getSideChannel=require(46),has=Object.prototype.hasOwnProperty,isArray=Array.isArray,overflowChannel=getSideChannel(),markOverflow=function markOverflow(e,r){return overflowChannel.set(e,r),e},isOverflow=function isOverflow(e){return overflowChannel.has(e)},getMaxIndex=function getMaxIndex(e){return overflowChannel.get(e)},setMaxIndex=function setMaxIndex(e,r){overflowChannel.set(e,r)},hexTable=function(){for(var e=[],r=0;r<256;++r)e[e.length]="%"+((r<16?"0":"...[truncated]dist/qs.js:128codepoint_decoder ::var hasMap="function"==typeof Map&&Map.prototype,mapSizeDescriptor=Object.getOwnPropertyDescriptor&&hasMap?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,mapSize=hasMap&&mapSizeDescriptor&&"function"==typeof mapSizeDescriptor.get?mapSizeDescriptor.get:null,mapForEach=hasMap&&Map.prototype.forEach,hasSet="function"==typeof Set&&Set.prototype,setSizeDescriptor=Object.getOwnPropertyDescriptor&&hasSet?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,setSize=hasSet&&setSizeDescr...[truncated]lib/parse.js:259codepoint_decoder ::var cu = key.charCodeAt(i);dist/qs.js:46shell_process_spawn ::"use strict";var undefined,$Object=require(22),$Error=require(16),$EvalError=require(15),$RangeError=require(17),$ReferenceError=require(18),$SyntaxError=require(19),$TypeError=require(20),$URIError=require(21),abs=require(34),floor=require(35),max=require(37),min=require(38),pow=require(39),round=require(40),sign=require(41),$Function=Function,getEvalledConstructor=function(r){try{return $Function('"use strict"; return ('+r+").constructor;")()}catch(r){}},$gOPD=require(30),$defineProperty=requi...[truncated]test/parse.js:1006shell_process_spawn ::var parts = reg.exec(str);test/parse.js:1009shell_process_spawn ::parts = reg.exec(str);README.md:758network_c2_indicator ::[<img src="https://raw.githubusercontent.com/numi-hq/open-design/main/assets/numi-lockup.png" alt="NUMI Logo" style="width: 200px;"/>](https://numi.tech/?ref=qs)dist/qs.js:14obfuscation_indicator ::"use strict";var formats=require(1),getSideChannel=require(46),has=Object.prototype.hasOwnProperty,isArray=Array.isArray,overflowChannel=getSideChannel(),markOverflow=function markOverflow(e,r){return overflowChannel.set(e,r),e},isOverflow=function isOverflow(e){return overflowChannel.has(e)},getMaxIndex=function getMaxIndex(e){return overflowChannel.get(e)},setMaxIndex=function setMaxIndex(e,r){overflowChannel.set(e,r)},hexTable=function(){for(var e=[],r=0;r<256;++r)e[e.length]="%"+((r<16?"0":"...[truncated]dist/qs.js:46obfuscation_indicator ::"use strict";var undefined,$Object=require(22),$Error=require(16),$EvalError=require(15),$RangeError=require(17),$ReferenceError=require(18),$SyntaxError=require(19),$TypeError=require(20),$URIError=require(21),abs=require(34),floor=require(35),max=require(37),min=require(38),pow=require(39),round=require(40),sign=require(41),$Function=Function,getEvalledConstructor=function(r){try{return $Function('"use strict"; return ('+r+").constructor;")()}catch(r){}},$gOPD=require(30),$defineProperty=requi...[truncated]
|
@dependabot rebase |
|
Looks like these dependencies are up-to-date now, so this is no longer needed. |
Roll up open Dependabot PRs Chia-Network#988, Chia-Network#995-Chia-Network#997, Chia-Network#1000-Chia-Network#1001, Chia-Network#1002, Chia-Network#1004, Chia-Network#1009, Chia-Network#1010, and Chia-Network#1011 into one change set. - npm: Docusaurus 3.10.1, React 19.2.6, and lockfile updates (webpack-dev-server, qs, express) - actions: crowdin/github-action v2.16.2, hashicorp/vault-action v4, docker/login-action v4.1.0, docker/build-push-action v7.1.0 Co-authored-by: Cursor <cursoragent@cursor.com>
Bumps qs and express. These dependencies needed to be updated together.
Updates
qsfrom 6.14.2 to 6.15.2Changelog
Sourced from qs's changelog.
Commits
9aca407v6.15.25e33d33[Dev Deps] update@ljharb/eslint-config21f80b3[Fix]stringify: skip null/undefined entries inarrayFormat: 'comma'+ `e...a0a81ea[Fix]stringify: use configureddelimiteraftercharsetSentinele3062f7[Fix]stringify: applyformatterto encoded key understrictNullHandling0c180a4[Fix]stringify: skip null/undefined filter-array entries instead of crashi...3a8b94a[Tests] add regression tests for keys containing percent-encoded bracket text96755ab[readme] fix grammara419ce5[Fix]parse: handle nested bracket groups and add regression tests3f5e1c5v6.15.1Updates
expressfrom 4.22.1 to 4.22.2Release notes
Sourced from express's releases.
Changelog
Sourced from express's changelog.
Commits
df0abc94.22.2836d3664.xupdate qs to 6.15.1, body-parser 1.20.5 (#7224)8d09bfefix: restore array parsing for req.query repeated keys (#7181)d39e8addeps: body-parser@~1.20.4 (#7021)efe85d9deps: qs@^6.14.1 (#6972)f62378e📝 add note to historyDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)You can disable automated security fix PRs for this repo from the Security Alerts page.
Note
Medium Risk
Dependency bumps to
express/body-parser/qscan subtly change request query/body parsing behavior (including array parsing limits), which may affect runtime edge cases. Node engine requirement is raised to>=24.14.1, which can break older CI/deploy environments.Overview
Updates the lockfile to pull in
express4.22.2(andbody-parser1.20.5) along withqs6.15.2, plus minor transitive updates likeside-channel-list.Also raises the declared Node.js engine requirement in the lockfile (and aligns with
package.json) to>=24.14.1.Reviewed by Cursor Bugbot for commit d5317b1. Bugbot is set up for automated code reviews on this repo. Configure here.