Skip to content

Compatibility

jsass 6 has no native code of its own. What runs where is decided by the JVM and by the engine you pick: the Javet native library you put on the classpath, GraalJS, which is pure Java, or the native dart-sass executable you install for the embedded engine.

Java

  • ❌ Java 8 / 11 / 17 unsupported
  • ✅ Java 21 supported — the compile target
  • ✅ Java 25 supported — the full test suite runs on it in CI

Still on Java 8 or 11? jsass 5 remains available for maintenance.

Platforms

Javet engines (V8 and Node)

Pick the artifact that matches the engine you chose and the platform you deploy to. All of them are com.caoccao.javet:<artifact>:6.0.2 on Maven Central — the same version as the javet jar jsass depends on. A native library from a different Javet release does not fit the Java side.

Platform V8 engine Node engine
Linux x86_64 javet-v8-linux-x86_64 javet-node-linux-x86_64
Linux arm64 javet-v8-linux-arm64 javet-node-linux-arm64
macOS Apple Silicon javet-v8-macos-arm64 javet-node-macos-arm64
macOS Intel javet-v8-macos-x86_64 javet-node-macos-x86_64
Windows x86_64 javet-v8-windows-x86_64 javet-node-windows-x86_64
Android javet-v8-android javet-node-android

Javet 6.0.2 ships V8 15.5 and Node.js 26.10. The legacy javet-linux-arm64 / javet-macos / javet-android-* coordinates were retired upstream after 4.0.0; use the javet-{v8,node}-<platform> ones above.

i18n variants

Each artifact also exists with an -i18n suffix. Those carry the full ICU data set, which matters for locale-aware JavaScript APIs. dart-sass does not need it, so the plain artifact is the smaller and correct default.

There is nothing to unpack or install: Javet extracts the native library from the JAR at startup. Declaring several platform artifacts side by side is fine — only the matching one is loaded.

Java modules

Javet's native jars declare an Automatic-Module-Name that is not a legal module name. On the module path they need a renamed one — see Java modules.

GraalJS engine

GraalJS needs no platform-specific jar: add org.graalvm.polyglot:js-community (UPL) or org.graalvm.polyglot:js (GraalVM Free Terms and Conditions) at runtime. jsass is built against the Polyglot API 25.4.4.1.1.

Platform GraalJS engine
Linux ✅ supported
macOS ✅ supported
Windows ❌ not yet supported — the builder fails fast with IllegalStateException; use a Javet engine (#102)

GraalJS runs on any Java 21+ JDK, but it is JIT-compiled only on a GraalVM JDK whose Graal version matches js-community. On every other JDK — Temurin, for instance — it runs in its interpreter: correct, fine for small stylesheets, but about 55× slower than V8 on a Bootstrap-sized one. The engines page has the numbers.

Embedded engine

The embedded engine runs wherever the JVM can start the dart-sass executable. dart-sass publishes releases for Linux, macOS and Windows. jsass's own tests run on Linux and macOS; Windows is untested.

Requirement Value
dart-sass 1.79.1 or newer (Embedded Sass Protocol 3.x); tested on 1.86.3
What to install a dart-sass release, not the npm package sass
Java dependencies protobuf-java (transitive), SLF4J

dart-sass 1.78.0 and older speak protocol 2 and are rejected with a message naming the version.

dart-sass

jsass does not ship dart-sass. It runs whichever copy you provide, so the supported Sass feature set is the one of that version. The embedded engine runs the native executable described above. The JavaScript engines load dart-sass's JavaScript build from one of two sources, and both work with every JavaScript engine:

  • A WebJar — the org.webjars.npm:sass WebJar on the classpath, read by WebjarModuleResolver. jsass is developed and tested against 1.86.3. This is the usual source for V8 and GraalJS.
  • node_modules/sass — installed by npm install sass or yarn add sass, read by NodeModulesResolver. No WebJar involved and no upper bound from jsass's side. This is the usual source for the Node engine.

The Node engine moves the working directory

With NodeModulesResolver, the Javet Node engine changes the JVM process's working directory to the directory of the module it loads (node_modules/sass) and leaves it there, even after close(). This is documented Javet behaviour; user.dir is not updated, so Path.toAbsolutePath() still reports the old directory while a relative path handed to a file operation resolves against the new one. Use absolute paths in code that runs alongside the Node engine. V8, GraalJS, and Node with WebjarModuleResolver are unaffected. Tracked as #101.

Sass language features

Everything dart-sass supports, because dart-sass is the compiler here: the modern module system (@use, @forward), @mixin / @include, all built-in modules, and the full modern color API including LAB, LCH, OKLAB, OKLCH and the wide-gamut spaces.

Two things behave differently from jsass 5, both inherited from dart-sass:

  • The NESTED and COMPACT output styles no longer exist. Use EXPANDED (details).
  • @import is deprecated upstream in favour of @use. It still works, and jsass exposes silenceDeprecations if the warnings get in the way.