2020-05-19 09:25:54 -04:00
import * as core from '@actions/core' ;
2023-01-05 13:16:21 +01:00
import os from 'os' ;
2025-08-26 08:10:12 +05:30
import fs from 'fs' ;
2023-01-05 13:16:21 +01:00
2020-05-19 09:25:54 -04:00
import * as auth from './authutil' ;
import * as path from 'path' ;
2021-06-16 09:52:44 +03:00
import { restoreCache } from './cache-restore' ;
2023-01-05 13:16:21 +01:00
import { isCacheFeatureAvailable } from './cache-utils' ;
import { getNodejsDistribution } from './distributions/installer-factory' ;
2023-12-29 16:31:21 +07:00
import { getNodeVersionFromFile , printEnvDetailsAndSetOutput } from './util' ;
2023-08-10 16:32:24 +02:00
import { State } from './constants' ;
2020-05-19 09:25:54 -04:00
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...
//
2022-11-17 14:35:58 +01:00
const version = resolveVersionInput ();
2020-05-19 09:25:54 -04:00
2020-12-08 16:15:38 -06:00
let arch = core . getInput ( 'architecture' );
2021-06-16 09:52:44 +03:00
const cache = core . getInput ( 'cache' );
2025-08-26 08:10:12 +05:30
const packagemanagercache =
( core . getInput ( 'package-manager-cache' ) || 'true' ). toUpperCase () ===
'TRUE' ;
2020-09-06 11:09:41 -05:00
2020-12-08 16:15:38 -06:00
// if architecture supplied but node-version is not
2020-09-06 11:09:41 -05:00
// if we don't throw a warning, the already installed x64 node will be used which is not probably what user meant.
if ( arch && ! version ) {
core . warning (
2020-12-09 11:27:02 -06:00
'`architecture` is provided but `node-version` is missing. In this configuration, the version/architecture of Node will not be changed. To fix this, provide `architecture` in combination with `node-version`'
2020-09-06 11:09:41 -05:00
);
}
2020-09-03 07:40:40 -05:00
if ( ! arch ) {
arch = os . arch ();
}
2020-05-19 09:25:54 -04:00
if ( version ) {
2022-11-17 14:35:58 +01:00
const token = core . getInput ( 'token' );
const auth = ! token ? undefined : `token ${ token } ` ;
2025-04-02 17:49:47 +02:00
const mirror = core . getInput ( 'mirror' );
const mirrorToken = core . getInput ( 'mirror-token' );
2022-11-17 14:35:58 +01:00
const stable =
( core . getInput ( 'stable' ) || 'true' ). toUpperCase () === 'TRUE' ;
2020-06-29 21:56:37 +03:00
const checkLatest =
( core . getInput ( 'check-latest' ) || 'false' ). toUpperCase () === 'TRUE' ;
2023-01-05 13:16:21 +01:00
const nodejsInfo = {
versionSpec : version ,
checkLatest ,
auth ,
stable ,
2025-04-02 17:49:47 +02:00
arch ,
mirror ,
mirrorToken
2023-01-05 13:16:21 +01:00
};
const nodeDistribution = getNodejsDistribution ( nodejsInfo );
await nodeDistribution . setupNodeJs ();
2020-05-19 09:25:54 -04:00
}
2022-10-03 17:02:04 +03:00
await printEnvDetailsAndSetOutput ();
2022-06-30 21:55:32 +02:00
2020-05-19 09:25:54 -04:00
const registryUrl : string = core . getInput ( 'registry-url' );
const alwaysAuth : string = core . getInput ( 'always-auth' );
if ( registryUrl ) {
auth . configAuthentication ( registryUrl , alwaysAuth );
}
2025-08-26 08:10:12 +05:30
const resolvedPackageManager = getNameFromPackageManagerField ();
const cacheDependencyPath = core . getInput ( 'cache-dependency-path' );
2022-03-31 21:10:37 +02:00
if ( cache && isCacheFeatureAvailable ()) {
2023-08-10 16:32:24 +02:00
core . saveState ( State . CachePackageManager , cache );
2021-08-02 20:44:59 +03:00
await restoreCache ( cache , cacheDependencyPath );
2025-08-26 08:10:12 +05:30
} else if ( resolvedPackageManager && packagemanagercache ) {
2025-09-08 21:49:38 -05:00
core . info (
"Detected package manager from package.json's packageManager field: " +
resolvedPackageManager +
'. Auto caching has been enabled for it. If you want to disable it, set package-manager-cache input to false'
);
2025-08-26 08:10:12 +05:30
core . saveState ( State . CachePackageManager , resolvedPackageManager );
await restoreCache ( resolvedPackageManager , cacheDependencyPath );
2021-06-16 09:52:44 +03:00
}
const matchersPath = path . join ( __dirname , '../..' , '.github' );
2021-01-20 20:58:35 +05:30
core . info ( `##[add-matcher] ${ path . join ( matchersPath , 'tsc.json' ) } ` );
core . info (
2020-05-19 09:25:54 -04:00
`##[add-matcher] ${ path . join ( matchersPath , 'eslint-stylish.json' ) } `
);
2021-01-20 20:58:35 +05:30
core . info (
2020-05-19 09:25:54 -04:00
`##[add-matcher] ${ path . join ( matchersPath , 'eslint-compact.json' ) } `
);
2021-11-29 14:48:31 +05:30
} catch ( err ) {
2023-10-19 10:40:59 +02:00
core . setFailed (( err as Error ). message );
2020-05-19 09:25:54 -04:00
}
}
2021-11-29 14:48:31 +05:30
function resolveVersionInput () : string {
2022-02-24 16:31:57 +03:00
let version = core . getInput ( 'node-version' );
2022-06-29 15:37:53 -07:00
const versionFileInput = core . getInput ( 'node-version-file' );
2021-11-29 14:48:31 +05:30
if ( version && versionFileInput ) {
core . warning (
'Both node-version and node-version-file inputs are specified, only node-version will be used'
);
}
if ( version ) {
return version ;
}
if ( versionFileInput ) {
const versionFilePath = path . join (
process . env . GITHUB_WORKSPACE ! ,
versionFileInput
);
2022-06-29 12:01:42 -07:00
2023-12-29 16:31:21 +07:00
const parsedVersion = getNodeVersionFromFile ( versionFilePath );
2023-12-14 07:53:26 -05:00
if ( parsedVersion ) {
version = parsedVersion ;
} else {
core . warning (
`Could not determine node version from ${ versionFilePath } . Falling back`
);
}
2022-06-29 12:01:42 -07:00
2021-11-29 14:48:31 +05:30
core . info ( `Resolved ${ versionFileInput } as ${ version } ` );
}
return version ;
}
2025-08-26 08:10:12 +05:30
export function getNameFromPackageManagerField () : string | undefined {
// Check packageManager field in package.json
const SUPPORTED_PACKAGE_MANAGERS = [ 'npm' , 'yarn' , 'pnpm' ];
try {
const packageJson = JSON . parse (
fs . readFileSync (
path . join ( process . env . GITHUB_WORKSPACE ! , 'package.json' ),
'utf-8'
)
);
const pm = packageJson . packageManager ;
if ( typeof pm === 'string' ) {
const regex = new RegExp (
`^(?:\\^)?( ${ SUPPORTED_PACKAGE_MANAGERS . join ( '|' ) } )@`
);
const match = pm . match ( regex );
return match ? match [ 1 ] : undefined ;
}
return undefined ;
} catch ( err ) {
return undefined ;
}
}