build(deps-dev): bump ajv from 8.18.0 to 8.20.0#2674
Conversation
|
Suggested comment for Cursor review (copy and paste as a new comment): Note: GitHub Actions bot cannot trigger Cursor agent directly. Please copy the above comment to invoke the review. |
Build Branch
Static preview entry points
QR codes (mobile preview)
Integration commandsnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", branch: "pr-releases/dependabot/npm_and_yarn/main/ajv-8.20.0")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/dependabot/npm_and_yarn/main/ajv-8.20.0
git -C submodules/content-scope-scripts checkout origin/pr-releases/dependabot/npm_and_yarn/main/ajv-8.20.0Pin to exact commitnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", revision: "9c2f5b71836804824c0b873bd24b43a842be8a85")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/dependabot/npm_and_yarn/main/ajv-8.20.0
git -C submodules/content-scope-scripts checkout 9c2f5b71836804824c0b873bd24b43a842be8a85 |
There was a problem hiding this comment.
Stale comment
Web Compatibility Assessment
No findings.
Changed files:
package.jsonandpackage-lock.jsononly. The bump is limited to the root dev dependencyajvfrom8.18.0to8.20.0; noinjected/srcruntime code, API wrappers/shims, DOM behavior, platform entry points, or messaging paths are changed.ajvusage in this repo is limited to injected unit-test schema validation (injected/unit-test/features.js), so there is no page-runtime API surface or compatibility impact.Security Assessment
No findings.
The diff does not touch captured globals, wrapper utilities, DDGProxy, message bridge/origin checks, native messaging transports, config patch application, iframe handling,
postMessage, network requests, or code executed in hostile page contexts. The lockfile change adds a nestedaddons-lintercopy ofajv@8.18.0because that dependency remains pinned there, while the root dev dependency resolves toajv@8.20.0; no unrelated package churn was observed.Risk Level
Low Risk: dependency metadata/lockfile-only devDependency update with no injected runtime bundle changes.
Recommendations
No blocking recommendations. Validation performed:
npm cicompleted successfully, with existing peer/audit warnings.npm run test-unit --workspace=injected -- unit-test/features.jspassed (79 specs, 0 failures, 16 legacy pending specs).Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency review finding:
The direct
ajvbump itself looks low-risk for this repo’s direct usage:injected/unit-test/features.jsimportsajvonly for test-page config schema validation, and the targeted suite passed with the updated lockfile:
npm run test-unit --workspace=injected -- --random=false --filter='test-pages'However, this update does not remove all
ajv@8.18.0copies from the dev dependency graph. Upstreamajv@8.19.0includes a security fix for prototype pollution via$dataformat lookup, and the new lockfile still containsweb-ext -> addons-linter -> ajv@8.18.0becauseaddons-linter@10.1.0pinsajvexactly.npm ls ajv --allconfirms bothajv@8.20.0and nestedajv@8.18.0remain installed.I did not push changes to this PR. I also did not draft a separate fix PR because the clean fix appears to require the upstream parent chain to consume
addons-linter@10.4.0or newer;addons-linter@10.4.0usesajv@8.20.0, but currentweb-extmetadata still points below that. A local npm override would need careful validation before landing.Sent by Cursor Automation: Review dependabot
| "node": "^18.18.0 || ^20.9.0 || >=21.1.0" | ||
| } | ||
| }, | ||
| "node_modules/addons-linter/node_modules/ajv": { |
There was a problem hiding this comment.
This lockfile still installs a nested ajv@8.18.0 under addons-linter. The upstream ajv@8.19.0 release notes list a security fix for prototype pollution via the format keyword with $data refs, so this PR updates the root devDependency but leaves a pre-fix ajv copy reachable through web-ext -> addons-linter.
Evidence from this PR state: addons-linter@10.1.0 pins "ajv": "8.18.0", causing this newly nested package entry, and npm ls ajv --all shows both root ajv@8.20.0 and nested addons-linter -> ajv@8.18.0 installed.
If the goal is to remove the vulnerable/pre-fix version from the dev graph, this needs a follow-up through the web-ext/addons-linter chain. addons-linter@10.4.0 has moved to ajv@8.20.0, but current web-ext metadata does not yet consume that version.
8eb1852 to
5a34c97
Compare
There was a problem hiding this comment.
Stale comment
Web Compatibility Assessment
No web compatibility findings. The diff only bumps root
ajvfrom^8.18.0to^8.20.0inpackage.json/package-lock.json; it does not touch shipped injected runtime code, API wrapping/shimming, DOM manipulation, platform entry points, or feature config behavior.Security Assessment
No security findings.
ajvremains a root dev dependency, and the only in-repo usage found is the injected unit-test schema validator. No captured-global, messaging, origin-validation, bridge, iframe, or network-request surfaces are changed.Risk Level
Low Risk: dependency metadata/tooling-only change with no runtime injected-script surface area.
Recommendations
No blocking recommendations.
Validation performed:
npm run test-unit --workspace=injected -- --filter=featurespassed (23 specs, 0 failures).Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency review finding:
The direct root
ajvbump to8.20.0looks low-risk for the repo’s direct usage. The only direct source import I found isinjected/unit-test/features.js, where Ajv validates generated privacy-configuration test-page schemas; it is not part of the injected runtime bundles. Upstream changelog notes:
8.19.0: fixes prototype pollution via theformatkeyword using$datarefs.8.20.0: adds Node 22/24 support, drops Node 16/21 support, and adds ES2022RegExpIndicesArraysupport.Validation performed:
npm cicompleted successfully.npm ls ajv --allconfirms the root install isajv@8.20.0.npm run test-unit --workspace=injected -- --random=false --filter='test-pages'passed:77 specs, 0 failures, 16 pending.Concern remains: the new lockfile still installs a nested
ajv@8.18.0throughweb-ext -> addons-linter@10.1.0, so this PR does not remove all copies below the8.19.0prototype-pollution fix. Exploitability is uncertain because I have not confirmed whetheraddons-linterenables$dataformat validation on attacker-controlled schemas, but the stale copy is concrete in the dependency graph.I did not push changes to this PR. I also did not draft a separate fix PR from this checkout because the clean fix is a transitive dependency update:
addons-linter@10.4.0usesajv@8.20.0, while currentweb-ext@10.0.0pinsaddons-linter@10.1.0and latestweb-ext@10.1.0still pinsaddons-linter@10.3.0(ajv@8.18.0). If we want to force the fix before upstreamweb-extcatches up, the likely separate PR is an npmoverridesentry foraddons-linter@10.4.0, validated against the extension lint/build path.Sent by Cursor Automation: Review dependabot
| } | ||
| }, | ||
| "node_modules/addons-linter/node_modules/ajv": { | ||
| "version": "8.18.0", |
There was a problem hiding this comment.
This nested copy means the update does not actually remove all ajv@8.18.0 from the dev dependency graph. Upstream ajv@8.19.0 fixes prototype pollution via format + $data refs, but npm ls ajv --all after npm ci still shows web-ext -> addons-linter@10.1.0 -> ajv@8.18.0. Exploitability depends on whether addons-linter uses $data/format validation over attacker-controlled schemas, so I would treat this as a residual dependency-risk follow-up rather than a direct runtime regression.
Bumps [ajv](https://github.com/ajv-validator/ajv) from 8.18.0 to 8.20.0. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](ajv-validator/ajv@v8.18.0...v8.20.0) --- updated-dependencies: - dependency-name: ajv dependency-version: 8.20.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
5a34c97 to
167162e
Compare
There was a problem hiding this comment.
Web Compatibility Assessment
No findings.
The current diff changes only package.json and package-lock.json, bumping the root dev dependency ajv from ^8.18.0 to ^8.20.0. No injected runtime code, API wrappers/shims, DOM manipulation, platform entry points, feature config handling, or messaging paths are changed.
Security Assessment
No findings for injected-page security surfaces.
ajv is used directly only by injected unit-test schema validation (injected/unit-test/features.js), not by bundled page-runtime code. The lockfile still contains a nested addons-linter -> ajv@8.18.0 through web-ext, which is already noted in prior dependency-review comments and does not create a new C-S-S injected runtime exposure in this PR.
Risk Level
Low Risk: devDependency/lockfile-only update with no hostile-page runtime surface-area changes.
Recommendations
No blocking recommendations.
Validation performed on the current head:
npm cicompleted successfully, with existing peer/audit warnings.npm ls ajv --allconfirms rootajv@8.20.0and the known nestedaddons-linterajv@8.18.0copy.npm run test-unit --workspace=injected -- --filter=featurespassed (23 specs, 0 failures).
Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency review finding:
Confirmed concern: this PR updates the root direct
ajvdevDependency to8.20.0, but it does not remove every pre-fix Ajv v8 copy from the dependency graph.ajv@8.19.0fixed prototype pollution via theformatkeyword using$datarefs, and the new lockfile still installsaddons-linter -> ajv@8.18.0throughweb-ext -> addons-linter@10.3.0.Direct repo impact looks low: the only direct source import I found is
injected/unit-test/features.js, where Ajv validates generated privacy-configuration test-page schemas; it is not part of injected runtime bundles. The8.20.0changelog also drops Node 16/21 support and adds Node 22/24 support, which matches this repo’s Node 22 environment.Validation performed:
npm cinpm ls ajv --allon this PR: confirms rootajv@8.20.0, but nestedaddons-linter@10.3.0 -> ajv@8.18.0remains.npm run test-unit --workspace=injected -- --random=false --filter='test-pages': passed (77 specs, 0 failures, 16 pending).Uncertain concern: I have not confirmed that
addons-linterenables Ajv$dataformat validation against attacker-controlled schemas, so I would treat the nested copy as incomplete remediation rather than confirmed exploitable behavior.I did not push changes to this PR. I opened a separate follow-up PR with the clean fix path: #2711. That bumps
web-extto10.2.0, which bringsaddons-linter@10.5.0and dedupes Ajv v8 to8.20.0; it also updates the fake MV3 extension manifest metadata required by the newer linter. Validation on that branch:npm ls ajv --all,npx web-ext lint --source-dir=integration-test/extension, and the same targeted schema test all pass.Sent by Cursor Automation: Review dependabot
| } | ||
| }, | ||
| "node_modules/addons-linter/node_modules/ajv": { | ||
| "version": "8.18.0", |
There was a problem hiding this comment.
ajv@8.19.0 contains the prototype-pollution fix for $data format lookups, but this newly added nested install keeps addons-linter on ajv@8.18.0. The direct root copy is updated, but the dev dependency graph still contains one Ajv v8 copy below the security-fix release via web-ext -> addons-linter@10.3.0.
[Beta] Generated file diffTime updated: Fri, 22 May 2026 10:34:57 GMT |
There was a problem hiding this comment.
Dependency review finding:
Confirmed concern: the direct root ajv bump itself is low-risk for this repo, but it does not fully remove pre-fix Ajv v8 from the dev dependency graph. Upstream changelog evidence:
8.19.0: fixes prototype pollution via theformatkeyword using$datarefs.8.20.0: adds Node 22/24 support, drops Node 16/21 support, and adds ES2022RegExpIndicesArraysupport.
Current-code impact: the only direct source import I found is injected/unit-test/features.js, where Ajv validates generated privacy-configuration test-page schemas. That path is test-only and not part of injected runtime bundles. Node support is compatible with this repo’s Node 22 environment.
Coverage/validation on the synchronized head:
npm cicompleted successfully.npm ls ajv --allconfirms rootajv@8.20.0, but alsoinjected -> web-ext@10.1.0 -> addons-linter@10.3.0 -> ajv@8.18.0.npm run test-unit --workspace=injected -- --random=false --filter='test-pages'passed:77 specs, 0 failures, 16 pending.
Dependency-need assessment: the direct root ajv dependency is still used by the schema-validation unit tests, so removing it is not currently a drop-in cleanup. The better follow-up is to update the transitive linting toolchain so addons-linter no longer pins the stale Ajv copy, rather than adding broad local fallback logic.
I did not push changes to this PR. A separate follow-up fix PR is already open: #2711. It bumps web-ext so the addons-linter chain dedupes Ajv v8 to 8.20.0, with the manifest metadata update required by the newer linter.
Sent by Cursor Automation: Review dependabot
| "node": "^18.18.0 || ^20.9.0 || >=21.1.0" | ||
| } | ||
| }, | ||
| "node_modules/addons-linter/node_modules/ajv": { |
There was a problem hiding this comment.
Confirmed residual dependency risk: this PR upgrades the root direct ajv devDependency to 8.20.0, but the lockfile still adds a nested addons-linter -> ajv@8.18.0 here. Ajv 8.19.0 fixed prototype pollution via the format keyword with $data refs, so if this PR is intended as security remediation it does not remove every pre-fix Ajv v8 copy. Exploitability in this path is uncertain because I have not confirmed that addons-linter uses $data format validation on attacker-controlled schemas.


Bumps ajv from 8.18.0 to 8.20.0.
Release notes
Sourced from ajv's releases.
Commits
0fba0b88.20.09caf8d6fix: add ES2022.RegExp for RegExpIndicesArray; fixes ajv-validator/ajv#2603 (...2065350fix: add support for node 22/24, drop node 16/21 (#2580)154b58d8.19.0e8d2bdctest/fix prototype pollution via $data ref with format keyword (#2607)Note
Low Risk
Low risk: this is a devDependency version bump with lockfile updates and no runtime code changes. Main risk is potential schema-validation/tooling behavior changes affecting builds or tests.
Overview
Updates the
ajvdevDependency from8.18.0to8.20.0inpackage.jsonand refreshespackage-lock.jsonaccordingly (including a nestedaddons-linter-scopedajventry to satisfy its dependency graph).Reviewed by Cursor Bugbot for commit f85e81c. Bugbot is set up for automated code reviews on this repo. Configure here.