UNPKG

react-cosmos

Version:

CLI for running React Cosmos inside webpack-powered apps

168 lines (133 loc) 6.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.webpackDevServer = webpackDevServer; var _webpackHotMiddleware = _interopRequireDefault(require("@skidding/webpack-hot-middleware")); var _path = _interopRequireDefault(require("path")); var _static = require("../../shared/static"); var _utils = require("../../shared/utils"); var _webpack = require("./cosmosConfig/webpack"); var _shared = require("./shared"); var _getDevWebpackConfig = require("./webpackConfig/getDevWebpackConfig"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function webpackDevServer(_x) { return _webpackDevServer.apply(this, arguments); } function _webpackDevServer() { _webpackDevServer = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref) { var cosmosConfig, expressApp, sendMessage, userWebpack, webpackConfig, webpackDerivedStaticPath, sendBuildMessage, webpackCompiler, onCompilationDone, wdm, wdmInst, _createWebpackCosmosC, hotReload; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: sendBuildMessage = function _sendBuildMessage(msg) { sendMessage(msg); }; cosmosConfig = _ref.cosmosConfig, expressApp = _ref.expressApp, sendMessage = _ref.sendMessage; if (!cosmosConfig.experimentalRendererUrl) { _context2.next = 4; break; } return _context2.abrupt("return"); case 4: userWebpack = (0, _shared.getWebpack)(cosmosConfig.rootDir); if (userWebpack) { _context2.next = 7; break; } return _context2.abrupt("return"); case 7: _context2.next = 9; return (0, _getDevWebpackConfig.getDevWebpackConfig)(cosmosConfig, userWebpack); case 9: webpackConfig = _context2.sent; // Serve static path derived from devServer.contentBase webpack config if (cosmosConfig.staticPath === null) { webpackDerivedStaticPath = getWebpackStaticPath(webpackConfig); if (webpackDerivedStaticPath !== null) { (0, _static.serveStaticDir)(expressApp, _path.default.resolve(cosmosConfig.rootDir, webpackDerivedStaticPath), cosmosConfig.publicUrl); } } webpackCompiler = userWebpack(webpackConfig); webpackCompiler.hooks.invalid.tap('Cosmos', function (filePath) { if (typeof filePath === 'string') { var relFilePath = _path.default.relative(process.cwd(), filePath); console.log('[Cosmos] webpack build invalidated by', relFilePath); } else { console.log('[Cosmos] webpack build invalidated by unknown file'); } sendBuildMessage({ type: 'buildStart' }); }); webpackCompiler.hooks.failed.tap('Cosmos', function () { sendBuildMessage({ type: 'buildError' }); }); onCompilationDone = new Promise(function (resolve) { webpackCompiler.hooks.done.tap('Cosmos', function (stats) { resolve(); if (stats.hasErrors()) { sendBuildMessage({ type: 'buildError' }); } else { sendBuildMessage({ type: 'buildDone' }); } }); }); console.log('[Cosmos] Building webpack...'); // Why import WDM here instead of at module level? Because it imports webpack, // which might not be installed in the user's codebase. If this were to happen // the Cosmos server would crash with a cryptic import error. See import here: // https://github.com/webpack/webpack-dev-middleware/blob/eb2e32bab57df11bdfbbac19474eb16817d504fe/lib/fs.js#L8 // Instead, prior to importing WDM we check if webpack is installed and fail // gracefully if not. wdm = require('webpack-dev-middleware'); wdmInst = wdm(webpackCompiler, { // publicPath is the base path for the webpack assets and has to match // webpack.output.path publicPath: (0, _utils.removeLeadingDot)(cosmosConfig.publicUrl) }); expressApp.use(wdmInst); _createWebpackCosmosC = (0, _webpack.createWebpackCosmosConfig)(cosmosConfig), hotReload = _createWebpackCosmosC.hotReload; if (hotReload) { expressApp.use((0, _webpackHotMiddleware.default)(webpackCompiler)); } _context2.next = 23; return onCompilationDone; case 23: return _context2.abrupt("return", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return new Promise(function (res) { return wdmInst.close(res); }); case 2: case "end": return _context.stop(); } } }, _callee); }))); case 24: case "end": return _context2.stop(); } } }, _callee2); })); return _webpackDevServer.apply(this, arguments); } function getWebpackStaticPath(_ref2) { var devServer = _ref2.devServer; return devServer && typeof devServer.contentBase === 'string' ? devServer.contentBase : null; }