mirror of
https://github.com/actions/setup-node.git
synced 2025-04-22 09:21:00 +00:00
Refactored code and removed redundant logic
This commit is contained in:
parent
bca281829f
commit
82441b3f82
4 changed files with 50 additions and 89 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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 || [];
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue