@tmsfe/tmskit 0.0.7 → 0.0.9-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/dist/index.cjs.js +1284 -983
- package/main.js +3 -3
- package/package.json +73 -75
- package/src/{gulp → compile}/build.js +5 -5
- package/src/{gulp → compile}/compile.js +90 -81
- package/src/{gulp → compile}/dev.js +129 -102
- package/src/{gulp → compile}/plugins/less.js +116 -116
- package/src/{gulp → compile}/plugins/mpCommonDep.js +131 -131
- package/src/{gulp → compile}/plugins/mpJsonDep.js +112 -108
- package/src/{gulp → compile}/plugins/mpWxmlDep.js +194 -194
- package/src/{gulp → compile}/plugins/postcss-font-base64.js +72 -72
- package/src/{gulp → compile}/plugins/replaceEnv.js +29 -29
- package/src/{gulp → compile}/plugins/utils/pluginError.js +25 -25
- package/src/config/constant.js +69 -71
- package/src/config/defaultTmsConfig.js +16 -16
- package/src/{utils → core}/buildAppJson.js +166 -221
- package/src/{utils → core}/checkDependencies.js +77 -77
- package/src/core/cloneModules.js +203 -0
- package/src/{utils → core}/handleError.js +18 -16
- package/src/core/isInIt.js +69 -0
- package/src/{utils/mpCiUtils.js → core/mpCi.js} +73 -73
- package/src/core/npm.js +218 -0
- package/src/core/symbolicLink.js +24 -0
- package/src/{utils/tkitUtils.js → core/tmsMpconfig.js} +234 -158
- package/src/entry.js +62 -60
- package/src/index.js +63 -62
- package/src/init.js +33 -33
- package/src/scripts/create/ask.js +63 -63
- package/src/scripts/create/generator.js +25 -25
- package/src/scripts/create/ignoreFiles.js +7 -7
- package/src/scripts/create/index.js +72 -72
- package/src/scripts/create/render.js +19 -19
- package/src/scripts/run/build/index.js +16 -17
- package/src/scripts/run/dev/index.js +42 -84
- package/src/scripts/run/index.js +97 -68
- package/src/scripts/run/init/index.js +95 -87
- package/src/scripts/run/install/index.js +31 -29
- package/src/utils/findCssImport.js +30 -30
- package/src/utils/global.js +22 -36
- package/src/utils/io.js +107 -106
- package/src/utils/log.js +47 -44
- package/src/utils/widgets.js +178 -167
- package/src/utils/cliUtils.js +0 -35
- package/src/utils/cloneModules.js +0 -116
- package/src/utils/npmUtils.js +0 -166
|
@@ -1,221 +1,166 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const {
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if (invalidKeys.length) {
|
|
168
|
-
fail(`不支持分包${subp?.name}配置${invalidKeys.join(',')}\n`);
|
|
169
|
-
}
|
|
170
|
-
// eslint-disable-next-line
|
|
171
|
-
invalidKeys.concat(['requiredBackgroundModes', 'embeddedAppIdList']).forEach(k => delete subp[k]);
|
|
172
|
-
return subp;
|
|
173
|
-
});
|
|
174
|
-
// 如果plugins重复,则错误提示
|
|
175
|
-
const pluginsErrMsg = Object.keys(pluginsMap).map((pk) => {
|
|
176
|
-
if (pluginsMap[pk].length > 1) {
|
|
177
|
-
return `${pluginsMap[pk].join(',')}重复配置plugin(${pk});`;
|
|
178
|
-
}
|
|
179
|
-
return '';
|
|
180
|
-
})
|
|
181
|
-
.reduce((pre, cur) => pre + cur, '');
|
|
182
|
-
if (pluginsErrMsg) {
|
|
183
|
-
fail(`plugins配置出现错误:${pluginsErrMsg}`);
|
|
184
|
-
}
|
|
185
|
-
// eslint-disable-next-line
|
|
186
|
-
appJson.subpackages = subps;
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* 动态生成编译后的app.json
|
|
192
|
-
* @param {object} tmsConfig
|
|
193
|
-
* @param {array} modules
|
|
194
|
-
* @returns
|
|
195
|
-
*/
|
|
196
|
-
function buildOutputAppJson(tmsConfig, modules, isDev) {
|
|
197
|
-
try {
|
|
198
|
-
// 获取当前 modules 下的所有子模块的配置内容
|
|
199
|
-
const modulesConfig = getLocalModuleConfig(modules, tmsConfig.appName, MODULE_CONFIG_FILENAME);
|
|
200
|
-
// 获取app.json的配置
|
|
201
|
-
const appJson = getAppJsonContent(resolve('./app.json'));
|
|
202
|
-
// 更新app.json中的subpackages
|
|
203
|
-
updateSubpackages(appJson, modulesConfig);
|
|
204
|
-
// 处理appJson中重复||冲突的地方
|
|
205
|
-
processAppJson(appJson);
|
|
206
|
-
// 更新主包,需在subpackages处理完成后执行, pages/
|
|
207
|
-
updateMainPackages(appJson, tmsConfig.mainPackages);
|
|
208
|
-
|
|
209
|
-
fs.writeFileSync(resolve(`${tmsConfig.outputDir}/app.json`), JSON.stringify(appJson, null, 2), 'utf8');
|
|
210
|
-
|
|
211
|
-
return appJson;
|
|
212
|
-
} catch (e) {
|
|
213
|
-
handleError(`生成app.json出现错误: ${e}`, isDev);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
module.exports = {
|
|
218
|
-
setModuleConfig,
|
|
219
|
-
getValidModules,
|
|
220
|
-
buildOutputAppJson,
|
|
221
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* 生成编译后的app.json
|
|
3
|
+
*/
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const { MODULE_CONFIG_FILENAME, MODULE_CONFIG_INVALID_KEY } = require('../config/constant');
|
|
6
|
+
const { getModuleConfig, getValidModules } = require('./tmsMpconfig');
|
|
7
|
+
const { fail } = require('../utils/log');
|
|
8
|
+
const { resolve, isObject } = require('../utils/widgets');
|
|
9
|
+
const { handleError } = require('./handleError');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 更新appJson里面的主包配置
|
|
13
|
+
* @param { object } appJson appJson信息
|
|
14
|
+
* @param { array } mainPackages 小程序主包信息
|
|
15
|
+
* @returns { object } appJson小程序主页配置信息
|
|
16
|
+
*/
|
|
17
|
+
function updateMainPackages(appJson, mainPackages = []) {
|
|
18
|
+
let foundMainPackages = appJson.subpackages.filter(subpackage => mainPackages.includes(subpackage.name));
|
|
19
|
+
if (foundMainPackages.length === 0) {
|
|
20
|
+
// 没找到主包
|
|
21
|
+
foundMainPackages = [appJson.subpackages[0]];
|
|
22
|
+
}
|
|
23
|
+
// 拼装 app.pages
|
|
24
|
+
foundMainPackages.forEach((subpackage) => {
|
|
25
|
+
if (!subpackage.pages || !subpackage.pages.length) {
|
|
26
|
+
fail(`主包 ${subpackage} 不能没有 pages`);
|
|
27
|
+
process.exit(-1);
|
|
28
|
+
}
|
|
29
|
+
subpackage.pages.forEach((page) => {
|
|
30
|
+
appJson.pages.push(`${subpackage.root}/${page}`);
|
|
31
|
+
});
|
|
32
|
+
if (subpackage.plugins) {
|
|
33
|
+
Object.assign(appJson.plugins, subpackage.plugins);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// 去掉 subpackages 中的主包配置
|
|
38
|
+
const foundMainPackageNames = foundMainPackages.map(item => item.name);
|
|
39
|
+
// eslint-disable-next-line
|
|
40
|
+
appJson.subpackages = appJson.subpackages.filter(subpackage => !foundMainPackageNames.includes(subpackage.name));
|
|
41
|
+
|
|
42
|
+
return appJson;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 获取app.json内容
|
|
46
|
+
* @param {string} sourceAppJsonPath app.json存在的源码路径
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
const getAppJsonContent = (sourceAppJsonPath) => {
|
|
50
|
+
if (!fs.existsSync(sourceAppJsonPath)) {
|
|
51
|
+
fail(`当前路径 ${sourceAppJsonPath} 没找到app.json`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const appJson = JSON.parse(fs.readFileSync(sourceAppJsonPath), 'utf-8');
|
|
55
|
+
// 加入默认值
|
|
56
|
+
appJson.subpackages = [];
|
|
57
|
+
appJson.pages = [];
|
|
58
|
+
// appJson.plugins = {};
|
|
59
|
+
delete appJson.entranceDeclare;
|
|
60
|
+
return appJson;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* 更新app.json中的subpackages
|
|
64
|
+
* @param {Object} appJson
|
|
65
|
+
* @param {Object} modulesConfig
|
|
66
|
+
*/
|
|
67
|
+
const updateSubpackages = (appJson, modulesConfig) => {
|
|
68
|
+
// eslint-disable-next-line
|
|
69
|
+
for (const name in modulesConfig) {
|
|
70
|
+
const moduleInfo = isObject(modulesConfig[name]) ? [modulesConfig[name]] : modulesConfig[name];
|
|
71
|
+
// 过滤 pages 为空的情况
|
|
72
|
+
const validModules = getValidModules(moduleInfo);
|
|
73
|
+
// eslint-disable-next-line
|
|
74
|
+
appJson.subpackages = appJson.subpackages.concat(validModules);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 处理合并subpackages后的appjson, 整理重复不合法的地方
|
|
80
|
+
* @param {Object} appJson appjson
|
|
81
|
+
*/
|
|
82
|
+
const fixAppJson = (appJson) => {
|
|
83
|
+
const { subpackages } = appJson;
|
|
84
|
+
const pluginsMap = {};
|
|
85
|
+
Object.keys(appJson.plugins || {}).forEach(key => pluginsMap[key] = ['app.json']);
|
|
86
|
+
const subps = subpackages.map((subp) => {
|
|
87
|
+
const invalidKeys = [];
|
|
88
|
+
Object.keys(subp).forEach((key) => {
|
|
89
|
+
if (key === 'dependencies') {
|
|
90
|
+
// eslint-disable-next-line
|
|
91
|
+
delete subp.dependencies;
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (key === 'plugins') {
|
|
95
|
+
Object.keys(subp.plugins).forEach((pk) => {
|
|
96
|
+
pluginsMap[pk] ? pluginsMap[pk].push(`分包${subp.name}`) : pluginsMap[pk] = [`分包${subp.name}`];
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (MODULE_CONFIG_INVALID_KEY.indexOf(key) > -1) {
|
|
101
|
+
// 如果分包配置中有不支持的key,则错误提醒
|
|
102
|
+
invalidKeys.push(key);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (['requiredBackgroundModes', 'embeddedAppIdList'].indexOf(key) > -1) {
|
|
106
|
+
// 提到appjson最上层处理
|
|
107
|
+
const preVal = appJson[key];
|
|
108
|
+
// eslint-disable-next-line
|
|
109
|
+
preVal ? appJson[key] = Array.from(new Set(preVal
|
|
110
|
+
// eslint-disable-next-line
|
|
111
|
+
.slice(0).concat(subp[key]))) : appJson[key] = subp[key].slice(0);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
if (invalidKeys.length) {
|
|
116
|
+
fail(`不支持分包${subp?.name}配置${invalidKeys.join(',')}\n`);
|
|
117
|
+
}
|
|
118
|
+
// eslint-disable-next-line
|
|
119
|
+
invalidKeys.concat(['requiredBackgroundModes', 'embeddedAppIdList']).forEach(k => delete subp[k]);
|
|
120
|
+
return subp;
|
|
121
|
+
});
|
|
122
|
+
// 如果plugins重复,则错误提示
|
|
123
|
+
const pluginsErrMsg = Object.keys(pluginsMap).map((pk) => {
|
|
124
|
+
if (pluginsMap[pk].length > 1) {
|
|
125
|
+
return `${pluginsMap[pk].join(',')}重复配置plugin(${pk});`;
|
|
126
|
+
}
|
|
127
|
+
return '';
|
|
128
|
+
})
|
|
129
|
+
.reduce((pre, cur) => pre + cur, '');
|
|
130
|
+
if (pluginsErrMsg) {
|
|
131
|
+
fail(`plugins配置出现错误:${pluginsErrMsg}`);
|
|
132
|
+
}
|
|
133
|
+
// eslint-disable-next-line
|
|
134
|
+
appJson.subpackages = subps;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 动态生成编译后的app.json
|
|
139
|
+
* @param {object} tmsConfig
|
|
140
|
+
* @param {array} modules 用户要编译的模块列表
|
|
141
|
+
* @returns
|
|
142
|
+
*/
|
|
143
|
+
function buildOutputAppJson(tmsConfig, modules) {
|
|
144
|
+
try {
|
|
145
|
+
// 获取当前 modules 下的所有子模块的配置内容
|
|
146
|
+
const modulesConfig = getModuleConfig(modules, tmsConfig.appName, MODULE_CONFIG_FILENAME);
|
|
147
|
+
// 获取app.json的配置
|
|
148
|
+
const appJson = getAppJsonContent(resolve('./app.json'));
|
|
149
|
+
// 更新app.json中的subpackages
|
|
150
|
+
updateSubpackages(appJson, modulesConfig);
|
|
151
|
+
// 处理appJson中重复||冲突的地方
|
|
152
|
+
fixAppJson(appJson);
|
|
153
|
+
// 更新主包,需在subpackages处理完成后执行, pages/
|
|
154
|
+
updateMainPackages(appJson, tmsConfig.mainPackages);
|
|
155
|
+
|
|
156
|
+
fs.writeFileSync(resolve(`${tmsConfig.outputDir}/app.json`), JSON.stringify(appJson, null, 2), 'utf8');
|
|
157
|
+
|
|
158
|
+
return appJson;
|
|
159
|
+
} catch (e) {
|
|
160
|
+
handleError(`生成app.json出现错误: ${e}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = {
|
|
165
|
+
buildOutputAppJson,
|
|
166
|
+
};
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const semver = require('semver');
|
|
3
|
-
const { resolve } = require('
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const shelljs = require('shelljs');
|
|
6
|
-
const { handleError } = require('./handleError');
|
|
7
|
-
|
|
8
|
-
const getLatestVersion = (npmName) => {
|
|
9
|
-
const data = shelljs.exec(`npm view ${npmName} version`);
|
|
10
|
-
return data.stdout || '0.0.0';
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* 检查package.json的依赖大于node_module的版本,则返回true
|
|
15
|
-
* @param {*} modules 模块
|
|
16
|
-
* @param {*} cwd 待检查package.json所在的目录 (eg: 当前执行脚本的目录)
|
|
17
|
-
* @param {*} outputDir 待检查node_modules存放的目录 (eg: dist/node_modules)
|
|
18
|
-
* @returns
|
|
19
|
-
*/
|
|
20
|
-
const checkDependencies = (modules, cwd, outputDir
|
|
21
|
-
// 步骤1. 收集package.json
|
|
22
|
-
const packageJsonName = 'package.json'; // 查找文件名
|
|
23
|
-
// 1.1根目录的package.json
|
|
24
|
-
const packageArr = [
|
|
25
|
-
{
|
|
26
|
-
srcPackageDir: path.join(cwd, packageJsonName),
|
|
27
|
-
destNpmDir: resolve(outputDir, 'node_modules'),
|
|
28
|
-
},
|
|
29
|
-
];
|
|
30
|
-
// 1.2模块的package.json
|
|
31
|
-
modules.forEach((item) => {
|
|
32
|
-
const srcPackageDir = path.join(cwd, item.path, 'package.json');
|
|
33
|
-
if (fs.existsSync(srcPackageDir)) {
|
|
34
|
-
packageArr.push({
|
|
35
|
-
srcPackageDir,
|
|
36
|
-
destNpmDir: resolve(outputDir, item.root, 'node_modules'),
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// 步骤2. 比较package.json的依赖与node_modules依赖的版本号
|
|
42
|
-
for (const item of packageArr) {
|
|
43
|
-
const packageJson = fs.readFileSync(item.srcPackageDir, 'utf-8');
|
|
44
|
-
let dependencies = {};
|
|
45
|
-
try {
|
|
46
|
-
const json = JSON.parse(packageJson);
|
|
47
|
-
dependencies = json?.dependencies ? json?.dependencies : {};
|
|
48
|
-
} catch (e) {
|
|
49
|
-
handleError(`解析${item.srcPackageDir}报错,请检查是否是正确的json
|
|
50
|
-
}
|
|
51
|
-
const dependenciesKeys = Object.keys(dependencies);
|
|
52
|
-
for (const key of dependenciesKeys) {
|
|
53
|
-
const depPath = path.join(item.destNpmDir, key);
|
|
54
|
-
if (!fs.existsSync(depPath)) {
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
const depPackagePath = path.join(depPath, 'package.json');
|
|
58
|
-
if (fs.existsSync(depPackagePath)) {
|
|
59
|
-
const packageData = require(depPackagePath);
|
|
60
|
-
if (dependencies[key] === 'latest') {
|
|
61
|
-
dependencies[key] = getLatestVersion(key);
|
|
62
|
-
}
|
|
63
|
-
if (packageData.version === 'latest') {
|
|
64
|
-
packageData.version = getLatestVersion(key);
|
|
65
|
-
}
|
|
66
|
-
if (semver.lt(packageData.version, semver.minVersion(dependencies[key]).version)) {
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return false;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
module.exports = {
|
|
76
|
-
checkDependencies,
|
|
77
|
-
};
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const semver = require('semver');
|
|
3
|
+
const { resolve } = require('../utils/widgets');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const shelljs = require('shelljs');
|
|
6
|
+
const { handleError } = require('./handleError');
|
|
7
|
+
|
|
8
|
+
const getLatestVersion = (npmName) => {
|
|
9
|
+
const data = shelljs.exec(`npm view ${npmName} version`);
|
|
10
|
+
return data.stdout || '0.0.0';
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 检查package.json的依赖大于node_module的版本,则返回true
|
|
15
|
+
* @param {*} modules 模块
|
|
16
|
+
* @param {*} cwd 待检查package.json所在的目录 (eg: 当前执行脚本的目录)
|
|
17
|
+
* @param {*} outputDir 待检查node_modules存放的目录 (eg: dist/node_modules)
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
const checkDependencies = (modules, cwd, outputDir) => {
|
|
21
|
+
// 步骤1. 收集package.json
|
|
22
|
+
const packageJsonName = 'package.json'; // 查找文件名
|
|
23
|
+
// 1.1根目录的package.json
|
|
24
|
+
const packageArr = [
|
|
25
|
+
{
|
|
26
|
+
srcPackageDir: path.join(cwd, packageJsonName),
|
|
27
|
+
destNpmDir: resolve(outputDir, 'node_modules'),
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
// 1.2模块的package.json
|
|
31
|
+
modules.forEach((item) => {
|
|
32
|
+
const srcPackageDir = path.join(cwd, item.path, 'package.json');
|
|
33
|
+
if (fs.existsSync(srcPackageDir)) {
|
|
34
|
+
packageArr.push({
|
|
35
|
+
srcPackageDir,
|
|
36
|
+
destNpmDir: resolve(outputDir, item.root, 'node_modules'),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// 步骤2. 比较package.json的依赖与node_modules依赖的版本号
|
|
42
|
+
for (const item of packageArr) {
|
|
43
|
+
const packageJson = fs.readFileSync(item.srcPackageDir, 'utf-8');
|
|
44
|
+
let dependencies = {};
|
|
45
|
+
try {
|
|
46
|
+
const json = JSON.parse(packageJson);
|
|
47
|
+
dependencies = json?.dependencies ? json?.dependencies : {};
|
|
48
|
+
} catch (e) {
|
|
49
|
+
handleError(`解析${item.srcPackageDir}报错,请检查是否是正确的json配置项 ${e}`);
|
|
50
|
+
}
|
|
51
|
+
const dependenciesKeys = Object.keys(dependencies);
|
|
52
|
+
for (const key of dependenciesKeys) {
|
|
53
|
+
const depPath = path.join(item.destNpmDir, key);
|
|
54
|
+
if (!fs.existsSync(depPath)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
const depPackagePath = path.join(depPath, 'package.json');
|
|
58
|
+
if (fs.existsSync(depPackagePath)) {
|
|
59
|
+
const packageData = require(depPackagePath);
|
|
60
|
+
if (dependencies[key] === 'latest') {
|
|
61
|
+
dependencies[key] = getLatestVersion(key);
|
|
62
|
+
}
|
|
63
|
+
if (packageData.version === 'latest') {
|
|
64
|
+
packageData.version = getLatestVersion(key);
|
|
65
|
+
}
|
|
66
|
+
if (semver.lt(packageData.version, semver.minVersion(dependencies[key]).version)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
module.exports = {
|
|
76
|
+
checkDependencies,
|
|
77
|
+
};
|