Compare commits

...

15 Commits

Author SHA1 Message Date
eeb10cff27 Support lts/-n aliases (#481) 2022-06-02 12:30:33 +02:00
ed1a46e9f2 Update zeit/ncc to vercel/ncc (#476) 2022-05-30 11:56:20 +02:00
daff393d43 Merge pull request #496 from panticmilos/v-mpantic/get-latest-version-from-cache
Get latest version from cache if exists
2022-05-30 09:13:35 +02:00
b14573ddb9 remove installer import 2022-05-23 12:53:31 +02:00
7569de03e7 rename dist manifest to node versions 2022-05-20 16:32:52 +02:00
b20a2561b9 get manifest once 2022-05-20 13:45:28 +02:00
ea3459bb45 docs: Update advanced-usage.md (#495)
* Update advanced-usage.md

* Update advanced-usage.md

* Update advanced-usage.md

* Update docs/advanced-usage.md

Co-authored-by: Brian Cristante <33549821+brcrista@users.noreply.github.com>

Co-authored-by: Brian Cristante <33549821+brcrista@users.noreply.github.com>
2022-05-19 13:32:26 -04:00
141334fcd1 remove unnecessary dist call 2022-05-19 18:21:03 +02:00
808c8f917f remove bumping deps 2022-05-19 17:38:21 +02:00
fd1b409bc3 unit tests 2022-05-19 17:33:13 +02:00
9a03ebd9cc run build 2022-05-19 17:06:51 +02:00
45e544a71a fix versionSpec required error 2022-05-19 17:02:08 +02:00
8c66f89aef improve latest version syntax 2022-05-19 16:48:16 +02:00
3601f2a33e improve version syntax presentation (#493) 2022-05-18 09:50:55 +02:00
4d62fafc05 Add test for node-version * (#491) 2022-05-18 09:50:05 +02:00
10 changed files with 64878 additions and 65682 deletions

View File

@ -35,13 +35,21 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [lts/dubnium, lts/erbium, lts/fermium, lts/*] node-version: [lts/dubnium, lts/erbium, lts/fermium, lts/*, lts/-1]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Setup Node - name: Setup Node
uses: ./ uses: ./
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
check-latest: true
- if: runner.os != 'Windows'
name: Verify node and npm
run: |
. "$NVM_DIR/nvm.sh"
[[ $(nvm version-remote "${{ matrix.node-version }}") =~ ^v([^.]+) ]]
__tests__/verify-node.sh "${BASH_REMATCH[1]}"
shell: bash
manifest: manifest:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}

View File

@ -35,12 +35,12 @@ For information regarding locally cached versions of Node.js on GitHub hosted ru
### Supported version syntax ### Supported version syntax
The `node-version` input supports the following syntax: The `node-version` input supports the following values:
major versions: `12`, `14`, `16` - Major versions: `12`, `14`, `16`
more specific versions: `10.15`, `14.2.0`, `16.3.0` - More specific versions: `10.15`, `14.2.0`, `16.3.0`
nvm lts syntax: `lts/erbium`, `lts/fermium`, `lts/*` - NVM LTS syntax: `lts/erbium`, `lts/fermium`, `lts/*`, `lts/-n`
latest release: `latest`/`current`/`node` - Latest release: `latest`/`current`/`node`
**Note:** Since the latest release will not be cached always, there is possibility of hitting rate limit when downloading from dist **Note:** Since the latest release will not be cached always, there is possibility of hitting rate limit when downloading from dist

View File

@ -1,157 +1,183 @@
[ [
{ {
"version": "14.0.0", "version": "14.0.0",
"stable": true, "stable": true,
"lts": "Fermium", "lts": "Fermium",
"release_url": "https://github.com/actions/node-versions/releases/tag/14.0.0-20200423.30", "release_url": "https://github.com/actions/node-versions/releases/tag/14.0.0-20200507.99",
"files": [ "files": [
{ {
"filename": "node-14.0.0-darwin-x64.tar.gz", "filename": "node-14.0.0-darwin-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "darwin", "platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200423.30/node-14.0.0-darwin-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200507.99/node-14.0.0-darwin-x64.tar.gz"
}, },
{ {
"filename": "node-14.0.0-linux-x64.tar.gz", "filename": "node-14.0.0-linux-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "linux", "platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200423.30/node-14.0.0-linux-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200507.99/node-14.0.0-linux-x64.tar.gz"
}, },
{ {
"filename": "node-14.0.0-win32-x64.zip", "filename": "node-14.0.0-win32-x64.7z",
"arch": "x64", "arch": "x64",
"platform": "win32", "platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200423.30/node-14.0.0-win32-x64.zip" "download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200507.99/node-14.0.0-win32-x64.7z"
} }
] ]
}, },
{ {
"version": "13.13.0", "version": "13.13.0",
"stable": true, "stable": true,
"release_url": "https://github.com/actions/node-versions/releases/tag/13.13.0-20200423.29", "release_url": "https://github.com/actions/node-versions/releases/tag/13.13.0-20200507.97",
"files": [ "files": [
{ {
"filename": "node-13.13.0-darwin-x64.tar.gz", "filename": "node-13.13.0-darwin-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "darwin", "platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200423.29/node-13.13.0-darwin-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200507.97/node-13.13.0-darwin-x64.tar.gz"
}, },
{ {
"filename": "node-13.13.0-linux-x64.tar.gz", "filename": "node-13.13.0-linux-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "linux", "platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200423.29/node-13.13.0-linux-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200507.97/node-13.13.0-linux-x64.tar.gz"
}, },
{ {
"filename": "node-13.13.0-win32-x64.zip", "filename": "node-13.13.0-win32-x64.7z",
"arch": "x64", "arch": "x64",
"platform": "win32", "platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200423.29/node-13.13.0-win32-x64.zip" "download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200507.97/node-13.13.0-win32-x64.7z"
} }
] ]
}, },
{ {
"version": "12.16.2", "version": "12.16.2",
"stable": true, "stable": true,
"lts": "Erbium", "lts": "Erbium",
"release_url": "https://github.com/actions/node-versions/releases/tag/12.16.2-20200423.28", "release_url": "https://github.com/actions/node-versions/releases/tag/12.16.2-20200507.95",
"files": [ "files": [
{ {
"filename": "node-12.16.2-darwin-x64.tar.gz", "filename": "node-12.16.2-darwin-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "darwin", "platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-darwin-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-darwin-x64.tar.gz"
}, },
{ {
"filename": "node-12.16.2-linux-x64.tar.gz", "filename": "node-12.16.2-linux-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "linux", "platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz"
}, },
{ {
"filename": "node-12.16.2-win32-x64.zip", "filename": "node-12.16.2-win32-x64.7z",
"arch": "x64", "arch": "x64",
"platform": "win32", "platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-win32-x64.zip" "download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-win32-x64.7z"
} }
] ]
}, },
{ {
"version": "10.20.1", "version": "12.0.0",
"stable": true, "stable": true,
"lts": "Dubnium", "lts": "Erbium",
"release_url": "https://github.com/actions/node-versions/releases/tag/10.20.1-20200423.27", "release_url": "https://github.com/actions/node-versions/releases/tag/12.0.0-20200507.71",
"files": [ "files": [
{ {
"filename": "node-10.20.1-darwin-x64.tar.gz", "filename": "node-12.0.0-darwin-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "darwin", "platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200423.27/node-10.20.1-darwin-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/12.0.0-20200507.71/node-12.0.0-darwin-x64.tar.gz"
}, },
{ {
"filename": "node-10.20.1-linux-x64.tar.gz", "filename": "node-12.0.0-linux-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "linux", "platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200423.27/node-10.20.1-linux-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/12.0.0-20200507.71/node-12.0.0-linux-x64.tar.gz"
}, },
{ {
"filename": "node-10.20.1-win32-x64.zip", "filename": "node-12.0.0-win32-x64.7z",
"arch": "x64", "arch": "x64",
"platform": "win32", "platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200423.27/node-10.20.1-win32-x64.zip" "download_url": "https://github.com/actions/node-versions/releases/download/12.0.0-20200507.71/node-12.0.0-win32-x64.7z"
} }
] ]
}, },
{ {
"version": "8.17.0", "version": "10.20.1",
"stable": true, "stable": true,
"lts": "Carbon", "lts": "Dubnium",
"release_url": "https://github.com/actions/node-versions/releases/tag/8.17.0-20200423.26", "release_url": "https://github.com/actions/node-versions/releases/tag/10.20.1-20200507.70",
"files": [ "files": [
{ {
"filename": "node-8.17.0-darwin-x64.tar.gz", "filename": "node-10.20.1-darwin-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "darwin", "platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200423.26/node-8.17.0-darwin-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200507.70/node-10.20.1-darwin-x64.tar.gz"
}, },
{ {
"filename": "node-8.17.0-linux-x64.tar.gz", "filename": "node-10.20.1-linux-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "linux", "platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200423.26/node-8.17.0-linux-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200507.70/node-10.20.1-linux-x64.tar.gz"
}, },
{ {
"filename": "node-8.17.0-win32-x64.zip", "filename": "node-10.20.1-win32-x64.7z",
"arch": "x64", "arch": "x64",
"platform": "win32", "platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200423.26/node-8.17.0-win32-x64.zip" "download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200507.70/node-10.20.1-win32-x64.7z"
} }
] ]
}, },
{ {
"version": "6.17.1", "version": "8.17.0",
"stable": true, "stable": true,
"lts": "Boron", "lts": "Carbon",
"release_url": "https://github.com/actions/node-versions/releases/tag/6.17.1-20200423.25", "release_url": "https://github.com/actions/node-versions/releases/tag/8.17.0-20200507.37",
"files": [ "files": [
{ {
"filename": "node-6.17.1-darwin-x64.tar.gz", "filename": "node-8.17.0-darwin-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "darwin", "platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200423.25/node-6.17.1-darwin-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200507.37/node-8.17.0-darwin-x64.tar.gz"
}, },
{ {
"filename": "node-6.17.1-linux-x64.tar.gz", "filename": "node-8.17.0-linux-x64.tar.gz",
"arch": "x64", "arch": "x64",
"platform": "linux", "platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200423.25/node-6.17.1-linux-x64.tar.gz" "download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200507.37/node-8.17.0-linux-x64.tar.gz"
}, },
{ {
"filename": "node-6.17.1-win32-x64.zip", "filename": "node-8.17.0-win32-x64.7z",
"arch": "x64", "arch": "x64",
"platform": "win32", "platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200423.25/node-6.17.1-win32-x64.zip" "download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200507.37/node-8.17.0-win32-x64.7z"
} }
] ]
} },
] {
"version": "6.17.1",
"stable": true,
"lts": "Boron",
"release_url": "https://github.com/actions/node-versions/releases/tag/6.17.1-20200529.2",
"files": [
{
"filename": "node-6.17.1-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200529.2/node-6.17.1-darwin-x64.tar.gz"
},
{
"filename": "node-6.17.1-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200529.2/node-6.17.1-linux-x64.tar.gz"
},
{
"filename": "node-6.17.1-win32-x64.7z",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200529.2/node-6.17.1-win32-x64.7z"
}
]
}
]

View File

@ -126,7 +126,7 @@ describe('setup-node', () => {
'mocktoken' 'mocktoken'
); );
expect(versions).toBeDefined(); expect(versions).toBeDefined();
expect(versions?.length).toBe(6); expect(versions?.length).toBe(7);
}); });
it('can mock dist versions', async () => { it('can mock dist versions', async () => {
@ -135,50 +135,28 @@ describe('setup-node', () => {
expect(versions?.length).toBe(23); expect(versions?.length).toBe(23);
}); });
it('can find 12.16.2 from manifest on osx', async () => { it.each([
os.platform = 'darwin'; ['12.16.2', 'darwin', '12.16.2', 'Erbium'],
os.arch = 'x64'; ['12', 'linux', '12.16.2', 'Erbium'],
let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo( ['10', 'win32', '10.20.1', 'Dubnium'],
'actions', ['*', 'linux', '14.0.0', 'Fermium']
'node-versions', ])(
'mocktoken' 'can find %s from manifest on %s',
); async (versionSpec, platform, expectedVersion, expectedLts) => {
expect(versions).toBeDefined(); os.platform = platform;
let match = await tc.findFromManifest('12.16.2', true, versions); os.arch = 'x64';
expect(match).toBeDefined(); let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo(
expect(match?.version).toBe('12.16.2'); 'actions',
expect((match as any).lts).toBe('Erbium'); 'node-versions',
}); 'mocktoken'
);
it('can find 12 from manifest on linux', async () => { expect(versions).toBeDefined();
os.platform = 'linux'; let match = await tc.findFromManifest(versionSpec, true, versions);
os.arch = 'x64'; expect(match).toBeDefined();
let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo( expect(match?.version).toBe(expectedVersion);
'actions', expect((match as any).lts).toBe(expectedLts);
'node-versions', }
'mocktoken' );
);
expect(versions).toBeDefined();
let match = await tc.findFromManifest('12.16.2', true, versions);
expect(match).toBeDefined();
expect(match?.version).toBe('12.16.2');
expect((match as any).lts).toBe('Erbium');
});
it('can find 10 from manifest on windows', async () => {
os.platform = 'win32';
os.arch = 'x64';
let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo(
'actions',
'node-versions',
'mocktoken'
);
expect(versions).toBeDefined();
let match = await tc.findFromManifest('10', true, versions);
expect(match).toBeDefined();
expect(match?.version).toBe('10.20.1');
expect((match as any).lts).toBe('Dubnium');
});
//-------------------------------------------------- //--------------------------------------------------
// Found in cache tests // Found in cache tests
@ -250,7 +228,7 @@ describe('setup-node', () => {
inputs['token'] = 'faketoken'; inputs['token'] = 'faketoken';
let expectedUrl = let expectedUrl =
'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz'; 'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz';
// ... but not in the local cache // ... but not in the local cache
findSpy.mockImplementation(() => ''); findSpy.mockImplementation(() => '');
@ -288,7 +266,7 @@ describe('setup-node', () => {
inputs['token'] = 'faketoken'; inputs['token'] = 'faketoken';
let expectedUrl = let expectedUrl =
'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz'; 'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz';
// ... but not in the local cache // ... but not in the local cache
findSpy.mockImplementation(() => ''); findSpy.mockImplementation(() => '');
@ -457,7 +435,7 @@ describe('setup-node', () => {
exSpy.mockImplementation(async () => '/some/other/temp/path'); exSpy.mockImplementation(async () => '/some/other/temp/path');
cacheSpy.mockImplementation(async () => toolPath); cacheSpy.mockImplementation(async () => toolPath);
const expectedUrl = const expectedUrl =
'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz'; 'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz';
await main.run(); await main.run();
@ -699,145 +677,102 @@ describe('setup-node', () => {
inputs.stable = 'true'; inputs.stable = 'true';
}); });
it('find latest LTS version and resolve it from local cache (lts/erbium)', async () => { it.each([
// arrange ['erbium', '12.16.2'],
inputs['node-version'] = 'lts/erbium'; ['*', '14.0.0'],
['-1', '12.16.2']
])(
'find latest LTS version and resolve it from local cache (lts/%s)',
async (lts, expectedVersion) => {
// arrange
inputs['node-version'] = `lts/${lts}`;
const toolPath = path.normalize('/cache/node/12.16.2/x64'); const toolPath = path.normalize(`/cache/node/${expectedVersion}/x64`);
findSpy.mockReturnValue(toolPath); findSpy.mockReturnValue(toolPath);
// act // act
await main.run(); await main.run();
// assert // assert
expect(logSpy).toHaveBeenCalledWith( expect(logSpy).toHaveBeenCalledWith(
'Attempt to resolve LTS alias from manifest...' 'Attempt to resolve LTS alias from manifest...'
); );
expect(dbgSpy).toHaveBeenCalledWith( expect(dbgSpy).toHaveBeenCalledWith(
'Getting manifest from actions/node-versions@main' 'Getting manifest from actions/node-versions@main'
); );
expect(dbgSpy).not.toHaveBeenCalledWith('No manifest cached'); expect(dbgSpy).not.toHaveBeenCalledWith('No manifest cached');
expect(dbgSpy).toHaveBeenCalledWith( expect(dbgSpy).toHaveBeenCalledWith(
`LTS alias 'erbium' for Node version 'lts/erbium'` `LTS alias '${lts}' for Node version 'lts/${lts}'`
); );
expect(dbgSpy).toHaveBeenCalledWith( expect(dbgSpy).toHaveBeenCalledWith(
`Found LTS release '12.16.2' for Node version 'lts/erbium'` `Found LTS release '${expectedVersion}' for Node version 'lts/${lts}'`
); );
expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
expect(cnSpy).toHaveBeenCalledWith( expect(cnSpy).toHaveBeenCalledWith(
`::add-path::${path.join(toolPath, 'bin')}${osm.EOL}` `::add-path::${path.join(toolPath, 'bin')}${osm.EOL}`
); );
}); }
);
it('find latest LTS version and install it from manifest (lts/erbium)', async () => { it.each([
// arrange [
inputs['node-version'] = 'lts/erbium'; 'erbium',
'12.16.2',
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz'
],
[
'*',
'14.0.0',
'https://github.com/actions/node-versions/releases/download/14.0.0-20200507.99/node-14.0.0-linux-x64.tar.gz'
],
[
'-1',
'12.16.2',
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz'
]
])(
'find latest LTS version and install it from manifest (lts/%s)',
async (lts, expectedVersion, expectedUrl) => {
// arrange
inputs['node-version'] = `lts/${lts}`;
const toolPath = path.normalize('/cache/node/12.16.2/x64'); const toolPath = path.normalize(`/cache/node/${expectedVersion}/x64`);
findSpy.mockImplementation(() => ''); findSpy.mockImplementation(() => '');
dlSpy.mockImplementation(async () => '/some/temp/path'); dlSpy.mockImplementation(async () => '/some/temp/path');
exSpy.mockImplementation(async () => '/some/other/temp/path'); exSpy.mockImplementation(async () => '/some/other/temp/path');
cacheSpy.mockImplementation(async () => toolPath); cacheSpy.mockImplementation(async () => toolPath);
const expectedUrl = const expectedMajor = expectedVersion.split('.')[0];
'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz';
// act // act
await main.run(); await main.run();
// assert // assert
expect(logSpy).toHaveBeenCalledWith( expect(logSpy).toHaveBeenCalledWith(
'Attempt to resolve LTS alias from manifest...' 'Attempt to resolve LTS alias from manifest...'
); );
expect(dbgSpy).toHaveBeenCalledWith( expect(dbgSpy).toHaveBeenCalledWith(
'Getting manifest from actions/node-versions@main' 'Getting manifest from actions/node-versions@main'
); );
expect(dbgSpy).not.toHaveBeenCalledWith('No manifest cached'); expect(dbgSpy).not.toHaveBeenCalledWith('No manifest cached');
expect(dbgSpy).toHaveBeenCalledWith( expect(dbgSpy).toHaveBeenCalledWith(
`LTS alias 'erbium' for Node version 'lts/erbium'` `LTS alias '${lts}' for Node version 'lts/${lts}'`
); );
expect(dbgSpy).toHaveBeenCalledWith( expect(dbgSpy).toHaveBeenCalledWith(
`Found LTS release '12.16.2' for Node version 'lts/erbium'` `Found LTS release '${expectedVersion}' for Node version 'lts/${lts}'`
); );
expect(logSpy).toHaveBeenCalledWith('Attempting to download 12...'); expect(logSpy).toHaveBeenCalledWith(
expect(logSpy).toHaveBeenCalledWith( `Attempting to download ${expectedMajor}...`
`Acquiring 12.16.2 - ${os.arch} from ${expectedUrl}` );
); expect(logSpy).toHaveBeenCalledWith(
expect(logSpy).toHaveBeenCalledWith('Extracting ...'); `Acquiring ${expectedVersion} - ${os.arch} from ${expectedUrl}`
expect(logSpy).toHaveBeenCalledWith('Adding to the cache ...'); );
expect(cnSpy).toHaveBeenCalledWith( expect(logSpy).toHaveBeenCalledWith('Extracting ...');
`::add-path::${path.join(toolPath, 'bin')}${osm.EOL}` expect(logSpy).toHaveBeenCalledWith('Adding to the cache ...');
); expect(cnSpy).toHaveBeenCalledWith(
}); `::add-path::${path.join(toolPath, 'bin')}${osm.EOL}`
);
it('find latest LTS version and resolve it from local cache (lts/*)', async () => { }
// arrange );
inputs['node-version'] = 'lts/*';
const toolPath = path.normalize('/cache/node/14.0.0/x64');
findSpy.mockReturnValue(toolPath);
// act
await main.run();
// assert
expect(logSpy).toHaveBeenCalledWith(
'Attempt to resolve LTS alias from manifest...'
);
expect(dbgSpy).toHaveBeenCalledWith(
'Getting manifest from actions/node-versions@main'
);
expect(dbgSpy).not.toHaveBeenCalledWith('No manifest cached');
expect(dbgSpy).toHaveBeenCalledWith(
`LTS alias '*' for Node version 'lts/*'`
);
expect(dbgSpy).toHaveBeenCalledWith(
`Found LTS release '14.0.0' for Node version 'lts/*'`
);
expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
expect(cnSpy).toHaveBeenCalledWith(
`::add-path::${path.join(toolPath, 'bin')}${osm.EOL}`
);
});
it('find latest LTS version and install it from manifest (lts/*)', async () => {
// arrange
inputs['node-version'] = 'lts/*';
const toolPath = path.normalize('/cache/node/14.0.0/x64');
findSpy.mockImplementation(() => '');
dlSpy.mockImplementation(async () => '/some/temp/path');
exSpy.mockImplementation(async () => '/some/other/temp/path');
cacheSpy.mockImplementation(async () => toolPath);
const expectedUrl =
'https://github.com/actions/node-versions/releases/download/14.0.0-20200423.30/node-14.0.0-linux-x64.tar.gz';
// act
await main.run();
// assert
expect(logSpy).toHaveBeenCalledWith(
'Attempt to resolve LTS alias from manifest...'
);
expect(dbgSpy).toHaveBeenCalledWith(
'Getting manifest from actions/node-versions@main'
);
expect(dbgSpy).not.toHaveBeenCalledWith('No manifest cached');
expect(dbgSpy).toHaveBeenCalledWith(
`LTS alias '*' for Node version 'lts/*'`
);
expect(dbgSpy).toHaveBeenCalledWith(
`Found LTS release '14.0.0' for Node version 'lts/*'`
);
expect(logSpy).toHaveBeenCalledWith('Attempting to download 14...');
expect(logSpy).toHaveBeenCalledWith(
`Acquiring 14.0.0 - ${os.arch} from ${expectedUrl}`
);
expect(logSpy).toHaveBeenCalledWith('Extracting ...');
expect(logSpy).toHaveBeenCalledWith('Adding to the cache ...');
expect(cnSpy).toHaveBeenCalledWith(
`::add-path::${path.join(toolPath, 'bin')}${osm.EOL}`
);
});
it('fail with unable to parse LTS alias (lts/)', async () => { it('fail with unable to parse LTS alias (lts/)', async () => {
// arrange // arrange
@ -935,4 +870,31 @@ describe('setup-node', () => {
} }
); );
}); });
describe('latest alias syntax from cache', () => {
it.each(['latest', 'current', 'node'])(
'download the %s version if alias is provided',
async inputVersion => {
// Arrange
inputs['node-version'] = inputVersion;
const expectedVersion = nodeTestDist[0];
os.platform = 'darwin';
os.arch = 'x64';
const toolPath = path.normalize(
`/cache/node/${expectedVersion.version}/x64`
);
findSpy.mockReturnValue(toolPath);
// Act
await main.run();
// assert
expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
expect(logSpy).toHaveBeenCalledWith('getting latest node version...');
}
);
});
}); });

55103
dist/cache-save/index.js vendored

File diff suppressed because one or more lines are too long

74693
dist/setup/index.js vendored

File diff suppressed because one or more lines are too long

View File

@ -19,12 +19,13 @@ Ensure that `package-lock.json` is always committed, use `npm ci` instead of `np
### Yarn ### Yarn
Ensure that `yarn.lock` is always committed, pass `--frozen-lockfile` to `yarn install` when installing packages. To ensure that `yarn.lock` is always committed, use `yarn install --immutable` when installing packages.
**See also:** **See also:**
- [Documentation of `yarn.lock`](https://classic.yarnpkg.com/en/docs/yarn-lock) - [Documentation of `yarn.lock`](https://classic.yarnpkg.com/en/docs/yarn-lock)
- [Documentation of `--frozen-lockfile` option](https://classic.yarnpkg.com/en/docs/cli/install#toc-yarn-install-frozen-lockfile) - [Documentation of `--frozen-lockfile` option](https://classic.yarnpkg.com/en/docs/cli/install#toc-yarn-install-frozen-lockfile)
- [QA - Should lockfiles be committed to the repoistory?](https://yarnpkg.com/getting-started/qa/#should-lockfiles-be-committed-to-the-repository) - [QA - Should lockfiles be committed to the repoistory?](https://yarnpkg.com/getting-started/qa/#should-lockfiles-be-committed-to-the-repository)
- [Documentation of `yarn install`](https://yarnpkg.com/cli/install)
### PNPM ### PNPM
@ -101,7 +102,7 @@ steps:
with: with:
node-version: '14' node-version: '14'
cache: 'yarn' cache: 'yarn'
- run: yarn install --frozen-lockfile - run: yarn install --frozen-lockfile # optional, --immutable
- run: yarn test - run: yarn test
``` ```

19
package-lock.json generated
View File

@ -23,7 +23,7 @@
"@types/jest": "^27.0.2", "@types/jest": "^27.0.2",
"@types/node": "^16.11.25", "@types/node": "^16.11.25",
"@types/semver": "^6.0.0", "@types/semver": "^6.0.0",
"@zeit/ncc": "^0.21.0", "@vercel/ncc": "^0.33.4",
"jest": "^27.2.5", "jest": "^27.2.5",
"jest-circus": "^27.2.5", "jest-circus": "^27.2.5",
"prettier": "^1.19.1", "prettier": "^1.19.1",
@ -1535,11 +1535,10 @@
"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
"dev": true "dev": true
}, },
"node_modules/@zeit/ncc": { "node_modules/@vercel/ncc": {
"version": "0.21.0", "version": "0.33.4",
"resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.21.0.tgz", "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz",
"integrity": "sha512-RUMdvVK/w78oo+yBjruZltt0kJXYar2un/1bYQ2LuHG7GmFVm+QjxzEmySwREctaJdEnBvlMdUNWd9hXHxEI3g==", "integrity": "sha512-ln18hs7dMffelP47tpkaR+V5Tj6coykNyxJrlcmCormPqRQjB/Gv4cu2FfBG+PMzIfdZp2CLDsrrB1NPU22Qhg==",
"deprecated": "@zeit/ncc is no longer maintained. Please use @vercel/ncc instead.",
"dev": true, "dev": true,
"bin": { "bin": {
"ncc": "dist/ncc/cli.js" "ncc": "dist/ncc/cli.js"
@ -6347,10 +6346,10 @@
"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
"dev": true "dev": true
}, },
"@zeit/ncc": { "@vercel/ncc": {
"version": "0.21.0", "version": "0.33.4",
"resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.21.0.tgz", "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz",
"integrity": "sha512-RUMdvVK/w78oo+yBjruZltt0kJXYar2un/1bYQ2LuHG7GmFVm+QjxzEmySwREctaJdEnBvlMdUNWd9hXHxEI3g==", "integrity": "sha512-ln18hs7dMffelP47tpkaR+V5Tj6coykNyxJrlcmCormPqRQjB/Gv4cu2FfBG+PMzIfdZp2CLDsrrB1NPU22Qhg==",
"dev": true "dev": true
}, },
"abab": { "abab": {

View File

@ -37,7 +37,7 @@
"@types/jest": "^27.0.2", "@types/jest": "^27.0.2",
"@types/node": "^16.11.25", "@types/node": "^16.11.25",
"@types/semver": "^6.0.0", "@types/semver": "^6.0.0",
"@zeit/ncc": "^0.21.0", "@vercel/ncc": "^0.33.4",
"jest": "^27.2.5", "jest": "^27.2.5",
"jest-circus": "^27.2.5", "jest-circus": "^27.2.5",
"prettier": "^1.19.1", "prettier": "^1.19.1",

View File

@ -37,6 +37,7 @@ export async function getNode(
) { ) {
// Store manifest data to avoid multiple calls // Store manifest data to avoid multiple calls
let manifest: INodeRelease[] | undefined; let manifest: INodeRelease[] | undefined;
let nodeVersions: INodeVersion[] | undefined;
let osPlat: string = os.platform(); let osPlat: string = os.platform();
let osArch: string = translateArchToDistUrl(arch); let osArch: string = translateArchToDistUrl(arch);
@ -49,6 +50,12 @@ export async function getNode(
versionSpec = resolveLtsAliasFromManifest(versionSpec, stable, manifest); versionSpec = resolveLtsAliasFromManifest(versionSpec, stable, manifest);
} }
if (isLatestSyntax(versionSpec)) {
nodeVersions = await getVersionsFromDist();
versionSpec = await queryDistForMatch(versionSpec, arch, nodeVersions);
core.info(`getting latest node version...`);
}
if (checkLatest) { if (checkLatest) {
core.info('Attempt to resolve the latest version from manifest...'); core.info('Attempt to resolve the latest version from manifest...');
const resolvedVersion = await resolveVersionFromManifest( const resolvedVersion = await resolveVersionFromManifest(
@ -119,7 +126,7 @@ export async function getNode(
// Download from nodejs.org // Download from nodejs.org
// //
if (!downloadPath) { if (!downloadPath) {
info = await getInfoFromDist(versionSpec, arch); info = await getInfoFromDist(versionSpec, arch, nodeVersions);
if (!info) { if (!info) {
throw new Error( throw new Error(
`Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` `Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`
@ -216,13 +223,21 @@ function resolveLtsAliasFromManifest(
core.debug(`LTS alias '${alias}' for Node version '${versionSpec}'`); core.debug(`LTS alias '${alias}' for Node version '${versionSpec}'`);
// Supported formats are `lts/<alias>` and `lts/*`. Where asterisk means highest possible LTS. // Supported formats are `lts/<alias>`, `lts/*`, and `lts/-n`. Where asterisk means highest possible LTS and -n means the nth-highest.
const n = Number(alias);
const aliases = Object.fromEntries(
manifest
.filter(x => x.lts && x.stable === stable)
.map(x => [x.lts!.toLowerCase(), x])
.reverse()
);
const numbered = Object.values(aliases);
const release = const release =
alias === '*' alias === '*'
? manifest.find(x => !!x.lts && x.stable === stable) ? numbered[numbered.length - 1]
: manifest.find( : n < 0
x => x.lts?.toLowerCase() === alias && x.stable === stable ? numbered[numbered.length - 1 + n]
); : aliases[alias];
if (!release) { if (!release) {
throw new Error( throw new Error(
@ -265,14 +280,18 @@ async function getInfoFromManifest(
async function getInfoFromDist( async function getInfoFromDist(
versionSpec: string, versionSpec: string,
arch: string = os.arch() arch: string = os.arch(),
nodeVersions?: INodeVersion[]
): Promise<INodeVersionInfo | null> { ): Promise<INodeVersionInfo | null> {
let osPlat: string = os.platform(); let osPlat: string = os.platform();
let osArch: string = translateArchToDistUrl(arch); let osArch: string = translateArchToDistUrl(arch);
let version: string; let version: string = await queryDistForMatch(
versionSpec,
arch,
nodeVersions
);
version = await queryDistForMatch(versionSpec, arch);
if (!version) { if (!version) {
return null; return null;
} }
@ -349,7 +368,8 @@ function evaluateVersions(versions: string[], versionSpec: string): string {
async function queryDistForMatch( async function queryDistForMatch(
versionSpec: string, versionSpec: string,
arch: string = os.arch() arch: string = os.arch(),
nodeVersions?: INodeVersion[]
): Promise<string> { ): Promise<string> {
let osPlat: string = os.platform(); let osPlat: string = os.platform();
let osArch: string = translateArchToDistUrl(arch); let osArch: string = translateArchToDistUrl(arch);
@ -370,14 +390,14 @@ async function queryDistForMatch(
throw new Error(`Unexpected OS '${osPlat}'`); throw new Error(`Unexpected OS '${osPlat}'`);
} }
let versions: string[] = []; if (!nodeVersions) {
let nodeVersions = await getVersionsFromDist(); core.debug('No dist manifest cached');
nodeVersions = await getVersionsFromDist();
}
if ( let versions: string[] = [];
versionSpec === 'current' ||
versionSpec === 'latest' || if (isLatestSyntax(versionSpec)) {
versionSpec === 'node'
) {
core.info(`getting latest node version...`); core.info(`getting latest node version...`);
return nodeVersions[0].version; return nodeVersions[0].version;
} }
@ -482,3 +502,7 @@ export function parseNodeVersionFile(contents: string): string {
} }
return nodeVersion; return nodeVersion;
} }
function isLatestSyntax(versionSpec): boolean {
return ['current', 'latest', 'node'].includes(versionSpec);
}