NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4042 most downloaded on npm
Node.js library that communicates with Embedded Dart Sass using the Embedded Sass protocol
Last release 6 days ago
12 Sep 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
5 years old
116 releases · first in 2021
One column per quarter.
Mixins and functions whose names begin with -- are now deprecated for forwards-compatibility with the in-progress CSS functions and mixins spec. This…
Throw errors for misplaced statements in keyframe blocks.
Mixins and functions whose names begin with -- are now deprecated for
forwards-compatibility with the in-progress CSS functions and mixins spec.
This deprecation is named css-function-mixin.
Fix a bug in which stylesheet canonicalization could be cached incorrectly when custom importers or the Node.js package importer made decisions based
importer to be passed without url in StringOptionsWithImporter.* No user-visible changes.
Support adjacent /s without whitespace in between when parsing plain CSS expressions.
Support adjacent /s without whitespace in between when parsing plain CSS
expressions.
Allow the Node.js pkg: importer to load Sass stylesheets for package.json
exports field entries without extensions.
When printing suggestions for variables, use underscores in variable names when the original usage used underscores.
pkg: imports with the Node.js package importer when
arguments are passed to the JavaScript process.Ship the musl Linux release with the proper Dart executable.
Export the NodePackageImporter class in ESM mode.
Allow NodePackageImporter to locate a default directory even when the
entrypoint is an ESM module.
NodePackageImporter() a static error rather
than just a runtime error.For more information about pkg: importers, see [the announcement][pkg-importers] on the Sass blog.
For more information about pkg: importers, see the
announcement on the Sass blog.
--pkg-importer flag to enable built-in pkg: importers. Currently
this only supports the Node.js package resolution algorithm, via
--pkg-importer=node. For example, @use "pkg:bootstrap" will load
node_modules/bootstrap/scss/bootstrap.scss.NodePackageImporter importer that can be passed to the importers
option. This loads files using the pkg: URL scheme according to the Node.js
package resolution algorithm. For example, @use "pkg:bootstrap" will load
node_modules/bootstrap/scss/bootstrap.scss. The constructor takes a single
optional argument, which indicates the base directory to use when locating
node_modules directories. It defaults to
path.dirname(require.main.filename).NodePackageImporter importer that can be passed to the importers
option. This loads files using the pkg: URL scheme according to the Node.js
package resolution algorithm. For example, @use "pkg:bootstrap" will load
node_modules/bootstrap/scss/bootstrap.scss. The constructor takes a single
argument, which indicates the base directory to use when locating
node_modules directories.Add a sass.initCompiler() function that returns a sass.Compiler object which supports compile() and compileString() methods with the same API as the g
Add a sass.initCompiler() function that returns a sass.Compiler object
which supports compile() and compileString() methods with the same API as
the global Sass object. On the Node.js embedded host, each sass.Compiler
object uses a single long-lived subprocess, making compiling multiple
stylesheets much more efficient.
Add a sass.initAsyncCompiler() function that returns a sass.AsyncCompiler
object which supports compileAsync() and compileStringAsync() methods with
the same API as the global Sass object. On the Node.js embedded host, each
sass.AsynCompiler object uses a single long-lived subprocess, making
compiling multiple stylesheets much more efficient.
Support the CompileRequest.silent field. This allows compilations with no
logging to avoid unnecessary request/response cycles.
The Dart Sass embedded compiler now reports its name as "dart-sass" rather
than "Dart Sass", to match the JS API's info field.
In the JS Embedded Host, properly install the x64 Dart Sass executable on ARM64 Windows.
Produce better output for numbers with complex units in meta.inspect() and debugging messages.
Produce better output for numbers with complex units in meta.inspect() and
debugging messages.
Escape U+007F DELETE when serializing strings.
When generating CSS error messages to display in-browser, escape all code points that aren't in the US-ASCII region. Previously only code points U+0100 LATIN CAPITAL LETTER A WITH MACRON were escaped.
Provide official releases for musl LibC and for Android.
Don't crash when running meta.apply() in asynchronous mode.
SourceSpans that didn't
follow the documented SourceSpan API.Compatibility with Node.js 21.0.0.
* No user-visible changes.
Fix a bug where Sass crashed when running in the browser if there was a global variable named process.
process.* No user-visible changes.
Breaking change: As a consequence of the change in calculation parsing described above, calculation functions containing interpolation are now parsed…
All functions defined in CSS Values and Units 4 are now once again parsed as
calculation objects: round(), mod(), rem(), sin(), cos(), tan(),
asin(), acos(), atan(), atan2(), pow(), sqrt(), hypot(),
log(), exp(), abs(), and sign().
Unlike in 1.65.0, function calls are not locked into being parsed as
calculations or plain Sass functions at parse-time. This means that
user-defined functions will take precedence over CSS calculations of the same
name. Although the function names calc() and clamp() are still forbidden,
users may continue to freely define functions whose names overlap with other
CSS calculations (including abs(), min(), max(), and round() whose
names overlap with global Sass functions).
Breaking change: As a consequence of the change in calculation parsing
described above, calculation functions containing interpolation are now parsed
more strictly than before. However, almost all interpolations that would
have produced valid CSS will continue to work. The only exception is
#{$variable}% which is not valid in Sass and is no longer valid in
calculations. Instead of this, either use $variable directly and ensure it
already has the % unit, or write ($variable * 1%).
Potentially breaking bug fix: The importer used to load a given file is no longer used to load absolute URLs that appear in that file. This was unintented behavior that contradicted the Sass specification. Absolute URLs will now correctly be loaded only from the global importer list. This applies to the modern JS API, the Dart API, and the embedded protocol.
Fix a bug where Sass compilation could crash in strict mode if passed a callback that threw a string, boolean, number, symbol, or bignum.
Breaking change: Drop support for the additional CSS calculations defined in CSS Values and Units 4. Custom Sass functions whose names overlapped with…
Breaking change: Drop support for the additional CSS calculations defined in CSS Values and Units 4. Custom Sass functions whose names overlapped with these new CSS functions were being parsed as CSS calculations instead, causing an unintentional breaking change outside our normal [compatibility policy] for CSS compatibility changes.
Support will be added again in a future version, but only after Sass has emitted a deprecation warning for all functions that will break for at least three months prior to the breakage.
* No user-visible changes.
Fix a bug where a valid SassCalculation.clamp() with less than 3 arguments would throw an error.
SassCalculation.clamp() with less than 3 arguments
would throw an error.Fix a bug where nested relative @imports failed to load when using the deprecated functions render or renderSync and those relative imports were loade…
Comments that appear before or between @use and @forward rules are now
emitted in source order as much as possible, instead of always being emitted
after the CSS of all module dependencies.
Fix a bug where an interpolation in a custom property name crashed if the file
was loaded by a @use nested in an @import.
Add a new SassCalculation type that represents the calculation objects added
in Dart Sass 1.40.0.
Add Value.assertCalculation(), which returns the value if it's a
SassCalculation and throws an error otherwise.
Produce a better error message when an environment that supports some Node.js APIs loads the browser entrypoint but attempts to access the filesystem.
@imports failed to load when using the
deprecated functions render or renderSync and those relative imports were
loaded multiple times across different files.Fix import sass from 'sass' again after it was broken in the last release.
import sass from 'sass' again after it was broken in the last release.exports declaration in package.json.Fix a bug where loading the package through both CJS require() and ESM import could crash on Node.js.
require() and ESM
import could crash on Node.js.Fix a deadlock when running at high concurrency on 32-bit systems.
Fix a race condition where the embedded compiler could deadlock or crash if a compilation ID was reused immediately after the compilation completed.
Deprecate the use of multiple !global or !default flags on the same variable. This deprecation is named duplicate-var-flags.
Deprecate the use of multiple !global or !default flags on the same
variable. This deprecation is named duplicate-var-flags.
Allow special numbers like var() or calc() in the global functions:
grayscale(), invert(), saturate(), and opacity(). These are also
native CSS filter functions. This is in addition to number values which were
already allowed.
Fix a cosmetic bug where an outer rule could be duplicated after nesting was resolved, instead of re-using a shared rule.
Potentially breaking change: Drop support for End-of-Life Node.js 12.
Potentially breaking change: Drop support for End-of-Life Node.js 12.
Fix remaining cases for the performance regression introduced in 1.59.0.
Add support for the pi, e, infinity, -infinity, and NaN constants in calculations. These will be interpreted as the corresponding numbers.
Add support for the pi, e, infinity, -infinity, and NaN constants in
calculations. These will be interpreted as the corresponding numbers.
Add support for unknown constants in calculations. These will be interpreted as unquoted strings.
Serialize numbers with value infinity, -infinity, and NaN to calc()
expressions rather than CSS-invalid identifiers. Numbers with complex units
still can't be serialized.
Fix a performance regression introduced in 1.59.0.
Fix a performance regression introduced in 1.59.0.
The NPM release of 1.59.0 dropped support for Node 12 without actually indicating so in its pubspec. This release temporarily adds back support so that the latest Sass version that declares it supports Node 12 actually does so. However, Node 12 is now end-of-life, so we will drop support for it properly in an upcoming release.
* No user-visible changes.
* No user-visible changes.
Add a timestamp to messages printed in --watch mode.
Add a timestamp to messages printed in --watch mode.
Print better calc()-based suggestions for /-as-division expression that
contain calculation-incompatible constructs like unary minus.
* No user-visible changes.
The embedded compiler now supports version 1.2.0 of the embedded protocol.
Importer results now validate that contents is actually a string and whether sourceMapUrl is an absolute URL.
contents is actually a string and whether
sourceMapUrl is an absolute URL.Emit a deprecation warning for $a -$b and $a +$b, since these look like they could be unary operations but they're actually parsed as binary operation…
Potentially breaking bug fix: Sass numbers are now universally stored as 64-bit floating-point numbers, rather than sometimes being stored as integers. This will generally make arithmetic with very large numbers more reliable and more consistent across platforms, but it does mean that numbers between nine quadrillion and nine quintillion will no longer be represented with full accuracy when compiling Sass on the Dart VM.
Potentially breaking bug fix: Sass equality is now properly transitive.
Two numbers are now considered equal (after doing unit conversions) if they
round to the same 1e-11th. Previously, numbers were considered equal if they
were within 1e-11 of one another, which led to some circumstances where $a == $b and $b == $c but $a != $b.
Potentially breaking bug fix: Various functions in sass:math no longer
treat floating-point numbers that are very close (but not identical) to
integers as integers. Instead, these functions now follow the floating-point
specification exactly. For example, math.pow(0.000000000001, -1) now returns
1000000000000 instead of Infinity.
Emit a deprecation warning for $a -$b and $a +$b, since these look like
they could be unary operations but they're actually parsed as binary
operations. Either explicitly write $a - $b or $a (-$b). See
https://sass-lang.com/d/strict-unary for more details.
Add an optional argumentName parameter to SassScriptException() to make it
easier to throw exceptions associated with particular argument names.
Most APIs that previously returned num now return double. All APIs
continue to accept num, although in Dart 2.0.0 these APIs will be changed
to accept only double.
Fix an incorrect span in certain @media query deprecation warnings.
@media query deprecation warnings.* No user-visible changes.
Improve error messages when passing incorrect units that are also out-of-bounds to various color functions.
Release a native ARM64 executable for Mac OS.
* No user-visible changes.
Add support for calling var() with an empty second argument, such as var(--side, ).
var() with an empty second argument, such as
var(--side, ).meta.load-css() would sometimes resolve relative URLs
incorrectly when called from a mixin using the legacy JS API.Fix crash when trailing loud comments (/* ... */) appear twice in a row across two different imports which themselves imported the same file each.
/* ... */) appear twice in a row
across two different imports which themselves imported the same file each.Preserve location of trailing loud comments (/* ... */) instead of pushing the comment to the next line.
/* ... */) instead of pushing
the comment to the next line.Fix a bug where --watch mode would close immediately in TTY mode. This was caused by our change to close --watch when stdin was closed *outside of* TT
--watch mode would close immediately in TTY mode. This was
caused by our change to close --watch when stdin was closed outside of TTY
mode, which has been reverted for now while we work on a fix.Potentially breaking change: Change the order of maps returned by map.deep-merge() to match those returned by map.merge(). All keys that appeared in t…
Potentially breaking change: Change the order of maps returned by
map.deep-merge() to match those returned by map.merge(). All keys that
appeared in the first map will now be listed first in the same order they
appeared in that map, followed by any new keys added from the second map.
Improve the string output of some AST nodes in error messages.
The JS embedded host and the embedded compiler will now properly avoid resolving imports relative to the current working directory unless '.' is passe
The JS embedded host and the embedded compiler will now properly avoid
resolving imports relative to the current working directory unless '.' is
passed as a load path.
Fix a bug in the JS embedded host's implementation of the legacy JS API where
imports that began with / could crash on Windows.
@extend now treats [:where()] the same as :is().
@extend now treats :where() the same as :is().--watch command to stop
running.Fix a bug where the JS embedded host crashed when invoking a legacy importer after resolving a relative filesystem import.
Improve error messages when returning non-Object values from legacy
importers.
Add support for 64-bit ARM releases on Linux.
id field for all
OutboundMessages.Fixed a bug where the legacy API could crash when passed an empty importer list.
Fixed a bug where some plain CSS imports would not be emitted.
First stable release the sass-embedded npm package that contains the Node.js Embedded Host.
First stable release the sass-embedded npm package that contains the Node.js
Embedded Host.
First stable release of the sass_embedded pub package that contains the
Embedded Dart Sass compiler.
The dart-sass executable will remain, with a deprecation message, until 1.0.0 is released.
Add support for importing an _index.scss or _index.sass file when
importing a directory.
Add a --load-path command-line option (alias -I) for passing additional
paths to search for Sass files to import.
Add a --quiet command-line option (alias -q) for silencing warnings.
Add an --indented command-line option for using the indented syntax with a
stylesheet from standard input.
Don't merge the media queries not type and (feature). We had previously
been generating not type and (feature), but that's not actually the
intersection of the two queries.
Don't crash on $x % 0.
The standalone executable distributed on GitHub is now named sass rather
than dart-sass. The dart-sass executable will remain, with a deprecation
message, until 1.0.0 is released.
Add a Logger class that allows users to control how messages are printed by
stylesheets.
Add a logger parameter to compile(), compileAsync(), compileString(),
and compileStringAsync().
@import "./foo.scss", importers will now receive
"./foo.scss" rather than "foo.scss".Nothing published for this version
Nothing published for this version
Nothing published for this version
Support unquoted imports in the indented syntax.
Support unquoted imports in the indented syntax.
Fix a crash when :not(...) extends a selector that appears in
:not(:not(...)).
render() and renderSync().Add compileAsync() and compileStringAsync() methods. These run
asynchronously, which allows them to take asynchronous importers (see below).
Add an AsyncImporter class. This allows imports to be resolved
asynchronously in case no synchronous APIs are available. AsyncImporters are
only compatible with compileAysnc() and compileStringAsync().
Properly parse numbers with exponents.
Properly parse numbers with exponents.
Don't crash when evaluating CSS variables whose names are entirely
interpolated (for example, #{--foo}: ...).
importer option to render() and renderSync().
Only synchronous importers are currently supported.Added an Importer class. This can be extended by users to provide support
for custom resolution for @import rules.
Added built-in FilesystemImporter and PackageImporter implementations that
support resolving file: and package: URLs, respectively.
Added an importers argument to the compile() and compileString()
functions that provides Importers to use when resolving @import rules.
Added a loadPaths argument to the compile() and compileString()
functions that provides paths to search for stylesheets when resolving
@import rules. This is a shorthand for passing FilesystemImporters to the
importers argument.
Drop support for the reference combinator. This has been removed from the spec, and will be deprecated and eventually removed in other implementations…
Drop support for the reference combinator. This has been removed from the spec, and will be deprecated and eventually removed in other implementations.
Trust type annotations when compiling to JavaScript, which makes it substantially faster.
Compile to minified JavaScript, which decreases the code size substantially and makes startup a little faster.
Fix a crash when inspecting a string expression that ended in "\a".
Fix a bug where declarations and @extend were allowed outside of a style
rule in certain circumstances.
Fix not in parentheses in @supports conditions.
Allow url as an identifier name.
Properly parse /***/ in selectors.
Properly parse unary operators immediately after commas.
Match Ruby Sass's rounding behavior for all functions.
Allow \ at the beginning of a selector in the indented syntax.
Fix a number of @extend bugs:
selector-extend() and selector-replace() now allow compound selector
extendees.
Remove the universal selector * when unifying with other selectors.
Properly unify the result of multiple simple selectors in the same compound selector being extended.
Properly handle extensions being extended.
Properly follow the first law of @extend.
Fix selector specificity tracking to follow the
second law of @extend.
Allow extensions that match selectors but fail to unify.
Partially-extended selectors are no longer used as parent selectors.
Fix an edge case where both the extender and the extended selector have invalid combinator sequences.
Don't crash with a "Bad state: no element" error in certain edge cases.
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →