Refactored code and removed redundant logic

This commit is contained in:
La'Kaleigh Harris 2021-10-01 19:16:00 +00:00 committed by GitHub
parent bca281829f
commit 82441b3f82
4 changed files with 50 additions and 89 deletions

View file

@ -2,11 +2,18 @@ import os = require('os');
import * as assert from 'assert'; import * as assert from 'assert';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as io from '@actions/io'; import * as io from '@actions/io';
import * as hc from '@actions/http-client';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as path from 'path'; import * as path from 'path';
import * as semver from 'semver'; import * as semver from 'semver';
import fs = require('fs'); import fs = require('fs');
import {INodeVersion, getVersionsFromDist} from './node-version';
interface INodeVersion {
version: string;
files: string[];
}
interface INodeVersionInfo { interface INodeVersionInfo {
downloadUrl: string; downloadUrl: string;
@ -376,6 +383,16 @@ async function queryDistForMatch(
return version; return version;
} }
async function getVersionsFromDist(): Promise<INodeVersion[]> {
let dataUrl = 'https://nodejs.org/dist/index.json';
let httpClient = new hc.HttpClient('setup-node', [], {
allowRetries: true,
maxRetries: 3
});
let response = await httpClient.getJson<INodeVersion[]>(dataUrl);
return response.result || [];
}
// For non LTS versions of Node, the files we need (for Windows) are sometimes located // For non LTS versions of Node, the files we need (for Windows) are sometimes located
// in a different folder than they normally are for other versions. // in a different folder than they normally are for other versions.
// Normally the format is similar to: https://nodejs.org/dist/v5.10.1/node-v5.10.1-win-x64.7z // Normally the format is similar to: https://nodejs.org/dist/v5.10.1/node-v5.10.1-win-x64.7z
@ -445,3 +462,32 @@ function translateArchToDistUrl(arch: string): string {
return arch; return arch;
} }
} }
export async function parseNodeVersionFile(contents: string): Promise<string> {
contents = contents.trim();
if (/^v\d/.test(contents)) {
contents = contents.substring(1);
}
const nodeVersions = await getVersionsFromDist();
let nodeVersion: string;
if (semver.valid(contents) || isPartialMatch(contents)) {
nodeVersion = contents;
} else {
throw new Error(`Couldn't resolve node version: '${contents}'`);
}
return stripVPrefix(nodeVersion);
}
function isPartialMatch(version: string): boolean {
return /^\d+(\.\d+(\.\d+)?)?$/.test(version);
}
function stripVPrefix(version: string): string {
return /^v\d/.test(version) ? version.substring(1) : version;
}

View file

@ -5,7 +5,6 @@ import fs = require('fs');
import * as path from 'path'; import * as path from 'path';
import {restoreCache} from './cache-restore'; import {restoreCache} from './cache-restore';
import {URL} from 'url'; import {URL} from 'url';
import {parseNodeVersionFile} from './node-version-file';
import os = require('os'); import os = require('os');
export async function run() { export async function run() {
@ -24,12 +23,13 @@ export async function run() {
if (!!versionFile) { if (!!versionFile) {
const versionFilePath = path.join(__dirname, '..', versionFile); const versionFilePath = path.join(__dirname, '..', versionFile);
version = await parseNodeVersionFile( version = await installer.parseNodeVersionFile(
fs.readFileSync(versionFilePath, 'utf8') fs.readFileSync(versionFilePath, 'utf8')
); );
core.info(`Resolved ${versionFile} as ${version}`); core.info(`Resolved ${versionFile} as ${version}`);
} }
} }
let arch = core.getInput('architecture'); let arch = core.getInput('architecture');
const cache = core.getInput('cache'); const cache = core.getInput('cache');
@ -87,3 +87,4 @@ function isGhes(): boolean {
); );
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
} }

View file

@ -1,65 +0,0 @@
import * as semvar from 'semver';
import {INodeVersion, getVersionsFromDist} from './node-version';
export async function parseNodeVersionFile(contents: string): Promise<string> {
contents = contents.trim();
if (/^v\d/.test(contents)) {
contents = contents.substring(1);
}
const nodeVersions = await getVersionsFromDist();
let nodeVersion: string;
if (contents.startsWith('lts/')) {
nodeVersion = findLatestLts(nodeVersions, contents).version;
} else if (semvar.valid(contents) || isPartialMatch(contents)) {
nodeVersion = contents;
} else {
throw new Error(`Couldn't resolve node version: '${contents}'`);
}
return stripVPrefix(nodeVersion);
}
function findLatestLts(
nodeVersions: INodeVersion[],
codename: string
): INodeVersion {
let nodeVersion: INodeVersion | undefined;
if (codename === 'lts/*') {
nodeVersion = nodeVersions.reduce((latest, nodeVersion) => {
if (!nodeVersion.lts) {
return latest;
}
return semvar.gt(nodeVersion.version, latest.version)
? nodeVersion
: latest;
});
} else {
codename = codename.replace('lts/', '').toLowerCase();
nodeVersion = nodeVersions.find(
nodeVersion => `${nodeVersion.lts}`.toLowerCase() === codename
);
}
if (!nodeVersion) {
throw new Error(
`Couldn't find matching release for codename: '${codename}'`
);
}
return nodeVersion;
}
function isPartialMatch(version: string): boolean {
return /^\d+(\.\d+(\.\d+)?)?$/.test(version);
}
function stripVPrefix(version: string): string {
return /^v\d/.test(version) ? version.substring(1) : version;
}

View file

@ -1,21 +0,0 @@
import * as hc from '@actions/http-client';
//
// Node versions interface
// see https://nodejs.org/dist/index.json
//
export interface INodeVersion {
version: string;
files: string[];
lts: boolean | string;
}
export async function getVersionsFromDist(): Promise<INodeVersion[]> {
let dataUrl = 'https://nodejs.org/dist/index.json';
let httpClient = new hc.HttpClient('setup-node', [], {
allowRetries: true,
maxRetries: 3
});
let response = await httpClient.getJson<INodeVersion[]>(dataUrl);
return response.result || [];
}