Skip to content
Snippets Groups Projects
Unverified Commit ce1be2c5 authored by RahulGautamSingh's avatar RahulGautamSingh Committed by GitHub
Browse files

fix(versioning/hashicorp): allow `!=` in ranges, constraints (#23492)

parent d255f811
No related branches found
No related tags found
No related merge requests found
import { regEx } from '../../util/regex';
import type { VersioningApi, VersioningApiConstructor } from './types'; import type { VersioningApi, VersioningApiConstructor } from './types';
export function isVersioningApiConstructor( export function isVersioningApiConstructor(
...@@ -5,3 +6,19 @@ export function isVersioningApiConstructor( ...@@ -5,3 +6,19 @@ export function isVersioningApiConstructor(
): obj is VersioningApiConstructor { ): obj is VersioningApiConstructor {
return typeof obj === 'function'; return typeof obj === 'function';
} }
export function getExcludedVersions(range: string): string[] {
return range
.split(',')
.map((v) => v.trim())
.filter((version) => regEx(/^!=/).test(version))
.map((version) => version.replace('!=', '').trim());
}
export function getFilteredRange(range: string): string {
return range
.split(',')
.map((v) => v.trim())
.filter((version) => !regEx(/^!=/).test(version))
.join(',');
}
...@@ -2,9 +2,11 @@ import { api as semver } from '.'; ...@@ -2,9 +2,11 @@ import { api as semver } from '.';
describe('modules/versioning/hashicorp/index', () => { describe('modules/versioning/hashicorp/index', () => {
it.each` it.each`
version | range | expected version | range | expected
${'4.2.0'} | ${'~> 4.0'} | ${true} ${'4.2.0'} | ${'~> 4.0'} | ${true}
${'4.2.0'} | ${'~> 4.0.0'} | ${false} ${'4.2.0'} | ${'~> 4.0.0'} | ${false}
${'4.2.0'} | ${'~> 4.0, != 4.2.0'} | ${false}
${'4.2.6'} | ${'~> 4.0, != 4.2.0'} | ${true}
`( `(
'matches("$version", "$range") === $expected', 'matches("$version", "$range") === $expected',
({ version, range, expected }) => { ({ version, range, expected }) => {
...@@ -13,9 +15,10 @@ describe('modules/versioning/hashicorp/index', () => { ...@@ -13,9 +15,10 @@ describe('modules/versioning/hashicorp/index', () => {
); );
it.each` it.each`
versions | range | expected versions | range | expected
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'} ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${'4.0.0'} ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${'4.0.0'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'!=4.2.0, > 4.0.0'} | ${'5.0.0'}
`( `(
'getSatisfyingVersion($versions, "$range") === $expected', 'getSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => { ({ versions, range, expected }) => {
...@@ -54,9 +57,11 @@ describe('modules/versioning/hashicorp/index', () => { ...@@ -54,9 +57,11 @@ describe('modules/versioning/hashicorp/index', () => {
); );
it.each` it.each`
versions | range | expected versions | range | expected
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'} ${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${null} ${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${null}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0, != 4.2.0'} | ${null}
${['0.4.0', '0.5.0', '4.2.0', '4.1.0']} | ${'~> 4.0, != 4.2.0'} | ${'4.1.0'}
`( `(
'minSatisfyingVersion($versions, "$range") === $expected', 'minSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => { ({ versions, range, expected }) => {
......
import { logger } from '../../../logger'; import { logger } from '../../../logger';
import type { RangeStrategy } from '../../../types/versioning'; import type { RangeStrategy } from '../../../types/versioning';
import { getExcludedVersions, getFilteredRange } from '../common';
import { api as npm } from '../npm'; import { api as npm } from '../npm';
import type { NewValueConfig, VersioningApi } from '../types'; import type { NewValueConfig, VersioningApi } from '../types';
import { hashicorp2npm, npm2hashicorp } from './convertor'; import { hashicorp2npm, npm2hashicorp } from './convertor';
...@@ -34,21 +35,46 @@ export function isValid(input: string): boolean { ...@@ -34,21 +35,46 @@ export function isValid(input: string): boolean {
} }
function matches(version: string, range: string): boolean { function matches(version: string, range: string): boolean {
return isValid(range) && npm.matches(version, hashicorp2npm(range)); const excludedVersions = getExcludedVersions(range);
if (excludedVersions.includes(version)) {
return false;
}
const filteredRange = getFilteredRange(range);
return (
isValid(filteredRange) && npm.matches(version, hashicorp2npm(filteredRange))
);
} }
function getSatisfyingVersion( function getSatisfyingVersion(
versions: string[], versions: string[],
range: string range: string
): string | null { ): string | null {
return npm.getSatisfyingVersion(versions, hashicorp2npm(range)); const excludedVersions = getExcludedVersions(range);
const filteredRange = getFilteredRange(range);
const filteredVersions = versions.filter(
(version) => !excludedVersions.includes(version)
);
return npm.getSatisfyingVersion(
filteredVersions,
hashicorp2npm(filteredRange)
);
} }
function minSatisfyingVersion( function minSatisfyingVersion(
versions: string[], versions: string[],
range: string range: string
): string | null { ): string | null {
return npm.minSatisfyingVersion(versions, hashicorp2npm(range)); const excludedVersions = getExcludedVersions(range);
const filteredRange = getFilteredRange(range);
const filteredVersions = versions.filter(
(version) => !excludedVersions.includes(version)
);
return npm.minSatisfyingVersion(
filteredVersions,
hashicorp2npm(filteredRange)
);
} }
function getNewValue({ function getNewValue({
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment