@ima/cli
Version:
IMA.js CLI tool to build, develop and work with IMA.js applications.
94 lines (93 loc) • 4.12 kB
JavaScript
;
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);
});
});
}