123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = wrapper;
- var _path = _interopRequireDefault(require("path"));
- var _mimeTypes = _interopRequireDefault(require("mime-types"));
- var _getFilenameFromUrl = _interopRequireDefault(require("./utils/getFilenameFromUrl"));
- var _handleRangeHeaders = _interopRequireDefault(require("./utils/handleRangeHeaders"));
- var _ready = _interopRequireDefault(require("./utils/ready"));
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- function wrapper(context) {
- return async function middleware(req, res, next) {
- const acceptedMethods = context.options.methods || ["GET", "HEAD"]; // fixes #282. credit @cexoso. in certain edge situations res.locals is undefined.
- // eslint-disable-next-line no-param-reassign
- res.locals = res.locals || {};
- if (!acceptedMethods.includes(req.method)) {
- await goNext();
- return;
- }
- (0, _ready.default)(context, processRequest, req);
- async function goNext() {
- if (!context.options.serverSideRender) {
- return next();
- }
- return new Promise(resolve => {
- (0, _ready.default)(context, () => {
- // eslint-disable-next-line no-param-reassign
- res.locals.webpack = {
- devMiddleware: context
- };
- resolve(next());
- }, req);
- });
- }
- async function processRequest() {
- const filename = (0, _getFilenameFromUrl.default)(context, req.url);
- let {
- headers
- } = context.options;
- if (typeof headers === "function") {
- headers = headers(req, res, context);
- }
- let content;
- if (!filename) {
- await goNext();
- return;
- }
- try {
- content = context.outputFileSystem.readFileSync(filename);
- } catch (_ignoreError) {
- await goNext();
- return;
- }
- const contentTypeHeader = res.get ? res.get("Content-Type") : res.getHeader("Content-Type");
- if (!contentTypeHeader) {
- // content-type name(like application/javascript; charset=utf-8) or false
- const contentType = _mimeTypes.default.contentType(_path.default.extname(filename)); // Only set content-type header if media type is known
- // https://tools.ietf.org/html/rfc7231#section-3.1.1.5
- if (contentType) {
- // Express API
- if (res.set) {
- res.set("Content-Type", contentType);
- } // Node.js API
- else {
- res.setHeader("Content-Type", contentType);
- }
- }
- }
- if (headers) {
- const names = Object.keys(headers);
- for (const name of names) {
- // Express API
- if (res.set) {
- res.set(name, headers[name]);
- } // Node.js API
- else {
- res.setHeader(name, headers[name]);
- }
- }
- } // Buffer
- content = (0, _handleRangeHeaders.default)(context, content, req, res); // Express API
- if (res.send) {
- res.send(content);
- } // Node.js API
- else {
- res.setHeader("Content-Length", content.length);
- if (req.method === "HEAD") {
- res.end();
- } else {
- res.end(content);
- }
- }
- }
- };
- }
|