12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- var mime = require("mime");
- var getFilenameFromUrl = require("./lib/GetFilenameFromUrl");
- var Shared = require("./lib/Shared");
- var pathJoin = require("./lib/PathJoin");
- // constructor for the middleware
- module.exports = function(compiler, options) {
- var context = {
- state: false,
- webpackStats: undefined,
- callbacks: [],
- options: options,
- compiler: compiler,
- watching: undefined,
- forceRebuild: false
- };
- var shared = Shared(context);
- // The middleware function
- function webpackDevMiddleware(req, res, next) {
- function goNext() {
- if(!context.options.serverSideRender) return next();
- shared.ready(function() {
- res.locals.webpackStats = context.webpackStats;
- next();
- }, req);
- }
- if(req.method !== "GET") {
- return goNext();
- }
- var filename = getFilenameFromUrl(context.options.publicPath, context.compiler.outputPath, req.url);
- if(filename === false) return goNext();
- shared.handleRequest(filename, processRequest, req);
- function processRequest() {
- try {
- var stat = context.fs.statSync(filename);
- if(!stat.isFile()) {
- if(stat.isDirectory()) {
- filename = pathJoin(filename, context.options.index || "index.html");
- stat = context.fs.statSync(filename);
- if(!stat.isFile()) throw "next";
- } else {
- throw "next";
- }
- }
- } catch(e) {
- return goNext();
- }
- // server content
- var content = context.fs.readFileSync(filename);
- content = shared.handleRangeHeaders(content, req, res);
- res.setHeader("Access-Control-Allow-Origin", "*"); // To support XHR, etc.
- res.setHeader("Content-Type", mime.lookup(filename) + "; charset=UTF-8");
- res.setHeader("Content-Length", content.length);
- if(context.options.headers) {
- for(var name in context.options.headers) {
- res.setHeader(name, context.options.headers[name]);
- }
- }
- // Express automatically sets the statusCode to 200, but not all servers do (Koa).
- res.statusCode = res.statusCode || 200;
- if(res.send) res.send(content);
- else res.end(content);
- }
- }
- webpackDevMiddleware.getFilenameFromUrl = getFilenameFromUrl.bind(this, context.options.publicPath, context.compiler.outputPath);
- webpackDevMiddleware.waitUntilValid = shared.waitUntilValid;
- webpackDevMiddleware.invalidate = shared.invalidate;
- webpackDevMiddleware.close = shared.close;
- webpackDevMiddleware.fileSystem = context.fs;
- return webpackDevMiddleware;
- };
|