Explaination of version range operators in package.json for package dependencies

  1. Basic Structure
  2. Version Range operator
    1. Basic Range
    2. Advanced Range
  3. Further Explaination on Caret Ranges ^
    1. Special interaction with Wildcard operator x
    2. Usage and Common Practices

To see the syntax and Railroad diagram version, goto here

Basic Structure

Package dependecies are a tuple of [major, minor, patch] with numeric values.

{
    "name": "project name",
    "version": "0.0.1",
    "description": "description of the project",
    "keywords": [
        "keyword 1",
        "keyword 2"
    ],
    "author": "John Doe",
    "dependencies": {
      "package-1": "~0.6.2",
      "package-2": ">=2.6.2"
    }
}

Version Range operator

Basic Range

For x in exmaple, see Advanced Range below.

Operator Explaination Example
= package version must be exactly matched 1.0.0 := =1.0.0
(They are equivalent)
< package version must be less than indicated <2.0.0
:=version from 0.0.1 to 1.x.x
<= package version must be less than or euqal to indicated <=2.0.0
:=version from 0.0.1 to 2.0.0
> package version must be greater than indicated >2.0.0:=
version from 2.0.1 to x (x >= 2)
>= package version must be greater than or euqal to indicated >=2.0.0
:=version from 2.0.0 to x (x >= 2)
|| joined one or more operator >2.0.1 || <1.7.3
:=version greater than 2.0.1 or less than 1.7.3
space Intersected one or more operator >=2.0.1 <=1.7.3
:=version from 2.0.1 to 1.7.3 (inclusive)

Advanced Range

Advanced ranges may be combined in the same way as primitive comparators using space or ||.

Operator Explaination Example
X, x, * A Wildcard may be used for any values in the [major, minor, patch] tuple (missing value are consider using Wildcard x) * := (empty string) := >=0.0.0
1.x.x := 1.x := 1 := >=1.0.0 <2.0.0
- Specifies an inclusive set of package version 1.2 - 2.3.4 := >=1.2.0 <=2.3.4
(missing pieces of first version are replaced with zeroes)
1.2.3 - 2.3 := >=1.2.3 <2.4.x
(missing pieces of second version replace with X-range)
~ Allows patch or minor level version changes, depends on specification ~1.2.3 := any version starts with 1.2 and greater than 1.2.3
~1.2 := any version starts with 1.2 (same as 1.2.x)
^ Allows version changes in the [major, minor, patch] tuple without modify the left-most non-zero element. ^1.2.3 := >=1.2.3 <2.0.0
(minor update)
^0.2.3 := >=0.2.3 <0.3.0
(patch update)
^0.0.3 := >=0.0.3 <0.0.4
(no updates)

Further Explaination on Caret Ranges ^

Special interaction with Wildcard operator x

When parsing caret ranges, minor and patch values with wildcard x desugars to the number 0 (missing values are consider as x):

Example:

  • ^1.2.x := >=1.2.0 <2.0.0-0 (equivalent to ^1.2.0)
  • ^1.x := >=1.0.0 <2.0.0-0 (equivalent to ^1.0.0)

However, when both major and minor versions are 0, Caret range allow flexibility within wildcard x:

Example:

  • ^0.0.x := >=0.0.0 <0.1.0-0 (NOT equivalent to ^0.0.0, but similar to ^0.1.0)

Usage and Common Practices

Caret ranges usually ideally used when an author may make breaking changes. For example, between 0.2.4 and 0.3.0 releases, which is a common practice.

However, it presumes that there will not be breaking changes between 0.2.4 and 0.2.5. It allows for changes that are presumed to be additive (but non-breaking), according to commonly observed practices.


Further Reading: version range in npm-semver, setup-node in GitHub Actions


Please cite the source for reprints, feel free to verify the sources cited in the article, and point out any errors or lack of clarity of expression. You can comment in the comments section below or email to GreenMeeple@yahoo.com
This Repo