Releases: momiji-rs/sasso
0.6.1 - 2026-06-16
Release Notes
Fixed
- A relative
meta.load-cssinside a first-class mixin (captured with
meta.get-mixinand invoked viameta.apply) now resolves against the
mixin's defining file, not the caller's (issue #8). The regular
namespaced include path was already correct.
Added
- A C ABI (
ffi/,libsasso+sasso.h) — drive sasso in-process from any
language with a C FFI, with a userland importer callback. Releases now attach a
per-targetsasso-<version>-<target>-c-api.{tar.xz,zip}(prebuilt static +
dynamic library + header). See the "C ABI" section in the README.
Install sasso 0.6.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.6.1/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.6.1/sasso-installer.ps1 | iex"Download sasso 0.6.1
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.6.0 - 2026-06-15
Release Notes
Changed (breaking)
-
The
Importertrait is now dart-sass's two-phasecanonicalize/load
(issue #4, RFC indocs/IMPORTER_REDESIGN.md). It replaces the old
resolve(path) -> Option<String>plus the accretedresolve_*overloads:fn canonicalize(&self, url: &str, ctx: &CanonicalizeContext) -> Result<Option<CanonicalUrl>, ImporterError>; fn load(&self, canonical: &CanonicalUrl) -> Result<Option<ImporterResult>, ImporterError>;
canonicalizeresolves a URL to a stable identity without loading (its result
is the module-cache key);loadfetches the source as an
ImporterResult { contents, syntax, source_map_url }. Three outcomes:
Ok(Some)= handled,Ok(None)= not handled,Err(ImporterError)=
handled-but-failed (an actionable compile error rather than a silent miss).
New public types:CanonicalUrl,ImporterResult,ImporterError,
CanonicalizeContext. A clean break with no compatibility shim (pre-1.0).
FsImporterand the built-in resolution are unchanged in behavior (sass-spec
ratchet delta +0); only customImporterimplementations must migrate.
Added
ImporterResult.source_map_urllets an importer set the URL recorded for a
loaded file in generated source maps (dart-sassImporterResult.sourceMapUrl).
Install sasso 0.6.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.6.0/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.6.0/sasso-installer.ps1 | iex"Download sasso 0.6.0
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.5.3 - 2026-06-15
Release Notes
Fixed
!defaultno longer evaluates its right-hand side when the variable is
already set. dart-sass short-circuits a guarded (!default) assignment
before evaluating the RHS, so an expression that would otherwise error is
harmless once the variable already holds a non-null value; sasso evaluated the
RHS first. This surfaced in Bootstrap-on-Shopware setups where, after an
override sets$w: 1rem, a later$p: $w + .5em !defaultraised an
"incompatible units" error instead of being skipped. Thanks to
@shyim (#2).- Legacy
rgb()/hsl()preserve the caller'srgba/hslaspelling in
special-value and relative-color passthroughs. When a call can't resolve to
a concrete color (a channel or alpha is avar()/env()/non-foldable
calc()), dart-sass keeps the call and the exact function name written;
sasso normalizedrgba/hsladown torgb/hsl, breaking Bootstrap's
rgba(var(--bs-body-color-rgb), …)output. The called name is now threaded
through every passthrough, keeping dart's carve-out that anone-only call
still normalizes to the canonicalrgb/hsl(and acalc()alpha that folds
to a number resolves to a real color rather than a passthrough). Thanks to
@shyim (#3).
Install sasso 0.5.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.5.3/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.5.3/sasso-installer.ps1 | iex"Download sasso 0.5.3
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.5.2 - 2026-06-14
Release Notes
Fixed
- Expanded
@at-rootgroup-separation blank lines. dart-sass writes one
blank line at an@at-roothoist→resume boundary when the hoisted chunk ends
in a style rule, while keeping a nested-@at-rootchain and a rule + its own
bubbled@mediacontiguous. sasso previously diverged BOTH ways — it never
emitted the blank before a resumed parent rule, and it over-emitted (three
blanks between top-level bare-@at-rootsiblings, spurious blanks between a
nested-@at-rootchain's rules / between a rule and its own bubbled@media/
before an@at-rootbody's trailing comment). Now byte-exact vs dart-sass
1.101 across a dedicated 54-shape group-separation sweep, with non-@at-root
output byte-identical. Compressed output is unaffected (no blank lines).
(sass-spec does not cover these@at-root-resume blanks.)
Install sasso 0.5.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.5.2/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.5.2/sasso-installer.ps1 | iex"Download sasso 0.5.2
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.5.1 - 2026-06-14
Release Notes
Source-map fidelity + compressed-output corrections, all byte-exact vs
dart-sass 1.101.
Fixed
- Source maps:
@media/@at-root/@supportsbubbled parent selector. When
one of these at-rules nested in a style rule bubbles a copy of the enclosing
selector out (@media screen { .a { … } }), that copy now maps back to the
ORIGINAL rule's source position, matching dart-sass. It previously had no
mapping at all — which in compressed output also let the consecutive-same-
source-line coalescing drop a following declaration's mapping (a 0.5.0
regression vs 0.4.0 for@media/@at-root-bubbled rules). CSS is unchanged. - Source maps:
@supportsheader. The@supports (…)at-rule header now
maps to its@supportskeyword (as@mediaalready did); previously it had
no mapping. CSS is unchanged. - Compressed
@media/@supportswhitespace. Compressed output now omits the
space before a prelude beginning with(for@media/@supports
(@media(min-width: 1px)), and within a@mediaquery drops the space before
and/orafter a)((a)and (b)) and after the comma between queries
((a),(b)) — matching dart-sass. Other at-rules (@container) and@supports
conditions keep their spaces. (Compressed CSS output change; expanded
unchanged.)
Install sasso 0.5.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.5.1/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.5.1/sasso-installer.ps1 | iex"Download sasso 0.5.1
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.5.0 - 2026-06-14
Release Notes
Added
- wasm: source maps. The
@momiji-rs/sassopackage'scompile(scss, { sourceMap: true [, sourceMapIncludeSources: true] })now returns
{ css, sourceMap }(the v3 map as a parsed object) instead of a bare CSS
string; withoutsourceMapit still returns the string (backwards
compatible). Newsasso_compile_mapexport returns a framed[u32 css_len][css] [map json]buffer. Source maps are now exposed on every surface (lib, CLI,
wasm).
Fixed
- Compressed source maps now emit one segment per source line, matching
dart-sass (compressed packs many tokens onto a line; dart maps only the first
per source line). Expanded maps are unchanged. The map's CSS is unaffected.
Install sasso 0.5.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.5.0/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.5.0/sasso-installer.ps1 | iex"Download sasso 0.5.0
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.4.0 - 2026-06-14
Release Notes
Added
- Source map (v3) support. New
compile_with_source_map(source, &Options) -> CompileResult { css, source_map: SourceMap }, withSourceMap::to_json()
andOptions::with_source_map_include_sources(bool). The CLI gains
-o/--output <file>(write CSS to a file),--source-map(also write a
<output>.mapsidecar + append thesourceMappingURLfooter),
--embed-sources, and--source-map-urls=relative|absolute. Output is
byte-for-byte identical to dart-sass for the common cases (selector +
declaration-name mappings; expanded + compressed). The plaincompilepath
and stdout output are unchanged. (Deferred for now: declaration-value-start
mappings, the inline--embed-source-mapdata URI.)
Changed
- Internal maintainability refactors only (no behaviour change, byte-identical
output): the.sassline scanners, theis_builtinname table, and the
oversizedeval/selector/parserfiles were split into domain modules;
the string serializers gained a no-escape fast path.
Install sasso 0.4.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.4.0/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.4.0/sasso-installer.ps1 | iex"Download sasso 0.4.0
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.3.1 - 2026-06-13
Release Notes
Fixed
- Compressed output now emits a color's canonical CSS name when it is no longer
than the shortest hex, matching dart-sass (rednot#f00,aquanot
#0ff; duplicate names resolve to dart's canonical pick —cyan/grey→
aqua/gray). Expanded output (which preserves the authored spelling) is
unchanged.
Install sasso 0.3.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.3.1/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.3.1/sasso-installer.ps1 | iex"Download sasso 0.3.1
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.3.0 - 2026-06-13
Release Notes
Since 0.2.0. Conformance holds at 100% of the attempted sass-spec suite
(13,896 / 13,896) — but that suite covers valid inputs plus the errors it
expects; this cycle hardened sasso to reject the same malformed inputs
dart-sass rejects, and cut more of the @extend and value hot paths.
Changed
- Strict input validation. Beyond matching dart-sass's output, sasso now
errors — rather than silently accepting — on malformed input, each with
dart-sass's exact message: an invalid hex literal (#00000,#0g),
out-of-grammarrgb()/hsl()channel units and legacy-vs-modern argument
shapes, a duplicate@mixin/@functionparameter, a malformed number
exponent (1e-), a non-identifier@use/@forwardnamespace, a misplaced
@content/@extend, a style rule / declaration /@extendin a@function
body, a map or empty list used as a CSS value (#{(a:1)},-()), a
malformed:nth-child()An+B or empty:not()selector, a stray!in a
selector, a leading-empty@extendtarget, and a malformed@charset/
@at-root (…)query. Found by a leniency-mining sweep that diffed every
category against dart-sass; the fixes are uncovered by the spec, so the
ratchet is unchanged.
Performance
- Transitive
@extendwent from ~151× slower than dart-sass to faster
on a deep extend chain: a match pre-filter with typed dedup, an incremental
per-rule fold (killing the O(N²) closure re-derivation), borrowed
scope-originals, and cached typed selector hashes — the@extendmaps are
now FxHash + typedComplex/Simplekeys, guarded by a render-injectivity
parity proof. Byte-identical output throughout. - Reference-counted composite values —
Str/List/MapareRc-backed,
so cloning a read-only$variableis an O(1) refcount bump instead of a deep
copy (copy-on-write for the mutating builtins): ~7× fewer instructions and
~13× less peak memory when a large list/map is passed through a call chain. Cow-borrowed argument-name normalization (called 4–6× per function
call) plus trimmed function-call-path allocations — ~15% fewer instructions
on a function-heavy compile.- Arena in-place
realloc— the scoped bump arena extends its tail
allocation in place instead of stranding a dead buffer on everyVec
doubling, trimming peak memory on parse-heavy compiles. - Net: pure-compile throughput ~7.4 ms on the large benchmark (was ~9–10),
~2.3–2.9× faster thangrassand ~19–30× faster than the dart-sass JS bin.
Internal
eval.rssplit into aneval/module directory andcolor.rsinto a
color/directory (pure code moves); the typed selector model gained a
parity-proof harness; the stringly hoist markers became typedOutNode
variants; the@extendcartesian-order bool became aCartesianOrderenum;
OutNoderule/at-rule constructors collapsed duplicated construction sites.
All byte-identical, each verified base-binary-vs-refactor.
Tooling
- The WebAssembly npm package publishes via OIDC Trusted Publishing (no token).
- Benchmark harness uses portable temp-file handling (
mktemp -d).
Install sasso 0.3.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.3.0/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.3.0/sasso-installer.ps1 | iex"Download sasso 0.3.0
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
0.2.0 - 2026-06-11
Release Notes
Everything since the initial 0.1.0 crates.io publish. This grew the compiler
from an early vertical slice to 100% of the attempted official sass-spec
suite (13,896 / 13,896, zero failures — 11,405 byte-exact CSS outputs plus
2,491 error specs correctly rejected; the 8 remaining cases are tagged :todo
for dart-sass itself upstream), matching current dart-sass (1.100) byte-for-byte.
The pass is measured against a conformance harness tightened to reproduce the
official sass-spec comparator (normalizeOutput) exactly — collapse newline
runs only, no extra whitespace leniency — so the count holds under the upstream
comparator, not just a looser local one.
Added
- Byte-exact diagnostics — errors,
@error,@warn, and@debugnow
reproduce dart-sass's stderr byte-for-byte: source-span╷│╵snippets with
carets and right-aligned gutters (tab→4 spaces), aligned stack frames
(root stylesheet/name()/@import), a--no-unicodeflag, and the
@importdeprecation warning (with a per-id cap/dedup deprecation registry).
238 of the suite's 3,256 stderr expectations now match byte-for-byte (a
spec/run_spec.py --check-stderrmetric tracks it); the rest (other
deprecations, multi-span layouts) build on this foundation. @use/@forwardmodule system — built-insass:*modules and user
files,withconfiguration, namespacing,@forwardprefix/show/hide,
dash-insensitive member access, forward conflict resolution, and star
(as *) modules.- Indented
.sasssyntax — a full front-end (Options::with_syntax, the
CLI--indentedflag,.sassextension inference), including cross-syntax
@importof partials by file extension. - CSS Color 4 color spaces —
srgb/display-p3/lab/lch/oklab/
oklch/xyzviacolor(), with modern color serialization. @extendand%placeholders — a faithful port of dart-sass's
ExtensionStoreengine: registration-order extension folding, selector
weaving/unification/trimming,@use/@forwardcross-module visibility, and
the self-referential:not/:haspseudo cases — closing the suite's
@extendfamily to byte-exact parity.- Built-in function modules —
meta(first-class function references via
get-function/call, existence predicates),math(clamp/min/max/
round/logand friends),list(bracket-preservingjoin/append),
map(nested key paths,deep-merge/deep-remove),string
(split/unique-id), andselectorfunctions. - First-class mixins —
meta.get-mixinreturns a mixin value and
meta.applyinvokes it (with@contentsupport). - CLI — compile multiple input files in one process (
sasso a.scss b.scss,
startup shared across files);--loop <N>for in-process throughput and
-q/--quietto suppress stdout (used by the benchmark harness). - Benchmark harness — sasso registered as a first-class engine in
bench/;
three-way reportbench/three_way.md(sasso vs
dart-sass vs grass). CODE_OF_CONDUCT.mdadopting the
Sass Community Guidelines, as
the Sass project asks every implementation to do.- This CHANGELOG.
Changed
- Selector resolution now matches dart-sass on combinator normalization,
adjacent-compound separation, and bogus-combinator omission. colorfunctions match dart-sass strictness: channel-unit leniency in
adjust/change, missing/powerless-channel errors, the Microsoftalpha()
filter overload, andadjust-huerejecting non-legacy colors.selectorfunctions coerce string/list arguments and validate arity, and
accept a list of extendees inextend/replace.listbuiltins validate fixed-arity arguments and preserve list shape.- Unquoted string serialization collapses newlines to spaces; custom-property
values are emitted verbatim — both matching dart-sass. - Control-flow blocks use semi-global scoping with a global-write guard.
Performance
Profiling showed the compiler is allocation- and hashing-bound; a series of
hot-path cuts followed, with no behavior change (cumulative ~2× faster on the
large benchmark vs. the original, lifting the lead over grass to ~1.9–2.4× and
over dart-sass to ~16–25×):
- Selector helpers
split_commas/tokenize_complexreturn borrowed&str
slices, andcopy_name/normalize_selectoravoid their intermediate
String/Vec— no per-part/per-token/per-name heap allocation on the hot
selector-resolution path. - The compiler's internal
String-keyed maps (variable scope, function/mixin
tables, module maps) use a small inline FxHash hasher instead of std's
DoS-resistant-but-slow SipHash. (Still zero runtime dependencies.) - A scoped bump-arena allocator (
ScopedAlloc): within eachcompile()a
per-thread arena turns every allocation into a pointer bump and frees them
wholesale (reset) at the end — a further ~1.5×. It is installed as the CLI's
#[global_allocator]; library/wasm embedders can opt in the same way (it
forwards to the system allocator outside a compile, so it's safe to install
unconditionally). This is the library's one auditedunsafemodule —
verified by unit tests, Miri (no UB), AddressSanitizer, and the full sass-spec
suite run through it (zero crashes, byte-identical output); the
rest of the crate isdeny(unsafe_code). Still zero runtime dependencies. - Smaller
Value— theColorvariant's modern-color payload is boxed, so
theValueenum drops from 128 to 64 bytes (a compile-timesize_of
guard prevents regressions). Halves every scope-map slot,Vec<Value>element
and lookup clone, with byte-identical output. - Zero-dependency Ryū float formatter — a from-scratch
d2sshortest-round-
trip formatter on the float-to-string hot path, replacingcore::fmt, with a
differential fuzz test against a reference.
Tooling
- The conformance ratchet pins the sass-spec commit (
spec/SPEC_VERSION.txt)
for reproducibility, with a--latest/--canarydrift-detection mode. - The conformance harness now reproduces the official sass-spec comparator
(sass-spec/lib/test-case/compare.tsnormalizeOutput) exactly, so a "pass"
means byte-identical under the upstream comparator — no extra local leniency.
Install sasso 0.2.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/momiji-rs/sasso/releases/download/v0.2.0/sasso-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/momiji-rs/sasso/releases/download/v0.2.0/sasso-installer.ps1 | iex"Download sasso 0.2.0
| File | Platform | Checksum |
|---|---|---|
| sasso-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sasso-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sasso-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sasso-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sasso-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| sasso-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| sasso-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |