diff --git a/.github/workflows/version-file-workflow.yml b/.github/workflows/version-file-workflow.yml new file mode 100644 index 00000000..7d00abad --- /dev/null +++ b/.github/workflows/version-file-workflow.yml @@ -0,0 +1,33 @@ + + +name: version-file-test + + +on: + + push: + branches: [ add-node-version-file-support ] + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' + + + workflow_dispatch: + + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + steps: + - uses: actions/checkout@v2 + - name: Setup node test + uses: ./ + with: + node-version-file: '.nvmrc' + - run: npm ci + - run: npm run build diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..b009dfb9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/* diff --git a/README.md b/README.md index 9c3caec1..76877841 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # setup-node -

build-test status versions status proxy status

diff --git a/__tests__/installer.test.ts b/__tests__/installer.test.ts index c8ca9283..1b10c6e7 100644 --- a/__tests__/installer.test.ts +++ b/__tests__/installer.test.ts @@ -6,10 +6,7 @@ import cp from 'child_process'; import osm = require('os'); import path from 'path'; import * as main from '../src/main'; -import * as nv from '../src/node-version'; -import * as nvf from '../src/node-version-file'; import * as auth from '../src/authutil'; - let nodeTestManifest = require('./data/versions-manifest.json'); let nodeTestDist = require('./data/node-dist-index.json'); @@ -597,9 +594,7 @@ describe('setup-node', () => { expect(parseNodeVersionSpy).toHaveBeenCalledWith(versionSpec); expect(logSpy).toHaveBeenCalledWith( `Resolved ${versionFile} as ${expectedVersionSpec}`); - }); - }); - + }); describe('LTS version', () => { beforeEach(() => { os.platform = 'linux'; @@ -819,3 +814,4 @@ describe('setup-node', () => { }); }); }); +}); diff --git a/src/installer.ts b/src/installer.ts index 7f32e907..2f1a8ffb 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -2,11 +2,18 @@ import os = require('os'); import * as assert from 'assert'; import * as core from '@actions/core'; import * as io from '@actions/io'; +import * as hc from '@actions/http-client'; import * as tc from '@actions/tool-cache'; import * as path from 'path'; import * as semver from 'semver'; import fs = require('fs'); -import {INodeVersion, getVersionsFromDist} from './node-version'; + + + +interface INodeVersion { + version: string; + files: string[]; +} interface INodeVersionInfo { downloadUrl: string; @@ -376,6 +383,16 @@ async function queryDistForMatch( return version; } +async function getVersionsFromDist(): Promise { + let dataUrl = 'https://nodejs.org/dist/index.json'; + let httpClient = new hc.HttpClient('setup-node', [], { + allowRetries: true, + maxRetries: 3 + }); + let response = await httpClient.getJson(dataUrl); + return response.result || []; +} + // 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. // 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; } } + +export async function parseNodeVersionFile(contents: string): Promise { + 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; +} + diff --git a/src/main.ts b/src/main.ts index 18bc3769..3ac2b1c8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,6 @@ import fs = require('fs'); import * as path from 'path'; import {restoreCache} from './cache-restore'; import {URL} from 'url'; -import {parseNodeVersionFile} from './node-version-file'; import os = require('os'); export async function run() { @@ -24,7 +23,7 @@ export async function run() { if (!!versionFile) { const versionFilePath = path.join(__dirname, '..', versionFile); - version = await parseNodeVersionFile( + version = await installer.parseNodeVersionFile( fs.readFileSync(versionFilePath, 'utf8') ); core.info(`Resolved ${versionFile} as ${version}`); @@ -88,3 +87,4 @@ function isGhes(): boolean { ); return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; } + diff --git a/src/node-version-file.ts b/src/node-version-file.ts deleted file mode 100644 index d2d3568b..00000000 --- a/src/node-version-file.ts +++ /dev/null @@ -1,65 +0,0 @@ -import * as semvar from 'semver'; -import {INodeVersion, getVersionsFromDist} from './node-version'; - -export async function parseNodeVersionFile(contents: string): Promise { - 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; -} diff --git a/src/node-version.ts b/src/node-version.ts deleted file mode 100644 index eb49b049..00000000 --- a/src/node-version.ts +++ /dev/null @@ -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 { - let dataUrl = 'https://nodejs.org/dist/index.json'; - let httpClient = new hc.HttpClient('setup-node', [], { - allowRetries: true, - maxRetries: 3 - }); - let response = await httpClient.getJson(dataUrl); - return response.result || []; -}