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
const { dirname } = require('path');
const { pkgUp, semver } = require('@umijs/utils');
const pkgPathCache = {};
const pkgCache = {};
// type 为 all 时以下依赖不走 babel 编译
const TYPE_ALL_EXCLUDE = [
'@ant-design/icons',
'@ant-design/icons-svg',
'@babel/runtime',
'core-js',
'echarts',
'lodash',
'react',
'react-dom',
'@wisdom-map/arcgismap',
'@wisdom-map/amap',
'@wisdom-map/basemap',
];
// 参考:
// https://github.com/umijs/umi/blob/2.x/packages/af-webpack/src/getWebpackConfig/es5ImcompatibleVersions.js
function isMatch(opts) {
const pkgPath = getPkgPath(opts);
// 可能没有 package.json
if (!pkgPath) return false;
if (pkgPath in pkgCache) return pkgCache[pkgPath];
const { name, version } = require(pkgPath); // eslint-disable-line
if (opts.pkgs[name]) {
pkgCache[pkgPath] = opts.pkgs[name].some(v => semver.satisfies(version, v));
} else {
pkgCache[pkgPath] = false;
}
return pkgCache[pkgPath];
}
function getPkgPath(opts) {
const dir = dirname(opts.path);
if (dir in pkgPathCache) return pkgPathCache[dir];
pkgPathCache[dir] = pkgUp.sync({ cwd: opts.path });
return pkgPathCache[dir];
}
function excludeToPkgs(opts) {
return opts.exclude.reduce((memo, exclude) => {
const { name, versions } = excludeToPkg({ exclude });
memo[name] = versions;
return memo;
}, {});
}
function excludeToPkg(opts) {
let firstAt = '';
let left = opts.exclude;
if (left.charAt(0) === '@') {
firstAt = '@';
left = left.slice(1);
}
let [name, version] = left.split('@');
name = `${firstAt}${name}`;
if (!version) {
version = '*';
}
return { name, versions: [version] };
}
function es5ImcompatibleVersionsToPkg() {
const {
config: { 'es5-imcompatible-versions': config },
} = require('es5-imcompatible-versions/package.json');
return Object.keys(config).reduce((memo, key) => {
memo[key] = Object.keys(config[key]);
return memo;
}, {});
}
module.exports = {
TYPE_ALL_EXCLUDE,
isMatch,
getPkgPath,
excludeToPkg,
excludeToPkgs,
es5ImcompatibleVersionsToPkg,
};