mirror of
				https://github.com/actions/setup-node.git
				synced 2025-11-04 12:03:34 +00:00 
			
		
		
		
	Refactored code and removed redundant logic
This commit is contained in:
		
							parent
							
								
									bca281829f
								
							
						
					
					
						commit
						82441b3f82
					
				@ -2,11 +2,18 @@ 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 io from '@actions/io';
 | 
					import * as io from '@actions/io';
 | 
				
			||||||
 | 
					import * as hc from '@actions/http-client';
 | 
				
			||||||
import * as tc from '@actions/tool-cache';
 | 
					import * as tc from '@actions/tool-cache';
 | 
				
			||||||
import * as path from 'path';
 | 
					import * as path from 'path';
 | 
				
			||||||
import * as semver from 'semver';
 | 
					import * as semver from 'semver';
 | 
				
			||||||
import fs = require('fs');
 | 
					import fs = require('fs');
 | 
				
			||||||
import {INodeVersion, getVersionsFromDist} from './node-version';
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface INodeVersion {
 | 
				
			||||||
 | 
					  version: string;
 | 
				
			||||||
 | 
					  files: string[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface INodeVersionInfo {
 | 
					interface INodeVersionInfo {
 | 
				
			||||||
  downloadUrl: string;
 | 
					  downloadUrl: string;
 | 
				
			||||||
@ -376,6 +383,16 @@ async function queryDistForMatch(
 | 
				
			|||||||
  return version;
 | 
					  return version;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
// in a different folder than they normally are for other versions.
 | 
					// in a different folder than they normally are for other versions.
 | 
				
			||||||
// Normally the format is similar to: https://nodejs.org/dist/v5.10.1/node-v5.10.1-win-x64.7z
 | 
					// Normally the format is similar to: https://nodejs.org/dist/v5.10.1/node-v5.10.1-win-x64.7z
 | 
				
			||||||
@ -445,3 +462,32 @@ function translateArchToDistUrl(arch: string): string {
 | 
				
			|||||||
      return arch;
 | 
					      return arch;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function parseNodeVersionFile(contents: string): Promise<string> {
 | 
				
			||||||
 | 
					  contents = contents.trim();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (/^v\d/.test(contents)) {
 | 
				
			||||||
 | 
					    contents = contents.substring(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const nodeVersions = await getVersionsFromDist();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let nodeVersion: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (semver.valid(contents) || isPartialMatch(contents)) {
 | 
				
			||||||
 | 
					    nodeVersion = contents;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    throw new Error(`Couldn't resolve node version: '${contents}'`);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return stripVPrefix(nodeVersion);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function isPartialMatch(version: string): boolean {
 | 
				
			||||||
 | 
					  return /^\d+(\.\d+(\.\d+)?)?$/.test(version);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function stripVPrefix(version: string): string {
 | 
				
			||||||
 | 
					  return /^v\d/.test(version) ? version.substring(1) : version;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,6 @@ import fs = require('fs');
 | 
				
			|||||||
import * as path from 'path';
 | 
					import * as path from 'path';
 | 
				
			||||||
import {restoreCache} from './cache-restore';
 | 
					import {restoreCache} from './cache-restore';
 | 
				
			||||||
import {URL} from 'url';
 | 
					import {URL} from 'url';
 | 
				
			||||||
import {parseNodeVersionFile} from './node-version-file';
 | 
					 | 
				
			||||||
import os = require('os');
 | 
					import os = require('os');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function run() {
 | 
					export async function run() {
 | 
				
			||||||
@ -24,12 +23,13 @@ export async function run() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (!!versionFile) {
 | 
					      if (!!versionFile) {
 | 
				
			||||||
        const versionFilePath = path.join(__dirname, '..', versionFile);
 | 
					        const versionFilePath = path.join(__dirname, '..', versionFile);
 | 
				
			||||||
        version = await parseNodeVersionFile(
 | 
					        version = await installer.parseNodeVersionFile(
 | 
				
			||||||
          fs.readFileSync(versionFilePath, 'utf8')
 | 
					          fs.readFileSync(versionFilePath, 'utf8')
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        core.info(`Resolved ${versionFile} as ${version}`);
 | 
					        core.info(`Resolved ${versionFile} as ${version}`);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    let arch = core.getInput('architecture');
 | 
					    let arch = core.getInput('architecture');
 | 
				
			||||||
    const cache = core.getInput('cache');
 | 
					    const cache = core.getInput('cache');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -87,3 +87,4 @@ function isGhes(): boolean {
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
  return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
 | 
					  return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,65 +0,0 @@
 | 
				
			|||||||
import * as semvar from 'semver';
 | 
					 | 
				
			||||||
import {INodeVersion, getVersionsFromDist} from './node-version';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export async function parseNodeVersionFile(contents: string): Promise<string> {
 | 
					 | 
				
			||||||
  contents = contents.trim();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (/^v\d/.test(contents)) {
 | 
					 | 
				
			||||||
    contents = contents.substring(1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const nodeVersions = await getVersionsFromDist();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  let nodeVersion: string;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (contents.startsWith('lts/')) {
 | 
					 | 
				
			||||||
    nodeVersion = findLatestLts(nodeVersions, contents).version;
 | 
					 | 
				
			||||||
  } else if (semvar.valid(contents) || isPartialMatch(contents)) {
 | 
					 | 
				
			||||||
    nodeVersion = contents;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    throw new Error(`Couldn't resolve node version: '${contents}'`);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return stripVPrefix(nodeVersion);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function findLatestLts(
 | 
					 | 
				
			||||||
  nodeVersions: INodeVersion[],
 | 
					 | 
				
			||||||
  codename: string
 | 
					 | 
				
			||||||
): INodeVersion {
 | 
					 | 
				
			||||||
  let nodeVersion: INodeVersion | undefined;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (codename === 'lts/*') {
 | 
					 | 
				
			||||||
    nodeVersion = nodeVersions.reduce((latest, nodeVersion) => {
 | 
					 | 
				
			||||||
      if (!nodeVersion.lts) {
 | 
					 | 
				
			||||||
        return latest;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      return semvar.gt(nodeVersion.version, latest.version)
 | 
					 | 
				
			||||||
        ? nodeVersion
 | 
					 | 
				
			||||||
        : latest;
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    codename = codename.replace('lts/', '').toLowerCase();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    nodeVersion = nodeVersions.find(
 | 
					 | 
				
			||||||
      nodeVersion => `${nodeVersion.lts}`.toLowerCase() === codename
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!nodeVersion) {
 | 
					 | 
				
			||||||
    throw new Error(
 | 
					 | 
				
			||||||
      `Couldn't find matching release for codename: '${codename}'`
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return nodeVersion;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function isPartialMatch(version: string): boolean {
 | 
					 | 
				
			||||||
  return /^\d+(\.\d+(\.\d+)?)?$/.test(version);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function stripVPrefix(version: string): string {
 | 
					 | 
				
			||||||
  return /^v\d/.test(version) ? version.substring(1) : version;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,21 +0,0 @@
 | 
				
			|||||||
import * as hc from '@actions/http-client';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Node versions interface
 | 
					 | 
				
			||||||
// see https://nodejs.org/dist/index.json
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
export interface INodeVersion {
 | 
					 | 
				
			||||||
  version: string;
 | 
					 | 
				
			||||||
  files: string[];
 | 
					 | 
				
			||||||
  lts: boolean | string;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export async function getVersionsFromDist(): Promise<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 || [];
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user