UNPKG

@ima/cli

Version:

IMA.js CLI tool to build, develop and work with IMA.js applications.

94 lines (93 loc) 4.12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDevServer = createDevServer; const path_1 = __importDefault(require("path")); const server_1 = require("@ima/server"); const express_1 = __importDefault(require("express")); const express_static_gzip_1 = __importDefault(require("express-static-gzip")); const webpack_dev_middleware_1 = __importDefault(require("webpack-dev-middleware")); const webpack_hot_middleware_1 = __importDefault(require("webpack-hot-middleware")); const internalSourceMiddleware_1 = require("./internalSourceMiddleware"); const openEditorMiddleware_1 = require("./openEditorMiddleware"); const WRITE_TO_DISK_WHITELIST = /(runner\.js|manifest\.json|favicon\.ico)$/i; async function createDevServer({ args, config, compiler, hostname, port, rootDir, environment, }) { return new Promise((resolve, reject) => { if (!compiler) { return reject(); } const app = (0, express_1.default)(); const isVerbose = process.argv.some(arg => arg.includes('--verbose')); const staticDir = path_1.default.join(path_1.default.dirname(require.resolve('@ima/error-overlay')), '..'); const { getProtocol } = (0, server_1.urlParserFactory)({ environment, applicationFolder: args.rootDir, }); /** * Helper to retrieve server origin used for CORS definition. */ function getOrigin(req) { if (config.devServer?.origin) { return config.devServer.origin; } return `${getProtocol(req)}//localhost:${environment.$Server.port}`; } app // CORS .use((req, res, next) => { res.header('Access-Control-Allow-Origin', getOrigin(req)); res.header('Access-Control-Allow-Headers', 'OPTIONS, GET'); next(); }) // Serve brotli version primary .use('/__error-overlay-static', (0, express_static_gzip_1.default)(staticDir, { enableBrotli: true, index: false, orderPreference: ['br'], serveStatic: { maxAge: '14d', }, })) // Non-zipped compressed version fallback .use('/__error-overlay-static', express_1.default.static(path_1.default.join(staticDir), { maxAge: '14d' })) .use((0, webpack_dev_middleware_1.default)(compiler, { index: false, publicPath: process.env.IMA_PUBLIC_PATH ?? config.publicPath, headers: (req, res) => { res.header('Access-Control-Allow-Origin', getOrigin(req)); res.header('Access-Control-Allow-Headers', 'OPTIONS, GET'); }, writeToDisk: args.writeToDisk ? () => true : filePath => (WRITE_TO_DISK_WHITELIST.test(filePath) || config.devServer?.writeToDiskFilter?.(filePath)) ?? false, ...(isVerbose ? undefined : { stats: 'none' }), serverSideRender: false, })) .use((0, webpack_hot_middleware_1.default)(compiler, { ...(isVerbose ? undefined : { quiet: true, log: () => { } }), path: '/__webpack_hmr', heartbeat: 1500, })) .use('/__get-internal-source', (0, internalSourceMiddleware_1.internalSourceMiddleware)(rootDir)) .use('/__open-editor', (0, openEditorMiddleware_1.openEditorMiddleware)()) .use((err, req, res, next) => { if (res.headersSent) { return next(err); } res.status(500).json({ status: 'Something is wrong with the @ima/cli/devServer', error: err, }); }) .listen(port, hostname, () => { resolve(); }) .on('error', error => { reject(error); }); }); }