react-cosmos
Version:
CLI for running React Cosmos inside webpack-powered apps
168 lines (133 loc) • 6.71 kB
JavaScript
;
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;
}