fix(deps): update frontend dependencies#788
Open
renovate-sh-app[bot] wants to merge 1 commit into
Open
Conversation
renovate-sh-app
Bot
force-pushed
the
renovate/frontend-dependencies
branch
5 times, most recently
from
July 24, 2026 10:01
4af2acb to
74bbeea
Compare
renovate-sh-app
Bot
force-pushed
the
renovate/frontend-dependencies
branch
2 times, most recently
from
July 26, 2026 01:01
b2c304d to
aeaa429
Compare
| datasource | package | from | to | | ---------- | -------------------------------- | ------- | ------- | | npm | @babel/core | 7.29.6 | 7.29.7 | | npm | @changesets/cli | 2.31.0 | 2.31.1 | | npm | @swc/core | 1.15.43 | 1.15.46 | | npm | @typescript-eslint/eslint-plugin | 8.63.0 | 8.65.0 | | npm | @typescript-eslint/parser | 8.63.0 | 8.65.0 | | npm | dompurify | 3.4.11 | 3.4.12 | | npm | prettier | 3.9.5 | 3.9.6 | | npm | sass | 1.101.0 | 1.101.7 | | npm | webpack | 5.108.4 | 5.109.0 | Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
renovate-sh-app
Bot
force-pushed
the
renovate/frontend-dependencies
branch
from
July 26, 2026 22:02
aeaa429 to
03788e7
Compare
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.
This PR contains the following updates:
7.29.6→7.29.72.31.0→2.31.11.15.43→1.15.468.63.0→8.65.08.63.0→8.65.03.4.11→3.4.123.9.5→3.9.61.101.0→1.101.75.108.4→5.109.0DOMPurify:
CUSTOM_ELEMENT_HANDLINGbypassesafterSanitizeElementsfor allowed custom elements.GHSA-c2j3-45gr-mqc4
More information
Details
Summary
There is a possible hook-policy inconsistency in DOMPurify 3.4.11 involving
CUSTOM_ELEMENT_HANDLING.When a custom element is allowed via
CUSTOM_ELEMENT_HANDLING.tagNameCheck, it appears that the element does not go throughafterSanitizeElementsin the same way as a normal element. As a result, an application that relies onafterSanitizeElementsas a security policy layer to strip sensitive attributes from all elements may see those attributes removed from normal elements but preserved on allowed custom elements.This does not appear to be a direct DOMPurify XSS or a case where DOMPurify directly allows executable payloads. The preserved value is still inert at sanitize time. The issue becomes relevant when the allowed custom element later re-injects that attribute value into an HTML sink such as
innerHTML, creating a second-order XSS gadget.Details
The issue appears to originate from the control flow in
src/purify.ts: line 1672~1691CUSTOM_ELEMENT_HANDLINGis parsed from user configuration atsrc/purify.ts: line 741~748In particular,
tagNameCheck,attributeNameCheck, andallowCustomizedBuiltInElementsare copied into the internalCUSTOM_ELEMENT_HANDLINGobject there.During element sanitization,
_sanitizeElements()checks whether a node is forbidden or not allowlisted atsrc/purify.ts: line 1805~1814If so, it immediately delegates to
_sanitizeDisallowedNode(currentNode, tagName)and returns its boolean result.Inside
_sanitizeDisallowedNode(), the custom-element-specific allow path is implemented atsrc/purify.ts: line 1672~1692If the node is treated as a basic custom element and
CUSTOM_ELEMENT_HANDLING.tagNameCheckmatches, the function returnsfalseimmediately at line 1682 or 1689, meaning “do not remove this node”.That early
return falseis significant because control returns directly to_sanitizeElements()via thereturn _sanitizeDisallowedNode(...)at line 1813. As a result, the later logic in_sanitizeElements()is skipped for that custom element instance, including:src/purify.ts: line 1816~1826src/purify.ts: line 1828~1837afterSanitizeElementshook dispatch atsrc/purify.ts: line 1850~1851.In other words, a normal allowlisted element continues through
_sanitizeElements()and reacheshooks.afterSanitizeElements, but a disallowed-by-default element that is revived by theCUSTOM_ELEMENT_HANDLING.tagNameCheckpath does not. This creates a policy inconsistency: an application that relies onafterSanitizeElementsto remove an attribute from all elements will observe that the policy is applied to normal elements but not to custom elements allowed throughCUSTOM_ELEMENT_HANDLING.In the PoC, the application hook removes
data-biofrom ordinary elements, but the same attribute remains on<x-bio>because the custom-element keep path bypassesafterSanitizeElements. The attribute itself is inert at sanitize time and DOMPurify is not directly allowing executable SVG/HTML through. The security impact appears when the application-defined custom element later reads the preserveddata-biovalue inconnectedCallback()and writes it toinnerHTML, turning the preserved attribute into a second-order XSS gadget.PoC
Reproduced on DOMPurify 3.4.11.
Steps
poc.html.divcontrol losesdata-bio, while the allowed custom element keeps it.connectedCallback()runs, the candidate payload is reinserted into the DOM and executes through the custom element’s own sink.HTML PoC
Expected result
This is output of HTML PoC.
Impact
This does not appear to affect DOMPurify’s default configuration as a direct sanitizer bypass.
The impact is limited to applications that:
CUSTOM_ELEMENT_HANDLING,afterSanitizeElementsas a security policy layer,innerHTMLor another HTML sink.In that situation, the behavior can become a second-order XSS gadget because a security-relevant attribute is removed from normal elements but remains on allowed custom elements.
Possible fixes or mitigations might include
afterSanitizeElementsCUSTOM_ELEMENT_HANDLINGmay not participate in the same post-element hook flow as normal allowlisted elements.Severity
CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
DOMPurify:
CUSTOM_ELEMENT_HANDLINGbypassesafterSanitizeElementsfor allowed custom elements.CVE-2026-66010 / GHSA-c2j3-45gr-mqc4
More information
Details
Summary
There is a possible hook-policy inconsistency in DOMPurify 3.4.11 involving
CUSTOM_ELEMENT_HANDLING.When a custom element is allowed via
CUSTOM_ELEMENT_HANDLING.tagNameCheck, it appears that the element does not go throughafterSanitizeElementsin the same way as a normal element. As a result, an application that relies onafterSanitizeElementsas a security policy layer to strip sensitive attributes from all elements may see those attributes removed from normal elements but preserved on allowed custom elements.This does not appear to be a direct DOMPurify XSS or a case where DOMPurify directly allows executable payloads. The preserved value is still inert at sanitize time. The issue becomes relevant when the allowed custom element later re-injects that attribute value into an HTML sink such as
innerHTML, creating a second-order XSS gadget.Details
The issue appears to originate from the control flow in
src/purify.ts: line 1672~1691CUSTOM_ELEMENT_HANDLINGis parsed from user configuration atsrc/purify.ts: line 741~748In particular,
tagNameCheck,attributeNameCheck, andallowCustomizedBuiltInElementsare copied into the internalCUSTOM_ELEMENT_HANDLINGobject there.During element sanitization,
_sanitizeElements()checks whether a node is forbidden or not allowlisted atsrc/purify.ts: line 1805~1814If so, it immediately delegates to
_sanitizeDisallowedNode(currentNode, tagName)and returns its boolean result.Inside
_sanitizeDisallowedNode(), the custom-element-specific allow path is implemented atsrc/purify.ts: line 1672~1692If the node is treated as a basic custom element and
CUSTOM_ELEMENT_HANDLING.tagNameCheckmatches, the function returnsfalseimmediately at line 1682 or 1689, meaning “do not remove this node”.That early
return falseis significant because control returns directly to_sanitizeElements()via thereturn _sanitizeDisallowedNode(...)at line 1813. As a result, the later logic in_sanitizeElements()is skipped for that custom element instance, including:src/purify.ts: line 1816~1826src/purify.ts: line 1828~1837afterSanitizeElementshook dispatch atsrc/purify.ts: line 1850~1851.In other words, a normal allowlisted element continues through
_sanitizeElements()and reacheshooks.afterSanitizeElements, but a disallowed-by-default element that is revived by theCUSTOM_ELEMENT_HANDLING.tagNameCheckpath does not. This creates a policy inconsistency: an application that relies onafterSanitizeElementsto remove an attribute from all elements will observe that the policy is applied to normal elements but not to custom elements allowed throughCUSTOM_ELEMENT_HANDLING.In the PoC, the application hook removes
data-biofrom ordinary elements, but the same attribute remains on<x-bio>because the custom-element keep path bypassesafterSanitizeElements. The attribute itself is inert at sanitize time and DOMPurify is not directly allowing executable SVG/HTML through. The security impact appears when the application-defined custom element later reads the preserveddata-biovalue inconnectedCallback()and writes it toinnerHTML, turning the preserved attribute into a second-order XSS gadget.PoC
Reproduced on DOMPurify 3.4.11.
Steps
poc.html.divcontrol losesdata-bio, while the allowed custom element keeps it.connectedCallback()runs, the candidate payload is reinserted into the DOM and executes through the custom element’s own sink.HTML PoC
Expected result
This is output of HTML PoC.
Impact
This does not appear to affect DOMPurify’s default configuration as a direct sanitizer bypass.
The impact is limited to applications that:
CUSTOM_ELEMENT_HANDLING,afterSanitizeElementsas a security policy layer,innerHTMLor another HTML sink.In that situation, the behavior can become a second-order XSS gadget because a security-relevant attribute is removed from normal elements but remains on allowed custom elements.
Possible fixes or mitigations might include
afterSanitizeElementsCUSTOM_ELEMENT_HANDLINGmay not participate in the same post-element hook flow as normal allowlisted elements.Severity
CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Release Notes
babel/babel (@babel/core)
v7.29.7Compare Source
v7.29.7 (2026-05-25)
Re-release all packages with npm provenance attestations
changesets/changesets (@changesets/cli)
v2.31.1Compare Source
Patch Changes
15cf592Thanks @ingvaldlorentzen! - Fixed already-published version detection with npm 12, which always wraps successfulnpm info --jsonoutput in an array. The unwrapped output madechangeset publishtreat every package as unpublished and fail attempting to republish existing versions.swc-project/swc (@swc/core)
v1.15.46Compare Source
Bug Fixes
(deps) Update crossbeam-epoch to 0.9.20 (#12004) (fababa1)
(es/fixer) Normalize for-head ident patterns (#11968) (af681bc)
(es/fixer) Preserve parens around PURE-annotated receivers (#12022) (73d8941)
(es/hygiene) Ignore eval in default hygiene pass (#12003) (dd43ad6)
(es/minifier) Eliminate unused classes with cyclic references (#11963) (63a94b9)
(es/minifier) Preserve switch fallthrough termination (#11971) (a5d19ae)
(es/minifier) Check last case (#11972) (060c7ac)
(es/minifier) Disable IIFE invoke when there's eval (#11984) (eabe4be)
(es/minifier) Invoke IIFE when has eval (#11987) (457df11)
(es/minifier) Make Infect Collect collect every used ident (#11998) (fb9ebee)
(es/minifier) Measure number length precisely (#12026) (54d139a)
(es/module) Rewrite
.tsximports to.jsunless JSX is preserved (#11995) (c341d9c)(es/module) Rewrite SystemJS transform (#11996) (2f47530)
(es/modules) Resolve relative symlinked inputs from cwd (#11883) (01e857d)
(es/react) Emit jsxdev source for fragments (#11993) (a70ce24)
(es/react-compiler) Correct catch and parameter scope resolution (#11985) (3867e57)
(react-compiler) Remove React-like prefilter (#12007) (ab66869)
(ts/fast-strip) Handle generic arrow line breaks (#12034) (3d82701)
Documentation
Features
(bindings) Add
lint/lintSyncAPI to@swc/react-compiler(#11965) (ab4ce67)(es/minifier) Remove unused param for new Function or Class Expr (#12017) (be56e09)
(es/minifier) Remove unused param for new expr (#12027) (661067c)
(wasm) Add @swc/nodejs-support-wasm (#11975) (b617562)
Refactor
(es/helpers) Generate inline helpers from canonical ESM sources (#12006) (f36e4b6)
(es/helpers) Remove unused jsx helper (#12009) (ccbc906)
(es/lexer) Remove smartstring dependency (#12013) (d6833cc)
(es/minifier) Remove ProgramData.top (#12031) (a72571f)
(es/module) Align module transform records with spec terms (#11992) (f680df5)
(es/module) Introduce source module lowering pipeline (#11999) (9609b7f)
Remove direct rkyv dependencies (#12010) (5761a2b)
Testing
Build
Ci
Allow publish milestone PR updates (#11960) (885d3e2)
Allow memmap2 advisory (#11961) (0be5872)
Update rust-toolchain action pin (#12021) (78b41b5)
Use Node.js 24 by default (#12035) (d658d08)
Update rust-toolchain action pin (#12036) (d1a1e23)
Use Node.js 24 for wasm publishing (#12038) (516bf3c)
typescript-eslint/typescript-eslint (@typescript-eslint/eslint-plugin)
v8.65.0Compare Source
🚀 Features
🩹 Fixes
❤️ Thank You
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
v8.64.0Compare Source
🚀 Features
using/await usingdeclarations and deprecate the rule (#12500)🩹 Fixes
❤️ Thank You
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
typescript-eslint/typescript-eslint (@typescript-eslint/parser)
v8.65.0Compare Source
🚀 Features
❤️ Thank You
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
v8.64.0Compare Source
This was a version bump only for parser to align it with other projects, there were no code changes.
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
cure53/DOMPurify (dompurify)
v3.4.12: DOMPurify 3.4.12Compare Source
prettier/prettier (prettier)
v3.9.6Compare Source
diff
TypeScript: Preserve quotes for methods named
new(#19621 by @kovsu)TypeScript: Support
import defer(#19624, #19675 by @fisker)JavaScript: Added a new official plugin
@prettier/plugin-yuku(#19628, #19629 by @fisker)@prettier/plugin-yukuis powered by Yuku (A high-performance JavaScript/TypeScript compiler toolchain written in Zig).This plugin includes two new parsers:
yuku(JavaScript syntax) andyuku-ts(TypeScript syntax).To use this plugin:
Install the plugin:
Add it to your
.prettierrc:Due to package size limitations, this plugin is not bundled with the main prettier package and must be installed separately.
For more information, check the package homepage.
Big thanks to @arshad-yaseen for his excellent work.
sass/dart-sass (sass)
v1.101.7Compare Source
v1.101.6Compare Source
v1.101.5Compare Source
v1.101.4Compare Source
Avoid emitting
rgb()orrgba()functions with non-percent decimalchannels. Older browsers only support integer values or (potentially decimal)
percentages for these functions, so in order to preserve
backwards-compatibility while retaining full precision for modern browsers,
legacy colors that contain at least one non-integer channel will now use
percentages for their channels (for example,
rgb(0%, 100%, 50%)rather thanrgb(0, 255, 127.5)).Fix a bug where the values of plain-CSS
if()expressions were emitted usingtheir
meta.inspect()format rather than their CSS serialization format.v1.101.3Compare Source
webpack/webpack (webpack)
v5.109.0Compare Source
Minor Changes
Default
experiments.typescriptto"auto", enabling built-in TypeScript support on Node.js >= 22.6 when no TypeScript loader is registered. (by @alexander-akait in #21477)Default
experiments.css,experiments.htmlandexperiments.asyncWebAssemblyto"auto", enabling built-in support unless a loader is registered for those files; modules with inline or hook-injected loaders (e.g. html-webpack-plugin templates) keep being parsed as JavaScript. (by @alexander-akait in #21477)Add
output.resourceHintsto emit resource hints (preload/prefetch/modulepreload/preconnect), on by default for ESM output, plusmodule.parser.<type>.urlHints,css.fontPreloadandjavascript.dynamicImportCssPreload. (by @alexander-akait in #21477)Add built-in build progress via
infrastructureLogging.progress, plusestimatedTime,phaseTimings, progress barwidthandprogressBar: "auto"onProgressPlugin. (by @alexander-akait in #21477)Concatenate CommonJS modules with statically analyzable exports; opt out via
optimization.concatenateModules: { commonjs: false }. (by @alexander-akait in #21477)Wrap "weird" CommonJS modules into module concatenation instead of bailing out. (by @alexander-akait in #21477)
Add
output.html.inline(true | "script" | "style") and thewebpackInlinemagic comment to inline chunk content into HTML. (by @alexander-akait in #21477)Add
output.html.injectto control where chunk tags are injected. (by @alexander-akait in #21477)Add
output.html.title,output.html.metaandoutput.html.baseoptions for head generation. (by @alexander-akait in #21477)Support per-icon link attributes (
sizes,media,color,type,crossorigin) and arrays inoutput.html.favicon. (by @alexander-akait in #21487)Add
output.html.manifestto generate and link a web app manifest with hashed icons. (by @alexander-akait in #21487)Add
output.html.cspto inject a Content-Security-Policy meta with inline-content hashes and an optional nonce. (by @alexander-akait in #21487)Add the
output.htmlinjectTagscompilation hook to inject tags (script/link/meta/…) withinjectToplacement. (by @alexander-akait in #21487)Add the
output.htmltransformTagscompilation hook to mutate, remove, or move (between<head>and<body>) a page's existing<script>/<link>/<style>/<meta>tags. (by @alexander-akait in #21487)Extend the HTML pipeline with
htmllink sources (bundled as their own emitted page) andrel="preload"/"prefetch"links bundled as chunks. (by @alexander-akait in #21477)Recognize more asset-bearing HTML sources: the
twitter:player:streammeta, legacy SVG references, and Web App Manifesticons/screenshots/shortcutsURLs. (by @alexander-akait in #21477)Add
module.parser.html.asto parse HTML as a document or an element fragment. (by @alexander-akait in #21477)Allow disabling a built-in HTML parser source via
type: falseinsources. (by @alexander-akait in #21477)Export
webpack.html.HtmlModulesPluginwithtransformHtml/htmlEmittedcompilation hooks. (by @alexander-akait in #21477)Resolve
@custom-media(including media-type values) and@custom-selectorin native CSS. (by @alexander-akait in #21477)Scope
view-transition-name/-group/-classnames and::view-transition-*()pseudo references in CSS modules undercustomIdents. (by @alexander-akait in #21486)Add
import.meta.globsupport, with acaseSensitiveoption and consistent hidden/node_modulesmatching. (by @alexander-akait in #21477)Resolve
import.meta.resolve("./asset")to the emitted asset URL via theimportMeta.resolveparser option. (by @alexander-akait in #21477)Add
import.meta.envdefaults:MODE,DEV,PROD,SSRandBASE_URL. (by @alexander-akait in #21477)Add fine-grained
import.metaparser options. (by @alexander-akait in #21477)Deprecate the
importMetaContextparser option in favor ofimportMeta.webpackContext. (by @alexander-akait in #21477)Emit analyzable
new URL(…, import.meta.url), worker/worklet URL andimport()references with literal specifiers for ESM module output. (by @alexander-akait in #21477)Compile async modules to generators for targets without async/await. (by @alexander-akait in #21477)
Evaluate and validate the second argument of dynamic
import(specifier, options). (by @alexander-akait in #21477)Add
module.parser.javascript.workletto bundle WorkletaddModule()entries. (by @alexander-akait in #21477)Add
?raw,?url,?inlineand?no-inlineasset query suffixes underexperiments.futureDefaults. (by @alexander-akait in #21477)Add an
interop("default" | "esModule") hint for object externals to control default-export interop. (by @alexander-akait in #21477)Add an
amd-asyncexternals type that loads AMD externals without an AMD library wrapper. (by @alexander-akait in #21477)Support
cache.compression: "zstd"for the filesystem cache. (by @alexander-akait in #21477)Warn on strict-mode-only syntax and semantic hazards in ES module output, configurable via the
strictModeViolationsparser option. (by @alexander-akait in #21477)Support parsers without location APIs: locations derive from node offsets and AST nodes no longer carry
loc. (by @alexander-akait in #21477)Attach the original DOM event to
ChunkLoadErrorandScriptExternalLoadErroraserror.event. (by [@alexander-akait](https://redireConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
Need help?
You can ask for more help in the following Slack channel: #proj-renovate-self-hosted. In that channel you can also find ADR and FAQ docs in the Resources section.