2021-06-16 09:52:44 +03:00
import * as core from '@actions/core' ;
import * as exec from '@actions/exec' ;
2022-03-31 21:10:37 +02:00
import * as cache from '@actions/cache' ;
2021-06-16 09:52:44 +03:00
type SupportedPackageManagers = {
[ prop : string ] : PackageManagerInfo ;
};
export interface PackageManagerInfo {
lockFilePatterns : Array < string >;
getCacheFolderCommand : string ;
}
export const supportedPackageManagers : SupportedPackageManagers = {
npm : {
2022-07-04 17:29:56 -04:00
lockFilePatterns : [ 'package-lock.json' , 'npm-shrinkwrap.json' , 'yarn.lock' ],
2021-06-16 09:52:44 +03:00
getCacheFolderCommand : 'npm config get cache'
},
2021-06-30 16:44:51 +01:00
pnpm : {
lockFilePatterns : [ 'pnpm-lock.yaml' ],
2022-07-13 16:20:39 +02:00
getCacheFolderCommand : 'pnpm store path --silent'
2021-06-30 16:44:51 +01:00
},
2021-06-16 09:52:44 +03: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 12:34:06 +03: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 09:52:44 +03:00
throw new Error ( stderr );
}
2021-06-30 16:44:51 +01:00
return stdout . trim ();
2021-06-16 09:52:44 +03: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 16:44:51 +01:00
} else if ( packageManager === 'pnpm' ) {
return supportedPackageManagers . pnpm ;
2021-06-16 09:52:44 +03: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 12:43:19 +01:00
const stdOut = await getCommandOutput (
packageManagerInfo . getCacheFolderCommand
);
2021-06-16 09:52:44 +03:00
if ( ! stdOut ) {
throw new Error ( `Could not get cache folder path for ${ packageManager } ` );
}
core . debug ( ` ${ packageManager } path is ${ stdOut } ` );
2022-07-13 16:20:39 +02:00
return stdOut . trim ();
2021-06-16 09:52:44 +03:00
};
2022-03-31 21:10:37 +02: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 11:41:54 +01:00
if ( cache . isFeatureAvailable ()) return true ;
2022-03-31 21:10:37 +02:00
2022-12-09 12:05:59 +01:00
if ( isGhes ()) {
core . warning (
2022-12-09 11:41:54 +01:00
'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.'
);
2022-12-09 12:05:59 +01:00
return false ;
}
2022-12-09 11:41:54 +01:00
core . warning (
'The runner was not able to contact the cache service. Caching will be skipped'
);
2022-03-31 21:10:37 +02:00
2022-12-09 11:41:54 +01:00
return false ;
2022-03-31 21:10:37 +02:00
}