UNPKG

3.23 kBJavaScriptView Raw
1var fs = require('fs');
2var path = require('path');
3var net = require('net');
4var crypto = require('crypto');
5var { execSync } = require('child_process');
6var color = require('@fle/color');
7var { boilerplates, pkgVersion } = require('./consts');
8
9function copyDir (origin, target, exclude) {
10 if (!fs.existsSync(target)) {
11 fs.mkdirSync(target);
12 }
13
14 fs.readdirSync(origin).forEach(file => {
15 if (exclude && exclude.test(file)) return;
16
17 var originFile = path.join(origin, file);
18 var targetFile = path.join(target, file.replace(/\.keep$/, ''));
19 var originStat = fs.statSync(originFile);
20
21 if (originStat.isDirectory()) {
22 copyDir(originFile, targetFile, exclude);
23 } else if (!fs.existsSync(targetFile)) {
24 fs.writeFileSync(targetFile, fs.readFileSync(originFile), { encoding: 'utf8' });
25 }
26 });
27}
28
29function getGitUser () {
30 var name, email;
31
32 try {
33 name = execSync('git config --get user.name');
34 email = execSync('git config --get user.email');
35 } catch (err) {}
36
37 name = (name && name.toString().trim()) || '';
38 email = (email && ` <${email.toString().trim()}>`) || '';
39
40 return name + email;
41}
42
43function useYarn () {
44 try {
45 execSync('yarnpkg --version', { stdio: 'ignore' });
46 return true;
47 } catch (err) {
48 return false;
49 }
50}
51
52// v1 - v2
53function compareVersion (v1, v2) {
54 if (v1 === v2) {
55 return 0;
56 }
57
58 var a1 = v1.split('.');
59 var a2 = v2.split('.');
60
61 if (a1[0] !== a2[0]) {
62 return a1[0] - a2[0];
63 }
64
65 if (a1[1] !== a2[1]) {
66 return a1[1] - a2[1];
67 }
68
69 if (a1[2] !== a2[2]) {
70 return a1[2] - a2[2];
71 }
72
73 return 0;
74}
75
76// 校验是否为fle项目
77function checkProject () {
78 var fleFile = path.resolve('fle.json');
79
80 if (!fs.existsSync(fleFile)) {
81 console.log(`\n当前目录不是fle项目\n`);
82 process.exit(1);
83 }
84
85 var fle = require(fleFile);
86
87 if (boilerplates.indexOf(fle.boilerplate) === -1) {
88 console.log(`\n暂不支持该项目模版:${fle.boilerplate}\n`);
89 process.exit(1);
90 }
91
92 if (compareVersion(fle.version || '0.0.0', pkgVersion) < 0) {
93 console.log();
94 console.log(color.warn('请更新项目依赖的fle版本!'));
95 console.log(' 项目依赖的版本:' + color.cyan(fle.version));
96 console.log(' 当前安装的版本:' + color.cyan(pkgVersion));
97 console.log(color.cyan(' 方法:更改fle.json的version字段为当前安装的版本'));
98 console.log();
99 }
100
101 return fle;
102}
103
104// 检测port是否被占用
105function portProbe (port, hostname, callback) {
106 // 创建服务并监听该端口
107 var server = net.createServer();
108
109 server.listen(port, hostname, function () {
110 server.once('close', function () {
111 callback(true, port, hostname);
112 });
113 server.close();
114 });
115
116 server.once('error', function (err) {
117 if (err.code === 'EADDRINUSE') { // 端口已经被使用
118 callback(false, port, hostname);
119 }
120 });
121}
122
123function createHash (str) {
124 return crypto.createHash('md5').update(str).digest('hex');
125}
126
127exports.copyDir = copyDir;
128exports.getGitUser = getGitUser;
129exports.useYarn = useYarn;
130exports.compareVersion = compareVersion;
131exports.checkProject = checkProject;
132exports.portProbe = portProbe;
133exports.createHash = createHash;