@@ -6,11 +6,11 @@ import logSymbols from 'log-symbols';
6
6
7
7
const d = debug ( 'electron-forge:package-manager' ) ;
8
8
9
- let hasEmittedWarning = false ;
10
-
11
9
export type SupportedPackageManager = 'yarn' | 'npm' | 'pnpm' ;
12
10
export type PMDetails = { executable : SupportedPackageManager ; version ?: string ; install : string ; dev : string ; exact : string } ;
13
11
12
+ let cachedPM : PMDetails | undefined = undefined ;
13
+
14
14
const MANAGERS : Record < SupportedPackageManager , PMDetails > = {
15
15
yarn : {
16
16
executable : 'yarn' ,
@@ -71,15 +71,18 @@ function pmFromUserAgent() {
71
71
*
72
72
*/
73
73
export const resolvePackageManager : ( ) => Promise < PMDetails > = async ( ) => {
74
+ if ( cachedPM ) {
75
+ return cachedPM ;
76
+ }
77
+
74
78
const executingPM = pmFromUserAgent ( ) ;
75
79
const lockfile = await findUp ( [ 'package-lock.json' , 'yarn.lock' , 'pnpm-lock.yaml' , 'pnpm-workspace.yaml' ] , { type : 'file' } ) ;
76
80
const lockfilePM = ( lockfile && PM_FROM_LOCKFILE [ lockfile ] ) ?? undefined ;
77
81
const installer = process . env . NODE_INSTALLER || executingPM ?. name || lockfilePM ;
78
82
79
83
// TODO(erickzhao): Remove NODE_INSTALLER environment variable for Forge 8
80
- if ( typeof process . env . NODE_INSTALLER === 'string' && ! hasEmittedWarning ) {
84
+ if ( typeof process . env . NODE_INSTALLER === 'string' ) {
81
85
console . warn ( logSymbols . warning , chalk . yellow ( `The NODE_INSTALLER environment variable is deprecated and will be removed in Electron Forge v8` ) ) ;
82
- hasEmittedWarning = true ;
83
86
}
84
87
85
88
switch ( installer ) {
@@ -89,7 +92,8 @@ export const resolvePackageManager: () => Promise<PMDetails> = async () => {
89
92
d (
90
93
`Resolved package manager to ${ installer } . (Derived from NODE_INSTALLER: ${ process . env . NODE_INSTALLER } , npm_config_user_agent: ${ executingPM } , lockfile: ${ lockfilePM } .)`
91
94
) ;
92
- return { ...MANAGERS [ installer ] , version : executingPM ?. version } ;
95
+ cachedPM = { ...MANAGERS [ installer ] , version : executingPM ?. version } ;
96
+ break ;
93
97
default :
94
98
if ( installer !== undefined ) {
95
99
console . warn (
@@ -99,8 +103,9 @@ export const resolvePackageManager: () => Promise<PMDetails> = async () => {
99
103
} else {
100
104
d ( `No package manager detected. Falling back to npm.` ) ;
101
105
}
102
- return MANAGERS [ 'npm' ] ;
106
+ cachedPM = MANAGERS [ 'npm' ] ;
103
107
}
108
+ return cachedPM ;
104
109
} ;
105
110
106
111
export const spawnPackageManager = async ( args ?: CrossSpawnArgs , opts ?: CrossSpawnOptions ) : Promise < string > =>
0 commit comments