-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
package-install.js
130 lines (108 loc) · 3.58 KB
/
package-install.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
'use strict';
const path = require('path');
const fs = require('fs');
const cproc = require('child_process');
const { paths, pluginNamePattern } = require('../constants');
function updatePackageFile() {
let oldPackageContents = {};
try {
oldPackageContents = JSON.parse(fs.readFileSync(paths.currentPackage, 'utf8'));
} catch (e) {
if (e.code !== 'ENOENT') {
throw e;
}
}
const defaultPackageContents = JSON.parse(fs.readFileSync(paths.installPackage, 'utf8'));
let dependencies = {};
Object.entries(oldPackageContents.dependencies || {}).forEach(([dep, version]) => {
if (pluginNamePattern.test(dep)) {
dependencies[dep] = version;
}
});
// Sort dependencies alphabetically
dependencies = sortDependencies({ ...dependencies, ...defaultPackageContents.dependencies });
const packageContents = { ...oldPackageContents, ...defaultPackageContents, dependencies: dependencies };
fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 2));
}
exports.updatePackageFile = updatePackageFile;
exports.supportedPackageManager = [
'npm',
'cnpm',
'pnpm',
'yarn',
];
function installAll() {
const prod = global.env !== 'development';
let command = 'npm install';
try {
fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK);
const supportedPackageManagerList = exports.supportedPackageManager; // load config from src/cli/package-install.js
const packageManager = require('nconf').get('package_manager');
if (supportedPackageManagerList.indexOf(packageManager) >= 0) {
switch (packageManager) {
case 'yarn':
command = 'yarn';
break;
case 'pnpm':
command = 'pnpm install';
break;
case 'cnpm':
command = 'cnpm install';
break;
default:
break;
}
}
} catch (e) {
// ignore
}
try {
cproc.execSync(command + (prod ? ' --production' : ''), {
cwd: path.join(__dirname, '../../'),
stdio: [0, 1, 2],
});
} catch (e) {
console.log('Error installing dependencies!');
console.log('message: ' + e.message);
console.log('stdout: ' + e.stdout);
console.log('stderr: ' + e.stderr);
throw e;
}
}
exports.installAll = installAll;
function preserveExtraneousPlugins() {
// Skip if `node_modules/` is not found or inaccessible
try {
fs.accessSync(paths.nodeModules, fs.constants.R_OK);
} catch (e) {
return;
}
const packages = fs.readdirSync(paths.nodeModules)
.filter(pkgName => pluginNamePattern.test(pkgName));
const packageContents = JSON.parse(fs.readFileSync(paths.currentPackage, 'utf8'));
const extraneous = packages
// only extraneous plugins (ones not in package.json) which are not links
.filter(function (pkgName) {
const extraneous = !packageContents.dependencies.hasOwnProperty(pkgName);
const isLink = fs.lstatSync(path.join(paths.nodeModules, pkgName)).isSymbolicLink();
return extraneous && !isLink;
})
// reduce to a map of package names to package versions
.reduce(function (map, pkgName) {
const pkgConfig = JSON.parse(fs.readFileSync(path.join(paths.nodeModules, pkgName, 'package.json'), 'utf8'));
map[pkgName] = pkgConfig.version;
return map;
}, {});
// Add those packages to package.json
packageContents.dependencies = sortDependencies({ ...packageContents.dependencies, ...extraneous });
fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 2));
}
function sortDependencies(dependencies) {
return Object.entries(dependencies)
.sort((a, b) => (a < b ? -1 : 1))
.reduce((memo, pkg) => {
memo[pkg[0]] = pkg[1];
return memo;
}, {});
}
exports.preserveExtraneousPlugins = preserveExtraneousPlugins;