jsdom

Frameworks & LibrariesMIT

Pure-JavaScript implementation of web standards, for running the DOM in Node.

Latest v30.0.1 · by jsdomWritten in JavaScriptWebsitejsdom/jsdomRSS

Release activity

Release activity — 10 releases across 7 days since Mar 15, 2026. Each cell is one day; darker means more releases that day. Nothing is recorded before Mar 15, 2026. Older weeks are hidden at this screen width.
JunJulAugSep
SundayNo releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026No releases on Aug 16, 2026No releases on Aug 23, 2026No releases on Aug 30, 2026No releases on Sep 6, 2026
MondayNo releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 20261 release on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026No releases on Aug 17, 2026No releases on Aug 24, 2026No releases on Aug 31, 2026No releases on Sep 7, 2026
TuesdayNo releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026No releases on Aug 18, 2026No releases on Aug 25, 2026No releases on Sep 1, 2026No releases on Sep 8, 2026
WednesdayNo releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 20261 release on Jul 29, 2026No releases on Aug 5, 2026No releases on Aug 12, 2026No releases on Aug 19, 2026No releases on Aug 26, 2026No releases on Sep 2, 2026
ThursdayNo releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026No releases on Aug 13, 2026No releases on Aug 20, 2026No releases on Aug 27, 2026No releases on Sep 3, 2026
FridayNo releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026No releases on Aug 14, 2026No releases on Aug 21, 2026No releases on Aug 28, 2026No releases on Sep 4, 2026
SaturdayNo releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026No releases on Aug 15, 2026No releases on Aug 22, 2026No releases on Aug 29, 2026No releases on Sep 5, 2026

10 releases since Mar 15, 2026, busiest day 4

Changelog

What changed from 29 to 30

v30.0.1

Latest
Changed 1
  • Sped up range operations on large documents
Fixed 1
  • getComputedStyle() with calc() and other functions throwing an exception, which regressed in v30.0.0

From jsdom

  • Fixed getComputedStyle() with calc() and other functions throwing an exception, which regressed in v30.0.0. (@asamuzaK)
  • Sped up up range operations on large documents (@leonidaz)
View originalPermalink
How v30.0.1 went

v30.0.0

Added 2
  • Add CSS.escape() and CSS.supports() functions
  • Add 'background-position-x' and 'background-position-y' CSS properties
Fixed 3
  • Fix getComputedStyle() to convert length values into pixels
  • Fix CSS function serialization in the return value of getPropertyValue()
  • Fix the type of error thrown by document.evaluate()
Removed 1
  • Raise Node.js minimum version to ^22.22.2 || ^24.15.0 || >=26.0.0

From jsdom

Breaking changes:

  • Node.js minimum version raised to ^22.22.2 || ^24.15.0 || >=26.0.0.

Other changes:

  • Added CSS.escape() and CSS.supports() functions. (@asamuzaK)
  • Added 'background-position-x' and 'background-position-y' CSS properties. (@olagokemills)
  • Fixed getComputedStyle() to convert length values into pixels. (@asamuzaK)
  • Fixed CSS function serialization, e.g., in the return value of getPropertyValue(). (@asamuzaK)
  • Fixed the type of error thrown by document.evaluate() (@dokson)
View originalPermalink
How v30.0.0 went

v29.1.1

Changed 1
  • Significantly optimized initial calls to getComputedStyle() before the cache warms up
Fixed 2
  • Fixed 'border-radius' computed style serialization
  • Fixed computed style computation when using 'background-origin' and 'background-clip' CSS properties

From jsdom

  • Fixed 'border-radius' computed style serialization. (@asamuzaK)
  • Fixed computed style computation when using 'background-origin' and 'background-clip' CSS properties. (@asamuzaK)
  • Significantly optimized initial calls to getComputedStyle(), before the cache warms up. (@asamuzaK)
View originalPermalink
How v29.1.1 went

v29.1.0

Added 1
  • Add basic support for the ratio CSS type
Fixed 1
  • Fix getComputedStyle() sometimes returning outdated results after CSS was modified

From jsdom

  • Added basic support for the ratio CSS type. (@asamuzaK)
  • Fixed getComputedStyle() sometimes returning outdated results after CSS was modified. (@asamuzaK)
View originalPermalink
How v29.1.0 went

v29.0.2

Changed 1
  • Significantly improved and sped up getComputedStyle() with computed value rules applied across a broader set of properties, including fixes related to inheritance, defaulting keywords, custom properties, and color-related values such as currentcolor and system colors
Fixed 1
  • Fixed CSS 'background' and 'border' shorthand parsing

From jsdom

  • Significantly improved and sped up getComputedStyle(). Computed value rules are now applied across a broader set of properties, and include fixes related to inheritance, defaulting keywords, custom properties, and color-related values such as currentcolor and system colors. (@asamuzaK)
  • Fixed CSS 'background' and 'border' shorthand parsing. (@asamuzaK)
View originalPermalink
How v29.0.2 went

v29.0.1

Fixed 2
  • CSS parsing of 'border', 'background', and their sub-shorthands containing keywords or var()
  • getComputedStyle() to return a more functional CSSStyleDeclaration object, including indexed access support, which regressed in v29.0.0

From jsdom

  • Fixed CSS parsing of 'border', 'background', and their sub-shorthands containing keywords or var(). (@asamuzaK)
  • Fixed getComputedStyle() to return a more functional CSSStyleDeclaration object, including indexed access support, which regressed in v29.0.0.
View originalPermalink
How v29.0.1 went

v27.4.0

Added 1
  • Added TextEncoder and TextDecoder
Changed 2
  • Improved decoding of HTML bytes using the @exodus/bytes package for more correct decoding
  • Improved decoding of XML bytes to use UTF-8 more often instead of sniffing for meta charset or using the parent frame's encoding
Fixed 1
  • Fixed a memory leak when Ranges were used and then the elements referred to by those ranges were removed

From jsdom

  • Added TextEncoder and TextDecoder.
  • Improved decoding of HTML bytes by using the new @exodus/bytes package; it is now much more correct. (@ChALkeR)
  • Improved decoding of XML bytes to use UTF-8 more often, instead of sniffing for <meta charset> or using the parent frame's encoding.
  • Fixed a memory leak when Ranges were used and then the elements referred to by those ranges were removed.
View originalPermalink
How v27.4.0 went

v29.0.0

Added 7
  • Added CSSCounterStyleRule and CSSNamespaceRule to jsdom Windows
  • Added cssMediaRule.matches and cssSupportsRule.matches getters
  • Added proper media query parsing in MediaList using css-tree instead of naive comma-splitting, with invalid queries becoming "not all" per spec
  • Added cssKeyframeRule.keyText getter/setter validation
  • Added cssStyleRule.selectorText setter validation to reject invalid selectors
  • Added styleSheet.ownerNode, styleSheet.href, and styleSheet.title
  • Added bad port blocking per the fetch specification to prevent fetches to commonly-abused ports
Changed 3
  • Node.js v22.13.0+ is now the minimum supported v22 version
  • Overhauled the CSSOM implementation with fresh internal implementations built on webidl2js wrappers and the css-tree parser, improving serialization, parsing, and API behavior
  • Improved Document initialization performance by lazily initializing the CSS selector engine
Fixed 7
  • Fixed a memory leak when stylesheets were removed from the document
  • Fixed CSSStyleDeclaration modifications to properly trigger custom element reactions
  • Fixed nested @media rule parsing
  • Fixed CSSStyleSheet's "disallow modification" flag not being checked in all mutation methods
  • Fixed XMLHttpRequest's response getter returning parsed JSON during the LOADING state instead of null
  • Fixed getComputedStyle() crashing in XHTML documents when stylesheets contained at-rules such as @page or @font-face
  • Fixed a potential hang in synchronous XMLHttpRequest caused by a race condition with the worker thread's idle timeout

From jsdom

Breaking changes:

  • Node.js v22.13.0+ is now the minimum supported v22 version (was v22.12.0+).

Other changes:

  • Overhauled the CSSOM implementation, replacing the @acemir/cssom and cssstyle dependencies with fresh internal implementations built on webidl2js wrappers and the css-tree parser. Serialization, parsing, and API behavior is improved in various ways, especially around edge cases.
  • Added CSSCounterStyleRule and CSSNamespaceRule to jsdom Windows.
  • Added cssMediaRule.matches and cssSupportsRule.matches getters.
  • Added proper media query parsing in MediaList, using css-tree instead of naive comma-splitting. Invalid queries become "not all" per spec.
  • Added cssKeyframeRule.keyText getter/setter validation.
  • Added cssStyleRule.selectorText setter validation: invalid selectors are now rejected.
  • Added styleSheet.ownerNode, styleSheet.href, and styleSheet.title.
  • Added bad port blocking per the fetch specification, preventing fetches to commonly-abused ports.
  • Improved Document initialization performance by lazily initializing the CSS selector engine, avoiding ~0.5 ms of overhead per Document. (@thypon)
  • Fixed a memory leak when stylesheets were removed from the document.
  • Fixed CSSStyleDeclaration modifications to properly trigger custom element reactions.
  • Fixed nested @media rule parsing.
  • Fixed CSSStyleSheet's "disallow modification" flag not being checked in all mutation methods.
  • Fixed XMLHttpRequest's response getter returning parsed JSON during the LOADING state instead of null.
  • Fixed getComputedStyle() crashing in XHTML documents when stylesheets contained at-rules such as @page or @font-face.
  • Fixed a potential hang in synchronous XMLHttpRequest caused by a race condition with the worker thread's idle timeout.
View originalPermalink
How v29.0.0 went

v28.1.0

Added 1
  • Add `blob.text()`, `blob.arrayBuffer()`, and `blob.bytes()` methods
Changed 3
  • Improve `getComputedStyle()` to account for CSS specificity when multiple rules apply
  • Improve synchronous `XMLHttpRequest` performance by using a persistent worker thread, avoiding ~400ms of setup overhead on every synchronous request after the first one
  • Improve performance of `node.getRootNode()`, `node.isConnected`, and `event.dispatchEvent()` by caching the root node of document-connected trees
Fixed 6
  • Fix `getComputedStyle()` to correctly handle `!important` priority
  • Fix `document.getElementById()` to return the first element in tree order when multiple elements share the same ID
  • Fix `<svg>` elements to no longer incorrectly proxy event handlers to the `Window`
  • Fix `FileReader` event timing and `fileReader.result` state to more closely follow the spec
  • Fix a potential hang when synchronous `XMLHttpRequest` encountered dispatch errors
  • Fix compatibility with environments where Node.js's built-in `fetch()` has been used before importing jsdom, by working around undici v6/v7 incompatibilities

From jsdom

  • Added blob.text(), blob.arrayBuffer(), and blob.bytes() methods.
  • Improved getComputedStyle() to account for CSS specificity when multiple rules apply. (@asamuzaK)
  • Improved synchronous XMLHttpRequest performance by using a persistent worker thread, avoiding ~400ms of setup overhead on every synchronous request after the first one.
  • Improved performance of node.getRootNode(), node.isConnected, and event.dispatchEvent() by caching the root node of document-connected trees.
  • Fixed getComputedStyle() to correctly handle !important priority. (@asamuzaK)
  • Fixed document.getElementById() to return the first element in tree order when multiple elements share the same ID.
  • Fixed <svg> elements to no longer incorrectly proxy event handlers to the Window.
  • Fixed FileReader event timing and fileReader.result state to more closely follow the spec.
  • Fixed a potential hang when synchronous XMLHttpRequest encountered dispatch errors.
  • Fixed compatibility with environments where Node.js's built-in fetch() has been used before importing jsdom, by working around undici v6/v7 incompatibilities.
View originalPermalink
How v28.1.0 went

v28.0.0

Added 1
  • Added MIME type sniffing to <iframe> and <frame> loads
Changed 1
  • Overhauled resource loading customization with a new API for loading subresources
Fixed 7
  • Fixed decoding of the query components of <a> and <area> elements in non-UTF-8 documents
  • Fixed XMLHttpRequest fetches and WebSocket upgrade requests to be interceptable by the new customizable resource loading
  • Fixed the referrer of a document to be set correctly when redirects are involved to use the initiating page instead of the last hop in the redirect chain
  • Fixed correctness bugs when passing ArrayBuffers or typed arrays to various APIs where they would not correctly snapshot the data
  • Fixed require("url").parse() deprecation warning when using WebSockets
  • Fixed <iframe>, <frame>, and <img> to fire load events instead of error events on non-OK HTTP responses
  • Fixed many small issues in XMLHttpRequest

From jsdom

  • Overhauled resource loading customization. See the new README for details on the new API.
  • Added MIME type sniffing to <iframe> and <frame> loads.
  • Regression: WebSockets are no longer correctly throttled to one connection per origin. This is a result of the bug at nodejs/undici#4743.
  • Fixed decoding of the query components of <a> and <area> elements in non-UTF-8 documents.
  • Fixed XMLHttpRequest fetches and WebSocket upgrade requests to be interceptable by the new customizable resource loading. (Except synchronous XMLHttpRequests.)
  • Fixed the referrer of a document to be set correctly when redirects are involved; it is now the initiating page, not the last hop in the redirect chain.
  • Fixed correctness bugs when passing ArrayBuffers or typed arrays to various APIs, where they would not correctly snapshot the data.
  • Fixed require("url").parse() deprecation warning when using WebSockets.
  • Fixed <iframe>, <frame>, and <img> (when canvas is installed) to fire load events, not error events, on non-OK HTTP responses.
  • Fixed many small issues in XMLHttpRequest.
View originalPermalink
How v28.0.0 went
View all

Discussion

If you publish jsdom, you can claim this product by proving you administer its repository.