@tdb/web
Version:
Common condiguration for serving a web-site and testing web-based UI components.
436 lines (366 loc) • 15.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectSpread"));
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
var _get2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
var _nextServer = _interopRequireDefault(require("./next-server"));
var _path = require("path");
var _hotReloader = _interopRequireDefault(require("./hot-reloader"));
var _constants = require("../lib/constants");
var DevServer =
/*#__PURE__*/
function (_Server) {
(0, _inherits2.default)(DevServer, _Server);
function DevServer(options) {
var _this;
(0, _classCallCheck2.default)(this, DevServer);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(DevServer).call(this, options));
_this.hotReloader = new _hotReloader.default(_this.dir, {
config: _this.nextConfig,
buildId: _this.buildId
});
_this.renderOpts.hotReloader = _this.hotReloader;
_this.renderOpts.dev = true;
return _this;
}
(0, _createClass2.default)(DevServer, [{
key: "currentPhase",
value: function currentPhase() {
return _constants.PHASE_DEVELOPMENT_SERVER;
}
}, {
key: "readBuildId",
value: function readBuildId() {
return 'development';
}
}, {
key: "prepare",
value: function () {
var _prepare = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee() {
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "prepare", this).call(this);
case 2:
_context.next = 4;
return this.hotReloader.start();
case 4:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function prepare() {
return _prepare.apply(this, arguments);
};
}()
}, {
key: "close",
value: function () {
var _close = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee2() {
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return this.hotReloader.stop();
case 2:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
return function close() {
return _close.apply(this, arguments);
};
}()
}, {
key: "run",
value: function () {
var _run = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee3(req, res, parsedUrl) {
var _ref, finished;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return this.hotReloader.run(req, res, parsedUrl);
case 2:
_ref = _context3.sent;
finished = _ref.finished;
if (!finished) {
_context3.next = 6;
break;
}
return _context3.abrupt("return");
case 6:
return _context3.abrupt("return", (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "run", this).call(this, req, res, parsedUrl));
case 7:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
return function run(_x, _x2, _x3) {
return _run.apply(this, arguments);
};
}()
}, {
key: "generateRoutes",
value: function () {
var _generateRoutes = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee6() {
var _this2 = this;
var routes, exportPathMap, _loop, path;
return _regenerator.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "generateRoutes", this).call(this);
case 2:
routes = _context6.sent;
// In development we expose all compiled files for react-error-overlay's line show feature
// We use unshift so that we're sure the routes is defined before Next's default routes
routes.unshift({
path: '/_next/development/:path*',
fn: function () {
var _fn = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee4(req, res, params) {
var p;
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
p = _path.join.apply(void 0, [_this2.distDir].concat((0, _toConsumableArray2.default)(params.path || [])));
_context4.next = 3;
return _this2.serveStatic(req, res, p);
case 3:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
return function fn(_x4, _x5, _x6) {
return _fn.apply(this, arguments);
};
}()
}); // Makes `next export` exportPathMap work in development mode.
// So that the user doesn't have to define a custom server reading the exportPathMap
if (!this.nextConfig.exportPathMap) {
_context6.next = 11;
break;
}
console.log('Defining routes from exportPathMap');
_context6.next = 8;
return this.nextConfig.exportPathMap({}, {
dev: true,
dir: this.dir,
outDir: null,
distDir: this.distDir,
buildId: this.buildId
});
case 8:
exportPathMap = _context6.sent;
_loop = function _loop(path) {
var _exportPathMap$path = exportPathMap[path],
page = _exportPathMap$path.page,
_exportPathMap$path$q = _exportPathMap$path.query,
query = _exportPathMap$path$q === void 0 ? {} : _exportPathMap$path$q; // We use unshift so that we're sure the routes is defined before Next's default routes
routes.unshift({
path: path,
fn: function () {
var _fn2 = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee5(req, res, params, parsedUrl) {
var urlQuery, mergedQuery;
return _regenerator.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
urlQuery = parsedUrl.query;
(0, _keys.default)(urlQuery).filter(function (key) {
return query[key] === undefined;
}).forEach(function (key) {
return console.warn("Url defines a query parameter '".concat(key, "' that is missing in exportPathMap"));
});
mergedQuery = (0, _objectSpread2.default)({}, urlQuery, query);
_context5.next = 5;
return _this2.render(req, res, page, mergedQuery, parsedUrl);
case 5:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
return function fn(_x7, _x8, _x9, _x10) {
return _fn2.apply(this, arguments);
};
}()
});
};
// In development we can't give a default path mapping
for (path in exportPathMap) {
_loop(path);
}
case 11:
return _context6.abrupt("return", routes);
case 12:
case "end":
return _context6.stop();
}
}
}, _callee6, this);
}));
return function generateRoutes() {
return _generateRoutes.apply(this, arguments);
};
}()
}, {
key: "renderToHTML",
value: function () {
var _renderToHTML = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee7(req, res, pathname, query) {
var compilationErr;
return _regenerator.default.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return this.getCompilationError(pathname);
case 2:
compilationErr = _context7.sent;
if (!compilationErr) {
_context7.next = 6;
break;
}
res.statusCode = 500;
return _context7.abrupt("return", this.renderErrorToHTML(compilationErr, req, res, pathname, query));
case 6:
return _context7.abrupt("return", (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "renderToHTML", this).call(this, req, res, pathname, query));
case 7:
case "end":
return _context7.stop();
}
}
}, _callee7, this);
}));
return function renderToHTML(_x11, _x12, _x13, _x14) {
return _renderToHTML.apply(this, arguments);
};
}()
}, {
key: "renderErrorToHTML",
value: function () {
var _renderErrorToHTML = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee8(err, req, res, pathname, query) {
var compilationErr, out;
return _regenerator.default.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
_context8.next = 2;
return this.getCompilationError(pathname);
case 2:
compilationErr = _context8.sent;
if (!compilationErr) {
_context8.next = 6;
break;
}
res.statusCode = 500;
return _context8.abrupt("return", (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "renderErrorToHTML", this).call(this, compilationErr, req, res, pathname, query));
case 6:
_context8.prev = 6;
_context8.next = 9;
return (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "renderErrorToHTML", this).call(this, err, req, res, pathname, query);
case 9:
out = _context8.sent;
return _context8.abrupt("return", out);
case 13:
_context8.prev = 13;
_context8.t0 = _context8["catch"](6);
if (!this.quiet) console.error(_context8.t0);
res.statusCode = 500;
return _context8.abrupt("return", (0, _get2.default)((0, _getPrototypeOf2.default)(DevServer.prototype), "renderErrorToHTML", this).call(this, _context8.t0, req, res, pathname, query));
case 18:
case "end":
return _context8.stop();
}
}
}, _callee8, this, [[6, 13]]);
}));
return function renderErrorToHTML(_x15, _x16, _x17, _x18, _x19) {
return _renderErrorToHTML.apply(this, arguments);
};
}()
}, {
key: "setImmutableAssetCacheControl",
value: function setImmutableAssetCacheControl(res) {
res.setHeader('Cache-Control', 'no-store, must-revalidate');
}
}, {
key: "getCompilationError",
value: function () {
var _getCompilationError = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee9(page) {
var errors;
return _regenerator.default.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
_context9.next = 2;
return this.hotReloader.getCompilationErrors(page);
case 2:
errors = _context9.sent;
if (!(errors.length === 0)) {
_context9.next = 5;
break;
}
return _context9.abrupt("return");
case 5:
return _context9.abrupt("return", errors[0]);
case 6:
case "end":
return _context9.stop();
}
}
}, _callee9, this);
}));
return function getCompilationError(_x20) {
return _getCompilationError.apply(this, arguments);
};
}()
}]);
return DevServer;
}(_nextServer.default);
exports.default = DevServer;