@beisen/storybook-react
Version:
Storybook for React: Develop React Component in isolation with Hot Reloading.
116 lines (83 loc) • 5.05 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getReactScriptsPath = getReactScriptsPath;
exports.isReactScriptsInstalled = isReactScriptsInstalled;
exports.getStyleRules = getStyleRules;
exports.getCraWebpackConfig = getCraWebpackConfig;
exports.applyCRAWebpackConfig = applyCRAWebpackConfig;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _semver = _interopRequireDefault(require("semver"));
var _miniCssExtractPlugin = _interopRequireDefault(require("mini-css-extract-plugin"));
var _RuleSet = require("webpack/lib/RuleSet");
function 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; }
function _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; }
var reactScriptsPath;
function getReactScriptsPath() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
noCache = _ref.noCache;
if (reactScriptsPath && !noCache) return reactScriptsPath;
var appDirectory = _fs["default"].realpathSync(process.cwd());
var reactScriptsScriptPath = _fs["default"].realpathSync(_path["default"].join(appDirectory, '/node_modules/.bin/react-scripts'));
reactScriptsPath = _path["default"].join(reactScriptsScriptPath, '../..');
return reactScriptsPath;
}
function isReactScriptsInstalled() {
try {
// eslint-disable-next-line global-require, import/no-dynamic-require
var reactScriptsJson = require(_path["default"].join(getReactScriptsPath(), 'package.json'));
if (_semver["default"].lt(reactScriptsJson.version, '2.0.0')) return false;
return true;
} catch (e) {
return false;
}
}
function getStyleRules(rules) {
// Extensions of style rules we're interested in
var extensions = ['.css', '.scss', '.sass', '.module.css', '.module.scss', '.module.sass'];
return rules.reduce(function (styleRules, rule) {
// If at least one style extension satisfies the rule test, the rule is one
// we want to extract
if (rule.test && extensions.some((0, _RuleSet.normalizeCondition)(rule.test))) {
// If the base test is for styles, return early
return styleRules.concat(rule);
} // Get any style rules contained in rule.oneOf
if (!rule.test && rule.oneOf) {
styleRules.push.apply(styleRules, (0, _toConsumableArray2["default"])(getStyleRules(rule.oneOf)));
} // Get any style rules contained in rule.rules
if (!rule.test && rule.rules) {
styleRules.push.apply(styleRules, (0, _toConsumableArray2["default"])(getStyleRules(rule.rules)));
}
return styleRules;
}, []);
}
function getCraWebpackConfig(mode) {
if (mode === 'production') {
// eslint-disable-next-line global-require, import/no-dynamic-require
return require(_path["default"].join(getReactScriptsPath(), 'config/webpack.config.prod'));
} // eslint-disable-next-line global-require, import/no-dynamic-require
return require(_path["default"].join(getReactScriptsPath(), 'config/webpack.config.dev'));
}
function applyCRAWebpackConfig(baseConfig) {
// Remove any rules from baseConfig that test true for any one of the extensions
var baseRulesExcludingStyles = baseConfig.module.rules.filter(function (rule) {
return !rule.test || !['.css', '.scss', '.sass'].some((0, _RuleSet.normalizeCondition)(rule.test));
}); // Load create-react-app config
var craWebpackConfig = getCraWebpackConfig(baseConfig.mode);
var craStyleRules = getStyleRules(craWebpackConfig.module.rules); // Add css minification for production
var plugins = (0, _toConsumableArray2["default"])(baseConfig.plugins);
if (baseConfig.mode === 'production') {
plugins.push(new _miniCssExtractPlugin["default"]());
}
return _objectSpread({}, baseConfig, {
module: _objectSpread({}, baseConfig.module, {
rules: [].concat((0, _toConsumableArray2["default"])(baseRulesExcludingStyles), (0, _toConsumableArray2["default"])(craStyleRules))
}),
plugins: plugins
});
}