UNPKG

react-cosmos

Version:

CLI for running React Cosmos inside webpack-powered apps

152 lines (125 loc) 5.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDefaultWebpackConfig = getDefaultWebpackConfig; var _resolveFrom = _interopRequireDefault(require("resolve-from")); var _playgroundHtml = require("../../../shared/playgroundHtml"); var _getWebpackNodeEnv = require("./getWebpackNodeEnv"); var _htmlPlugin = require("./htmlPlugin"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // This config doesn't have entry and output set up because it's not meant to // work standalone. An entry & output will be added to this base config. function getDefaultWebpackConfig(userWebpack, rootDir) { // react-cosmos doesn't directly depend on any webpack loader. // Instead, it includes the ones already installed by the user. var tsLoaderPath = _resolveFrom.default.silent(rootDir, 'ts-loader'); var babelLoaderPath = _resolveFrom.default.silent(rootDir, 'next/dist/compiled/babel-loader') || _resolveFrom.default.silent(rootDir, 'babel-loader'); var styleLoaderPath = _resolveFrom.default.silent(rootDir, 'style-loader'); var cssLoaderPath = _resolveFrom.default.silent(rootDir, 'css-loader'); var postcssLoaderPath = _resolveFrom.default.silent(rootDir, 'postcss-loader'); // Note: Since webpack >= v2.0.0, importing of JSON files will work by default var jsonLoaderPath = _resolveFrom.default.silent(rootDir, 'json-loader'); var rules = []; var plugins = []; // Prefer babel-loader over ts-loader if user has both installed. If user // has babel-loader installed then most likely they won't want ts-loader // to handle module transformation. if (babelLoaderPath) { rules.push({ test: /\.(js|ts)x?$/, exclude: /node_modules/, use: { loader: babelLoaderPath, options: { root: rootDir } } }); } else if (tsLoaderPath) { rules.push({ test: /\.tsx?$/, loader: tsLoaderPath }); } if (styleLoaderPath && cssLoaderPath) { if (postcssLoaderPath) { rules.push({ test: /\.css$/, use: [styleLoaderPath, { loader: cssLoaderPath, options: { importLoaders: 1 } }, postcssLoaderPath], exclude: /node_modules/ }); } else { rules.push({ test: /\.css$/, use: [{ loader: styleLoaderPath }, { loader: cssLoaderPath }], exclude: /node_modules/ }); } // Preprocess 3rd party .css files located in node_modules rules.push({ test: /\.css$/, use: [{ loader: styleLoaderPath }, { loader: cssLoaderPath }], include: /node_modules/ }); } if (jsonLoaderPath) { rules.push({ test: /\.json$/, loader: jsonLoaderPath, exclude: /node_modules/ }); } var htmlWebpackPlugin = (0, _htmlPlugin.getHtmlWebpackPlugin)(rootDir); if (htmlWebpackPlugin) { plugins.push(new htmlWebpackPlugin({ title: 'React Cosmos', filename: _playgroundHtml.RENDERER_FILENAME })); } var config = { // Besides other advantages, cheap-module-source-map is compatible with // React.componentDidCatch https://github.com/facebook/react/issues/10441 devtool: 'cheap-module-source-map', resolve: { // Warning: webpack 1.x expects ['', '.js', '.jsx'] extensions: ['.js', '.jsx', '.ts', '.tsx'] }, module: { // Note: `module.rules` only works with webpack >=2.x. For 1.x // compatibility a custom webpack config (with module.loaders) is required rules: rules }, plugins: plugins, stats: 'minimal', infrastructureLogging: { level: 'warn' } }; var webpack4 = userWebpack.version && parseInt(userWebpack.version, 10) >= 4; if (!webpack4) { return config; } return _objectSpread(_objectSpread({}, config), {}, { mode: (0, _getWebpackNodeEnv.getWebpackNodeEnv)(), optimization: { // Cosmos reads component names at run-time, so it is crucial to not // minify even when building with production env (ie. when exporting) // https://github.com/react-cosmos/react-cosmos/issues/701 minimize: false } }); }