UNPKG

5.05 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.getReactScriptsPath = getReactScriptsPath;
9exports.isReactScriptsInstalled = isReactScriptsInstalled;
10exports.getStyleRules = getStyleRules;
11exports.getCraWebpackConfig = getCraWebpackConfig;
12exports.applyCRAWebpackConfig = applyCRAWebpackConfig;
13
14var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
16var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
18var _fs = _interopRequireDefault(require("fs"));
19
20var _path = _interopRequireDefault(require("path"));
21
22var _semver = _interopRequireDefault(require("semver"));
23
24var _miniCssExtractPlugin = _interopRequireDefault(require("mini-css-extract-plugin"));
25
26var _RuleSet = require("webpack/lib/RuleSet");
27
28function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
29
30function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
32var reactScriptsPath;
33
34function getReactScriptsPath() {
35 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
36 noCache = _ref.noCache;
37
38 if (reactScriptsPath && !noCache) return reactScriptsPath;
39
40 var appDirectory = _fs["default"].realpathSync(process.cwd());
41
42 var reactScriptsScriptPath = _fs["default"].realpathSync(_path["default"].join(appDirectory, '/node_modules/.bin/react-scripts'));
43
44 reactScriptsPath = _path["default"].join(reactScriptsScriptPath, '../..');
45 return reactScriptsPath;
46}
47
48function isReactScriptsInstalled() {
49 try {
50 // eslint-disable-next-line global-require, import/no-dynamic-require
51 var reactScriptsJson = require(_path["default"].join(getReactScriptsPath(), 'package.json'));
52
53 if (_semver["default"].lt(reactScriptsJson.version, '2.0.0')) return false;
54 return true;
55 } catch (e) {
56 return false;
57 }
58}
59
60function getStyleRules(rules) {
61 // Extensions of style rules we're interested in
62 var extensions = ['.css', '.scss', '.sass', '.module.css', '.module.scss', '.module.sass'];
63 return rules.reduce(function (styleRules, rule) {
64 // If at least one style extension satisfies the rule test, the rule is one
65 // we want to extract
66 if (rule.test && extensions.some((0, _RuleSet.normalizeCondition)(rule.test))) {
67 // If the base test is for styles, return early
68 return styleRules.concat(rule);
69 } // Get any style rules contained in rule.oneOf
70
71
72 if (!rule.test && rule.oneOf) {
73 styleRules.push.apply(styleRules, (0, _toConsumableArray2["default"])(getStyleRules(rule.oneOf)));
74 } // Get any style rules contained in rule.rules
75
76
77 if (!rule.test && rule.rules) {
78 styleRules.push.apply(styleRules, (0, _toConsumableArray2["default"])(getStyleRules(rule.rules)));
79 }
80
81 return styleRules;
82 }, []);
83}
84
85function getCraWebpackConfig(mode) {
86 if (mode === 'production') {
87 // eslint-disable-next-line global-require, import/no-dynamic-require
88 return require(_path["default"].join(getReactScriptsPath(), 'config/webpack.config.prod'));
89 } // eslint-disable-next-line global-require, import/no-dynamic-require
90
91
92 return require(_path["default"].join(getReactScriptsPath(), 'config/webpack.config.dev'));
93}
94
95function applyCRAWebpackConfig(baseConfig) {
96 // Remove any rules from baseConfig that test true for any one of the extensions
97 var baseRulesExcludingStyles = baseConfig.module.rules.filter(function (rule) {
98 return !rule.test || !['.css', '.scss', '.sass'].some((0, _RuleSet.normalizeCondition)(rule.test));
99 }); // Load create-react-app config
100
101 var craWebpackConfig = getCraWebpackConfig(baseConfig.mode);
102 var craStyleRules = getStyleRules(craWebpackConfig.module.rules); // Add css minification for production
103
104 var plugins = (0, _toConsumableArray2["default"])(baseConfig.plugins);
105
106 if (baseConfig.mode === 'production') {
107 plugins.push(new _miniCssExtractPlugin["default"]());
108 }
109
110 return _objectSpread({}, baseConfig, {
111 module: _objectSpread({}, baseConfig.module, {
112 rules: [].concat((0, _toConsumableArray2["default"])(baseRulesExcludingStyles), (0, _toConsumableArray2["default"])(craStyleRules))
113 }),
114 plugins: plugins
115 });
116}
\No newline at end of file