build-plugin-fusion
Version:
plugin for build scripts while use fusion component
121 lines • 5.38 kB
JavaScript
/* eslint-disable import/no-dynamic-require */
/**
* 检测 ICE 组件的依赖问题
* - 部分代码直接借鉴了 duplicate-package-checker-webpack-plugin
*/
var path = require('path');
var findRoot = require('find-root');
var semver = require('semver');
var bizComponentsVersion = require('./bizComponentsVersion');
var deprecatedComponents = require('./deprecatedComponents');
var depModules = {};
module.exports = /** @class */ (function () {
function CheckDepsPlugin(options) {
this.pkg = options.pkg || {};
this.log = options.log;
}
CheckDepsPlugin.prototype.apply = function (compiler) {
var _this = this;
compiler.hooks.emit.tapAsync('CheckDepsPlugin', function (compilation, callback) {
compilation.modules.forEach(function (module) {
if (!module.resource) {
return;
}
var closestPackage = getClosestPackage(module.resource);
// Skip module if no closest package is found
if (!closestPackage) {
return;
}
var pkg = closestPackage.package;
if (!depModules[pkg.name]) {
depModules[pkg.name] = [pkg.version];
}
else if (depModules[pkg.name].indexOf(pkg.version) === -1) {
depModules[pkg.name].push(pkg.version);
}
});
// 1. 多份基础组件
var baseComponentDeps = ['@icedesign/base', '@alife/next', '@ali/ice'].filter(function (name) { return depModules[name]; });
if (baseComponentDeps.length > 1) {
_this.log.warn("\u9879\u76EE\u4F9D\u8D56\u4E86\u591A\u4EFD\u57FA\u7840\u7EC4\u4EF6 ".concat(baseComponentDeps, "\uFF0C\u5EFA\u8BAE\u901A\u8FC7\u914D\u7F6E buildConfig.uniteBaseComponent \u4F18\u5316"));
}
// 2. 业务组件与基础组件的版本对应关系
var pkgDirectDeps = _this.pkg.dependencies || {};
var depFdNext = pkgDirectDeps['@alifd/next'];
var depFeNext = pkgDirectDeps['@ali/ice'] || pkgDirectDeps['@icedesign/base'] || pkgDirectDeps['@alife/next'];
if (depFeNext && !depFdNext) {
// 只依赖了 0.x 的项目应该使用 0.x 的业务组件
Object.keys(depModules).forEach(function (moduleName) {
checkBizComponentVersion({
npmName: moduleName,
npmVersion: depModules[moduleName][0],
baseVersion: '0.x',
log: _this.log,
});
});
}
if (depFdNext && !depFeNext) {
// 只依赖了 1.x 的项目应该使用 1.x 的业务组件
Object.keys(depModules).forEach(function (moduleName) {
checkBizComponentVersion({
npmName: moduleName,
npmVersion: depModules[moduleName][0],
baseVersion: '1.x',
log: _this.log,
});
});
}
// 3. 不维护的业务组件
Object.keys(depModules).forEach(function (moduleName) {
var deprecatedMsg = deprecatedComponents[moduleName];
if (deprecatedMsg) {
_this.log.warn(deprecatedMsg);
}
});
callback();
});
};
return CheckDepsPlugin;
}());
// Get closest package definition from path
function getClosestPackage(modulePath) {
var root;
var pkg;
// Catch findRoot or require errors
try {
root = findRoot(modulePath);
// eslint-disable-next-line
pkg = require(path.join(root, 'package.json'));
}
catch (e) {
return null;
}
// If the package.json does not have a name property, try again from
// one level higher.
// https://github.com/jsdnxx/find-root/issues/2
// https://github.com/date-fns/date-fns/issues/264#issuecomment-265128399
if (!pkg.name) {
return getClosestPackage(path.resolve(root, '..'));
}
return {
package: pkg,
path: root,
};
}
function checkBizComponentVersion(_a) {
var npmName = _a.npmName, npmVersion = _a.npmVersion, baseVersion = _a.baseVersion, log = _a.log;
if (!bizComponentsVersion[npmName]) {
// 未统计到或者 0.x&1.x 兼容的业务组件
return;
}
var semverVersion = bizComponentsVersion[npmName][baseVersion];
if (!semverVersion) {
// 没有对应的(未升级)
log.warn("".concat(npmName, " \u6682\u65F6\u6CA1\u6709\u7B26\u5408\u57FA\u7840\u7EC4\u4EF6 ").concat(baseVersion, " \u7684\u7248\u672C\uFF0C\u5EFA\u8BAE\u8054\u7CFB ICE \u56E2\u961F\u534F\u52A9\u5347\u7EA7"));
}
if (!semver.satisfies(npmVersion, semverVersion)) {
// 不符合版本
log.warn("\u9879\u76EE\u4F7F\u7528\u7684\u57FA\u7840\u7EC4\u4EF6\u7248\u672C\u662F ".concat(baseVersion, "\uFF0C\u4E1A\u52A1\u7EC4\u4EF6 ").concat(npmName, "@").concat(npmVersion, " \u4E0D\u7B26\u5408\u7248\u672C\u8981\u6C42 ").concat(semverVersion, "\uFF0C\u5EFA\u8BAE\u9009\u62E9\u6B63\u786E\u7684\u7EC4\u4EF6\u7248\u672C"));
}
}
//# sourceMappingURL=index.js.map