Skip to content

build(deps): Bump qs and express#1009

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/multi-f792d6d6d9
Closed

build(deps): Bump qs and express#1009
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/multi-f792d6d6d9

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github May 22, 2026

Copy link
Copy Markdown
Contributor

Bumps qs and express. These dependencies needed to be updated together.
Updates qs from 6.14.2 to 6.15.2

Changelog

Sourced from qs's changelog.

6.15.2

  • [Fix] stringify: skip null/undefined entries in arrayFormat: 'comma' + encodeValuesOnly instead of crashing in encoder
  • [Fix] stringify: use configured delimiter after charsetSentinel (#555)
  • [Fix] stringify: apply formatter to encoded key under strictNullHandling (#554)
  • [Fix] stringify: skip null/undefined filter-array entries instead of crashing in encoder (#551)
  • [Fix] parse: handle nested bracket groups and add regression tests (#530)
  • [readme] fix grammar (#550)
  • [Dev Deps] update @ljharb/eslint-config
  • [Tests] add regression tests for keys containing percent-encoded bracket text

6.15.1

  • [Fix] parse: parameterLimit: Infinity with throwOnLimitExceeded: true silently drops all parameters
  • [Deps] update @ljharb/eslint-config
  • [Dev Deps] update @ljharb/eslint-config, iconv-lite
  • [Tests] increase coverage

6.15.0

  • [New] parse: add strictMerge option to wrap object/primitive conflicts in an array (#425, #122)
  • [Fix] duplicates option should not apply to bracket notation keys (#514)
Commits
  • 9aca407 v6.15.2
  • 5e33d33 [Dev Deps] update @ljharb/eslint-config
  • 21f80b3 [Fix] stringify: skip null/undefined entries in arrayFormat: 'comma' + `e...
  • a0a81ea [Fix] stringify: use configured delimiter after charsetSentinel
  • e3062f7 [Fix] stringify: apply formatter to encoded key under strictNullHandling
  • 0c180a4 [Fix] stringify: skip null/undefined filter-array entries instead of crashi...
  • 3a8b94a [Tests] add regression tests for keys containing percent-encoded bracket text
  • 96755ab [readme] fix grammar
  • a419ce5 [Fix] parse: handle nested bracket groups and add regression tests
  • 3f5e1c5 v6.15.1
  • Additional commits viewable in compare view

Updates express from 4.22.1 to 4.22.2

Release notes

Sourced from express's releases.

v4.22.2

What's Changed

  • fix: restore >20 array parsing for req.query repeated keys (8d09bfe6)
    • This also unifies array-cap behavior across notations. Indexed notation (a[0]=...) was historically capped at qs's default arrayLimit of 20 even in older qs versions; after this change it also allows up to 1000 items.
  • deps: qs@~6.15.1
  • deps: body-parser@~1.20.5

New Contributors

Full Changelog: expressjs/express@v4.22.1...v4.22.2

Changelog

Sourced from express's changelog.

4.22.2 / 2026-05-011

  • fix: restore >20 array parsing for req.query repeated keys (8d09bfe6)
    • This also unifies array-cap behavior across notations. Indexed notation (a[0]=...) was historically capped at qs's default arrayLimit of 20 even in older qs versions; after this change it also allows up to 1000 items.
  • deps: qs@~6.15.1
  • deps: body-parser@~1.20.5
Commits

Dependabot 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 rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will 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 version will 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 dependency will 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/qs can 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 express 4.22.2 (and body-parser 1.20.5) along with qs 6.15.2, plus minor transitive updates like side-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.

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>
@dependabot dependabot Bot added Changed Required label for PR that categorizes merge commit message as "Changed" for changelog dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code labels May 22, 2026
@github-actions

Copy link
Copy Markdown

🤖 Cursor Dependency Analysis

Supply-Chain Malware Review

Reviewing how qs and express are used in the repo and validating the malware scan findings.
Verdict: benign

This is a routine paired transitive update (qs 6.14.2→6.15.2, express 4.22.1→4.22.2) from well-known maintainers (ljharb/qs, expressjs/express). In chia-docs, neither package is direct; they arrive via dev tooling (e.g. webpack-dev-serverexpressqs). The lockfile resolves to published npm tarballs with standard integrity hashes and no suspicious manifest edits.

Checklist review

Category Result
Classic obfuscation No malicious obfuscation. dist/qs.js is qs’s normal browserify/uglify build output. decodeURIComponent/charCodeAt are expected query-string parsing. No credential exfil, FS writes, or shell spawning in changed source.
Invisible Unicode / GlassWorm Clean. Scanner: 0 unicode findings. The 2 “confusable” hits are legitimate Japanese docs (こんにちは! with fullwidth in README encoding examples), not homoglyph operator substitution.
Dependency integrity Versions align with tagged releases and changelogs. express@4.22.2 correctly pulls qs@~6.15.1 and body-parser@~1.20.5 (both present in lockfile). qs runtime deps unchanged (side-channel, es-define-property). No typosquatting, no ghost versions, no dependency-count spike.
Dependabot-specific Expected lockfile-only bump. No changes under node_modules/, no new lifecycle preinstall/postinstall/install scripts in qs package.json, no .github/workflows changes. Upstream diff is limited to qs source/tests/docs (lib/parse.js, lib/stringify.js, tests, CHANGELOG.md).

Scanner interpretation (disagreement noted)

Status warn is driven entirely by false positives:

  1. codepoint_decodercharCodeAt in lib/parse.js:259 supports nested-bracket parsing (documented fix in 6.15.2); normal for this library.
  2. shell_process_spawn — Regex matched reg.exec(str) in tests and bundled transitive code, not child_process/spawn.
  3. obfuscation_indicator — Minified dist/qs.js plus standard URL decoding; not a hidden payload.
  4. network_c2_indicator — Public sponsor logo link (numi.tech, raw.githubusercontent.com/numi-hq/...) in README acknowledgements.
  5. confusable — Fullwidth punctuation in intentional i18n documentation examples.

No IOC findings. Changed files match published release notes (parse/stringify bugfixes, nested bracket handling, express req.query array-limit fix).

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 req.query array parsing behavior (>20 repeated keys now parse as arrays up to 1000 items)—behavioral, not security-related, and only affects dev-server query parsing in this repo.

Compatibility Analysis

I'll trace how express and qs are used in this repo and compare that to the upstream changes in the PR.

Compatibility & adoption analysis — PR #1009 (qs + express)

1) Where used

Neither package is a direct dependency in package.json. Both are transitive, dev-time only:

Package Resolved version Path
express 4.22.2 @docusaurus/corewebpack-dev-serverexpress
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 build should 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: true may 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 start or 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/a to=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:703 confusable :: var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder });
  • README.md:712 confusable :: assert.deepEqual(obj, { a: 'こんにちは!' });
  • dist/qs.js:8 codepoint_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:14 codepoint_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:128 codepoint_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:259 codepoint_decoder :: var cu = key.charCodeAt(i);
  • dist/qs.js:46 shell_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:1006 shell_process_spawn :: var parts = reg.exec(str);
  • test/parse.js:1009 shell_process_spawn :: parts = reg.exec(str);
  • README.md:758 network_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:14 obfuscation_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:46 obfuscation_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]

@BrandtH22

Copy link
Copy Markdown
Contributor

@dependabot rebase

@dependabot @github

dependabot Bot commented on behalf of github Jun 1, 2026

Copy link
Copy Markdown
Contributor Author

Looks like these dependencies are up-to-date now, so this is no longer needed.

@dependabot dependabot Bot closed this Jun 1, 2026
@dependabot dependabot Bot deleted the dependabot/npm_and_yarn/multi-f792d6d6d9 branch June 1, 2026 20:06
wanziforever pushed a commit to wanziforever/chia-docs that referenced this pull request Jun 15, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changed Required label for PR that categorizes merge commit message as "Changed" for changelog dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant