From a4ae07903c6e148cd8d999d43d04a02fdd9241cf Mon Sep 17 00:00:00 2001 From: Dmitry Shibanov Date: Wed, 19 Oct 2022 14:03:13 +0200 Subject: [PATCH] fixing bugs --- __tests__/authutil.test.ts | 2 +- __tests__/installer.test.ts | 5 +-- dist/setup/index.js | 59 +++++++++++++++++++++++++------- src/installer.ts | 68 ++++++++++++++++++++++++++++++------- src/main.ts | 8 ++--- 5 files changed, 110 insertions(+), 32 deletions(-) diff --git a/__tests__/authutil.test.ts b/__tests__/authutil.test.ts index 1ec4e1e1..594c6a13 100644 --- a/__tests__/authutil.test.ts +++ b/__tests__/authutil.test.ts @@ -1,4 +1,4 @@ -import os = require('os'); +import os from 'os'; import * as fs from 'fs'; import * as path from 'path'; import * as core from '@actions/core'; diff --git a/__tests__/installer.test.ts b/__tests__/installer.test.ts index 28d77e7c..d359f7ab 100644 --- a/__tests__/installer.test.ts +++ b/__tests__/installer.test.ts @@ -6,7 +6,7 @@ import * as im from '../src/installer'; import * as cache from '@actions/cache'; import fs from 'fs'; import cp from 'child_process'; -import osm = require('os'); +import osm from 'os'; import path from 'path'; import each from 'jest-each'; import * as main from '../src/main'; @@ -138,7 +138,8 @@ describe('setup-node', () => { }); it('can mock dist versions', async () => { - let versions: im.INodeVersion[] = await im.getVersionsFromDist(); + const versionSpec = '1.2.3'; + let versions: im.INodeVersion[] = await im.getVersionsFromDist(versionSpec); expect(versions).toBeDefined(); expect(versions?.length).toBe(23); }); diff --git a/dist/setup/index.js b/dist/setup/index.js index f4ff5882..18342fae 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -73410,16 +73410,51 @@ function resolveVersionFromManifest(versionSpec, stable, auth, osArch = translat } }); } +function evaluateNightlyVersions(versions, versionSpec) { + let version = ''; + let range; + const [raw, prerelease] = versionSpec.split('-'); + const isValidVersion = semver.valid(raw); + const rawVersion = isValidVersion ? raw : semver.coerce(raw); + if (rawVersion) { + if (prerelease !== 'nightly') { + range = `${rawVersion}+${prerelease.replace('nightly', 'nightly.')}`; + } + else { + range = semver.validRange(`^${rawVersion}`); + } + } + if (range) { + versions = versions.sort((a, b) => { + if (semver.gt(a, b)) { + return 1; + } + return -1; + }); + for (let i = versions.length - 1; i >= 0; i--) { + const potential = versions[i]; + const satisfied = semver.satisfies(potential.replace('-nightly', '+nightly.'), range); + if (satisfied) { + version = potential; + break; + } + } + } + if (version) { + core.debug(`matched: ${version}`); + } + else { + core.debug('match not found'); + } + return version; +} // TODO - should we just export this from @actions/tool-cache? Lifted directly from there function evaluateVersions(versions, versionSpec) { let version = ''; core.debug(`evaluating ${versions.length} versions`); - core.debug(`version 1 is ${versions[0]}`); - core.debug(`version spec is ${versionSpec}`); - versionSpec = - versionSpec.includes('nightly') && !semver.valid(versionSpec.split('-')[0]) - ? versionSpec.split('-')[0] - : versionSpec; + if (versionSpec.includes('nightly')) { + return evaluateNightlyVersions(versions, versionSpec); + } versions = versions.sort((a, b) => { if (semver.gt(a, b)) { return 1; @@ -73428,7 +73463,7 @@ function evaluateVersions(versions, versionSpec) { }); for (let i = versions.length - 1; i >= 0; i--) { const potential = versions[i]; - const satisfied = semver.satisfies(potential.replace('-nightly', '+nightly.'), versionSpec.replace('-nightly', '+nightly')); + const satisfied = semver.satisfies(potential, versionSpec); if (satisfied) { version = potential; break; @@ -73447,7 +73482,7 @@ function getNodejsDistUrl(version) { if (!prerelease || !prerelease.length) { return 'https://nodejs.org/dist'; } - else if (prerelease[0] === 'nightly') { + else if (version.includes('nightly')) { return 'https://nodejs.org/download/nightly'; } else { @@ -73642,7 +73677,7 @@ function run() { // Version is optional. If supplied, install / use from the tool cache // If not supplied then task is still used to setup proxy, auth, etc... // - let version = resolveVersionInput(); + const version = resolveVersionInput(); let arch = core.getInput('architecture'); const cache = core.getInput('cache'); // if architecture supplied but node-version is not @@ -73654,9 +73689,9 @@ function run() { arch = os.arch(); } if (version) { - let token = core.getInput('token'); - let auth = !token || cache_utils_1.isGhes() ? undefined : `token ${token}`; - let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; + const token = core.getInput('token'); + const auth = !token || cache_utils_1.isGhes() ? undefined : `token ${token}`; + const stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; const checkLatest = (core.getInput('check-latest') || 'false').toUpperCase() === 'TRUE'; yield installer.getNode(version, stable, checkLatest, auth, arch); } diff --git a/src/installer.ts b/src/installer.ts index 32281996..b9519995 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -347,16 +347,61 @@ async function resolveVersionFromManifest( } } +function evaluateNightlyVersions( + versions: string[], + versionSpec: string +): string { + let version = ''; + let range: string | null | undefined; + const [raw, prerelease] = versionSpec.split('-'); + const isValidVersion = semver.valid(raw); + const rawVersion = isValidVersion ? raw : semver.coerce(raw); + if (rawVersion) { + if (prerelease !== 'nightly') { + range = `${rawVersion}+${prerelease.replace('nightly', 'nightly.')}`; + } else { + range = semver.validRange(`^${rawVersion}`); + } + } + + if (range) { + versions = versions.sort((a, b) => { + if (semver.gt(a, b)) { + return 1; + } + return -1; + }); + for (let i = versions.length - 1; i >= 0; i--) { + const potential: string = versions[i]; + const satisfied: boolean = semver.satisfies( + potential.replace('-nightly', '+nightly.'), + range + ); + if (satisfied) { + version = potential; + break; + } + } + } + + if (version) { + core.debug(`matched: ${version}`); + } else { + core.debug('match not found'); + } + + return version; +} + // TODO - should we just export this from @actions/tool-cache? Lifted directly from there function evaluateVersions(versions: string[], versionSpec: string): string { let version = ''; core.debug(`evaluating ${versions.length} versions`); - core.debug(`version 1 is ${versions[0]}`); - core.debug(`version spec is ${versionSpec}`); - versionSpec = - versionSpec.includes('nightly') && !semver.valid(versionSpec.split('-')[0]) - ? versionSpec.split('-')[0] - : versionSpec; + + if(versionSpec.includes('nightly')) { + return evaluateNightlyVersions(versions, versionSpec); + } + versions = versions.sort((a, b) => { if (semver.gt(a, b)) { return 1; @@ -365,10 +410,7 @@ function evaluateVersions(versions: string[], versionSpec: string): string { }); for (let i = versions.length - 1; i >= 0; i--) { const potential: string = versions[i]; - const satisfied: boolean = semver.satisfies( - potential.replace('-nightly', '+nightly.'), - versionSpec.replace('-nightly', '+nightly') - ); + const satisfied: boolean = semver.satisfies(potential, versionSpec); if (satisfied) { version = potential; break; @@ -384,11 +426,11 @@ function evaluateVersions(versions: string[], versionSpec: string): string { return version; } -function getNodejsDistUrl(version: string | semver.SemVer) { +function getNodejsDistUrl(version: string) { const prerelease = semver.prerelease(version); if (!prerelease || !prerelease.length) { return 'https://nodejs.org/dist'; - } else if (prerelease[0] === 'nightly') { + } else if (version.includes('nightly')) { return 'https://nodejs.org/download/nightly'; } else { return 'https://nodejs.org/download/rc'; @@ -439,7 +481,7 @@ async function queryDistForMatch( }); // get the latest version that matches the version spec - let version: string = evaluateVersions(versions, versionSpec); + let version = evaluateVersions(versions, versionSpec); return version; } diff --git a/src/main.ts b/src/main.ts index 6a980a0d..bec19354 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,7 @@ export async function run() { // Version is optional. If supplied, install / use from the tool cache // If not supplied then task is still used to setup proxy, auth, etc... // - let version = resolveVersionInput(); + const version = resolveVersionInput(); let arch = core.getInput('architecture'); const cache = core.getInput('cache'); @@ -32,9 +32,9 @@ export async function run() { } if (version) { - let token = core.getInput('token'); - let auth = !token || isGhes() ? undefined : `token ${token}`; - let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; + const token = core.getInput('token'); + const auth = !token || isGhes() ? undefined : `token ${token}`; + const stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; const checkLatest = (core.getInput('check-latest') || 'false').toUpperCase() === 'TRUE'; await installer.getNode(version, stable, checkLatest, auth, arch);