Address review comments

- add explicit return type for findMatching version function
- force version argument to be defined in createVersionArgument
- make dotnetVersion and quality properties readonly
This commit is contained in:
Nikolai Laevskii 2023-09-08 14:45:09 +02:00
parent cd87e99430
commit 2219620f96
4 changed files with 41 additions and 40 deletions

View File

@ -2,43 +2,43 @@ import * as dotnetUtils from '../src/dotnet-utils';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
describe('dotnet-utils', () => { describe('dotnet-utils', () => {
describe('matchVersionToList', () => { describe('findMatchingVersion', () => {
it('matches all versions with all syntaxes correctly', () => { it('matches all versions with all syntaxes correctly', () => {
expect( expect(
dotnetUtils.matchVersionToList('3.1', ['3.1.201', '6.0.402']) dotnetUtils.findMatchingVersion('3.1', ['3.1.201', '6.0.402'])
).toEqual('3.1.201'); ).toEqual('3.1.201');
expect( expect(
dotnetUtils.matchVersionToList('3.1.x', ['3.1.201', '6.0.402']) dotnetUtils.findMatchingVersion('3.1.x', ['3.1.201', '6.0.402'])
).toEqual('3.1.201'); ).toEqual('3.1.201');
expect( expect(
dotnetUtils.matchVersionToList('3', ['3.1.201', '6.0.402']) dotnetUtils.findMatchingVersion('3', ['3.1.201', '6.0.402'])
).toEqual('3.1.201'); ).toEqual('3.1.201');
expect( expect(
dotnetUtils.matchVersionToList('3.x', ['3.1.201', '6.0.402']) dotnetUtils.findMatchingVersion('3.x', ['3.1.201', '6.0.402'])
).toEqual('3.1.201'); ).toEqual('3.1.201');
expect( expect(
dotnetUtils.matchVersionToList('6.0.4xx', ['3.1.201', '6.0.402']) dotnetUtils.findMatchingVersion('6.0.4xx', ['3.1.201', '6.0.402'])
).toEqual('6.0.402'); ).toEqual('6.0.402');
}); });
it('returns undefined if no version is matched', () => { it('returns undefined if no version is matched', () => {
expect( expect(
dotnetUtils.matchVersionToList('6.0.5xx', ['3.1.201', '6.0.403']) dotnetUtils.findMatchingVersion('6.0.5xx', ['3.1.201', '6.0.403'])
).toEqual(undefined); ).toEqual(undefined);
expect(dotnetUtils.matchVersionToList('6.0.5xx', [])).toEqual(undefined); expect(dotnetUtils.findMatchingVersion('6.0.5xx', [])).toEqual(undefined);
}); });
it("returns the first version if 'x' or '*' version is provided", () => { it("returns the first version if 'x' or '*' version is provided", () => {
expect( expect(
dotnetUtils.matchVersionToList('x', ['3.1.201', '6.0.403']) dotnetUtils.findMatchingVersion('x', ['3.1.201', '6.0.403'])
).toEqual('3.1.201'); ).toEqual('3.1.201');
expect( expect(
dotnetUtils.matchVersionToList('*', ['3.1.201', '6.0.403']) dotnetUtils.findMatchingVersion('*', ['3.1.201', '6.0.403'])
).toEqual('3.1.201'); ).toEqual('3.1.201');
}); });
it('returns undefined if empty version list is provided', () => { it('returns undefined if empty version list is provided', () => {
expect(dotnetUtils.matchVersionToList('6.0.4xx', [])).toEqual(undefined); expect(dotnetUtils.findMatchingVersion('6.0.4xx', [])).toEqual(undefined);
}); });
}); });

27
dist/setup/index.js vendored
View File

@ -72785,7 +72785,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}); });
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.matchVersionToList = exports.listSdks = void 0; exports.findMatchingVersion = exports.listSdks = void 0;
const exec = __importStar(__nccwpck_require__(1514)); const exec = __importStar(__nccwpck_require__(1514));
const listSdks = () => __awaiter(void 0, void 0, void 0, function* () { const listSdks = () => __awaiter(void 0, void 0, void 0, function* () {
const { stdout, exitCode } = yield exec const { stdout, exitCode } = yield exec
@ -72810,20 +72810,19 @@ exports.listSdks = listSdks;
* '3.1', '3.1.x', '3', '3.x', '6.0.4xx' to * '3.1', '3.1.x', '3', '3.x', '6.0.4xx' to
* correct version number like '3.1.201', '3.1.201', '3.1.201', '3.1.201', '6.0.402' * correct version number like '3.1.201', '3.1.201', '3.1.201', '3.1.201', '6.0.402'
*/ */
const matchVersionToList = (version, versions) => { const findMatchingVersion = (versionPattern, versions) => {
if (!version || version === 'x' || version === '*') { if (!versionPattern || versionPattern === 'x' || versionPattern === '*') {
return versions.at(0); return versions.at(0);
} }
const versionArray = version.split('.'); const versionArray = versionPattern.split('.');
if (versionArray.length < 3) { if (versionArray.length < 3) {
versionArray.push(...Array(3 - versionArray.length).fill('x')); versionArray.push(...Array(3 - versionArray.length).fill('x'));
} }
const normalizedVersion = versionArray.join('.'); const normalizedVersion = versionArray.join('.');
const versionRegex = new RegExp(`^${normalizedVersion.replace(/x/g, '\\d+')}`); const versionRegex = new RegExp(`^${normalizedVersion.replace(/x/g, '\\d+')}`);
const matchedVersion = versions.find(v => versionRegex.test(v)); return versions.find(v => versionRegex.test(v));
return matchedVersion;
}; };
exports.matchVersionToList = matchVersionToList; exports.findMatchingVersion = findMatchingVersion;
/***/ }), /***/ }),
@ -72895,7 +72894,7 @@ class DotnetVersionResolver {
throw new Error(`The 'dotnet-version' was supplied in invalid format: ${this.inputVersion}! Supported syntax: A.B.C, A.B, A.B.x, A, A.x, A.B.Cxx`); throw new Error(`The 'dotnet-version' was supplied in invalid format: ${this.inputVersion}! Supported syntax: A.B.C, A.B, A.B.x, A, A.x, A.B.Cxx`);
} }
if (semver_1.default.valid(this.inputVersion)) { if (semver_1.default.valid(this.inputVersion)) {
this.createVersionArgument(); this.createVersionArgument(this.inputVersion);
return; return;
} }
if (!this.preferInstalled) { if (!this.preferInstalled) {
@ -72904,12 +72903,12 @@ class DotnetVersionResolver {
} }
const requestedVersion = this.inputVersion; const requestedVersion = this.inputVersion;
const installedVersions = yield (0, dotnet_utils_1.listSdks)(); const installedVersions = yield (0, dotnet_utils_1.listSdks)();
const matchingInstalledVersion = (0, dotnet_utils_1.matchVersionToList)(requestedVersion, installedVersions); const matchingInstalledVersion = (0, dotnet_utils_1.findMatchingVersion)(requestedVersion, installedVersions);
if (matchingInstalledVersion === undefined) { if (matchingInstalledVersion) {
this.createChannelArgument(); this.createVersionArgument(matchingInstalledVersion);
return; return;
} }
this.createVersionArgument(matchingInstalledVersion); this.createChannelArgument();
}); });
} }
isNumericTag(versionTag) { isNumericTag(versionTag) {
@ -72924,9 +72923,9 @@ class DotnetVersionResolver {
} }
return majorTag ? true : false; return majorTag ? true : false;
} }
createVersionArgument(updatedVersion) { createVersionArgument(version) {
this.resolvedArgument.type = 'version'; this.resolvedArgument.type = 'version';
this.resolvedArgument.value = updatedVersion !== null && updatedVersion !== void 0 ? updatedVersion : this.inputVersion; this.resolvedArgument.value = version;
} }
createChannelArgument() { createChannelArgument() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {

View File

@ -27,12 +27,15 @@ export const listSdks = async () => {
* '3.1', '3.1.x', '3', '3.x', '6.0.4xx' to * '3.1', '3.1.x', '3', '3.x', '6.0.4xx' to
* correct version number like '3.1.201', '3.1.201', '3.1.201', '3.1.201', '6.0.402' * correct version number like '3.1.201', '3.1.201', '3.1.201', '3.1.201', '6.0.402'
*/ */
export const matchVersionToList = (version: string, versions: string[]) => { export const findMatchingVersion = (
if (!version || version === 'x' || version === '*') { versionPattern: string,
versions: string[]
): string | undefined => {
if (!versionPattern || versionPattern === 'x' || versionPattern === '*') {
return versions.at(0); return versions.at(0);
} }
const versionArray = version.split('.'); const versionArray = versionPattern.split('.');
if (versionArray.length < 3) { if (versionArray.length < 3) {
versionArray.push(...Array(3 - versionArray.length).fill('x')); versionArray.push(...Array(3 - versionArray.length).fill('x'));
@ -43,7 +46,6 @@ export const matchVersionToList = (version: string, versions: string[]) => {
const versionRegex = new RegExp( const versionRegex = new RegExp(
`^${normalizedVersion.replace(/x/g, '\\d+')}` `^${normalizedVersion.replace(/x/g, '\\d+')}`
); );
const matchedVersion = versions.find(v => versionRegex.test(v));
return matchedVersion; return versions.find(v => versionRegex.test(v));
}; };

View File

@ -9,7 +9,7 @@ import os from 'os';
import semver from 'semver'; import semver from 'semver';
import {IS_WINDOWS, PLATFORM} from './utils'; import {IS_WINDOWS, PLATFORM} from './utils';
import {QualityOptions} from './setup-dotnet'; import {QualityOptions} from './setup-dotnet';
import {listSdks, matchVersionToList} from './dotnet-utils'; import {listSdks, findMatchingVersion} from './dotnet-utils';
export interface DotnetVersion { export interface DotnetVersion {
type: string; type: string;
@ -36,7 +36,7 @@ export class DotnetVersionResolver {
} }
if (semver.valid(this.inputVersion)) { if (semver.valid(this.inputVersion)) {
this.createVersionArgument(); this.createVersionArgument(this.inputVersion);
return; return;
} }
@ -47,17 +47,17 @@ export class DotnetVersionResolver {
const requestedVersion = this.inputVersion; const requestedVersion = this.inputVersion;
const installedVersions = await listSdks(); const installedVersions = await listSdks();
const matchingInstalledVersion = matchVersionToList( const matchingInstalledVersion = findMatchingVersion(
requestedVersion, requestedVersion,
installedVersions installedVersions
); );
if (matchingInstalledVersion === undefined) { if (matchingInstalledVersion) {
this.createChannelArgument(); this.createVersionArgument(matchingInstalledVersion);
return; return;
} }
this.createVersionArgument(matchingInstalledVersion); this.createChannelArgument();
} }
private isNumericTag(versionTag): boolean { private isNumericTag(versionTag): boolean {
@ -79,9 +79,9 @@ export class DotnetVersionResolver {
return majorTag ? true : false; return majorTag ? true : false;
} }
private createVersionArgument(updatedVersion?: string) { private createVersionArgument(version: string) {
this.resolvedArgument.type = 'version'; this.resolvedArgument.type = 'version';
this.resolvedArgument.value = updatedVersion ?? this.inputVersion; this.resolvedArgument.value = version;
} }
private async createChannelArgument() { private async createChannelArgument() {
@ -274,8 +274,8 @@ export class DotnetCoreInstaller {
} }
constructor( constructor(
private dotnetVersion: DotnetVersion, private readonly dotnetVersion: DotnetVersion,
private quality: QualityOptions private readonly quality: QualityOptions
) {} ) {}
public async installDotnet(): Promise<string | null> { public async installDotnet(): Promise<string | null> {