sounisi5011/semver-range-intersect

Do not combine pre-release and any match

Closed this issue · 3 comments

any match (eg *) does not match pre-release.

const semver = require('semver');

semver.satisfies('1.2.3-alpha', '* || >=1.2.3-0') === true

semver.satisfies('1.2.3-alpha', '*') === false

Therefore, it is wrong to convert '* ||> = 1.2.3-0' to '*'.

intersect('* || >=1.2.3-0') !== '* || >=1.2.3-0'
// return: '*'

This result is also incorrect.

intersect('*', '>=1.2.3-0') !== '>=1.2.3'
// return: '>=1.2.3-0'

'*' does not match 1.2.3 prerelease.
'>=1.2.3-0' will only match 1.2.3 or higher.
Thus, the correct intersection is '>=1.2.3'.

Apparently, there is a problem with the prerelease version range merge itself.

intersect('^1.2.3-alpha || ^1.2.4-beta') !== '^1.2.3-alpha || ^1.2.4-beta'
// return: '>=1.2.3-alpha <2.0.0'

semver.satisfies('1.2.2', '^1.2.3-alpha || ^1.2.4-beta') === false
semver.satisfies('1.2.2', '>=1.2.3-alpha <2.0.0') === false

semver.satisfies('1.2.3-alpha', '^1.2.3-alpha || ^1.2.4-beta') === true
semver.satisfies('1.2.3-alpha', '>=1.2.3-alpha <2.0.0') === true

semver.satisfies('1.2.3', '^1.2.3-alpha || ^1.2.4-beta') === true
semver.satisfies('1.2.3', '>=1.2.3-alpha <2.0.0') === true

semver.satisfies('1.2.4-beta', '^1.2.3-alpha || ^1.2.4-beta') === true
semver.satisfies('1.2.4-beta', '>=1.2.3-alpha <2.0.0') !== true // incorrect!

semver.satisfies('1.2.4', '^1.2.3-alpha || ^1.2.4-beta') === true
semver.satisfies('1.2.4', '>=1.2.3-alpha <2.0.0') === true

semver.satisfies('1.2.5', '^1.2.3-alpha || ^1.2.4-beta') === true
semver.satisfies('1.2.5', '>=1.2.3-alpha <2.0.0') === true

Related:

// see https://github.com/sounisi5011/semver-range-intersect/issues/26
// TODO: fix this test
test.failing(
validateOutputRangeMacro,
['^1.9.0-alpha', '*', '^1.9.0-beta'],
'^1.9.0',
);