New:Microsoft Teams Notifications Are Now Available in Socket.Learn more →
Get Started

verkit

Package Overview
Dependencies
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

verkit

Fast, zero-dependency SemVer for ESM and TypeScript, with functional, tree-shakeable APIs.

Source
npmnpm
Version
0.1.0
Version published
Weekly downloads
7.9M
4.24%
Maintainers
1
Weekly downloads
 
Created
Source

verkit

Open on npmx npm downloads Unit Test

Fast, zero-dependency SemVer for ESM and TypeScript, with functional, tree-shakeable APIs.

Features

  • ✅ Complete SemVer version and range toolkit.
  • 🚀 Faster than node-semver across tested operations.
  • 📦 Pure ESM with zero runtime dependencies.
  • 💙 First-class TypeScript declarations.
  • 🌳 Functional, tree-shakeable named exports.
  • 🔁 Mutable SemVer and SemVerRange records.
  • ⚡ 25.4% smaller for full CDN imports.
  • 🪶 59.7% smaller with common bundled imports.
  • 🛡️ Immutable collection operations.

Install

npm add verkit

Versions

import {
  coerce,
  increment,
  normalize,
  normalizeFull,
  parse,
  truncate,
} from 'verkit'

const version = parse('1.2.3-rc.1+sha.abc')
version.patch = 4

normalizeFull(version) // '1.2.4-rc.1+sha.abc'
normalize(version) // '1.2.4-rc.1'
increment(version, 'minor') // '1.3.0'
truncate(version, 'patch') // '1.2.4'
coerce('release 42.6.7.9', { rtl: true }) // '6.7.9'

Version APIs accept strings or mutable SemVer objects returned by parse. normalizeFull keeps build metadata; normalized, incremented, and truncated versions omit it.

Comparison

import { compare, compareBuild, sortReversed } from 'verkit'

compare('1.0.0+one', '1.0.0+two') // 0
compareBuild('1.0.0+one', '1.0.0+two') // -1
sortReversed(['1.0.0', '2.0.0']) // ['2.0.0', '1.0.0']

compare ignores build metadata; compareBuild uses it as a tie-breaker.

Ranges

import {
  findMaxSatisfying,
  normalizeRange,
  parseRange,
  satisfies,
} from 'verkit'

const range = parseRange('^1.2.3')

normalizeRange(range) // '>=1.2.3 <2.0.0-0'
satisfies('1.5.0', range) // true
findMaxSatisfying(['1.2.3', '1.5.0', '2.0.0'], range) // '1.5.0'

Range APIs accept strings or mutable SemVerRange objects. They support comparators, unions, hyphens, wildcards, tilde, caret, loose parsing, and prereleases.

API

See the API reference.

Invalid input behavior

parse and parseRange throw detailed TypeErrors. Their safe wrappers, tryParse and tryParseRange, return null; other safe transforms and predicates keep their documented null/false behavior.

Migrating from node-semver

Only renamed or reshaped node-semver APIs are listed; same-named functions such as clean, coerce, compare, and satisfies are omitted.

node-semververkit
SemVerparse
parsetryParse
validnormalize
inc, diffincrement, difference
major, minor, patch, prereleasegetMajor, getMinor, getPatch, getPrerelease
rcompare, compareLoose, cmpcompareReversed, compare with { loose: true }, compareWithOperator
eq, neq, gt, gte, lt, lteisEqual, isNotEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual
rsortsortReversed
rcompareIdentifierscompareIdentifiersReversed
ComparatorSemVerComparator, normalizeComparator, satisfiesComparator, comparatorsIntersect
RangeparseRange
toComparators, validRangerangeToComparators, normalizeRange
maxSatisfying, minSatisfying, minVersionfindMaxSatisfying, findMinSatisfying, findMinimumForRange
outside, gtr, ltrisOutsideRange, isGreaterThanRange, isLessThanRange
intersects, subsetrangesIntersect, isRangeSubset
RELEASE_TYPESINCREMENT_TYPES (also includes release)

valid returns a normalized string | null in node-semver, so its equivalent is normalize. Use isValid when you only need a boolean.

Use options objects such as { loose: true } and { identifier, identifierBase }.

Differences from node-semver

verkit follows node-semver semantics with three user-visible differences:

  • Array helpers never mutate their inputs.
  • verkit is ESM-only, with no CommonJS, CLI, or NODE_DEBUG=semver output.
  • Error text, stack traces, and supported runtimes may differ.

Bundle size

Full package imports, minified with Rolldown:

PackageMinifiedgzipBrotli
verkit18,385 B5,687 B5,185 B
semver24,648 B7,361 B6,708 B
verkit reduction25.4%22.7%22.7%

Common validation, range, comparison, increment, and coercion imports, tree-shaken and minified with Rolldown:

PackageMinifiedgzipBrotli
verkit10,005 B3,374 B3,072 B
semver24,801 B7,432 B6,773 B
verkit reduction59.7%54.6%54.6%

Run pnpm test:size to reproduce the comparison.

Benchmarks

Measured on a MacBook Pro with an Apple M1 Ultra and 32 GB RAM. Higher is better.

Operationverkit ops/ssemver ops/sFaster
Parse and normalize1.92M1.63Mverkit 1.18×
Compare1.60M1.13Mverkit 1.41×
Compare parsed versions12.83M5.93Mverkit 2.16×
Increment1.78M1.02Mverkit 1.76×
Coerce1.18M1.05Mverkit 1.13×
Satisfy uncached ranges0.07M0.06Mverkit 1.18×
Satisfy pre-parsed inputs5.15M2.28Mverkit 2.26×

Range benchmarks either cycle through 1,001 inputs to avoid cache hits or parse once and reuse the resulting objects.

Run runtime benchmarks with pnpm bench.

Sponsors

Sponsors

License

MIT © 2026-PRESENT Kevin Deng.

Parts of the implementation and test fixtures are derived from node-semver under the ISC license; see THIRD_PARTY_NOTICES.md.

Keywords

semver

FAQs

Package last updated on 19 Jul 2026

Related posts