Skip to content

Conversation

@lukaselmer
Copy link


Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or

(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or

(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.

(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.

Copilot AI review requested due to automatic review settings October 29, 2025 22:33
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR removes the built-in 'extended' query parser option from Express and moves the qs package from dependencies to devDependencies. Users must now provide a custom parser function to replicate the previous 'extended' behavior.

Key changes:

  • Removed qs as a production dependency and added it as a devDependency
  • Replaced the 'extended' query parser option with a helpful error message directing users to use a custom parser function
  • Updated tests to use qs.parse directly instead of the deprecated 'extended' string option

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
package.json Moved qs from dependencies to devDependencies
lib/utils.js Removed qs import, removed parseExtendedQueryString function, and replaced 'extended' case with an error throw
test/req.query.js Added qs import, updated tests to use qs.parse directly, and added test for new error behavior
History.md Documented the breaking change with migration instructions

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

case 'extended':
fn = parseExtendedQueryString;
break;
throw new TypeError("query parser 'extended' is no longer supported; use: `app.set('query parser', str => qs.parse(str, { allowPrototypes: true }))` to replicate the old behavior");
Copy link

Copilot AI Oct 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message suggests using { allowPrototypes: true } but this option is a security risk. The old parseExtendedQueryString function used this option, but users migrating should be warned about the security implications or given a safer default option.

Suggested change
throw new TypeError("query parser 'extended' is no longer supported; use: `app.set('query parser', str => qs.parse(str, { allowPrototypes: true }))` to replicate the old behavior");
throw new TypeError("query parser 'extended' is no longer supported. To replicate the old behavior, you may use: `app.set('query parser', str => qs.parse(str, { allowPrototypes: true }))`, but WARNING: enabling `{ allowPrototypes: true }` is a security risk and can lead to prototype pollution vulnerabilities. Do not use this option in production unless you fully understand the risks. The default behavior is safer and recommended.");

Copilot uses AI. Check for mistakes.
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ljharb/qs#321 => allowPrototypes: true is not a security issue

@lukaselmer lukaselmer force-pushed the remove-direct-qs-dependency branch from ea7e54e to 54e7050 Compare October 29, 2025 22:39
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