DEV Community

Ayc0
Ayc0

Posted on • Edited on

Semver: The unknown buildMetadata

I was reading semver's spec and I noticed something weird in the regex:

Screenshot of semver spec saying "And one with numbered capture groups instead (so cg1 = major, cg2 = minor, cg3 = patch, cg4 = prerelease and cg5 = buildmetadata)"

This is the 1st time that I ever encountered the mention of buildmetadata.

Let's deconstruct that a bit

When you read the regex, it mentions at the beginning the required major, minor, and patch: a valid semver version needs to be at least MAJOR.MINOR.PATCH, for instance 1.2.3.

Then the version can contain an option prerelease tag starting with a -, for instance 1.2.3-hello and this prelease tag can be anything made of alpha numerics (0-9 or a-z or A-Z), . and -.

But what surprised me is the last one: the buildmetadata prefixed with a + (same thing as the prerelease so any alpha numerics, or ., or -).
So for instance 1.2.3+build is valid, and so is 1.2.3-beta.1+build.linux

Verification

Just to be sure, I run this in runkit, and indeed it can properly parse 1.2.3-pre.release.4+build.meta.5.6 as:

{
  major: 1,
  minor: 2,
  patch: 3,
  prerelease: ["pre", "release", 4], // here 4 is even a number
  build: ["build", "meta", "5", "6"], // but here 5 and 6 are strings
  version: "1.2.3-pre.release.4",
  raw: "1.2.3-pre.release.4+build.meta.5.6"
}
Enter fullscreen mode Exit fullscreen mode

See for yourselves:

semver properly parses  raw `1.2.3-pre.release.4.5+build.meta.6.7` endraw

Discussion

I've seen plenty of times the prerelease being used (and I used it myself a few times too).

For instance, React uses it a lot:

Sample of React versions on NPM with a lot of prereleases

My topic for a conversation with you is: Have you ever seen this used anywhere on NPM (or else where)? And if so, for what purpose?

Top comments (0)