mirror of
				https://gitea.com/actions/setup-node.git
				synced 2025-10-29 07:47:20 +00:00 
			
		
		
		
	Compare commits
	
		
			22 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f1f314fca9 | ||
|   | 108628bcbd | ||
|   | eb416799cf | ||
|   | 5f10e344c2 | ||
|   | 40e244d750 | ||
|   | c8711b5525 | ||
|   | d5ae932ee7 | ||
|   | 56899e050a | ||
|   | 4bb8c45053 | ||
|   | a251a519bf | ||
|   | 44c9c18728 | ||
|   | e715d9a456 | ||
|   | b1f2e78536 | ||
|   | 55897e37f3 | ||
|   | 46903d1fb1 | ||
|   | 28505ad4d3 | ||
|   | 2d53d29868 | ||
|   | 1e163ded31 | ||
|   | ffde538781 | ||
|   | e99a7e62b2 | ||
|   | 0dc69b3a71 | ||
|   | 52eb8a7524 | 
							
								
								
									
										8
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @@ -28,7 +28,13 @@ jobs: | |||||||
|         run: __tests__/verify-no-unstaged-changes.sh |         run: __tests__/verify-no-unstaged-changes.sh | ||||||
|  |  | ||||||
|   test: |   test: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ${{ matrix.operating-system }} | ||||||
|  |     strategy: | ||||||
|  |       matrix: | ||||||
|  |         operating-system: [ubuntu-latest, windows-latest] | ||||||
|  |     defaults: | ||||||
|  |       run: | ||||||
|  |         shell: bash | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v2 | ||||||
|       - name: Clear tool cache |       - name: Clear tool cache | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -2,9 +2,6 @@ node_modules/ | |||||||
| lib/ | lib/ | ||||||
| __tests__/runner/* | __tests__/runner/* | ||||||
|  |  | ||||||
| validate/temp |  | ||||||
| validate/node |  | ||||||
|  |  | ||||||
| # Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore | # Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore | ||||||
| # Logs | # Logs | ||||||
| logs | logs | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							| @@ -1,21 +0,0 @@ | |||||||
| { |  | ||||||
|     // Use IntelliSense to learn about possible attributes. |  | ||||||
|     // Hover to view descriptions of existing attributes. |  | ||||||
|     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 |  | ||||||
|     "version": "0.2.0", |  | ||||||
|     "configurations": [ |  | ||||||
|         { |  | ||||||
|             "name": "Debug Jest Tests on Nix", |  | ||||||
|             "type": "node", |  | ||||||
|             "request": "launch", |  | ||||||
|             "runtimeArgs": [ |  | ||||||
|               "--inspect-brk", |  | ||||||
|               "${workspaceRoot}/node_modules/.bin/jest", |  | ||||||
|               "--runInBand" |  | ||||||
|             ], |  | ||||||
|             "console": "integratedTerminal", |  | ||||||
|             "internalConsoleOptions": "neverOpen", |  | ||||||
|             "port": 9229 |  | ||||||
|           }         |  | ||||||
|     ] |  | ||||||
| } |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| # setup-node | # setup-node servicing v1 | ||||||
|  |  | ||||||
| <p align="left"> | <p align="left"> | ||||||
|   <a href="https://github.com/actions/setup-node"><img alt="GitHub Actions status" src="https://github.com/actions/setup-node/workflows/Main%20workflow/badge.svg"></a> |   <a href="https://github.com/actions/setup-node"><img alt="GitHub Actions status" src="https://github.com/actions/setup-node/workflows/Main%20workflow/badge.svg"></a> | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								__tests__/__snapshots__/authutil.test.ts.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								__tests__/__snapshots__/authutil.test.ts.snap
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | // Jest Snapshot v1, https://goo.gl/fbAQLP | ||||||
|  |  | ||||||
|  | exports[`installer tests Appends trailing slash to registry 1`] = ` | ||||||
|  | "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} | ||||||
|  | registry=https://registry.npmjs.org/ | ||||||
|  | always-auth=false" | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | exports[`installer tests Automatically configures GPR scope 1`] = ` | ||||||
|  | "npm.pkg.github.com/:_authToken=\${NODE_AUTH_TOKEN} | ||||||
|  | @ownername:registry=npm.pkg.github.com/ | ||||||
|  | always-auth=false" | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | exports[`installer tests Configures scoped npm registries 1`] = ` | ||||||
|  | "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} | ||||||
|  | @myscope:registry=https://registry.npmjs.org/ | ||||||
|  | always-auth=false" | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | exports[`installer tests Sets up npmrc for always-auth true 1`] = ` | ||||||
|  | "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} | ||||||
|  | registry=https://registry.npmjs.org/ | ||||||
|  | always-auth=true" | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | exports[`installer tests Sets up npmrc for npmjs 1`] = ` | ||||||
|  | "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} | ||||||
|  | registry=https://registry.npmjs.org/ | ||||||
|  | always-auth=false" | ||||||
|  | `; | ||||||
| @@ -1,26 +1,22 @@ | |||||||
| import os = require('os'); | import * as io from '@actions/io'; | ||||||
| import * as fs from 'fs'; | import * as fs from 'fs'; | ||||||
| import * as path from 'path'; | import * as path from 'path'; | ||||||
| import * as core from '@actions/core'; |  | ||||||
| import * as io from '@actions/io'; |  | ||||||
| import * as auth from '../src/authutil'; | import * as auth from '../src/authutil'; | ||||||
|  |  | ||||||
| let rcFile: string; | let rcFile: string; | ||||||
|  |  | ||||||
| describe('authutil tests', () => { | describe('installer tests', () => { | ||||||
|   const _runnerDir = path.join(__dirname, 'runner'); |  | ||||||
|  |  | ||||||
|   let cnSpy: jest.SpyInstance; |  | ||||||
|   let logSpy: jest.SpyInstance; |  | ||||||
|   let dbgSpy: jest.SpyInstance; |  | ||||||
|  |  | ||||||
|   beforeAll(async () => { |   beforeAll(async () => { | ||||||
|     const randPath = path.join( |     const tempDir = path.join( | ||||||
|       Math.random() |       __dirname, | ||||||
|         .toString(36) |       'runner', | ||||||
|         .substring(7) |       path.join( | ||||||
|  |         Math.random() | ||||||
|  |           .toString(36) | ||||||
|  |           .substring(7) | ||||||
|  |       ), | ||||||
|  |       'temp' | ||||||
|     ); |     ); | ||||||
|     const tempDir = path.join(_runnerDir, randPath, 'temp'); |  | ||||||
|     await io.rmRF(tempDir); |     await io.rmRF(tempDir); | ||||||
|     await io.mkdirP(tempDir); |     await io.mkdirP(tempDir); | ||||||
|     process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo'; |     process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo'; | ||||||
| @@ -28,96 +24,44 @@ describe('authutil tests', () => { | |||||||
|     rcFile = path.join(tempDir, '.npmrc'); |     rcFile = path.join(tempDir, '.npmrc'); | ||||||
|   }, 100000); |   }, 100000); | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(() => { | ||||||
|     await io.rmRF(rcFile); |     if (fs.existsSync(rcFile)) { | ||||||
|     // if (fs.existsSync(rcFile)) { |       fs.unlinkSync(rcFile); | ||||||
|     //   fs.unlinkSync(rcFile); |     } | ||||||
|     // } |  | ||||||
|     process.env['INPUT_SCOPE'] = ''; |     process.env['INPUT_SCOPE'] = ''; | ||||||
|  |   }); | ||||||
|     // writes |  | ||||||
|     cnSpy = jest.spyOn(process.stdout, 'write'); |  | ||||||
|     logSpy = jest.spyOn(console, 'log'); |  | ||||||
|     dbgSpy = jest.spyOn(core, 'debug'); |  | ||||||
|     cnSpy.mockImplementation(line => { |  | ||||||
|       // uncomment to debug |  | ||||||
|       // process.stderr.write('write:' + line + '\n'); |  | ||||||
|     }); |  | ||||||
|     logSpy.mockImplementation(line => { |  | ||||||
|       // uncomment to debug |  | ||||||
|       // process.stderr.write('log:' + line + '\n'); |  | ||||||
|     }); |  | ||||||
|     dbgSpy.mockImplementation(msg => { |  | ||||||
|       // uncomment to see debug output |  | ||||||
|       // process.stderr.write(msg + '\n'); |  | ||||||
|     }); |  | ||||||
|   }, 100000); |  | ||||||
|  |  | ||||||
|   function dbg(message: string) { |  | ||||||
|     process.stderr.write('dbg::' + message + '::\n'); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   afterAll(async () => { |  | ||||||
|     if (_runnerDir) { |  | ||||||
|       await io.rmRF(_runnerDir); |  | ||||||
|     } |  | ||||||
|   }, 100000); |  | ||||||
|  |  | ||||||
|   function readRcFile(rcFile: string) { |  | ||||||
|     let rc = {}; |  | ||||||
|     let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); |  | ||||||
|     for (const line of contents.split(os.EOL)) { |  | ||||||
|       let parts = line.split('='); |  | ||||||
|       if (parts.length == 2) { |  | ||||||
|         rc[parts[0].trim()] = parts[1].trim(); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     return rc; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   it('Sets up npmrc for npmjs', async () => { |   it('Sets up npmrc for npmjs', async () => { | ||||||
|     await auth.configAuthentication('https://registry.npmjs.org/', 'false'); |     await auth.configAuthentication('https://registry.npmjs.org/', 'false'); | ||||||
|  |     expect(fs.existsSync(rcFile)).toBe(true); | ||||||
|     expect(fs.statSync(rcFile)).toBeDefined(); |     expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); | ||||||
|     let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); |  | ||||||
|     let rc = readRcFile(rcFile); |  | ||||||
|     expect(rc['registry']).toBe('https://registry.npmjs.org/'); |  | ||||||
|     expect(rc['always-auth']).toBe('false'); |  | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('Appends trailing slash to registry', async () => { |   it('Appends trailing slash to registry', async () => { | ||||||
|     await auth.configAuthentication('https://registry.npmjs.org', 'false'); |     await auth.configAuthentication('https://registry.npmjs.org', 'false'); | ||||||
|  |  | ||||||
|     expect(fs.statSync(rcFile)).toBeDefined(); |     expect(fs.existsSync(rcFile)).toBe(true); | ||||||
|     let rc = readRcFile(rcFile); |     expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); | ||||||
|     expect(rc['registry']).toBe('https://registry.npmjs.org/'); |  | ||||||
|     expect(rc['always-auth']).toBe('false'); |  | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('Configures scoped npm registries', async () => { |   it('Configures scoped npm registries', async () => { | ||||||
|     process.env['INPUT_SCOPE'] = 'myScope'; |     process.env['INPUT_SCOPE'] = 'myScope'; | ||||||
|     await auth.configAuthentication('https://registry.npmjs.org', 'false'); |     await auth.configAuthentication('https://registry.npmjs.org', 'false'); | ||||||
|  |  | ||||||
|     expect(fs.statSync(rcFile)).toBeDefined(); |     expect(fs.existsSync(rcFile)).toBe(true); | ||||||
|     let rc = readRcFile(rcFile); |     expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); | ||||||
|     expect(rc['@myscope:registry']).toBe('https://registry.npmjs.org/'); |  | ||||||
|     expect(rc['always-auth']).toBe('false'); |  | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('Automatically configures GPR scope', async () => { |   it('Automatically configures GPR scope', async () => { | ||||||
|     await auth.configAuthentication('npm.pkg.github.com', 'false'); |     await auth.configAuthentication('npm.pkg.github.com', 'false'); | ||||||
|  |  | ||||||
|     expect(fs.statSync(rcFile)).toBeDefined(); |     expect(fs.existsSync(rcFile)).toBe(true); | ||||||
|     let rc = readRcFile(rcFile); |     expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); | ||||||
|     expect(rc['@ownername:registry']).toBe('npm.pkg.github.com/'); |  | ||||||
|     expect(rc['always-auth']).toBe('false'); |  | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('Sets up npmrc for always-auth true', async () => { |   it('Sets up npmrc for always-auth true', async () => { | ||||||
|     await auth.configAuthentication('https://registry.npmjs.org/', 'true'); |     await auth.configAuthentication('https://registry.npmjs.org/', 'true'); | ||||||
|     expect(fs.statSync(rcFile)).toBeDefined(); |     expect(fs.existsSync(rcFile)).toBe(true); | ||||||
|     let rc = readRcFile(rcFile); |     expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); | ||||||
|     expect(rc['registry']).toBe('https://registry.npmjs.org/'); |  | ||||||
|     expect(rc['always-auth']).toBe('true'); |  | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -1,770 +0,0 @@ | |||||||
| [ |  | ||||||
|     { |  | ||||||
|         "version": "v14.1.0", |  | ||||||
|         "date": "2020-04-29", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "8.1.307.31", |  | ||||||
|         "uv": "1.37.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1g", |  | ||||||
|         "modules": "83", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v14.0.0", |  | ||||||
|         "date": "2020-04-21", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "8.1.307.30", |  | ||||||
|         "uv": "1.37.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1f", |  | ||||||
|         "modules": "83", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v13.14.0", |  | ||||||
|         "date": "2020-04-28", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "7.9.317.25", |  | ||||||
|         "uv": "1.37.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1g", |  | ||||||
|         "modules": "79", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v13.13.0", |  | ||||||
|         "date": "2020-04-14", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "7.9.317.25", |  | ||||||
|         "uv": "1.35.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1f", |  | ||||||
|         "modules": "79", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v12.16.3", |  | ||||||
|         "date": "2020-04-28", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "7.8.279.23", |  | ||||||
|         "uv": "1.34.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1g", |  | ||||||
|         "modules": "72", |  | ||||||
|         "lts": "Erbium", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v12.16.2", |  | ||||||
|         "date": "2020-04-08", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "7.8.279.23", |  | ||||||
|         "uv": "1.34.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1e", |  | ||||||
|         "modules": "72", |  | ||||||
|         "lts": "Erbium", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v12.1.0", |  | ||||||
|         "date": "2019-04-29", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.9.0", |  | ||||||
|         "v8": "7.4.288.21", |  | ||||||
|         "uv": "1.28.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1b", |  | ||||||
|         "modules": "72", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v11.15.0", |  | ||||||
|         "date": "2019-04-30", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.7.0", |  | ||||||
|         "v8": "7.0.276.38", |  | ||||||
|         "uv": "1.27.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1b", |  | ||||||
|         "modules": "67", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v10.20.1", |  | ||||||
|         "date": "2020-04-10", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "6.8.275.32", |  | ||||||
|         "uv": "1.34.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1e", |  | ||||||
|         "modules": "64", |  | ||||||
|         "lts": "Dubnium", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v10.20.0", |  | ||||||
|         "date": "2020-03-24", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.14.4", |  | ||||||
|         "v8": "6.8.275.32", |  | ||||||
|         "uv": "1.34.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.1.1e", |  | ||||||
|         "modules": "64", |  | ||||||
|         "lts": "Dubnium", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v9.11.2", |  | ||||||
|         "date": "2018-06-12", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "5.6.0", |  | ||||||
|         "v8": "6.2.414.46", |  | ||||||
|         "uv": "1.19.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2o", |  | ||||||
|         "modules": "59", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v9.11.1", |  | ||||||
|         "date": "2018-04-05", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "5.6.0", |  | ||||||
|         "v8": "6.2.414.46", |  | ||||||
|         "uv": "1.19.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2o", |  | ||||||
|         "modules": "59", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v8.17.0", |  | ||||||
|         "date": "2019-12-17", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.13.4", |  | ||||||
|         "v8": "6.2.414.78", |  | ||||||
|         "uv": "1.23.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2s", |  | ||||||
|         "modules": "57", |  | ||||||
|         "lts": "Carbon", |  | ||||||
|         "security": true |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v8.16.2", |  | ||||||
|         "date": "2019-10-08", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "6.4.1", |  | ||||||
|         "v8": "6.2.414.78", |  | ||||||
|         "uv": "1.23.2", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2s", |  | ||||||
|         "modules": "57", |  | ||||||
|         "lts": "Carbon", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v7.10.1", |  | ||||||
|         "date": "2017-07-11", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "4.2.0", |  | ||||||
|         "v8": "5.5.372.43", |  | ||||||
|         "uv": "1.11.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2k", |  | ||||||
|         "modules": "51", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": true |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v7.10.0", |  | ||||||
|         "date": "2017-05-02", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "4.2.0", |  | ||||||
|         "v8": "5.5.372.43", |  | ||||||
|         "uv": "1.11.0", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2k", |  | ||||||
|         "modules": "51", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v6.17.1", |  | ||||||
|         "date": "2019-04-03", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "3.10.10", |  | ||||||
|         "v8": "5.1.281.111", |  | ||||||
|         "uv": "1.16.1", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2r", |  | ||||||
|         "modules": "48", |  | ||||||
|         "lts": "Boron", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v6.17.0", |  | ||||||
|         "date": "2019-02-28", |  | ||||||
|         "files": [ |  | ||||||
|             "aix-ppc64", |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-s390x", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "3.10.10", |  | ||||||
|         "v8": "5.1.281.111", |  | ||||||
|         "uv": "1.16.1", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2r", |  | ||||||
|         "modules": "48", |  | ||||||
|         "lts": "Boron", |  | ||||||
|         "security": true |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v5.12.0", |  | ||||||
|         "date": "2016-06-23", |  | ||||||
|         "files": [ |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi" |  | ||||||
|         ], |  | ||||||
|         "npm": "3.8.6", |  | ||||||
|         "v8": "4.6.85.32", |  | ||||||
|         "uv": "1.8.0", |  | ||||||
|         "zlib": "1.2.8", |  | ||||||
|         "openssl": "1.0.2h", |  | ||||||
|         "modules": "47", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v4.9.1", |  | ||||||
|         "date": "2018-03-29", |  | ||||||
|         "files": [ |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "2.15.11", |  | ||||||
|         "v8": "4.5.103.53", |  | ||||||
|         "uv": "1.9.1", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2o", |  | ||||||
|         "modules": "46", |  | ||||||
|         "lts": "Argon", |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v4.9.0", |  | ||||||
|         "date": "2018-03-28", |  | ||||||
|         "files": [ |  | ||||||
|             "headers", |  | ||||||
|             "linux-arm64", |  | ||||||
|             "linux-armv6l", |  | ||||||
|             "linux-armv7l", |  | ||||||
|             "linux-ppc64le", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-7z", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x64-msi", |  | ||||||
|             "win-x64-zip", |  | ||||||
|             "win-x86-7z", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi", |  | ||||||
|             "win-x86-zip" |  | ||||||
|         ], |  | ||||||
|         "npm": "2.15.11", |  | ||||||
|         "v8": "4.5.103.53", |  | ||||||
|         "uv": "1.9.1", |  | ||||||
|         "zlib": "1.2.11", |  | ||||||
|         "openssl": "1.0.2o", |  | ||||||
|         "modules": "46", |  | ||||||
|         "lts": "Argon", |  | ||||||
|         "security": true |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v0.12.18", |  | ||||||
|         "date": "2017-02-22", |  | ||||||
|         "files": [ |  | ||||||
|             "headers", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "osx-x86-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi" |  | ||||||
|         ], |  | ||||||
|         "npm": "2.15.11", |  | ||||||
|         "v8": "3.28.71.20", |  | ||||||
|         "uv": "1.6.1", |  | ||||||
|         "zlib": "1.2.8", |  | ||||||
|         "openssl": "1.0.1u", |  | ||||||
|         "modules": "14", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": false |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "version": "v0.12.17", |  | ||||||
|         "date": "2016-10-18", |  | ||||||
|         "files": [ |  | ||||||
|             "headers", |  | ||||||
|             "linux-x64", |  | ||||||
|             "linux-x86", |  | ||||||
|             "osx-x64-pkg", |  | ||||||
|             "osx-x64-tar", |  | ||||||
|             "osx-x86-tar", |  | ||||||
|             "src", |  | ||||||
|             "sunos-x64", |  | ||||||
|             "sunos-x86", |  | ||||||
|             "win-x64-exe", |  | ||||||
|             "win-x86-exe", |  | ||||||
|             "win-x86-msi" |  | ||||||
|         ], |  | ||||||
|         "npm": "2.15.1", |  | ||||||
|         "v8": "3.28.71.19", |  | ||||||
|         "uv": "1.6.1", |  | ||||||
|         "zlib": "1.2.8", |  | ||||||
|         "openssl": "1.0.1u", |  | ||||||
|         "modules": "14", |  | ||||||
|         "lts": false, |  | ||||||
|         "security": true |  | ||||||
|     } |  | ||||||
| ] |  | ||||||
| @@ -1,152 +0,0 @@ | |||||||
| [ |  | ||||||
|     { |  | ||||||
|       "version": "14.0.0", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/node-versions/releases/tag/14.0.0-20200423.30", |  | ||||||
|       "files": [ |  | ||||||
|         { |  | ||||||
|           "filename": "node-14.0.0-darwin-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-14.0.0-linux-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-14.0.0-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/node-versions/releases/download/14.0.0-20200423.30/node-14.0.0-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "version": "13.13.0", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/node-versions/releases/tag/13.13.0-20200423.29", |  | ||||||
|       "files": [ |  | ||||||
|         { |  | ||||||
|           "filename": "node-13.13.0-darwin-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-13.13.0-linux-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-13.13.0-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/node-versions/releases/download/13.13.0-20200423.29/node-13.13.0-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "version": "12.16.2", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/node-versions/releases/tag/12.16.2-20200423.28", |  | ||||||
|       "files": [ |  | ||||||
|         { |  | ||||||
|           "filename": "node-12.16.2-darwin-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-12.16.2-linux-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-12.16.2-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "version": "10.20.1", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/node-versions/releases/tag/10.20.1-20200423.27", |  | ||||||
|       "files": [ |  | ||||||
|         { |  | ||||||
|           "filename": "node-10.20.1-darwin-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-10.20.1-linux-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-10.20.1-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/node-versions/releases/download/10.20.1-20200423.27/node-10.20.1-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "version": "8.17.0", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/node-versions/releases/tag/8.17.0-20200423.26", |  | ||||||
|       "files": [ |  | ||||||
|         { |  | ||||||
|           "filename": "node-8.17.0-darwin-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-8.17.0-linux-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "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" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-8.17.0-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/node-versions/releases/download/8.17.0-20200423.26/node-8.17.0-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "version": "6.17.1", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/node-versions/releases/tag/6.17.1-20200423.25", |  | ||||||
|       "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-20200423.25/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-20200423.25/node-6.17.1-linux-x64.tar.gz" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "node-6.17.1-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/node-versions/releases/download/6.17.1-20200423.25/node-6.17.1-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     } |  | ||||||
|   ] |  | ||||||
| @@ -1,336 +1,123 @@ | |||||||
| import * as core from '@actions/core'; |  | ||||||
| import * as io from '@actions/io'; | import * as io from '@actions/io'; | ||||||
| import * as tc from '@actions/tool-cache'; | import * as tc from '@actions/tool-cache'; | ||||||
| import fs from 'fs'; | import * as fs from 'fs'; | ||||||
| import cp from 'child_process'; | import * as os from 'os'; | ||||||
| import osm = require('os'); | import * as path from 'path'; | ||||||
| import path from 'path'; | import * as installer from '../src/installer'; | ||||||
| import * as main from '../src/main'; |  | ||||||
| import * as im from '../src/installer'; |  | ||||||
| import * as auth from '../src/authutil'; |  | ||||||
|  |  | ||||||
| let nodeTestManifest = require('./data/versions-manifest.json'); | const isWindows = process.platform === 'win32'; | ||||||
| let nodeTestDist = require('./data/node-dist-index.json'); | let toolDir: string; | ||||||
|  |  | ||||||
| // let matchers = require('../matchers.json'); | describe('installer tests', () => { | ||||||
| // let matcherPattern = matchers.problemMatcher[0].pattern[0]; |   beforeAll(async () => { | ||||||
| // let matcherRegExp = new RegExp(matcherPattern.regexp); |     toolDir = path.join( | ||||||
|  |       __dirname, | ||||||
| describe('setup-node', () => { |       'runner', | ||||||
|   let inputs = {} as any; |       path.join( | ||||||
|   let os = {} as any; |         Math.random() | ||||||
|  |           .toString(36) | ||||||
|   let inSpy: jest.SpyInstance; |           .substring(7) | ||||||
|   let findSpy: jest.SpyInstance; |       ), | ||||||
|   let cnSpy: jest.SpyInstance; |       'tools' | ||||||
|   let logSpy: jest.SpyInstance; |  | ||||||
|   let getManifestSpy: jest.SpyInstance; |  | ||||||
|   let getDistSpy: jest.SpyInstance; |  | ||||||
|   let platSpy: jest.SpyInstance; |  | ||||||
|   let archSpy: jest.SpyInstance; |  | ||||||
|   let dlSpy: jest.SpyInstance; |  | ||||||
|   let exSpy: jest.SpyInstance; |  | ||||||
|   let cacheSpy: jest.SpyInstance; |  | ||||||
|   let dbgSpy: jest.SpyInstance; |  | ||||||
|   let whichSpy: jest.SpyInstance; |  | ||||||
|   let existsSpy: jest.SpyInstance; |  | ||||||
|   let mkdirpSpy: jest.SpyInstance; |  | ||||||
|   let execSpy: jest.SpyInstance; |  | ||||||
|   let authSpy: jest.SpyInstance; |  | ||||||
|  |  | ||||||
|   beforeEach(() => { |  | ||||||
|     // @actions/core |  | ||||||
|     inputs = {}; |  | ||||||
|     inSpy = jest.spyOn(core, 'getInput'); |  | ||||||
|     inSpy.mockImplementation(name => inputs[name]); |  | ||||||
|  |  | ||||||
|     // node |  | ||||||
|     os = {}; |  | ||||||
|     platSpy = jest.spyOn(osm, 'platform'); |  | ||||||
|     platSpy.mockImplementation(() => os['platform']); |  | ||||||
|     archSpy = jest.spyOn(osm, 'arch'); |  | ||||||
|     archSpy.mockImplementation(() => os['arch']); |  | ||||||
|     execSpy = jest.spyOn(cp, 'execSync'); |  | ||||||
|  |  | ||||||
|     // @actions/tool-cache |  | ||||||
|     findSpy = jest.spyOn(tc, 'find'); |  | ||||||
|     dlSpy = jest.spyOn(tc, 'downloadTool'); |  | ||||||
|     exSpy = jest.spyOn(tc, 'extractTar'); |  | ||||||
|     cacheSpy = jest.spyOn(tc, 'cacheDir'); |  | ||||||
|     getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); |  | ||||||
|     getDistSpy = jest.spyOn(im, 'getVersionsFromDist'); |  | ||||||
|  |  | ||||||
|     // io |  | ||||||
|     whichSpy = jest.spyOn(io, 'which'); |  | ||||||
|     existsSpy = jest.spyOn(fs, 'existsSync'); |  | ||||||
|     mkdirpSpy = jest.spyOn(io, 'mkdirP'); |  | ||||||
|  |  | ||||||
|     // disable authentication portion for installer tests |  | ||||||
|     authSpy = jest.spyOn(auth, 'configAuthentication'); |  | ||||||
|     authSpy.mockImplementation(() => {}); |  | ||||||
|  |  | ||||||
|     // gets |  | ||||||
|     getManifestSpy.mockImplementation( |  | ||||||
|       () => <tc.IToolRelease[]>nodeTestManifest |  | ||||||
|     ); |     ); | ||||||
|     getDistSpy.mockImplementation(() => <im.INodeVersion>nodeTestDist); |     const tempDir = path.join( | ||||||
|  |       __dirname, | ||||||
|     // writes |       'runner', | ||||||
|     cnSpy = jest.spyOn(process.stdout, 'write'); |       path.join( | ||||||
|     logSpy = jest.spyOn(console, 'log'); |         Math.random() | ||||||
|     dbgSpy = jest.spyOn(core, 'debug'); |           .toString(36) | ||||||
|     cnSpy.mockImplementation(line => { |           .substring(7) | ||||||
|       // uncomment to debug |       ), | ||||||
|       // process.stderr.write('write:' + line + '\n'); |       'temp' | ||||||
|     }); |  | ||||||
|     logSpy.mockImplementation(line => { |  | ||||||
|       // uncomment to debug |  | ||||||
|       // process.stderr.write('log:' + line + '\n'); |  | ||||||
|     }); |  | ||||||
|     dbgSpy.mockImplementation(msg => { |  | ||||||
|       // uncomment to see debug output |  | ||||||
|       // process.stderr.write(msg + '\n'); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   afterEach(() => { |  | ||||||
|     jest.resetAllMocks(); |  | ||||||
|     jest.clearAllMocks(); |  | ||||||
|     //jest.restoreAllMocks(); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   afterAll(async () => {}, 100000); |  | ||||||
|  |  | ||||||
|   //-------------------------------------------------- |  | ||||||
|   // Manifest find tests |  | ||||||
|   //-------------------------------------------------- |  | ||||||
|   it('can mock manifest versions', async () => { |  | ||||||
|     let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo( |  | ||||||
|       'actions', |  | ||||||
|       'node-versions', |  | ||||||
|       'mocktoken' |  | ||||||
|     ); |     ); | ||||||
|     expect(versions).toBeDefined(); |     await io.rmRF(toolDir); | ||||||
|     expect(versions?.length).toBe(6); |     await io.rmRF(tempDir); | ||||||
|  |     process.env['RUNNER_TOOL_CACHE'] = toolDir; | ||||||
|  |     process.env['RUNNER_TEMP'] = tempDir; | ||||||
|  |   }, 100000); | ||||||
|  |  | ||||||
|  |   it('Acquires version of node if no matching version is installed', async () => { | ||||||
|  |     await installer.getNode('10.16.0'); | ||||||
|  |     const nodeDir = path.join(toolDir, 'node', '10.16.0', os.arch()); | ||||||
|  |  | ||||||
|  |     expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | ||||||
|  |     if (isWindows) { | ||||||
|  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | ||||||
|  |     } else { | ||||||
|  |       expect(fs.existsSync(path.join(nodeDir, 'bin', 'node'))).toBe(true); | ||||||
|  |     } | ||||||
|  |   }, 100000); | ||||||
|  |  | ||||||
|  |   if (isWindows) { | ||||||
|  |     it('Falls back to backup location if first one doesnt contain correct version', async () => { | ||||||
|  |       await installer.getNode('5.10.1'); | ||||||
|  |       const nodeDir = path.join(toolDir, 'node', '5.10.1', os.arch()); | ||||||
|  |  | ||||||
|  |       expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | ||||||
|  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | ||||||
|  |     }, 100000); | ||||||
|  |  | ||||||
|  |     it('Falls back to third location if second one doesnt contain correct version', async () => { | ||||||
|  |       await installer.getNode('0.12.18'); | ||||||
|  |       const nodeDir = path.join(toolDir, 'node', '0.12.18', os.arch()); | ||||||
|  |  | ||||||
|  |       expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | ||||||
|  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | ||||||
|  |     }, 100000); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   it('Throws if no location contains correct node version', async () => { | ||||||
|  |     let thrown = false; | ||||||
|  |     try { | ||||||
|  |       await installer.getNode('1000'); | ||||||
|  |     } catch { | ||||||
|  |       thrown = true; | ||||||
|  |     } | ||||||
|  |     expect(thrown).toBe(true); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('can mock dist versions', async () => { |   it('Acquires version of node with long paths', async () => { | ||||||
|     let versions: im.INodeVersion[] = await im.getVersionsFromDist(); |     const toolpath = await installer.getNode('8.8.1'); | ||||||
|     expect(versions).toBeDefined(); |     const nodeDir = path.join(toolDir, 'node', '8.8.1', os.arch()); | ||||||
|     expect(versions?.length).toBe(23); |  | ||||||
|  |     expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | ||||||
|  |     if (isWindows) { | ||||||
|  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | ||||||
|  |     } else { | ||||||
|  |       expect(fs.existsSync(path.join(nodeDir, 'bin', 'node'))).toBe(true); | ||||||
|  |     } | ||||||
|  |   }, 100000); | ||||||
|  |  | ||||||
|  |   it('Uses version of node installed in cache', async () => { | ||||||
|  |     const nodeDir: string = path.join(toolDir, 'node', '250.0.0', os.arch()); | ||||||
|  |     await io.mkdirP(nodeDir); | ||||||
|  |     fs.writeFileSync(`${nodeDir}.complete`, 'hello'); | ||||||
|  |     // This will throw if it doesn't find it in the cache (because no such version exists) | ||||||
|  |     await installer.getNode('250.0.0'); | ||||||
|  |     return; | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('can find 12.16.2 from manifest on osx', async () => { |   it('Doesnt use version of node that was only partially installed in cache', async () => { | ||||||
|     os.platform = 'darwin'; |     const nodeDir: string = path.join(toolDir, 'node', '251.0.0', os.arch()); | ||||||
|     os.arch = 'x64'; |     await io.mkdirP(nodeDir); | ||||||
|     let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo( |     let thrown = false; | ||||||
|       'actions', |     try { | ||||||
|       'node-versions', |       // This will throw if it doesn't find it in the cache (because no such version exists) | ||||||
|       'mocktoken' |       await installer.getNode('251.0.0'); | ||||||
|     ); |     } catch { | ||||||
|     expect(versions).toBeDefined(); |       thrown = true; | ||||||
|     let match = await tc.findFromManifest('12.16.2', true, versions); |     } | ||||||
|     expect(match).toBeDefined(); |     expect(thrown).toBe(true); | ||||||
|     expect(match?.version).toBe('12.16.2'); |     return; | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('can find 12 from manifest on linux', async () => { |   it('Resolves semantic versions of node installed in cache', async () => { | ||||||
|     os.platform = 'linux'; |     const nodeDir: string = path.join(toolDir, 'node', '252.0.0', os.arch()); | ||||||
|     os.arch = 'x64'; |     await io.mkdirP(nodeDir); | ||||||
|     let versions: tc.IToolRelease[] | null = await tc.getManifestFromRepo( |     fs.writeFileSync(`${nodeDir}.complete`, 'hello'); | ||||||
|       'actions', |     // These will throw if it doesn't find it in the cache (because no such version exists) | ||||||
|       'node-versions', |     await installer.getNode('252.0.0'); | ||||||
|       'mocktoken' |     await installer.getNode('252'); | ||||||
|     ); |     await installer.getNode('252.0'); | ||||||
|     expect(versions).toBeDefined(); |  | ||||||
|     let match = await tc.findFromManifest('12.16.2', true, versions); |  | ||||||
|     expect(match).toBeDefined(); |  | ||||||
|     expect(match?.version).toBe('12.16.2'); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   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'); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   //-------------------------------------------------- |  | ||||||
|   // Found in cache tests |  | ||||||
|   //-------------------------------------------------- |  | ||||||
|  |  | ||||||
|   it('finds version in cache with stable true', async () => { |  | ||||||
|     inputs['node-version'] = '12'; |  | ||||||
|     inputs.stable = 'true'; |  | ||||||
|  |  | ||||||
|     let toolPath = path.normalize('/cache/node/12.16.1/x64'); |  | ||||||
|     findSpy.mockImplementation(() => toolPath); |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('finds version in cache with stable not supplied', async () => { |  | ||||||
|     inputs['node-version'] = '12'; |  | ||||||
|  |  | ||||||
|     inSpy.mockImplementation(name => inputs[name]); |  | ||||||
|  |  | ||||||
|     let toolPath = path.normalize('/cache/node/12.16.1/x64'); |  | ||||||
|     findSpy.mockImplementation(() => toolPath); |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('finds version in cache and adds it to the path', async () => { |  | ||||||
|     inputs['node-version'] = '12'; |  | ||||||
|  |  | ||||||
|     inSpy.mockImplementation(name => inputs[name]); |  | ||||||
|  |  | ||||||
|     let toolPath = path.normalize('/cache/node/12.16.1/x64'); |  | ||||||
|     findSpy.mockImplementation(() => toolPath); |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     let expPath = path.join(toolPath, 'bin'); |  | ||||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('handles unhandled find error and reports error', async () => { |  | ||||||
|     let errMsg = 'unhandled error message'; |  | ||||||
|     inputs['node-version'] = '12'; |  | ||||||
|  |  | ||||||
|     findSpy.mockImplementation(() => { |  | ||||||
|       throw new Error(errMsg); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     expect(cnSpy).toHaveBeenCalledWith('::error::' + errMsg + osm.EOL); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('downloads a version from a manifest match', async () => { |  | ||||||
|     os.platform = 'linux'; |  | ||||||
|     os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|     // a version which is in the manifest |  | ||||||
|     let versionSpec = '12.16.2'; |  | ||||||
|     let resolvedVersion = versionSpec; |  | ||||||
|  |  | ||||||
|     inputs['node-version'] = versionSpec; |  | ||||||
|     inputs['always-auth'] = false; |  | ||||||
|     inputs['token'] = 'faketoken'; |  | ||||||
|  |  | ||||||
|     let expectedUrl = |  | ||||||
|       'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz'; |  | ||||||
|  |  | ||||||
|     // ... but not in the local cache |  | ||||||
|     findSpy.mockImplementation(() => ''); |  | ||||||
|  |  | ||||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); |  | ||||||
|     let toolPath = path.normalize('/cache/node/12.16.2/x64'); |  | ||||||
|     exSpy.mockImplementation(async () => '/some/other/temp/path'); |  | ||||||
|     cacheSpy.mockImplementation(async () => toolPath); |  | ||||||
|  |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     let expPath = path.join(toolPath, 'bin'); |  | ||||||
|  |  | ||||||
|     expect(dlSpy).toHaveBeenCalled(); |  | ||||||
|     expect(exSpy).toHaveBeenCalled(); |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|       `Acquiring ${resolvedVersion} from ${expectedUrl}` |  | ||||||
|     ); |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|       `Attempting to download ${versionSpec}...` |  | ||||||
|     ); |  | ||||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('falls back to a version from node dist', async () => { |  | ||||||
|     os.platform = 'linux'; |  | ||||||
|     os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|     // a version which is not in the manifest but is in node dist |  | ||||||
|     let versionSpec = '11.15.0'; |  | ||||||
|     let resolvedVersion = versionSpec; |  | ||||||
|  |  | ||||||
|     inputs['node-version'] = versionSpec; |  | ||||||
|     inputs['always-auth'] = false; |  | ||||||
|     inputs['token'] = 'faketoken'; |  | ||||||
|  |  | ||||||
|     let expectedUrl = |  | ||||||
|       'https://github.com/actions/node-versions/releases/download/12.16.2-20200423.28/node-12.16.2-linux-x64.tar.gz'; |  | ||||||
|  |  | ||||||
|     // ... but not in the local cache |  | ||||||
|     findSpy.mockImplementation(() => ''); |  | ||||||
|  |  | ||||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); |  | ||||||
|     let toolPath = path.normalize('/cache/node/11.11.0/x64'); |  | ||||||
|     exSpy.mockImplementation(async () => '/some/other/temp/path'); |  | ||||||
|     cacheSpy.mockImplementation(async () => toolPath); |  | ||||||
|  |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     let expPath = path.join(toolPath, 'bin'); |  | ||||||
|  |  | ||||||
|     expect(dlSpy).toHaveBeenCalled(); |  | ||||||
|     expect(exSpy).toHaveBeenCalled(); |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|       'Not found in manifest.  Falling back to download directly from Node' |  | ||||||
|     ); |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|       `Attempting to download ${versionSpec}...` |  | ||||||
|     ); |  | ||||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('does not find a version that does not exist', async () => { |  | ||||||
|     os.platform = 'linux'; |  | ||||||
|     os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|     let versionSpec = '9.99.9'; |  | ||||||
|     inputs['node-version'] = versionSpec; |  | ||||||
|  |  | ||||||
|     findSpy.mockImplementation(() => ''); |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|       'Not found in manifest.  Falling back to download directly from Node' |  | ||||||
|     ); |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|       `Attempting to download ${versionSpec}...` |  | ||||||
|     ); |  | ||||||
|     expect(cnSpy).toHaveBeenCalledWith( |  | ||||||
|       `::error::Unable to find Node version '${versionSpec}' for platform ${os.platform} and architecture ${os.arch}.${osm.EOL}` |  | ||||||
|     ); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   it('reports a failed download', async () => { |  | ||||||
|     let errMsg = 'unhandled download message'; |  | ||||||
|     os.platform = 'linux'; |  | ||||||
|     os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|     // a version which is in the manifest |  | ||||||
|     let versionSpec = '12.16.2'; |  | ||||||
|     let resolvedVersion = versionSpec; |  | ||||||
|  |  | ||||||
|     inputs['node-version'] = versionSpec; |  | ||||||
|     inputs['always-auth'] = false; |  | ||||||
|     inputs['token'] = 'faketoken'; |  | ||||||
|  |  | ||||||
|     findSpy.mockImplementation(() => ''); |  | ||||||
|     dlSpy.mockImplementation(() => { |  | ||||||
|       throw new Error(errMsg); |  | ||||||
|     }); |  | ||||||
|     await main.run(); |  | ||||||
|  |  | ||||||
|     expect(cnSpy).toHaveBeenCalledWith(`::error::${errMsg}${osm.EOL}`); |  | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								action.yml
									
									
									
									
									
								
							| @@ -1,21 +1,17 @@ | |||||||
| name: 'Setup Node.js environment' | name: 'Setup Node.js environment' | ||||||
| description: 'Setup a Node.js environment by adding problem matchers and optionally downloading and adding it to the PATH' | description: 'Setup a Node.js environment and add it to the PATH, additionally providing proxy support' | ||||||
| author: 'GitHub' | author: 'GitHub' | ||||||
| inputs: | inputs: | ||||||
|   always-auth: |   always-auth: | ||||||
|     description: 'Set always-auth in npmrc' |     description: 'Set always-auth in npmrc' | ||||||
|     default: 'false' |     default: 'false' | ||||||
|   node-version: |   node-version: | ||||||
|     description: 'Version Spec of the version to use.  Examples: 12.x, 10.15.1, >=10.15.0' |     description: 'Version Spec of the version to use.  Examples: 10.x, 10.15.1, >=10.15.0' | ||||||
|  |     default: '10.x' | ||||||
|   registry-url: |   registry-url: | ||||||
|     description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN' |     description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN' | ||||||
|   scope: |   scope: | ||||||
|     description: 'Optional scope for authenticating against scoped registries' |     description: 'Optional scope for authenticating against scoped registries' | ||||||
|   token: |  | ||||||
|     description: Used to pull node distributions from node-versions.  Since there's a default, this is typically not supplied by the user. |  | ||||||
|     default: ${{ github.token }} |  | ||||||
| # TODO: add input to control forcing to pull from cloud or dist.  |  | ||||||
| #       escape valve for someone having issues or needing the absolute latest which isn't cached yet |  | ||||||
| # Deprecated option, do not use. Will not be supported after October 1, 2019 | # Deprecated option, do not use. Will not be supported after October 1, 2019 | ||||||
|   version: |   version: | ||||||
|     description: 'Deprecated. Use node-version instead. Will not be supported after October 1, 2019' |     description: 'Deprecated. Use node-version instead. Will not be supported after October 1, 2019' | ||||||
|   | |||||||
							
								
								
									
										1299
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1299
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1278
									
								
								dist/licenses.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1278
									
								
								dist/licenses.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3862
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3862
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										15
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "setup-node", |   "name": "setup-node", | ||||||
|   "version": "2.0.0", |   "version": "1.0.0", | ||||||
|   "private": true, |   "private": true, | ||||||
|   "description": "setup node action", |   "description": "setup node action", | ||||||
|   "main": "lib/setup-node.js", |   "main": "lib/setup-node.js", | ||||||
| @@ -23,11 +23,12 @@ | |||||||
|   "author": "GitHub", |   "author": "GitHub", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@actions/core": "^1.2.2", |     "@actions/core": "^1.2.6", | ||||||
|  |     "@actions/exec": "^1.0.3", | ||||||
|     "@actions/github": "^1.1.0", |     "@actions/github": "^1.1.0", | ||||||
|     "@actions/http-client": "^1.0.6", |     "@actions/http-client": "^1.0.6", | ||||||
|     "@actions/io": "^1.0.2", |     "@actions/io": "^1.0.2", | ||||||
|     "@actions/tool-cache": "^1.5.2", |     "@actions/tool-cache": "^1.3.3", | ||||||
|     "semver": "^6.1.1" |     "semver": "^6.1.1" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
| @@ -35,10 +36,10 @@ | |||||||
|     "@types/node": "^12.0.4", |     "@types/node": "^12.0.4", | ||||||
|     "@types/semver": "^6.0.0", |     "@types/semver": "^6.0.0", | ||||||
|     "@zeit/ncc": "^0.21.0", |     "@zeit/ncc": "^0.21.0", | ||||||
|     "jest": "^24.9.0", |     "jest": "^24.8.0", | ||||||
|     "jest-circus": "^24.7.1", |     "jest-circus": "^24.7.1", | ||||||
|     "prettier": "^1.19.1", |     "prettier": "^1.17.1", | ||||||
|     "ts-jest": "^24.3.0", |     "ts-jest": "^24.0.2", | ||||||
|     "typescript": "^3.8.3" |     "typescript": "^3.5.1" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										249
									
								
								src/installer.ts
									
									
									
									
									
								
							
							
						
						
									
										249
									
								
								src/installer.ts
									
									
									
									
									
								
							| @@ -1,89 +1,54 @@ | |||||||
| 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 hc from '@actions/http-client'; | import * as hc from '@actions/http-client'; | ||||||
| import * as io from '@actions/io'; | import * as io from '@actions/io'; | ||||||
| import * as tc from '@actions/tool-cache'; | import * as tc from '@actions/tool-cache'; | ||||||
|  | import * as os from 'os'; | ||||||
| import * as path from 'path'; | import * as path from 'path'; | ||||||
| import * as semver from 'semver'; | import * as semver from 'semver'; | ||||||
| import {Url} from 'url'; |  | ||||||
|  | let osPlat: string = os.platform(); | ||||||
|  | let osArch: string = translateArchToDistUrl(os.arch()); | ||||||
|  |  | ||||||
| // | // | ||||||
| // Node versions interface | // Node versions interface | ||||||
| // see https://nodejs.org/dist/index.json | // see https://nodejs.org/dist/index.json | ||||||
| // | // | ||||||
| export interface INodeVersion { | interface INodeVersion { | ||||||
|   version: string; |   version: string; | ||||||
|   files: string[]; |   files: string[]; | ||||||
| } | } | ||||||
|  |  | ||||||
| interface INodeVersionInfo { | export async function getNode(versionSpec: string) { | ||||||
|   downloadUrl: string; |  | ||||||
|   token: string | null; |  | ||||||
|   resolvedVersion: string; |  | ||||||
|   fileName: string; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export async function getNode( |  | ||||||
|   versionSpec: string, |  | ||||||
|   stable: boolean, |  | ||||||
|   token: string |  | ||||||
| ) { |  | ||||||
|   let osPlat: string = os.platform(); |  | ||||||
|   let osArch: string = translateArchToDistUrl(os.arch()); |  | ||||||
|  |  | ||||||
|   // check cache |   // check cache | ||||||
|   let info: INodeVersionInfo | null = null; |  | ||||||
|   let toolPath: string; |   let toolPath: string; | ||||||
|   toolPath = tc.find('node', versionSpec); |   toolPath = tc.find('node', versionSpec); | ||||||
|  |  | ||||||
|   // If not found in cache, download |   // If not found in cache, download | ||||||
|   if (toolPath) { |   if (!toolPath) { | ||||||
|     console.log(`Found in cache @ ${toolPath}`); |     let version: string; | ||||||
|   } else { |     const c = semver.clean(versionSpec) || ''; | ||||||
|     console.log(`Attempting to download ${versionSpec}...`); |     // If explicit version | ||||||
|     let info = await getInfoFromManifest(versionSpec, stable, token); |     if (semver.valid(c) != null) { | ||||||
|     if (!info) { |       // version to download | ||||||
|       console.log( |       version = versionSpec; | ||||||
|         'Not found in manifest.  Falling back to download directly from Node' |     } else { | ||||||
|       ); |       // query nodejs.org for a matching version | ||||||
|       info = await getInfoFromDist(versionSpec); |       version = await queryLatestMatch(versionSpec); | ||||||
|     } |       if (!version) { | ||||||
|  |         throw new Error( | ||||||
|     if (!info) { |           `Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` | ||||||
|       throw new Error( |         ); | ||||||
|         `Unable to find Node version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     console.log(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); |  | ||||||
|  |  | ||||||
|     let downloadPath = ''; |  | ||||||
|     try { |  | ||||||
|       downloadPath = await tc.downloadTool(info.downloadUrl, undefined, token); |  | ||||||
|     } catch (err) { |  | ||||||
|       if (err instanceof tc.HTTPError && err.httpStatusCode == 404) { |  | ||||||
|         return await acquireNodeFromFallbackLocation(info.resolvedVersion); |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       throw err; |       // check cache | ||||||
|  |       toolPath = tc.find('node', version); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // |     if (!toolPath) { | ||||||
|     // Extract |       // download, extract, cache | ||||||
|     // |       toolPath = await acquireNode(version); | ||||||
|     let extPath: string; |  | ||||||
|     if (osPlat == 'win32') { |  | ||||||
|       let _7zPath = path.join(__dirname, '..', 'externals', '7zr.exe'); |  | ||||||
|       extPath = await tc.extract7z(downloadPath, undefined, _7zPath); |  | ||||||
|     } else { |  | ||||||
|       extPath = await tc.extractTar(downloadPath); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // |  | ||||||
|     // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded |  | ||||||
|     // |  | ||||||
|     toolPath = await tc.cacheDir(extPath, 'node', info.resolvedVersion); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |   // | ||||||
| @@ -100,62 +65,41 @@ export async function getNode( | |||||||
|   core.addPath(toolPath); |   core.addPath(toolPath); | ||||||
| } | } | ||||||
|  |  | ||||||
| async function getInfoFromManifest( | async function queryLatestMatch(versionSpec: string): Promise<string> { | ||||||
|   versionSpec: string, |   // node offers a json list of versions | ||||||
|   stable: boolean, |   let dataFileName: string; | ||||||
|   token: string |   switch (osPlat) { | ||||||
| ): Promise<INodeVersionInfo | null> { |     case 'linux': | ||||||
|   let info: INodeVersionInfo | null = null; |       dataFileName = `linux-${osArch}`; | ||||||
|   const releases = await tc.getManifestFromRepo( |       break; | ||||||
|     'actions', |     case 'darwin': | ||||||
|     'node-versions', |       dataFileName = `osx-${osArch}-tar`; | ||||||
|     token |       break; | ||||||
|   ); |     case 'win32': | ||||||
|   console.log(`matching ${versionSpec}...`); |       dataFileName = `win-${osArch}-exe`; | ||||||
|   const rel = await tc.findFromManifest(versionSpec, stable, releases); |       break; | ||||||
|  |     default: | ||||||
|   if (rel && rel.files.length > 0) { |       throw new Error(`Unexpected OS '${osPlat}'`); | ||||||
|     info = <INodeVersionInfo>{}; |  | ||||||
|     info.resolvedVersion = rel.version; |  | ||||||
|     info.downloadUrl = rel.files[0].download_url; |  | ||||||
|     info.fileName = rel.files[0].filename; |  | ||||||
|     info.token = token; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return info; |   let versions: string[] = []; | ||||||
| } |   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); | ||||||
|  |   let nodeVersions = response.result || []; | ||||||
|  |   nodeVersions.forEach((nodeVersion: INodeVersion) => { | ||||||
|  |     // ensure this version supports your os and platform | ||||||
|  |     if (nodeVersion.files.indexOf(dataFileName) >= 0) { | ||||||
|  |       versions.push(nodeVersion.version); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  |  | ||||||
| async function getInfoFromDist( |   // get the latest version that matches the version spec | ||||||
|   versionSpec: string |   let version: string = evaluateVersions(versions, versionSpec); | ||||||
| ): Promise<INodeVersionInfo | null> { |   return version; | ||||||
|   let osPlat: string = os.platform(); |  | ||||||
|   let osArch: string = translateArchToDistUrl(os.arch()); |  | ||||||
|  |  | ||||||
|   let info: INodeVersionInfo | null = null; |  | ||||||
|   let version: string; |  | ||||||
|  |  | ||||||
|   version = await queryDistForMatch(versionSpec); |  | ||||||
|   if (!version) { |  | ||||||
|     return null; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // |  | ||||||
|   // Download - a tool installer intimately knows how to get the tool (and construct urls) |  | ||||||
|   // |  | ||||||
|   version = semver.clean(version) || ''; |  | ||||||
|   let fileName: string = |  | ||||||
|     osPlat == 'win32' |  | ||||||
|       ? `node-v${version}-win-${osArch}` |  | ||||||
|       : `node-v${version}-${osPlat}-${osArch}`; |  | ||||||
|   let urlFileName: string = |  | ||||||
|     osPlat == 'win32' ? `${fileName}.7z` : `${fileName}.tar.gz`; |  | ||||||
|   let url = `https://nodejs.org/dist/v${version}/${urlFileName}`; |  | ||||||
|  |  | ||||||
|   return <INodeVersionInfo>{ |  | ||||||
|     downloadUrl: url, |  | ||||||
|     resolvedVersion: version, |  | ||||||
|     fileName: fileName |  | ||||||
|   }; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // TODO - should we just export this from @actions/tool-cache? Lifted directly from there | // TODO - should we just export this from @actions/tool-cache? Lifted directly from there | ||||||
| @@ -186,49 +130,47 @@ function evaluateVersions(versions: string[], versionSpec: string): string { | |||||||
|   return version; |   return version; | ||||||
| } | } | ||||||
|  |  | ||||||
| async function queryDistForMatch(versionSpec: string): Promise<string> { | async function acquireNode(version: string): Promise<string> { | ||||||
|   let osPlat: string = os.platform(); |   // | ||||||
|   let osArch: string = translateArchToDistUrl(os.arch()); |   // Download - a tool installer intimately knows how to get the tool (and construct urls) | ||||||
|  |   // | ||||||
|  |   version = semver.clean(version) || ''; | ||||||
|  |   let fileName: string = | ||||||
|  |     osPlat == 'win32' | ||||||
|  |       ? `node-v${version}-win-${osArch}` | ||||||
|  |       : `node-v${version}-${osPlat}-${osArch}`; | ||||||
|  |   let urlFileName: string = | ||||||
|  |     osPlat == 'win32' ? `${fileName}.7z` : `${fileName}.tar.gz`; | ||||||
|  |   let downloadUrl = `https://nodejs.org/dist/v${version}/${urlFileName}`; | ||||||
|  |  | ||||||
|   // node offers a json list of versions |   let downloadPath: string; | ||||||
|   let dataFileName: string; |  | ||||||
|   switch (osPlat) { |   try { | ||||||
|     case 'linux': |     downloadPath = await tc.downloadTool(downloadUrl); | ||||||
|       dataFileName = `linux-${osArch}`; |   } catch (err) { | ||||||
|       break; |     if (err instanceof tc.HTTPError && err.httpStatusCode == 404) { | ||||||
|     case 'darwin': |       return await acquireNodeFromFallbackLocation(version); | ||||||
|       dataFileName = `osx-${osArch}-tar`; |     } | ||||||
|       break; |  | ||||||
|     case 'win32': |     throw err; | ||||||
|       dataFileName = `win-${osArch}-exe`; |  | ||||||
|       break; |  | ||||||
|     default: |  | ||||||
|       throw new Error(`Unexpected OS '${osPlat}'`); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   let versions: string[] = []; |   // | ||||||
|   let nodeVersions = await module.exports.getVersionsFromDist(); |   // Extract | ||||||
|  |   // | ||||||
|  |   let extPath: string; | ||||||
|  |   if (osPlat == 'win32') { | ||||||
|  |     let _7zPath = path.join(__dirname, '..', 'externals', '7zr.exe'); | ||||||
|  |     extPath = await tc.extract7z(downloadPath, undefined, _7zPath); | ||||||
|  |   } else { | ||||||
|  |     extPath = await tc.extractTar(downloadPath); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   nodeVersions.forEach((nodeVersion: INodeVersion) => { |   // | ||||||
|     // ensure this version supports your os and platform |   // Install into the local tool cache - node extracts with a root folder that matches the fileName downloaded | ||||||
|     if (nodeVersion.files.indexOf(dataFileName) >= 0) { |   // | ||||||
|       versions.push(nodeVersion.version); |   let toolRoot = path.join(extPath, fileName); | ||||||
|     } |   return await tc.cacheDir(toolRoot, 'node', version); | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   // get the latest version that matches the version spec |  | ||||||
|   let version: string = evaluateVersions(versions, versionSpec); |  | ||||||
|   return version; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| 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 || []; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // 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 | ||||||
| @@ -246,9 +188,6 @@ export async function getVersionsFromDist(): Promise<INodeVersion[]> { | |||||||
| async function acquireNodeFromFallbackLocation( | async function acquireNodeFromFallbackLocation( | ||||||
|   version: string |   version: string | ||||||
| ): Promise<string> { | ): Promise<string> { | ||||||
|   let osPlat: string = os.platform(); |  | ||||||
|   let osArch: string = translateArchToDistUrl(os.arch()); |  | ||||||
|  |  | ||||||
|   // Create temporary folder to download in to |   // Create temporary folder to download in to | ||||||
|   const tempDownloadFolder: string = |   const tempDownloadFolder: string = | ||||||
|     'temp_' + Math.floor(Math.random() * 2000000000); |     'temp_' + Math.floor(Math.random() * 2000000000); | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -1,41 +0,0 @@ | |||||||
| import * as core from '@actions/core'; |  | ||||||
| import * as installer from './installer'; |  | ||||||
| import * as auth from './authutil'; |  | ||||||
| import * as path from 'path'; |  | ||||||
|  |  | ||||||
| export async function run() { |  | ||||||
|   try { |  | ||||||
|     // |  | ||||||
|     // 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 = core.getInput('node-version'); |  | ||||||
|     if (!version) { |  | ||||||
|       version = core.getInput('version'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     console.log(`version: ${version}`); |  | ||||||
|     if (version) { |  | ||||||
|       let token = core.getInput('token'); |  | ||||||
|       let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; |  | ||||||
|       await installer.getNode(version, stable, token); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     const registryUrl: string = core.getInput('registry-url'); |  | ||||||
|     const alwaysAuth: string = core.getInput('always-auth'); |  | ||||||
|     if (registryUrl) { |  | ||||||
|       auth.configAuthentication(registryUrl, alwaysAuth); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     const matchersPath = path.join(__dirname, '..', '.github'); |  | ||||||
|     console.log(`##[add-matcher]${path.join(matchersPath, 'tsc.json')}`); |  | ||||||
|     console.log( |  | ||||||
|       `##[add-matcher]${path.join(matchersPath, 'eslint-stylish.json')}` |  | ||||||
|     ); |  | ||||||
|     console.log( |  | ||||||
|       `##[add-matcher]${path.join(matchersPath, 'eslint-compact.json')}` |  | ||||||
|     ); |  | ||||||
|   } catch (error) { |  | ||||||
|     core.setFailed(error.message); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @@ -1,3 +1,49 @@ | |||||||
| import {run} from './main'; | import * as core from '@actions/core'; | ||||||
|  | import * as exec from '@actions/exec'; | ||||||
|  | import * as io from '@actions/io'; | ||||||
|  | import * as installer from './installer'; | ||||||
|  | import * as auth from './authutil'; | ||||||
|  | import * as path from 'path'; | ||||||
|  |  | ||||||
|  | async function run() { | ||||||
|  |   try { | ||||||
|  |     // | ||||||
|  |     // 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 = core.getInput('version'); | ||||||
|  |     if (!version) { | ||||||
|  |       version = core.getInput('node-version'); | ||||||
|  |     } | ||||||
|  |     if (version) { | ||||||
|  |       await installer.getNode(version); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Output version of node and npm that are being used | ||||||
|  |     await exec.exec('node', ['--version']); | ||||||
|  |  | ||||||
|  |     // Older versions of Node don't include npm, so don't let this call fail | ||||||
|  |     await exec.exec('npm', ['--version'], { | ||||||
|  |       ignoreReturnCode: true | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     const registryUrl: string = core.getInput('registry-url'); | ||||||
|  |     const alwaysAuth: string = core.getInput('always-auth'); | ||||||
|  |     if (registryUrl) { | ||||||
|  |       auth.configAuthentication(registryUrl, alwaysAuth); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const matchersPath = path.join(__dirname, '..', '.github'); | ||||||
|  |     console.log(`##[add-matcher]${path.join(matchersPath, 'tsc.json')}`); | ||||||
|  |     console.log( | ||||||
|  |       `##[add-matcher]${path.join(matchersPath, 'eslint-stylish.json')}` | ||||||
|  |     ); | ||||||
|  |     console.log( | ||||||
|  |       `##[add-matcher]${path.join(matchersPath, 'eslint-compact.json')}` | ||||||
|  |     ); | ||||||
|  |   } catch (error) { | ||||||
|  |     core.setFailed(error.message); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| run(); | run(); | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ | |||||||
|     ], |     ], | ||||||
|     "outDir": "./lib",                        /* Redirect output structure to the directory. */ |     "outDir": "./lib",                        /* Redirect output structure to the directory. */ | ||||||
|     "rootDir": "./src",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ |     "rootDir": "./src",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||||||
|     "sourceMap": true, |  | ||||||
|     "strict": true,                           /* Enable all strict type-checking options. */ |     "strict": true,                           /* Enable all strict type-checking options. */ | ||||||
|     "noImplicitAny": false,                 /* Raise error on expressions and declarations with an implied 'any' type. */ |     "noImplicitAny": false,                 /* Raise error on expressions and declarations with an implied 'any' type. */ | ||||||
|     "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ |     "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||||||
|   | |||||||
| @@ -1,22 +0,0 @@ | |||||||
|  |  | ||||||
| #/bin/bash |  | ||||||
|  |  | ||||||
| set -e |  | ||||||
|  |  | ||||||
| rm -rf ./temp |  | ||||||
| rm -rf ./node |  | ||||||
|  |  | ||||||
| # uncomment to use charles proxy or other debugging proxy |  | ||||||
| # export NODE_TLS_REJECT_UNAUTHORIZED=0 |  | ||||||
| # export https_proxy=http://127.0.0.1:8888 |  | ||||||
|  |  | ||||||
| export RUNNER_TOOL_CACHE=$(pwd) |  | ||||||
| export RUNNER_TEMP="${RUNNER_TOOL_CACHE}/temp" |  | ||||||
| export INPUT_STABLE=true |  | ||||||
| export INPUT_VERSION="12.x" |  | ||||||
| # export your PAT with repo scope before running |  | ||||||
| export INPUT_TOKEN=$GITHUB_TOKEN |  | ||||||
|  |  | ||||||
| echo "Getting ${INPUT_VERSION} ($INPUT_STABLE) with ${INPUT_TOKEN}..." |  | ||||||
|  |  | ||||||
| node ../dist/index.js |  | ||||||
		Reference in New Issue
	
	Block a user