Improve sorting in tools.getSemverVersion

This commit is contained in:
Shivam Mathur
2025-09-18 16:30:57 +05:30
parent 8f8196743c
commit bf6b4fbd49
3 changed files with 57 additions and 10 deletions

View File

@ -61,7 +61,15 @@ jest.mock('../src/fetch', () => ({
} else if (!token || token === 'valid_token') { } else if (!token || token === 'valid_token') {
return {data: `[{"ref": "refs/tags/1.2.3", "url": "${url}"}]`}; return {data: `[{"ref": "refs/tags/1.2.3", "url": "${url}"}]`};
} else if (token === 'beta_token') { } else if (token === 'beta_token') {
return {data: `[{"ref": "refs/tags/1.2.3-beta1", "url": "${url}"}]`}; return {data: `[{"ref": "refs/tags/1.2.3beta1", "url": "${url}"}]`};
} else if (token === 'rc_token') {
return {
data: `[{"ref":"refs/tags/3.0.0RC1"},{"ref":"refs/tags/3.0.0RC2"}]`
};
} else if (token === 'non_semver_tags') {
return {
data: `[{"ref":"refs/tags/release-2025-09-18"},{"ref":"refs/tags/release-2025-09-17"}]`
};
} else if (token === 'undefined_ref') { } else if (token === 'undefined_ref') {
return { return {
data: `[{"url":"${url}"},{"ref":"refs/tags/v1.2.4","url":"${url}"}]` data: `[{"url":"${url}"},{"ref":"refs/tags/v1.2.4","url":"${url}"}]`
@ -97,13 +105,14 @@ jest.mock('../src/packagist', () => ({
describe('Tools tests', () => { describe('Tools tests', () => {
it.each` it.each`
token | version token | version
${'invalid_token'} | ${'1.2'} ${'invalid_token'} | ${'1.2'}
${'valid_token'} | ${'1.2.3'} ${'valid_token'} | ${'1.2.3'}
${'beta_token'} | ${'1.2.3-beta1'} ${'beta_token'} | ${'1.2.3beta1'}
${'undefined_ref'} | ${'1.2.4'} ${'undefined_ref'} | ${'1.2.4'}
${'multi_refs'} | ${'1.2.4'} ${'multi_refs'} | ${'1.2.4'}
${''} | ${'1.2.3'} ${'non_semver_tags'} | ${'release-2025-09-18'}
${''} | ${'1.2.3'}
`('checking getSemverVersion: $token', async ({token, version}) => { `('checking getSemverVersion: $token', async ({token, version}) => {
process.env['GITHUB_TOKEN'] = token; process.env['GITHUB_TOKEN'] = token;
expect( expect(
@ -111,6 +120,26 @@ describe('Tools tests', () => {
).toBe(version); ).toBe(version);
}); });
it('checking getSemverVersion triggers ?? fallback via Map#get mock', async () => {
process.env['GITHUB_TOKEN'] = 'rc_token';
const spy = jest
.spyOn(Map.prototype as Map<string, string>, 'get')
.mockImplementation(function (
this: Map<string, string>,
key: string
): string | undefined {
if (key === '3.0.0-RC2') {
return undefined;
}
return Map.prototype.get.call(this, key);
});
const result = await tools.getSemverVersion(
getData({tool: 'tool', version: '3.0.0'})
);
expect(result).toBe('3.0.0-RC2');
spy.mockRestore();
});
it.each` it.each`
tool | fetch_latest | version tool | fetch_latest | version
${'tool'} | ${'true'} | ${'3.2.1'} ${'tool'} | ${'true'} | ${'3.2.1'}

2
dist/index.js vendored

File diff suppressed because one or more lines are too long

View File

@ -21,6 +21,11 @@ interface IRef {
* @param data * @param data
*/ */
export async function getSemverVersion(data: RS): Promise<string> { export async function getSemverVersion(data: RS): Promise<string> {
const fixSemver = (t: string): string => {
if (/^\d+\.\d+\.\d+(-|$)/.test(t)) return t;
const m = t.match(/^(\d+\.\d+\.\d+)([A-Za-z]+[0-9A-Za-z.]+)$/);
return m ? `${m[1]}-${m[2]}` : t;
};
const search: string = data['version_prefix'] + data['version']; const search: string = data['version_prefix'] + data['version'];
const url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${search}.`; const url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${search}.`;
const github_token: string = const github_token: string =
@ -35,7 +40,20 @@ export async function getSemverVersion(data: RS): Promise<string> {
const tags = refs const tags = refs
.map((i: IRef) => (i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, '')) .map((i: IRef) => (i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, ''))
.filter((t: string) => t.length > 0); .filter((t: string) => t.length > 0);
return tags.sort((a: string, b: string) => cv.compareVersions(b, a))[0]; const fixedToOriginal = new Map<string, string>();
const fixed = tags.map(t => {
const f = fixSemver(t);
fixedToOriginal.set(f, t);
return f;
});
fixed.sort((a, b) => {
try {
return cv.compareVersions(b, a);
} catch {
return b.localeCompare(a, 'en', {numeric: true, sensitivity: 'base'});
}
});
return fixedToOriginal.get(fixed[0]) ?? fixed[0];
} }
} }