2021-06-16 14:52:44 +08:00
import * as core from '@actions/core' ;
import * as exec from '@actions/exec' ;
2022-04-01 03:10:37 +08:00
import * as cache from '@actions/cache' ;
2021-06-16 14:52:44 +08:00
type SupportedPackageManagers = {
[ prop : string ] : PackageManagerInfo ;
} ;
export interface PackageManagerInfo {
lockFilePatterns : Array < string > ;
getCacheFolderCommand : string ;
}
export const supportedPackageManagers : SupportedPackageManagers = {
npm : {
2022-07-05 05:29:56 +08:00
lockFilePatterns : [ 'package-lock.json' , 'npm-shrinkwrap.json' , 'yarn.lock' ] ,
2021-06-16 14:52:44 +08:00
getCacheFolderCommand : 'npm config get cache'
} ,
2021-06-30 23:44:51 +08:00
pnpm : {
lockFilePatterns : [ 'pnpm-lock.yaml' ] ,
2022-07-13 22:20:39 +08:00
getCacheFolderCommand : 'pnpm store path --silent'
2021-06-30 23:44:51 +08:00
} ,
2021-06-16 14:52:44 +08:00
yarn1 : {
lockFilePatterns : [ 'yarn.lock' ] ,
getCacheFolderCommand : 'yarn cache dir'
} ,
yarn2 : {
lockFilePatterns : [ 'yarn.lock' ] ,
getCacheFolderCommand : 'yarn config get cacheFolder'
}
} ;
export const getCommandOutput = async ( toolCommand : string ) = > {
2021-12-27 17:34:06 +08:00
let { stdout , stderr , exitCode } = await exec . getExecOutput (
toolCommand ,
undefined ,
{ ignoreReturnCode : true }
) ;
if ( exitCode ) {
stderr = ! stderr . trim ( )
? ` The ' ${ toolCommand } ' command failed with exit code: ${ exitCode } `
: stderr ;
2021-06-16 14:52:44 +08:00
throw new Error ( stderr ) ;
}
2021-06-30 23:44:51 +08:00
return stdout . trim ( ) ;
2021-06-16 14:52:44 +08:00
} ;
const getPackageManagerVersion = async (
packageManager : string ,
command : string
) = > {
const stdOut = await getCommandOutput ( ` ${ packageManager } ${ command } ` ) ;
if ( ! stdOut ) {
throw new Error ( ` Could not retrieve version of ${ packageManager } ` ) ;
}
return stdOut ;
} ;
export const getPackageManagerInfo = async ( packageManager : string ) = > {
if ( packageManager === 'npm' ) {
return supportedPackageManagers . npm ;
2021-06-30 23:44:51 +08:00
} else if ( packageManager === 'pnpm' ) {
return supportedPackageManagers . pnpm ;
2021-06-16 14:52:44 +08:00
} else if ( packageManager === 'yarn' ) {
const yarnVersion = await getPackageManagerVersion ( 'yarn' , '--version' ) ;
core . debug ( ` Consumed yarn version is ${ yarnVersion } ` ) ;
if ( yarnVersion . startsWith ( '1.' ) ) {
return supportedPackageManagers . yarn1 ;
} else {
return supportedPackageManagers . yarn2 ;
}
} else {
return null ;
}
} ;
export const getCacheDirectoryPath = async (
packageManagerInfo : PackageManagerInfo ,
packageManager : string
) = > {
2021-07-15 19:43:19 +08:00
const stdOut = await getCommandOutput (
packageManagerInfo . getCacheFolderCommand
) ;
2021-06-16 14:52:44 +08:00
if ( ! stdOut ) {
throw new Error ( ` Could not get cache folder path for ${ packageManager } ` ) ;
}
core . debug ( ` ${ packageManager } path is ${ stdOut } ` ) ;
2022-07-13 22:20:39 +08:00
return stdOut . trim ( ) ;
2021-06-16 14:52:44 +08:00
} ;
2022-04-01 03:10:37 +08:00
export function isGhes ( ) : boolean {
const ghUrl = new URL (
process . env [ 'GITHUB_SERVER_URL' ] || 'https://github.com'
) ;
return ghUrl . hostname . toUpperCase ( ) !== 'GITHUB.COM' ;
}
export function isCacheFeatureAvailable ( ) : boolean {
2022-12-09 18:41:54 +08:00
if ( cache . isFeatureAvailable ( ) ) return true ;
2022-04-01 03:10:37 +08:00
2022-12-09 18:41:54 +08:00
if ( isGhes ( ) )
throw new Error (
'Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.'
) ;
core . warning (
'The runner was not able to contact the cache service. Caching will be skipped'
) ;
2022-04-01 03:10:37 +08:00
2022-12-09 18:41:54 +08:00
return false ;
2022-04-01 03:10:37 +08:00
}