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
-
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 || [];
-}