forked from webpack/webpack
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetup.js
111 lines (102 loc) · 2.86 KB
/
setup.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
"use strict";
const fs = require("fs");
const path = require("path");
const root = process.cwd();
const node_modulesFolder = path.resolve(root, "node_modules");
const webpackDependencyFolder = path.resolve(root, "node_modules/webpack");
function setup() {
return Promise.all([
checkSymlinkExistsAsync().then(async hasSymlink => {
if (!hasSymlink) {
await ensureYarnInstalledAsync();
await runSetupSymlinkAsync();
if (!(await checkSymlinkExistsAsync())) {
throw new Error("windows symlink was not successfully created");
}
}
})
])
.then(() => {
process.exitCode = 0;
})
.catch(e => {
console.error(e);
process.exitCode = 1;
});
}
async function runSetupSymlinkAsync() {
await exec("yarn", ["install"], "Install dependencies");
await exec("yarn", ["link"], "Create webpack symlink");
await exec("yarn", ["link", "webpack"], "Link webpack into itself");
}
function checkSymlinkExistsAsync() {
return new Promise((resolve, reject) => {
if (
fs.existsSync(node_modulesFolder) &&
fs.existsSync(webpackDependencyFolder) &&
fs.lstatSync(webpackDependencyFolder).isSymbolicLink()
) {
resolve(true);
} else {
resolve(false);
}
});
}
async function ensureYarnInstalledAsync() {
const semverPattern =
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/;
let hasYarn = false;
try {
const stdout = await execGetOutput("yarn", ["-v"], "Check yarn version");
hasYarn = semverPattern.test(stdout);
} catch (e) {
hasYarn = false;
}
if (!hasYarn) await installYarnAsync();
}
function installYarnAsync() {
return exec("npm", ["install", "-g", "yarn"], "Install yarn");
}
function exec(command, args, description) {
console.log(`Setup: ${description}`);
return new Promise((resolve, reject) => {
let cp = require("child_process").spawn(command, args, {
cwd: root,
stdio: "inherit",
shell: true
});
cp.on("error", error => {
reject(new Error(`${description} failed with ${error}`));
});
cp.on("exit", exitCode => {
if (exitCode) {
reject(`${description} failed with exit code ${exitCode}`);
} else {
resolve();
}
});
});
}
function execGetOutput(command, args, description) {
console.log(`Setup: ${description}`);
return new Promise((resolve, reject) => {
let cp = require("child_process").spawn(command, args, {
cwd: root,
stdio: [process.stdin, "pipe", process.stderr],
shell: true
});
cp.on("error", error => {
reject(new Error(`${description} failed with ${error}`));
});
cp.on("exit", exitCode => {
if (exitCode) {
reject(`${description} failed with exit code ${exitCode}`);
} else {
resolve(Buffer.concat(buffers).toString("utf-8").trim());
}
});
const buffers = [];
cp.stdout.on("data", data => buffers.push(data));
});
}
setup();