-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
84 lines (73 loc) · 1.86 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
* Has Pnpm.
*
* Check if pnpm is used instead of npm
*
* @author Awais <https://twitter.com/MrAhmadAwais/>
*/
import {execa} from 'execa';
import fs from 'fs/promises';
import path from 'path';
const cache = new Map();
// Returns true if a file exists.
const exists = path =>
fs.stat(path).then(
() => true,
() => false
);
function hasGlobalInstallation(pm) {
const key = `has_global_${pm}`;
if (cache.has(key)) {
return Promise.resolve(cache.get(key));
}
return execa(pm, ['--version'])
.then(res => {
return /^\d+.\d+.\d+$/.test(res.stdout);
})
.then(value => {
cache.set(key, value);
return value;
})
.catch(() => false);
}
async function checkOtherManagers(cwd) {
const managers = ['yarn', 'npm', 'bun'];
const results = await Promise.all(
managers.map(async manager => {
const lockFile =
manager === 'npm'
? 'package-lock.json'
: `${manager}.lock${manager === 'bun' ? 'b' : ''}`;
const hasLock = await exists(path.join(cwd, lockFile));
const hasGlobal = await hasGlobalInstallation(manager);
return {
name: manager,
hasLock,
hasGlobal
};
})
);
return results.filter(m => m.hasLock || m.hasGlobal);
}
async function canPnpm(cwd = process.cwd()) {
// Check for pnpm lock file
const pnpmLockExists = await exists(path.join(cwd, 'pnpm-lock.yaml'));
if (pnpmLockExists) {
return {canPnpm: true, reason: 'local lock file'};
}
// Check for global pnpm installation
const canPnpmGlobal = await hasGlobalInstallation('pnpm');
if (canPnpmGlobal) {
return {canPnpm: true, reason: 'global installation'};
}
// If pnpm is not found, check other managers
const otherManagers = await checkOtherManagers(cwd);
return {
canPnpm: false,
otherManagers: otherManagers.map(m => ({
name: m.name,
detected: m.hasLock ? 'local lock file' : 'global installation'
}))
};
}
export default canPnpm;