koa-webpack
Version:
Development and Hot Reload Middleware for Koa2
187 lines (137 loc) • 5.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _webpack = require('webpack');
var _webpack2 = _interopRequireDefault(_webpack);
var _webpackDevMiddleware = require('webpack-dev-middleware');
var _webpackDevMiddleware2 = _interopRequireDefault(_webpackDevMiddleware);
var _webpackHotMiddleware = require('webpack-hot-middleware');
var _webpackHotMiddleware2 = _interopRequireDefault(_webpackHotMiddleware);
var _stream = require('stream');
var _koaCompose = require('koa-compose');
var _koaCompose2 = _interopRequireDefault(_koaCompose);
var _appRootPath = require('app-root-path');
var _appRootPath2 = _interopRequireDefault(_appRootPath);
var _path = require('path');
var path = _interopRequireWildcard(_path);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @method koaDevware
* @desc Middleware for Koa to proxy webpack-dev-middleware
**/
function koaDevware(compiler, options) {
var _this = this;
var dev = (0, _webpackDevMiddleware2.default)(compiler, options);
/**
* @method waitMiddleware
* @desc Provides blocking for the Webpack processes to complete.
**/
function waitMiddleware() {
return new _promise2.default(function (resolve, reject) {
dev.waitUntilValid(function () {
resolve(true);
});
compiler.plugin('failed', function (error) {
reject(error);
});
});
}
return function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(context, next) {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return waitMiddleware();
case 2:
_context.next = 4;
return dev(context.req, {
end: function end(content) {
context.body = content;
},
setHeader: context.set.bind(context)
}, next);
case 4:
case 'end':
return _context.stop();
}
}
}, _callee, _this);
}));
return function (_x, _x2) {
return _ref.apply(this, arguments);
};
}();
}
/**
* @method koaHotware
* @desc Middleware for Koa to proxy webpack-hot-middleware
**/
function koaHotware(compiler, options) {
var _this2 = this;
var hot = (0, _webpackHotMiddleware2.default)(compiler, options);
return function () {
var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(context, next) {
var stream;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
stream = new _stream.PassThrough();
context.body = stream;
_context2.next = 4;
return hot(context.req, {
write: stream.write.bind(stream),
writeHead: function writeHead(state, headers) {
context.state = state;
context.set(headers);
}
}, next);
case 4:
case 'end':
return _context2.stop();
}
}
}, _callee2, _this2);
}));
return function (_x3, _x4) {
return _ref2.apply(this, arguments);
};
}();
}
/**
* The entry point for the Koa middleware.
**/
function fn(options) {
var defaults = { dev: {}, hot: {} };
options = (0, _assign2.default)(defaults, options);
var config = options.config,
compiler = options.compiler;
if (!compiler) {
if (!config) {
config = require(path.join(_appRootPath2.default.path, 'webpack.config.js'));
}
compiler = (0, _webpack2.default)(config);
}
if (!options.dev.publicPath) {
var publicPath = compiler.options.output.publicPath;
if (!publicPath) {
throw new Error('koa-webpack: publicPath must be set on `dev` options, or in a compiler\'s `output` configuration.');
}
options.dev.publicPath = publicPath;
}
return (0, _koaCompose2.default)([koaDevware(compiler, options.dev), koaHotware(compiler, options.hot)]);
};
exports.default = (0, _assign2.default)(fn, { devMiddleware: _webpackDevMiddleware2.default, hotMiddleware: _webpackHotMiddleware2.default });
module.exports = exports['default'];