UNPKG

@bolt/build-tools

Version:

Curated collection of front-end build tools in the Bolt Design System.

94 lines (79 loc) 2.61 kB
const fs = require('fs'); const path = require('path'); const ejs = require('ejs'); const webpack = require('webpack'); const timer = require('@bolt/build-utils/timer'); const data = { webpackVersion: webpack.version, webpackDevServerVersion: '2.4.1', progress: [[0]], }; /** * @typedef {object} WebpackDevServerWaitpageOptions * @property title {string} * @property theme {string} * @property template {string} * @property disableWhenValid {boolean} */ /** @type {WebpackDevServerWaitpageOptions} */ const defaultOptions = { title: 'Bolt Dev Server', theme: 'bolt', disableWhenValid: true, }; /** * webpack-dev-server-waitpage middleware factory * @param server {Server} The server argument passed to webpack-dev-server's 'before' function * @param [options] {WebpackDevServerWaitpageOptions} An optional object of options (see Readme for more information) * @returns {Function} Koa compatible middleware */ const webpackDevServerWaitpage = (server, options) => { const startTime = timer.start(); if (!server) throw new Error( `webpack-dev-server's compilers argument must be supplied as first parameter.`, ); /** @type {WebpackDevServerWaitpageOptions} */ options = Object.assign({}, defaultOptions, options); const compilers = server.compilers; // || [server.middleware.context.compiler]; for (let i = 0; i < compilers.length; i++) { new webpack.ProgressPlugin(function() { data.progress[i] = arguments; }).apply(compilers[i]); } let template = options.template; if (!template) { if ( fs .readdirSync(__dirname) .filter(x => x.endsWith('.ejs')) .map(x => x.slice(0, -4)) .indexOf(options.theme) < 0 ) throw new Error(`Unknown theme provided: ${options.theme}`); template = fs.readFileSync( path.resolve(__dirname, options.theme + '.ejs'), 'utf8', ); } // eslint-disable-next-line no-return-assign Object.keys(options).forEach(key => (data[key] = options[key])); // expend data with options let wasValid = false; return async (req, res, next) => { const valid = data.progress.every(p => p[0] === 1); wasValid = wasValid || valid; data.duration = timer.end(startTime, false); if ( valid || // already valid (options.disableWhenValid && wasValid) || // if after valid state should be disabled req.method !== 'GET' ) { return await next(); } else { res.setHeader('Content-Type', 'text/html'); res.end(ejs.render(template, data)); } }; }; module.exports = webpackDevServerWaitpage;