aboutsummaryrefslogtreecommitdiff
path: root/node_modules/@webpack-contrib/config-loader/lib/extend.js
blob: 0854032a40c4c76f2cd62608d1de45cbca25d014 (plain)
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
93
94
95
96
const path = require('path');

const isPlainObj = require('is-plain-obj');
const merge = require('merge-options').bind({ concatArrays: true });

const load = require('./load');
const resolve = require('./resolve');
const pluginFilters = require('./filters/plugins');
const ruleFilters = require('./filters/rules');

const loadExtends = (extent, options) => {
  let result;
  /* istanbul ignore else */
  if (path.isAbsolute(extent)) {
    result = load({ allowMissing: true, configPath: extent });
  } else {
    // eslint-disable-next-line import/no-dynamic-require, global-require
    result = { config: require(extent), configPath: extent };
  }

  // eslint-disable-next-line no-use-before-define
  return resolve(result).then(({ config }) => mergeExtend(config, options));
};

const filterPlugins = (config, options = {}) => {
  const filterName = options.plugins || 'default';
  const filter = pluginFilters[filterName] || pluginFilters.default;

  return filter(config);
};

const filterRules = (config, options = {}) => {
  const filterName = options.rules || 'default';
  const filter = ruleFilters[filterName] || ruleFilters.default;

  return filter(config);
};

const filterModule = (config, options = {}) => {
  const { module } = config;
  /* istanbul ignore else */
  if (module) {
    module.rules = filterRules(config, options);
  }

  return module;
};

const filter = (config, options = {}) => {
  /* eslint-disable no-param-reassign */
  config.module = filterModule(config, options);
  config.plugins = filterPlugins(config, options);

  return config;
};

const mergeExtend = (config, options = {}) => {
  let { extends: configExtends } = config;

  if (configExtends) {
    if (isPlainObj(configExtends)) {
      // eslint-disable-next-line no-param-reassign
      options = configExtends.filters;
      configExtends = configExtends.configs;
    }

    configExtends = [].concat(configExtends);

    const result = configExtends.reduceRight(
      (prev, conf) =>
        loadExtends(conf, options).then((extent) =>
          prev.then((prevConfig) => filter(merge(extent, prevConfig), options))
        ),
      Promise.resolve(config)
    );

    return result;
  }

  return Promise.resolve(config);
};

module.exports = {
  extend(config, options) {
    const promises = [].concat(config).map((conf) =>
      mergeExtend(conf, options).then((result) => {
        delete result.extends;
        return result;
      })
    );

    return Promise.all(promises).then(
      (results) => (results.length > 1 ? results : results[0])
    );
  },
};