Files
Nahrin cc32f48c9c docs(versioning): replace bare links with descriptive markdown links in urls (#43951)
* fix(versioning): replace bare links with descriptive markdown links in urls

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: export markdownLinkRegex from common.ts and import in test

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-15 06:30:54 +00:00

114 lines
3.0 KiB
TypeScript

import { logger } from '../../../logger/index.ts';
import type { RangeStrategy } from '../../../types/versioning.ts';
import { getExcludedVersions, getFilteredRange } from '../common.ts';
import { api as npm } from '../npm/index.ts';
import type { NewValueConfig, VersioningApi } from '../types.ts';
import { hashicorp2npm, npm2hashicorp } from './convertor.ts';
export const id = 'hashicorp';
export const displayName = 'Hashicorp';
export const urls = [
'[Terraform - Specifying a required version](https://www.terraform.io/docs/configuration/terraform.html#specifying-a-required-terraform-version)',
];
export const supportsRanges = true;
export const supportedRangeStrategies: RangeStrategy[] = [
'bump',
'widen',
'replace',
];
function isLessThanRange(version: string, range: string): boolean {
return !!npm.isLessThanRange?.(version, hashicorp2npm(range));
}
export function isValid(input: string): boolean {
if (input) {
try {
return npm.isValid(hashicorp2npm(input));
} catch {
logger.trace({ value: input }, 'Unsupported hashicorp versioning value');
return false;
}
}
return false;
}
function matches(version: string, range: string): boolean {
const excludedVersions = getExcludedVersions(range);
if (excludedVersions.includes(version)) {
return false;
}
const filteredRange = getFilteredRange(range);
return (
isValid(filteredRange) && npm.matches(version, hashicorp2npm(filteredRange))
);
}
function getSatisfyingVersion(
versions: string[],
range: string,
): string | null {
const excludedVersions = getExcludedVersions(range);
const filteredRange = getFilteredRange(range);
const filteredVersions = versions.filter(
(version) => !excludedVersions.includes(version),
);
return npm.getSatisfyingVersion(
filteredVersions,
hashicorp2npm(filteredRange),
);
}
function minSatisfyingVersion(
versions: string[],
range: string,
): string | null {
const excludedVersions = getExcludedVersions(range);
const filteredRange = getFilteredRange(range);
const filteredVersions = versions.filter(
(version) => !excludedVersions.includes(version),
);
return npm.minSatisfyingVersion(
filteredVersions,
hashicorp2npm(filteredRange),
);
}
function getNewValue({
currentValue,
rangeStrategy,
currentVersion,
newVersion,
}: NewValueConfig): string | null {
let npmNewVersion = npm.getNewValue({
currentValue: hashicorp2npm(currentValue),
rangeStrategy,
currentVersion,
newVersion,
});
if (npmNewVersion) {
npmNewVersion = npm2hashicorp(npmNewVersion);
if (currentValue.startsWith('v') && !npmNewVersion.startsWith('v')) {
npmNewVersion = `v${npmNewVersion}`;
}
}
return npmNewVersion;
}
export const api: VersioningApi = {
...npm,
isLessThanRange,
isValid,
matches,
getSatisfyingVersion,
minSatisfyingVersion,
getNewValue,
};
// oxlint-disable-next-line typescript/unbound-method
export const { isVersion } = api;
export default api;