studio
studio copied to clipboard
Update Build Tools
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| autoprefixer | dependencies | patch | 10.4.19 -> 10.4.20 |
| esbuild | dependencies | minor | 0.23.0 -> 0.25.0 |
| rtlcss (source) | dependencies | minor | 4.2.0 -> 4.3.0 |
| sass | dependencies | minor | 1.77.8 -> 1.85.1 |
Release Notes
evanw/esbuild (esbuild)
v0.25.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of esbuild in your package.json file (recommended) or be using a version range syntax that only accepts patch upgrades such as ^0.24.0 or ~0.24.0. See npm's documentation about semver for more information.
-
Restrict access to esbuild's development server (GHSA-67mh-4wv8-2f99)
This change addresses esbuild's first security vulnerability report. Previously esbuild set the
Access-Control-Allow-Originheader to*to allow esbuild's development server to be flexible in how it's used for development. However, this allows the websites you visit to make HTTP requests to esbuild's local development server, which gives read-only access to your source code if the website were to fetch your source code's specific URL. You can read more information in the report.Starting with this release, CORS will now be disabled, and requests will now be denied if the host does not match the one provided to
--serve=. The default host is0.0.0.0, which refers to all of the IP addresses that represent the local machine (e.g. both127.0.0.1and192.168.0.1). If you want to customize anything about esbuild's development server, you can put a proxy in front of esbuild and modify the incoming and/or outgoing requests.In addition, the
serve()API call has been changed to return an array ofhostsinstead of a singlehoststring. This makes it possible to determine all of the hosts that esbuild's development server will accept.Thanks to @sapphi-red for reporting this issue.
-
Delete output files when a build fails in watch mode (#3643)
It has been requested for esbuild to delete files when a build fails in watch mode. Previously esbuild left the old files in place, which could cause people to not immediately realize that the most recent build failed. With this release, esbuild will now delete all output files if a rebuild fails. Fixing the build error and triggering another rebuild will restore all output files again.
-
Fix correctness issues with the CSS nesting transform (#3620, #3877, #3933, #3997, #4005, #4037, #4038)
This release fixes the following problems:
-
Naive expansion of CSS nesting can result in an exponential blow-up of generated CSS if each nesting level has multiple selectors. Previously esbuild sometimes collapsed individual nesting levels using
:is()to limit expansion. However, this collapsing wasn't correct in some cases, so it has been removed to fix correctness issues./* Original code */ .parent { > .a, > .b1 > .b2 { color: red; } } /* Old output (with --supported:nesting=false) */ .parent > :is(.a, .b1 > .b2) { color: red; } /* New output (with --supported:nesting=false) */ .parent > .a, .parent > .b1 > .b2 { color: red; }Thanks to @tim-we for working on a fix.
-
The
&CSS nesting selector can be repeated multiple times to increase CSS specificity. Previously esbuild ignored this possibility and incorrectly considered&&to have the same specificity as&. With this release, this should now work correctly:/* Original code (color should be red) */ div { && { color: red } & { color: blue } } /* Old output (with --supported:nesting=false) */ div { color: red; } div { color: blue; } /* New output (with --supported:nesting=false) */ div:is(div) { color: red; } div { color: blue; }Thanks to @CPunisher for working on a fix.
-
Previously transforming nested CSS incorrectly removed leading combinators from within pseudoclass selectors such as
:where(). This edge case has been fixed and how has test coverage./* Original code */ a b:has(> span) { a & { color: green; } } /* Old output (with --supported:nesting=false) */ a :is(a b:has(span)) { color: green; } /* New output (with --supported:nesting=false) */ a :is(a b:has(> span)) { color: green; }This fix was contributed by @NoremacNergfol.
-
The CSS minifier contains logic to remove the
&selector when it can be implied, which happens when there is only one and it's the leading token. However, this logic was incorrectly also applied to selector lists inside of pseudo-class selectors such as:where(). With this release, the minifier will now avoid applying this logic in this edge case:/* Original code */ .a { & .b { color: red } :where(& .b) { color: blue } } /* Old output (with --minify) */ .a{.b{color:red}:where(.b){color:#​00f}} /* New output (with --minify) */ .a{.b{color:red}:where(& .b){color:#​00f}}
-
-
Fix some correctness issues with source maps (#1745, #3183, #3613, #3982)
Previously esbuild incorrectly treated source map path references as file paths instead of as URLs. With this release, esbuild will now treat source map path references as URLs. This fixes the following problems with source maps:
-
File names in
sourceMappingURLthat contained a space previously did not encode the space as%20, which resulted in JavaScript tools (including esbuild) failing to read that path back in when consuming the generated output file. This should now be fixed. -
Absolute URLs in
sourceMappingURLthat use thefile://scheme previously attempted to read from a folder calledfile:. These URLs should now be recognized and parsed correctly. -
Entries in the
sourcesarray in the source map are now treated as URLs instead of file paths. The correct behavior for this is much more clear now that source maps has a formal specification. Many thanks to those who worked on the specification.
-
-
Fix incorrect package for
@esbuild/netbsd-arm64(#4018)Due to a copy+paste typo, the binary published to
@esbuild/netbsd-arm64was not actually forarm64, and didn't run in that environment. This release should fix running esbuild in that environment (NetBSD on 64-bit ARM). Sorry about the mistake. -
Fix a minification bug with bitwise operators and bigints (#4065)
This change removes an incorrect assumption in esbuild that all bitwise operators result in a numeric integer. That assumption was correct up until the introduction of bigints in ES2020, but is no longer correct because almost all bitwise operators now operate on both numbers and bigints. Here's an example of the incorrect minification:
// Original code if ((a & b) !== 0) found = true // Old output (with --minify) a&b&&(found=!0); // New output (with --minify) (a&b)!==0&&(found=!0); -
Fix esbuild incorrectly rejecting valid TypeScript edge case (#4027)
The following TypeScript code is valid:
export function open(async?: boolean): void { console.log(async as boolean) }Before this version, esbuild would fail to parse this with a syntax error as it expected the token sequence
async as ...to be the start of an async arrow function expressionasync as => .... This edge case should be parsed correctly by esbuild starting with this release. -
Transform BigInt values into constructor calls when unsupported (#4049)
Previously esbuild would refuse to compile the BigInt literals (such as
123n) if they are unsupported in the configured target environment (such as with--target=es6). The rationale was that they cannot be polyfilled effectively because they change the behavior of JavaScript's arithmetic operators and JavaScript doesn't have operator overloading.However, this prevents using esbuild with certain libraries that would otherwise work if BigInt literals were ignored, such as with old versions of the
bufferlibrary before the library fixed support for running in environments without BigInt support. So with this release, esbuild will now turn BigInt literals into BigInt constructor calls (so123nbecomesBigInt(123)) and generate a warning in this case. You can turn off the warning with--log-override:bigint=silentor restore the warning to an error with--log-override:bigint=errorif needed. -
Change how
consoleAPI dropping works (#4020)Previously the
--drop:consolefeature replaced all method calls off of theconsoleglobal withundefinedregardless of how long the property access chain was (so it applied toconsole.log()andconsole.log.call(console)andconsole.log.not.a.method()). However, it was pointed out that this breaks uses ofconsole.log.bind(console). That's also incompatible with Terser's implementation of the feature, which is where this feature originally came from (it does supportbind). So with this release, using this feature with esbuild will now only replace one level of method call (unless extended bycallorapply) and will replace the method being called with an empty function in complex cases:// Original code const x = console.log('x') const y = console.log.call(console, 'y') const z = console.log.bind(console)('z') // Old output (with --drop-console) const x = void 0; const y = void 0; const z = (void 0)("z"); // New output (with --drop-console) const x = void 0; const y = void 0; const z = (() => { }).bind(console)("z");This should more closely match Terser's existing behavior.
-
Allow BigInt literals as
definevaluesWith this release, you can now use BigInt literals as define values, such as with
--define:FOO=123n. Previously trying to do this resulted in a syntax error. -
Fix a bug with resolve extensions in
node_modules(#4053)The
--resolve-extensions=option lets you specify the order in which to try resolving implicit file extensions. For complicated reasons, esbuild reorders TypeScript file extensions after JavaScript ones inside ofnode_modulesso that JavaScript source code is always preferred to TypeScript source code inside of dependencies. However, this reordering had a bug that could accidentally change the relative order of TypeScript file extensions if one of them was a prefix of the other. That bug has been fixed in this release. You can see the issue for details. -
Better minification of statically-determined
switchcases (#4028)With this release, esbuild will now try to trim unused code within
switchstatements when the test expression andcaseexpressions are primitive literals. This can arise when the test expression is an identifier that is substituted for a primitive literal at compile time. For example:// Original code switch (MODE) { case 'dev': installDevToolsConsole() break case 'prod': return default: throw new Error } // Old output (with --minify '--define:MODE="prod"') switch("prod"){case"dev":installDevToolsConsole();break;case"prod":return;default:throw new Error} // New output (with --minify '--define:MODE="prod"') return; -
Emit
/* @​__KEY__ */for string literals derived from property names (#4034)Property name mangling is an advanced feature that shortens certain property names for better minification (I say "advanced feature" because it's very easy to break your code with it). Sometimes you need to store a property name in a string, such as
obj.get('foo')instead ofobj.foo. JavaScript minifiers such as esbuild and Terser have a convention where a/* @​__KEY__ */comment before the string makes it behave like a property name. Soobj.get(/* @​__KEY__ */ 'foo')allows the contents of the string'foo'to be shortened.However, esbuild sometimes itself generates string literals containing property names when transforming code, such as when lowering class fields to ES6 or when transforming TypeScript decorators. Previously esbuild didn't generate its own
/* @​__KEY__ */comments in this case, which means that minifying your code by running esbuild again on its own output wouldn't work correctly (this does not affect people that both minify and transform their code in a single step).With this release, esbuild will now generate
/* @​__KEY__ */comments for property names in generated string literals. To avoid lots of unnecessary output for people that don't use this advanced feature, the generated comments will only be present when the feature is active. If you want to generate the comments but not actually mangle any property names, you can use a flag that has no effect such as--reserve-props=., which tells esbuild to not mangle any property names (but still activates this feature). -
The
textloader now strips the UTF-8 BOM if present (#3935)Some software (such as Notepad on Windows) can create text files that start with the three bytes
0xEF 0xBB 0xBF, which is referred to as the "byte order mark". This prefix is intended to be removed before using the text. Previously esbuild'stextloader included this byte sequence in the string, which turns into a prefix of\uFEFFin a JavaScript string when decoded from UTF-8. With this release, esbuild'stextloader will now remove these bytes when they occur at the start of the file. -
Omit legal comment output files when empty (#3670)
Previously configuring esbuild with
--legal-comment=externalor--legal-comment=linkedwould always generate a.LEGAL.txtoutput file even if it was empty. Starting with this release, esbuild will now only do this if the file will be non-empty. This should result in a more organized output directory in some cases. -
Update Go from 1.23.1 to 1.23.5 (#4056, #4057)
This should have no effect on existing code as this version change does not change Go's operating system support. It may remove certain reports from vulnerability scanners that detect which version of the Go compiler esbuild uses.
This PR was contributed by @MikeWillCook.
-
Allow passing a port of 0 to the development server (#3692)
Unix sockets interpret a port of 0 to mean "pick a random unused port in the ephemeral port range". However, esbuild's default behavior when the port is not specified is to pick the first unused port starting from 8000 and upward. This is more convenient because port 8000 is typically free, so you can for example restart the development server and reload your app in the browser without needing to change the port in the URL. Since esbuild is written in Go (which does not have optional fields like JavaScript), not specifying the port in Go means it defaults to 0, so previously passing a port of 0 to esbuild caused port 8000 to be picked.
Starting with this release, passing a port of 0 to esbuild when using the CLI or the JS API will now pass port 0 to the OS, which will pick a random ephemeral port. To make this possible, the
Portoption in the Go API has been changed fromuint16toint(to allow for additional sentinel values) and passing a port of -1 in Go now picks a random port. Both the CLI and JS APIs now remap an explicitly-provided port of 0 into -1 for the internal Go API.Another option would have been to change
Portin Go fromuint16to*uint16(Go's closest equivalent ofnumber | undefined). However, that would make the common case of providing an explicit port in Go very awkward as Go doesn't support taking the address of integer constants. This tradeoff isn't worth it as picking a random ephemeral port is a rare use case. So the CLI and JS APIs should now match standard Unix behavior when the port is 0, but you need to use -1 instead with Go API. -
Minification now avoids inlining constants with direct
eval(#4055)Direct
evalcan be used to introduce a new variable like this:const variable = false ;(function () { eval("var variable = true") console.log(variable) })()Previously esbuild inlined
variablehere (which becamefalse), which changed the behavior of the code. This inlining is now avoided, but please keep in mind that directevalbreaks many assumptions that JavaScript tools hold about normal code (especially when bundling) and I do not recommend using it. There are usually better alternatives that have a more localized impact on your code. You can read more about this here: https://esbuild.github.io/link/direct-eval/
v0.24.2
-
Fix regression with
--defineandimport.meta(#4010, #4012, #4013)The previous change in version 0.24.1 to use a more expression-like parser for
definevalues to allow quoted property names introduced a regression that removed the ability to use--define:import.meta=.... Even thoughimportis normally a keyword that can't be used as an identifier, ES modules special-case theimport.metaexpression to behave like an identifier anyway. This change fixes the regression.This fix was contributed by @sapphi-red.
v0.24.1
-
Allow
es2024as a target intsconfig.json(#4004)TypeScript recently added
es2024as a compilation target, so esbuild now supports this in thetargetfield oftsconfig.jsonfiles, such as in the following configuration file:{ "compilerOptions": { "target": "ES2024" } }As a reminder, the only thing that esbuild uses this field for is determining whether or not to use legacy TypeScript behavior for class fields. You can read more in the documentation.
This fix was contributed by @billyjanitsch.
-
Allow automatic semicolon insertion after
get/setThis change fixes a grammar bug in the parser that incorrectly treated the following code as a syntax error:
class Foo { get *x() {} set *y() {} }The above code will be considered valid starting with this release. This change to esbuild follows a similar change to TypeScript which will allow this syntax starting with TypeScript 5.7.
-
Allow quoted property names in
--defineand--pure(#4008)The
defineandpureAPI options now accept identifier expressions containing quoted property names. Previously all identifiers in the identifier expression had to be bare identifiers. This change now makes--defineand--pureconsistent with--global-name, which already supported quoted property names. For example, the following is now possible:// The following code now transforms to "return true;\n" console.log(esbuild.transformSync( `return process.env['SOME-TEST-VAR']`, { define: { 'process.env["SOME-TEST-VAR"]': 'true' } }, ))Note that if you're passing values like this on the command line using esbuild's
--defineflag, then you'll need to know how to escape quote characters for your shell. You may find esbuild's JavaScript API more ergonomic and portable than writing shell code. -
Minify empty
try/catch/finallyblocks (#4003)With this release, esbuild will now attempt to minify empty
tryblocks:// Original code try {} catch { foo() } finally { bar() } // Old output (with --minify) try{}catch{foo()}finally{bar()} // New output (with --minify) bar();This can sometimes expose additional minification opportunities.
-
Include
entryPointmetadata for thecopyloader (#3985)Almost all entry points already include a
entryPointfield in theoutputsmap in esbuild's build metadata. However, this wasn't the case for thecopyloader as that loader is a special-case that doesn't behave like other loaders. This release adds theentryPointfield in this case. -
Source mappings may now contain
nullentries (#3310, #3878)With this change, sources that result in an empty source map may now emit a
nullsource mapping (i.e. one with a generated position but without a source index or original position). This change improves source map accuracy by fixing a problem where minified code from a source without any source mappings could potentially still be associated with a mapping from another source file earlier in the generated output on the same minified line. It manifests as nonsensical files in source mapped stack traces. Now thenullmapping "resets" the source map so that any lookups into the minified code without any mappings resolves tonull(which appears as the output file in stack traces) instead of the incorrect source file.This change shouldn't affect anything in most situations. I'm only mentioning it in the release notes in case it introduces a bug with source mapping. It's part of a work-in-progress future feature that will let you omit certain unimportant files from the generated source map to reduce source map size.
-
Avoid using the parent directory name for determinism (#3998)
To make generated code more readable, esbuild includes the name of the source file when generating certain variable names within the file. Specifically bundling a CommonJS file generates a variable to store the lazily-evaluated module initializer. However, if a file is named
index.js(or with a different extension), esbuild will use the name of the parent directory instead for a better name (since many packages have files all namedindex.jsbut have unique directory names).This is problematic when the bundle entry point is named
index.jsand the parent directory name is non-deterministic (e.g. a temporary directory created by a build script). To avoid non-determinism in esbuild's output, esbuild will now useindexinstead of the parent directory in this case. Specifically this will happen if the parent directory is equal to esbuild'soutbaseAPI option, which defaults to the lowest common ancestor of all user-specified entry point paths. -
Experimental support for esbuild on NetBSD (#3974)
With this release, esbuild now has a published binary executable for NetBSD in the
@esbuild/netbsd-arm64npm package, and esbuild's installer has been modified to attempt to use it when on NetBSD. Hopefully this makes installing esbuild via npm work on NetBSD. This change was contributed by @bsiegert.⚠️ Note: NetBSD is not one of Node's supported platforms, so installing esbuild may or may not work on NetBSD depending on how Node has been patched. This is not a problem with esbuild. ⚠️
v0.24.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of esbuild in your package.json file (recommended) or be using a version range syntax that only accepts patch upgrades such as ^0.23.0 or ~0.23.0. See npm's documentation about semver for more information.
-
Drop support for older platforms (#3902)
This release drops support for the following operating system:
- macOS 10.15 Catalina
This is because the Go programming language dropped support for this operating system version in Go 1.23, and this release updates esbuild from Go 1.22 to Go 1.23. Go 1.23 now requires macOS 11 Big Sur or later.
Note that this only affects the binary esbuild executables that are published to the esbuild npm package. It's still possible to compile esbuild's source code for these older operating systems. If you need to, you can compile esbuild for yourself using an older version of the Go compiler (before Go version 1.23). That might look something like this:
git clone https://github.com/evanw/esbuild.git cd esbuild go build ./cmd/esbuild ./esbuild --version -
Fix class field decorators in TypeScript if
useDefineForClassFieldsisfalse(#3913)Setting the
useDefineForClassFieldsflag tofalseintsconfig.jsonmeans class fields use the legacy TypeScript behavior instead of the standard JavaScript behavior. Specifically they use assign semantics instead of define semantics (e.g. setters are triggered) and fields without an initializer are not initialized at all. However, when this legacy behavior is combined with standard JavaScript decorators, TypeScript switches to always initializing all fields, even those without initializers. Previously esbuild incorrectly continued to omit field initializers for this edge case. These field initializers in this case should now be emitted starting with this release. -
Avoid incorrect cycle warning with
tsconfig.jsonmultiple inheritance (#3898)TypeScript 5.0 introduced multiple inheritance for
tsconfig.jsonfiles whereextendscan be an array of file paths. Previously esbuild would incorrectly treat files encountered more than once when processing separate subtrees of the multiple inheritance hierarchy as an inheritance cycle. With this release,tsconfig.jsonfiles containing this edge case should work correctly without generating a warning. -
Handle Yarn Plug'n'Play stack overflow with
tsconfig.json(#3915)Previously a
tsconfig.jsonfile thatextendsanother file in a package with anexportsmap could cause a stack overflow when Yarn's Plug'n'Play resolution was active. This edge case should work now starting with this release. -
Work around more issues with Deno 1.31+ (#3917)
This version of Deno broke the
stdinandstdoutproperties on command objects for inherited streams, which matters when you run esbuild's Deno module as the entry point (i.e. whenimport.meta.mainistrue). Previously esbuild would crash in Deno 1.31+ if you ran esbuild like that. This should be fixed starting with this release.This fix was contributed by @Joshix-1.
v0.23.1
-
Allow using the
node:import prefix withes*targets (#3821)The
node:prefix on imports is an alternate way to import built-in node modules. For example,import fs from "fs"can also be writtenimport fs from "node:fs". This only works with certain newer versions of node, so esbuild removes it when you target older versions of node such as with--target=node14so that your code still works. With the way esbuild's platform-specific feature compatibility table works, this was added by saying that only newer versions of node support this feature. However, that means that a target such as--target=node18,es2022removes thenode:prefix because none of thees*targets are known to support this feature. This release adds the support for thenode:flag to esbuild's internal compatibility table fores*to allow you to use compound targets like this:// Original code import fs from 'node:fs' fs.open // Old output (with --bundle --format=esm --platform=node --target=node18,es2022) import fs from "fs"; fs.open; // New output (with --bundle --format=esm --platform=node --target=node18,es2022) import fs from "node:fs"; fs.open; -
Fix a panic when using the CLI with invalid build flags if
--analyzeis present (#3834)Previously esbuild's CLI could crash if it was invoked with flags that aren't valid for a "build" API call and the
--analyzeflag is present. This was caused by esbuild's internals attempting to add a Go plugin (which is how--analyzeis implemented) to a null build object. The panic has been fixed in this release. -
Fix incorrect location of certain error messages (#3845)
This release fixes a regression that caused certain errors relating to variable declarations to be reported at an incorrect location. The regression was introduced in version 0.18.7 of esbuild.
-
Print comments before case clauses in switch statements (#3838)
With this release, esbuild will attempt to print comments that come before case clauses in switch statements. This is similar to what esbuild already does for comments inside of certain types of expressions. Note that these types of comments are not printed if minification is enabled (specifically whitespace minification).
-
Fix a memory leak with
pluginData(#3825)With this release, the build context's internal
pluginDatacache will now be cleared when starting a new build. This should fix a leak of memory from plugins that returnpluginDataobjects fromonResolveand/oronLoadcallbacks.
MohammadYounes/rtlcss (rtlcss)
v4.3.0
- Return an error code when the parsed CSS
stdinis invalid. Thanks @lade-odoo
sass/dart-sass (sass)
v1.85.1
- Fix a bug where global Sass functions whose names overlap with CSS math
functions could incorrectly be treated as CSS math functions even though they
used Sass-only features, causing compilation failures. For example,
round(-$var / 2)previously threw an error but now works as intended.
v1.85.0
- No longer fully trim redundant selectors generated by
@extend. This caused unacceptable performance issues for certain heavy users of@extend. We'll try to find a more performant way to accomplish it in the future.
v1.84.0
-
Allow newlines in whitespace in the indented syntax.
-
Potentially breaking bug fix: Selectors with unmatched brackets now always produce a parser error. Previously, some edge cases like
[foo#{"]:is(bar"}) {a: b}would compile without error, but this was an unintentional bug. -
Fix a bug in which various Color Level 4 functions weren't allowed in plain CSS.
-
Fix the error message for
@extendwithout a selector and possibly other parsing edge-cases in contexts that allow interpolation.
Embedded Host
- Fixed the implementation of the
SassBooleantype to adhere to the spec, now using a class instead of an interface.
v1.83.4
- No user-visible changes.
v1.83.3
- No user-visible changes.
v1.83.2
-
Properly display deprecation IDs for the JS Sass API.
-
Don't display deprecation IDs for user-defined deprecations.
v1.83.1
-
Fix a bug where
--quiet-depswould get deactivated for@contentblocks, even when those blocks were entirely contained within dependencies. -
Include deprecation IDs in deprecation warnings to make it easier to determine what to pass to
--silence-deprecationor--fatal-deprecation.
v1.83.0
- Allow trailing commas in all argument and parameter lists.
v1.82.0
Command-Line Interface
-
Improve
--watchmode reliability when making multiple changes at once, such as checking out a different Git branch. -
Parse the
calc-size()function as a calculation now that it's supported in some browsers.
Dart API
- Add a
SassCalculation.calcSize()function.
v1.81.1
- No user-visible changes.
v1.81.0
-
Fix a few cases where deprecation warnings weren't being emitted for global built-in functions whose names overlap with CSS calculations.
-
Add support for the CSS
round()calculation with a single argument, as long as that argument might be a unitless number.
v1.80.7
Embedded Host
- Don't treat
0asundefinedfor thegreenandbluechannels in theLegacyColorconstructor.
v1.80.6
Command-Line Interface
- Make
@parcel/watcheran optional dependency so this can still be installed on operating systems where it's unavailable.
v1.80.5
Embedded Host
- Don't produce phantom
@importdeprecations when using an importer with the legacy API.
v1.80.4
- No user-visible changes.
v1.80.3
-
Fix a bug where
@import url("...")would crash in plain CSS files. -
Improve consistency of how warnings are emitted by different parts of the compiler. This should result in minimal user-visible changes, but different types of warnings should now respond more reliably to flags like
--quiet,--verbose, and--silence-deprecation.
v1.80.2
- Fix a bug where deprecation warnings were incorrectly emitted for the
plain-CSS
invert()function.
v1.80.1
- Fix a bug where repeated deprecation warnings were not automatically limited.
v1.80.0
@importis now officially deprecated, as are global built-in functions that are available within built-in modules. See the Sass blog post for more details on the deprecation process.
Embedded Host
- Fix an error that would sometimes occur when deprecation warnings were emitted when using a custom importer with the legacy API.
v1.79.6
-
Fix a bug where Sass would add an extra
*/after loud comments with whitespace after an explicit*/in the indented syntax. -
Potentially breaking bug fix: Adding text after an explicit
*/in the indented syntax is now an error, rather than silently generating invalid CSS.
Embedded Host
- Properly export the
SassBooleantype.
v1.79.5
-
Changes to how
selector.unify()and@extendcombine selectors:-
The relative order of pseudo-classes (like
:hover) and pseudo-elements (like::before) within each original selector is now preserved when they're combined. -
Pseudo selectors are now consistently placed at the end of the combined selector, regardless of which selector they came from. Previously, this reordering only applied to pseudo-selectors in the second selector.
-
-
Tweak the color transformation matrices for OKLab and OKLCH to match the newer, more accurate values in the CSS spec.
-
Fix a slight inaccuracy case when converting to
srgb-linearanddisplay-p3. -
Potentially breaking bug fix:
math.unit()now wraps multiple denominator units in parentheses. For example,px/(em*em)instead ofpx/em*em.
Command-Line Interface
- Use
@parcel/watcherto watch the filesystem when running from JavaScript and not using--poll. This should mitigate more frequent failures users have been seeing since version 4.0.0 of Chokidar, our previous watching tool, was released.
JS API
- Fix
SassColor.interpolate()to allow an undefinedoptionsparameter, as the types indicate.
Embedded Sass
- Properly pass missing color channel values to and from custom functions.
v1.79.4
JS API
- Fix a bug where passing
greenorbluetocolor.change()for legacy colors would fail.
v1.79.3
- Update the
$channelparameter in the suggested replacement forcolor.red(),color.green(),color.blue(),color.hue(),color.saturation(),color.lightness(),color.whiteness(), andcolor.blackness()to use a quoted string.
v1.79.2
-
Add a
$spaceparameter to the suggested replacement forcolor.red(),color.green(),color.blue(),color.hue(),color.saturation(),color.lightness(),color.whiteness(), andcolor.blackness(). -
Update deprecation warnings for the legacy JS API to include a link to relevant documentation.
v1.79.1
- No user-visible changes.
v1.79.0
-
Breaking change: Passing a number with unit
%to the$alphaparameter ofcolor.change(),color.adjust(),change-color(), andadjust-color()is now interpreted as a percentage, instead of ignoring the unit. For example,color.change(red, $alpha: 50%)now returnsrgb(255 0 0 / 0.5). -
Potentially breaking compatibility fix: Sass no longer rounds RGB channels to the nearest integer. This means that, for example,
rgb(0 0 1) != rgb(0 0 0.6). This matches the latest version of the CSS spec and browser behavior. -
Potentially breaking compatibility fix: Passing large positive or negative values to
color.adjust()can now cause a color's channels to go outside that color's gamut. In most cases this will currently be clipped by the browser and end up showing the same color as before, but once browsers implement gamut mapping it may produce a different result. -
Add support for CSS Color Level 4 color spaces. Each color value now tracks its color space along with the values of each channel in that color space. There are two general principles to keep in mind when dealing with new color spaces:
-
With the exception of legacy color spaces (
rgb,hsl, andhwb), colors will always be emitted in the color space they were defined in unless they're explicitly converted. -
The
color.to-space()function is the only way to convert a color to another color space. Some built-in functions may do operations in a different color space, but they'll always convert back to the original space afterwards.
-
-
rgbcolors can now have non-integer channels and channels outside the normal gamut of 0-255. These colors are always emitted using thergb()syntax so that modern browsers that are being displayed on wide-gamut devices can display the most accurate color possible. -
Add support for all the new color syntax defined in Color Level 4, including:
oklab(),oklch(),lab(), andlch()functions;- a top-level
hwb()function that matches the space-separated CSS syntax; - and a
color()function that supports thesrgb,srgb-linear,display-p3,a98-rgb,prophoto-rgb,rec2020,xyz,xyz-d50, andxyz-d65color spaces.
-
Add new functions for working with color spaces:
-
color.to-space($color, $space)converts$colorto the given$space. In most cases this conversion is lossless—the color may end up out-of-gamut for the destination color space, but browsers will generally display it as best they can regardless. However, thehslandhwbspaces can't represent out-of-gamut colors and so will be clamped. -
color.channel($color, $channel, $space: null)returns the value of the given$channelin$color, after converting it to$spaceif necessary. It should be used instead of the old channel-specific functions such ascolor.red()andcolor.hue(). -
color.same($color1, $color2)returns whether two colors represent the same color even across color spaces. It differs from$color1 == $color2because==never consider colors in different (non-legacy) spaces as equal. -
color.is-in-gamut($color, $space: null)returns whether$coloris in-gamut for its color space (or$spaceif it's passed). -
color.to-gamut($color, $space: null)returns$colorconstrained to its space's gamut (or to$space's gamut, if passed). This is generally not recommended since even older browsers will display out-of-gamut colors as best they can, but it may be necessary in some cases. -
color.space($color): Returns the name of$color's color space. -
color.is-legacy($color): Returns whether$coloris in a legacy color space (rgb,hsl, orhwb). -
color.is-powerless($color, $channel, $space: null): Returns whether the given$channelof$coloris powerless in$space(or its own color space). A channel is "powerless" if its value doesn't affect the way the color is displayed, such as hue for a color with 0 chroma. -
color.is-missing($color, $channel): Returns whether$channel's value is missing in$color. Missing channels can be explicitly specified using the special valuenoneand can appear automatically whencolor.to-space()returns a color with a powerless channel. Missing channels are usually treated as 0, except when interpolating between two colors and incolor.mix()where they're treated as the same value as the other color.
-
-
Update existing functions to support color spaces:
-
hsl()andcolor.hwb()no longer forbid out-of-bounds values. Instead, they follow the CSS spec by clamping them to within the allowed range. -
color.change(),color.adjust(), andcolor.scale()now support all channels of all color spaces. However, if you want to modify a channel that's not in$color's own color space, you have to explicitly specify the space with the$spaceparameter. (For backwards-compatibility, this doesn't apply to legacy channels of legacy colors—for example, you can still adjust anrgbcolor's saturation without passing$space: hsl). -
color.mix()andcolor.invert()now support the standard CSS algorithm for interpolating between two colors (the same one that's used for gradients and animations). To use this, pass the color space to use for interpolation to the$methodparameter. For polar color spaces likehslandoklch, this parameter also allows you to specify how hue interpolation is handled. -
color.complement()now supports a$spaceparameter that indicates which color space should be used to take the complement. -
color.grayscale()now operates in theoklchspace for non-legacy colors. -
color.ie-hex-str()now automatically converts its color to thergbspace and gamut-maps it so that it can continue to take colors from any color space.
-
-
The following functions are now deprecated, and uses should be replaced with the new color-space-aware functions defined above:
-
The
color.red(),color.green(),color.blue(),color.hue(),color.saturation(),color.lightness(),color.whiteness(), andcolor.blackness()functions, as well as their global counterparts, should be replaced with calls tocolor.channel(). -
The global
adjust-hue(),saturate(),desaturate(),lighten(),darken(),transaprentize(),fade-out(),opacify(), andfade-in()functions should be replaced bycolor.adjust()orcolor.scale().
-
-
Add a
global-builtinfuture deprecation, which can be opted-into with the--future-deprecationflag or thefutureDeprecationsoption in the JS or Dart API. This emits warnings when any global built-in functions that are now available insass:modules are called. It will become active by default in an upcoming release alongside the@importdeprecation.
Dart API
-
Added a
ColorSpaceclass which represents the various color spaces defined in the CSS spec. -
Added
SassColor.spacewhich returns a color's color space. -
Added
SassColor.channelsand.channelsOrNullwhich returns a list of channel values, with missing channels converted to 0 or exposed as null, respectively. -
Added
SassColor.isLegacy,.isInGamut,.channel(),.isChannelMissing(),.isChannelPowerless(),.toSpace(),.toGamut(),.changeChannels(), and.interpolate()which do the same thing as the Sass functions of the corresponding names. -
SassColor.rgb()now allows out-of-bounds and non-integer arguments. -
SassColor.hsl()and.hwb()now allow out-of-bounds arguments. -
Added
SassColor.hwb(),.srgb(),.srgbLinear(),.displayP3(),.a98Rgb(),.prophotoRgb(),.rec2020(),.xyzD50(),.xyzD65(),.lab(),.lch(),.oklab(),.oklch(), and.forSpace()constructors. -
Deprecated
SassColor.red,.green,.blue,.hue,.saturation,.lightness,.whiteness, and.blacknessin favor ofSassColor.channel(). -
Deprecated
SassColor.changeRgb(),.changeHsl(), and.changeHwb()in favor ofSassColor.changeChannels(). -
Added
SassNumber.convertValueToUnit()as a shorthand forSassNumber.convertValue()with a single numerator. -
Added
InterpolationMethodandHueInterpolationMethodwhich collectively represent the method to use to interpolate two colors.
JS API
-
While the legacy API has been deprecated since we released the modern API, we now emit warnings when the legacy API is used to make sure users are aware that it will be removed in Dart Sass 2.0.0. In the meantime, you can silence these warnings by passing
legacy-js-apiinsilenceDeprecationswhen using the legacy API. -
Modify
SassColorto accept a newspaceoption, with support for all the new color spaces defined in Color Level 4. -
Add
SassColor.spacewhich returns a color's color space. -
Add
SassColor.channelsand.channelsOrNullwhich returns a list of channel values, with missing channels converted to 0 or exposed as null, respectively. -
Add
SassColor.isLegacy,.isInGamut(),.channel(),.isChannelMissing(),.isChannelPowerless(),.toSpace(),.toGamut(),.change(), and.interpolate()which do the same thing as the Sass functions of the corresponding names. -
Deprecate
SassColor.red,.green,.blue,.hue,.saturation,.lightness,.whiteness, and.blacknessin favor ofSassColor.channel().
Embedded Sass
-
Add
ColorSassScript value, with support for all the new color spaces defined in Color Level 4. -
Remove
RgbColor,HslColorandHwbColorSassScript values.
v1.78.0
-
The
meta.feature-existsfunction is now deprecated. This deprecation is namedfeature-exists. -
Fix a crash when using
@at-rootwithout any queries or children in the indented syntax.
JS API
-
Backport the deprecation options (
fatalDeprecations,futureDeprecations, andsilenceDeprecations) to the legacy JS API. The legacy JS API is itself deprecated, and you should move off of it if possible, but this will allow users of bundlers and other tools that are still using the legacy API to still control deprecation warnings. -
Fix a bug where accessing
SourceSpan.urlwould crash when a relative URL was passed to the Sass API.
Embedded Sass
-
Explicitly expose a
sassexecutable from thesass-embeddednpm package. This was intended to be included in 1.63.0, but due to the way platform-specific dependency executables are installed it did not work as intended. Now users can runnpx sassfor local installs or justsasswhensass-embeddedis installed globally. -
Add linux-riscv64, linux-musl-riscv64, and android-riscv64 support for the
sass-embeddednpm package. -
Fix an edge case where the Dart VM could hang when shutting down when requests were in flight.
-
Fix a race condition where the embedded host could fail to shut down if it was closed around the same time a new compilation was started.
-
Fix a bug where parse-time deprecation warnings could not be controlled by the deprecation options in some circumstances.
Configuration
📅 Schedule: Branch creation - "on the first day of the month" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- [ ] If you want to rebase/retry this PR, check this box
disabled