This repository has been archived by the owner on Jul 31, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgetProjectTempDir.js
81 lines (76 loc) · 2.21 KB
/
getProjectTempDir.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
'use strict';
const tmp = require('tmp');
const nodeCleanup = require('node-cleanup');
const semver = require('semver');
const colors = require('colors/safe');
const path = require('path');
const { exec, execSync } = require('child_process');
const { rmSync } = require('fs');
const { writeFile } = require('fs').promises;
const cleanupHandlers = [];
const finalCleanup = function finalCleanup() {
for (let i = 0; i < cleanupHandlers.length; ++i) {
cleanupHandlers[i]();
}
};
let rootTempDir;
const getRootTempDir = function getRootTempDir(npmNeeded, logger = () => {}) {
if (!rootTempDir) {
logger(colors.blue('Creating root temp directory, to hold temporary lockfiles...'));
rootTempDir = new Promise((resolve, reject) => {
tmp.dir((err, tmpDir, cleanup) => {
if (err) {
reject(err);
} else {
resolve(tmpDir);
cleanupHandlers.push(cleanup);
nodeCleanup(finalCleanup);
}
});
}).then((tmpDir) => {
const npmV = execSync('npm --version', { encoding: 'utf-8', cwd: tmpDir }).trim();
logger(`${colors.blue('Checking npm version:')} \`npm --version\` -> v${npmV}`);
if (!semver.satisfies(npmV, npmNeeded)) {
const pkgContents = {
private: true,
name: 'npm-jail',
dependencies: {
npm: npmNeeded,
},
};
return writeFile(
path.join(tmpDir, 'package.json'),
JSON.stringify(pkgContents),
).then(() => new Promise((resolve, reject) => {
cleanupHandlers.unshift(() => {
rmSync(path.join(tmpDir, '*'), { recursive: true, force: true });
});
exec('npm install --no-package-lock --silent >/dev/null', { cwd: tmpDir }, (err) => {
if (err) {
reject(err);
} else {
resolve(tmpDir);
}
});
}));
}
return tmpDir;
});
}
return rootTempDir;
};
module.exports = function getProjectTempDir({ npmNeeded = '^6.9.0-0', logger = undefined } = {}) {
return getRootTempDir(npmNeeded, logger).then((rootDir) => {
const projectDir = path.join(rootDir, 'XXXXXX');
return new Promise((resolve, reject) => {
tmp.dir({ template: projectDir }, (err, tmpDir, cleanup) => {
if (err) {
reject(err);
} else {
resolve(tmpDir);
cleanupHandlers.unshift(cleanup);
}
});
});
});
};