index.js
2.35 KB
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
85
86
87
88
89
90
'use strict';
const path = require('path');
const os = require('os');
const fs = require('fs');
const ini = require('ini');
const readRc = fp => {
try {
return ini.parse(fs.readFileSync(fp, 'utf8')).prefix;
} catch (err) {}
};
const defaultNpmPrefix = (() => {
if (process.env.PREFIX) {
return process.env.PREFIX;
}
if (process.platform === 'win32') {
// `c:\node\node.exe` → `prefix=c:\node\`
return path.dirname(process.execPath);
}
// `/usr/local/bin/node` → `prefix=/usr/local`
return path.dirname(path.dirname(process.execPath));
})();
const getNpmPrefix = () => {
if (process.env.PREFIX) {
return process.env.PREFIX;
}
const homePrefix = readRc(path.join(os.homedir(), '.npmrc'));
if (homePrefix) {
return homePrefix;
}
const globalConfigPrefix = readRc(path.resolve(defaultNpmPrefix, 'etc', 'npmrc'));
if (globalConfigPrefix) {
return globalConfigPrefix;
}
if (process.platform === 'win32' && process.env.APPDATA) {
// Hardcoded contents of `c:\Program Files\nodejs\node_modules\npm\.npmrc`
const prefix = path.join(process.env.APPDATA, 'npm');
if (fs.existsSync(prefix)) {
return prefix;
}
}
return defaultNpmPrefix;
};
const npmPrefix = path.resolve(getNpmPrefix());
const getYarnPrefix = () => {
if (process.env.PREFIX) {
return process.env.PREFIX;
}
if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
const prefix = path.join(process.env.LOCALAPPDATA, 'Yarn');
if (fs.existsSync(prefix)) {
return prefix;
}
}
const configPrefix = path.join(os.homedir(), '.config/yarn');
if (fs.existsSync(configPrefix)) {
return configPrefix;
}
const homePrefix = path.join(os.homedir(), '.yarn-config');
if (fs.existsSync(homePrefix)) {
return homePrefix;
}
// Yarn supports the npm conventions but the inverse is not true
return npmPrefix;
};
exports.npm = {};
exports.npm.prefix = npmPrefix;
exports.npm.packages = path.join(npmPrefix, process.platform === 'win32' ? 'node_modules' : 'lib/node_modules');
exports.npm.binaries = process.platform === 'win32' ? npmPrefix : path.join(npmPrefix, 'bin');
const yarnPrefix = path.resolve(getYarnPrefix());
exports.yarn = {};
exports.yarn.prefix = yarnPrefix;
exports.yarn.packages = path.join(yarnPrefix, process.platform === 'win32' ? 'config/global/node_modules' : 'global/node_modules');
exports.yarn.binaries = path.join(exports.yarn.packages, '.bin');