nodeModulesTransform.js 2.06 KB
Newer Older
1 2
const { dirname } = require('path');

3
const { pkgUp, semver } = require('@umijs/utils');
4 5 6 7 8 9 10 11 12 13 14 15 16 17

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',
lihonglin's avatar
lihonglin committed
18
  '@wisdom-map/arcgismap',
19 20
  '@wisdom-map/amap',
  '@wisdom-map/basemap',
21 22 23 24 25 26 27 28 29 30 31 32 33 34
];

// 参考:
// 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]) {
35
    pkgCache[pkgPath] = opts.pkgs[name].some(v => semver.satisfies(version, v));
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
  } 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 = {
86 87 88 89 90 91 92
  TYPE_ALL_EXCLUDE,
  isMatch,
  getPkgPath,
  excludeToPkg,
  excludeToPkgs,
  es5ImcompatibleVersionsToPkg,
};