# `nodejs-semver` Release Changelog
<a name="7.0.0"></a>
## 7.0.0 (2026-09-25)
### Bug Fixes
* **range:** compound ranges no longer silently drop tokens that the fast parser rejects but loose parsing accepts; `^1.0.0 v1.2.3` now yields `>=1.0.0 <2.0.0-0||1.2.3` instead of discarding `v1.2.3` ([fbd593c](https://github.com/cijiugechu/nodejs-semver/commit/fbd593c10858120270875459bb2f8aa5f7f4ca62))
* **range:** `||` disjunctions following a comparator set are no longer parsed twice ([fbd593c](https://github.com/cijiugechu/nodejs-semver/commit/fbd593c10858120270875459bb2f8aa5f7f4ca62))
### Performance
* **parser:** share number, identifier, and whitespace scanning across the fast and loose parsers; remove the garbage-token fallback stage and make loose parsing allocate only when a range actually spans multiple `||` branches ([fbd593c](https://github.com/cijiugechu/nodejs-semver/commit/fbd593c10858120270875459bb2f8aa5f7f4ca62))
### **BREAKING CHANGE**
All parsers now use a single whitespace definition matching JavaScript's `\s` ([fbd593c](https://github.com/cijiugechu/nodejs-semver/commit/fbd593c10858120270875459bb2f8aa5f7f4ca62)).
`Range::parse` trims leading and trailing whitespace before parsing, so inputs such as `" <v 1"` or `"<v 1 "` no longer change meaning based on edge whitespace. Non-space whitespace now also acts as a token separator, so `"foo\n1.2.3-beta"` parses as `1.2.3-beta` instead of failing.
Loose parsing keeps tokens it accepts even when the fast parser cannot handle them, and tilde ranges accept `~1.x.3` with a prerelease suffix to match the fast parser.
Callers relying on the exact set of accepted or rejected inputs, or on the displayed form of parsed ranges for inputs containing unusual whitespace or mixed loose and strict tokens, may observe different results.
<a name="6.0.0"></a>
## 6.0.0 (2026-09-19)
### Bug Fixes
* **range:** fix a stack overflow when the short range scanner mistook `|}` for `||` and recursively parsed the same input ([8b0b01c](https://github.com/cijiugechu/nodejs-semver/commit/8b0b01c96809f77f936b276d5af835c6181a2bb9))
### Performance
* **range:** avoid unnecessary trimming and scans for empty ranges on common inputs, while preserving Unicode whitespace handling ([e89e11d](https://github.com/cijiugechu/nodejs-semver/commit/e89e11df6ec2a6629e08f8cda7ca8c8a30cab123))
* **parser:** replace the parser-combinator fallback with dedicated handwritten parsing while preserving existing fast paths and loose parsing behavior; avoid allocating input strings for parse errors ([8b0b01c](https://github.com/cijiugechu/nodejs-semver/commit/8b0b01c96809f77f936b276d5af835c6181a2bb9))
### Miscellaneous Tasks
* **deps:** remove `winnow`, `miette`, and `bytecount` ([8b0b01c](https://github.com/cijiugechu/nodejs-semver/commit/8b0b01c96809f77f936b276d5af835c6181a2bb9))
* **test:** add loose parsing compatibility fixtures and regression tests, and extend fuzzing to include Unicode and control characters ([8b0b01c](https://github.com/cijiugechu/nodejs-semver/commit/8b0b01c96809f77f936b276d5af835c6181a2bb9))
* **bench:** expand coverage of version and range fallback parsing and invalid inputs ([8b0b01c](https://github.com/cijiugechu/nodejs-semver/commit/8b0b01c96809f77f936b276d5af835c6181a2bb9))
### **BREAKING CHANGE**
`SemverError` is now a lightweight error without detailed diagnostics ([8b0b01c](https://github.com/cijiugechu/nodejs-semver/commit/8b0b01c96809f77f936b276d5af835c6181a2bb9)).
The following diagnostic APIs have been removed:
* `SemverErrorKind`.
* The `SemverError::input()`, `span()`, `offset()`, `location()`, and `kind()` accessors.
* The `miette::Diagnostic` implementation.
Detailed error messages are replaced by the fixed message `Invalid semantic version or range`. Callers that previously inspected error kinds or source locations should handle `SemverError` as a generic parse failure and retain the original input themselves if needed.
`Version::parse` and `Range::parse` still return `Result<_, SemverError>`. `FromStr`, `Display`, and `std::error::Error` remain supported, so callers using `?`, `is_err()`, or standard error propagation can keep their existing handling.
<a name="5.0.0"></a>
## 5.0.0 (2026-06-20)
### Features
* **version:** add `VersionParts` and `Version::into_parts()` for moving owned version components out without cloning ([8a7014f](https://github.com/cijiugechu/nodejs-semver/commit/8a7014fbd1fe244e8970c05e76232df6e2871849))
* **range:** improve npm compatibility coverage for wildcard, hyphen, prerelease, and disjunction ranges ([4bce182](https://github.com/cijiugechu/nodejs-semver/commit/4bce182f5df287c117e0fc9edf3e69ee747c6c12))
### Performance
* **version:** add a fast path for common `Version::parse` inputs ([2764904](https://github.com/cijiugechu/nodejs-semver/commit/27649049dad315de3755582ea0011c6e015838eb))
* **range:** add fast paths for common range parsing cases, including exact, comparator, wildcard, tilde, and fallback attempts ([413660e](https://github.com/cijiugechu/nodejs-semver/commit/413660ee971d3e88ce1bfb3e5c6be1e5d390aee8), [786b864](https://github.com/cijiugechu/nodejs-semver/commit/786b864d3507c9db188084df5dfea01f2b7a6669), [6bcc483](https://github.com/cijiugechu/nodejs-semver/commit/6bcc483e6653092240d9b46f9196432c846b5aca))
* **layout:** compact `Version` and common single-range storage to reduce allocation and improve parse-heavy workloads ([2471252](https://github.com/cijiugechu/nodejs-semver/commit/2471252313f6fec692232143f62c39ea8f02e898), [439cb1e](https://github.com/cijiugechu/nodejs-semver/commit/439cb1e25646a6e8d59d9fdb00f8f2e8205964f5))
Benchmarked with `cargo bench --bench parser`, using the same benchmark suite for `v4.2.0` and `5.0.0`. Values are Criterion slope estimates from the same machine.
| `Version::parse("1.2.3")` | 60.52 ns | 4.86 ns | 12.46x |
| `Version::parse("1.2.3-rc.4+build.7")` | 109.02 ns | 65.00 ns | 1.68x |
| `Range::parse("1.2.3")` | 333.84 ns | 35.91 ns | 9.30x |
| `Range::parse(">=1.2.3 <2.0.0")` | 464.21 ns | 103.39 ns | 4.49x |
| <code>Range::parse(">=18 <20 || >=22")</code> | 584.19 ns | 261.19 ns | 2.24x |
| `Range::parse("1.x.x")` | 314.54 ns | 58.80 ns | 5.35x |
| parse and satisfy exact range | 386.88 ns | 44.45 ns | 8.70x |
| parse and satisfy wildcard range | 365.71 ns | 65.97 ns | 5.54x |
| filter version strings with current API | 774.59 ns | 221.29 ns | 3.50x |
| package-manager corpus: resolved versions | 7.97 us | 914.05 ns | 8.71x |
| package-manager corpus: specifier range parse attempts | 40.91 us | 7.39 us | 5.54x |
| package-manager corpus: version-then-range parse | 21.61 us | 5.29 us | 4.09x |
Grouped geomean speedups from the full benchmark suite: `version_parse` 4.36x, `range_parse` 4.20x, `range_parse_fallback_attempt` 3.97x, `parse_and_satisfies` 3.72x, and `package_manager_corpus` 5.01x. Already-parsed `Range::satisfies` microbenchmarks remain nanosecond-level and are mixed overall (`0.94x` geomean vs 4.2.0).
### Miscellaneous Tasks
* **bench:** expand parser benchmarks with npm-style range cases and package-manager corpus inputs ([2aef643](https://github.com/cijiugechu/nodejs-semver/commit/2aef643dc9d6504e242c4245698125c31102a33a))
* **msrv:** bump MSRV to `1.85.0` and move the crate to Rust 2024 edition ([4abc489](https://github.com/cijiugechu/nodejs-semver/commit/4abc489bb4db4b3244c89300b0d4d7bba53a104b))
### **BREAKING CHANGE**
The minimum supported Rust version is now `1.85.0`.
`Version` fields are no longer public. This lets the crate keep optimizing the internal representation without exposing layout details.
Read fields through methods:
```rust
let version = Version::parse("1.2.3-alpha.1+build.7")?;
let major = version.major();
let minor = version.minor();
let patch = version.patch();
let pre_release = version.pre_release();
let build = version.build();
```
Construct versions with `Version::new` instead of struct literals:
```rust
let version = Version::new(1, 2, 3, vec![], vec![]);
```
Move all owned components out with `into_parts()` when you previously destructured a `Version`:
```rust
use nodejs_semver::{Version, VersionParts};
let version = Version::parse("1.2.3-alpha.1+build.7")?;
let VersionParts {
major,
minor,
patch,
pre_release,
build,
} = version.into_parts();
```
If code previously mutated fields directly, build a new `Version` from updated parts with `Version::new`.
<a name="4.2.0"></a>
## 4.2.0 (2025-11-27)
### Features
* **version:** implement `inc` ([73547a1](https://github.com/cijiugechu/nodejs-semver/commit/73547a1edb25f846ee43976835e151b8c79da57b))
* **range:** implement `outside` ([eb5b36f](https://github.com/cijiugechu/nodejs-semver/commit/eb5b36f4fb4ec5a61ab2c262ddef0762482c11ed))
### Performance
* **range:** inline `outside` comparisons by specializing helpers ([e933faf](https://github.com/cijiugechu/nodejs-semver/commit/e933faf317ae61da3fc20d519f8608d2a6fc949f))
* **range:** remove unnecessary `collect()` ([6bcbbb7](https://github.com/cijiugechu/nodejs-semver/commit/6bcbbb7c6319c6de430b9ce0ad46b03e55933ac0))
### Miscellaneous Tasks
* **deps:** bump deps ([e0179f1](https://github.com/cijiugechu/nodejs-semver/commit/e0179f1949bbdb1b7561ad6df9c7f2a79632c0d7))
* **clippy:** make clippy happy ([9013a4c](https://github.com/cijiugechu/nodejs-semver/commit/9013a4cbe87ed4eafc103cac376b7a0681450f57))
* **deps:** bump `winnow` ([0185b2f](https://github.com/cijiugechu/nodejs-semver/commit/0185b2f5a9c58623db2f3b37210209cc6321c9c8))
* **deps:** bump `miette` ([7f64b85](https://github.com/cijiugechu/nodejs-semver/commit/7f64b85eb32119549ba902578d393d610f347db0))
<a name="4.1.0"></a>
## 4.1.0 (2024-11-05)
### Features
* **conversion:** implement additional traits for converting integer types to Version. ([d1b6021](https://github.com/cijiugechu/nodejs-semver/commit/d1b6021381be66f8edb8359cdc987a21945baca2))
### Bug Fixes
* **namespace:** add prefix to std to avoid namespace conflict ([02a866b](https://github.com/cijiugechu/nodejs-semver/commit/02a866b0c2a0128ff394f6624db2d906a1b9ad73))
### Performance
* **range:** boxing `BoundSet` ([#8](https://github.com/cijiugechu/nodejs-semver/pull/8))
### Miscellaneous Tasks
* **deps:** bump deps
<a name="4.0.0"></a>
## 4.0.0 (2024-03-10)
### Miscellaneous Tasks
* **winnow:** upgrade to `winnow` 0.6 ([#6](https://github.com/cijiugechu/nodejs-semver/pull/6))
* **miette:** upgrade to `miette` 7.2 ([#7](https://github.com/cijiugechu/nodejs-semver/pull/7))
### **BREAKING CHANGE**
bump MSRV to `1.70.0` ([#7](https://github.com/cijiugechu/nodejs-semver/pull/7))
<a name="3.4.0"></a>
## 3.4.0 (2024-01-06)
### Features
* **range:** add `min_version` ([14ab733](https://github.com/cijiugechu/nodejs-semver/commit/14ab73317ff2de3bd565e65c2ef5c07f8137f8bb))
<a name="3.3.1"></a>
## 3.3.1 (2023-12-19)
### Performance
* **winnow:** migrate to `winnow` ([#3](https://github.com/cijiugechu/nodejs-semver/pull/3))
<a name="3.3.0"></a>
## 3.3.0 (2023-11-30)
### Features
* **serde:** add optional feature: `serde` ([3842e9af](https://github.com/cijiugechu/nodejs-semver/commit/3842e9af9ae266a672c073063c8765a2f07dbec7))
<a name="3.2.0"></a>
## 3.2.0 (2023-10-22)
### Features
* **range:** add `max_satisfying` ([5efbeaa](https://github.com/cijiugechu/nodejs-semver/commit/5efbeaa35982d4ebc4ab1cbb393d1bba20b5b3d1)) and `min_satisfying` ([a476865](https://github.com/cijiugechu/nodejs-semver/commit/a4768658bc225e92c05862c13f59357f75d83583))
* **type:** add `ReleaseType` ([10e0caa](https://github.com/cijiugechu/nodejs-semver/commit/10e0caaa64b14d6a086a337c72c5a26ad5fa1328))
### Documentation
* **examples:** add examples ([648b45c](https://github.com/cijiugechu/nodejs-semver/commit/648b45ceed08b299455617a9bea68705e4c82861))
<a name="3.1.0"></a>
## 3.1.0 (2023-10-10)
### Miscellaneous Tasks
* **deps:** bump deps
### Features
* **diff:** add `diff` for `Version` ([1dae57fa](https://github.com/cijiugechu/nodejs-semver/commit/1dae57faa246ed8bd3207d29893f0c9c2f0bea78))
<a name="3.0.1"></a>
## 3.0.1 (2023-09-29)
### Bug Fixes
* **range:** make `<=11` work the same as in npm (#1) ([6438d9f4](https://github.com/cijiugechu/nodejs-semver/commit/6438d9f46a888b4296a665673e3361b35999979b))
<a name="3.0.0"></a>
## 3.0.0 (2023-09-06)
### **BREAKING CHANGE**
remove unnecessary `serde`([18f26b43](https://github.com/cijiugechu/nodejs-semver/commit/18f26b4305150385fb174a8c60c50a328e4998d6))
### Performance
* **vector:** initialize vector with capacity([f454c8e1](https://github.com/cijiugechu/nodejs-semver/commit/f454c8e1ad04b7b41adbb5a5aa6d8e46e694cc2f))
<a name="2.2.0"></a>
## 2.2.0 (2023-09-05)
### Miscellaneous Tasks
* **crate:** Project forked.
### Performance
* **syscall:** Reduced unnecessary cloning operations([598e3554](https://github.com/cijiugechu/nodejs-semver/commit/598e355476e19e96f7dd6dd1582d65b7fdc13221))
<a name="2.1.0"></a>
## 2.1.0 (2022-09-21)
### Features
* **format:** Include the build and prerelease when stringifying to maintain consistency (#9) ([f2b2e44c](https://github.com/felipesere/node-semver-rs/commit/f2b2e44c8dfe815c194c4f458025fbbbf418fd9f))
<a name="2.0.1"></a>
## 2.0.1 (2022-09-04)
### Bug Fixes
* **satisfies:** Fix `.satisfies` bug for higher major/minor/path pre-release versions (#8) ([ee8376e7](https://github.com/felipesere/node-semver-rs/commit/ee8376e7f060cb19829e5e0e62c1a729cf4653f8))
* **range:** handle partial `=` ranges, which was causing panics (#7) ([f0eef040](https://github.com/felipesere/node-semver-rs/commit/f0eef04032cf1fe7ed341a110897005c31e61ead))
<a name="2.0.0"></a>
## 2.0.0 (2021-09-26)
This is an almost full rewrite of the Range parser to make it work much more
closely to how the JS `node-semver` parser works. Not by using regex,
fortunately.
As such, this is potentially a pretty breaking change, but it's a breaking
change in the direction of compatibility.
Please file issues for any compatibility issues you find and we'll fix them
asap!
### Features
* **loose:** rewrite to support loose mode better (#5) ([20fb02d8](https://github.com/felipesere/node-semver-rs/commit/20fb02d882caf12439f115277ec3ca587ad1e62e))
* **BREAKING CHANGE**: This accepts (and rejects) some semver strings that
were valid before, and I'm not comfortable just calling thos e bugs. It
also vastly reduces the number of "bad" semver parses by outright throwing
out bad-looking data without warning you. This is literally what the
JavaScript node-semver does. And so...
<a name="1.0.1"></a>
## 1.0.1 (2021-09-24)
### Bug Fixes
* **api:** stop exporting anything but Range from range mod ([4eeb862d](https://github.com/felipesere/node-semver-rs/commit/4eeb862dd2d07901826c3e6d47b8c9ffe2cf90d3))
<a name="1.0.0"></a>
## 1.0.0 (2021-09-24)
### Features
* **error:** upgrade miette and change error API a bit ([82625fd3](https://github.com/felipesere/node-semver-rs/commit/82625fd37384cc24469a55e28a8c8d310e619276))
* **BREAKING CHANGE**: This changes the error API a bit. You may need to update code that handles errors by hand
* **version:** add .satisfies() method to Version ([da70b187](https://github.com/felipesere/node-semver-rs/commit/da70b1872bdd6f910d56d6b1c674d0c3dabdeaf6))