@@ -14,7 +14,6 @@ const _gitProjects = new LRU({
1414 max : 10 ,
1515 maxAge : 1000
1616} )
17- let _hasPnpm
1817
1918// env detection
2019exports . hasYarn = ( ) => {
@@ -79,25 +78,51 @@ exports.hasProjectGit = (cwd) => {
7978 return result
8079}
8180
82- exports . hasPnpm = ( ) => {
81+ let _hasPnpm
82+ let _hasPnpm3orLater
83+ const _pnpmProjects = new LRU ( {
84+ max : 10 ,
85+ maxAge : 1000
86+ } )
87+
88+ exports . hasPnpm3OrLater = ( ) => {
8389 if ( process . env . VUE_CLI_TEST ) {
8490 return true
8591 }
86- if ( _hasPnpm != null ) {
87- return _hasPnpm
92+ if ( _hasPnpm3orLater != null ) {
93+ return _hasPnpm3orLater
8894 }
8995 try {
9096 const pnpmVersion = execSync ( 'pnpm --version' ) . toString ( )
9197 // there's a critical bug in pnpm 2
9298 // https://github.com/pnpm/pnpm/issues/1678#issuecomment-469981972
9399 // so we only support pnpm >= 3.0.0
94- _hasPnpm = semver . gte ( pnpmVersion , '3.0.0' )
95- return _hasPnpm
100+ _hasPnpm = true
101+ _hasPnpm3orLater = semver . gte ( pnpmVersion , '3.0.0' )
102+ return _hasPnpm3orLater
96103 } catch ( e ) {
97- return ( _hasPnpm = false )
104+ return ( _hasPnpm3orLater = false )
98105 }
99106}
100107
108+ exports . hasProjectPnpm = ( cwd ) => {
109+ if ( _pnpmProjects . has ( cwd ) ) {
110+ return checkPnpm ( _pnpmProjects . get ( cwd ) )
111+ }
112+
113+ const lockFile = path . join ( cwd , 'pnpm-lock.yaml' )
114+ const result = fs . existsSync ( lockFile )
115+ _pnpmProjects . set ( cwd , result )
116+ return checkPnpm ( result )
117+ }
118+
119+ function checkPnpm ( result ) {
120+ if ( result && ! exports . hasPnpm3OrLater ( ) ) {
121+ throw new Error ( `The project seems to require pnpm${ _hasPnpm ? ' >= 3' : '' } but it's not installed.` )
122+ }
123+ return result
124+ }
125+
101126// OS
102127exports . isWindows = process . platform === 'win32'
103128exports . isMacintosh = process . platform === 'darwin'
0 commit comments