UNPKG

@msfw/cli

Version:

Install the package in your project directory with:

110 lines (109 loc) 4.36 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = serve; const config_1 = require("../lib/config"); const context_1 = require("../lib/context"); const express_1 = __importDefault(require("express")); const compression_1 = __importDefault(require("compression")); const cors_1 = __importDefault(require("cors")); const url_1 = __importDefault(require("url")); const chalk_1 = __importDefault(require("chalk")); const address_1 = require("address"); const default_gateway_1 = __importDefault(require("default-gateway")); const path_1 = __importDefault(require("path")); const fs_extra_1 = __importDefault(require("fs-extra")); const https_1 = __importDefault(require("https")); function formatUrl(protocol, host, port, pathname = '/') { const format = (hostname) => url_1.default.format({ protocol, hostname, port, pathname, }); const pretty = (hostname) => url_1.default.format({ protocol, hostname, port: chalk_1.default.bold(port), pathname, }); const isUnspecifiedHost = host === '0.0.0.0' || host === '::'; let prettyHost, lanUrlForConfig; let lanUrlForTerminal = chalk_1.default.gray('unavailable'); if (isUnspecifiedHost) { prettyHost = 'localhost'; try { // This can only return an IPv4 address const gw4 = default_gateway_1.default.v4.sync(); lanUrlForConfig = (0, address_1.ip)(gw4 && gw4.interface); if (lanUrlForConfig) { // Check if the address is a private ip // https://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces if (/^10[.]|^172[.](1[6-9]|2[0-9]|3[0-1])[.]|^192[.]168[.]/.test(lanUrlForConfig)) { // Address is private, format it for later use lanUrlForTerminal = pretty(lanUrlForConfig); } else { // Address is not private, so we will discard it lanUrlForConfig = undefined; } } } catch (_e) { // ignored } } else { prettyHost = host; lanUrlForConfig = host; lanUrlForTerminal = pretty(lanUrlForConfig); } const localUrlForTerminal = pretty(prettyHost); const localUrlForBrowser = format(prettyHost); return { lanUrlForConfig, lanUrlForTerminal, localUrlForTerminal, localUrlForBrowser, }; } function startLog({ httpsOptions, host, port, publicPath }) { if (publicPath && (publicPath.indexOf('http://') > -1 || publicPath.indexOf('https://') > -1)) { console.log(`- Network: ${chalk_1.default.hex('#3498db')(publicPath)} \n`); } else { const protocol = httpsOptions ? 'https' : 'http'; const realHost = host || '0.0.0.0'; const urls = formatUrl(protocol, realHost, port); console.log(`- Local: ${chalk_1.default.hex('#3498db')(urls.localUrlForTerminal)}`); console.log(`- Network: ${chalk_1.default.hex('#3498db')(urls.lanUrlForTerminal)} \n`); } } async function serve(options) { const msfwContext = (0, context_1.createMsfwContext)(options); const msfwConfig = (0, config_1.loadMsfwConfig)(msfwContext); const app = (0, express_1.default)(); app.use((0, compression_1.default)()); app.use((0, cors_1.default)()); const staticRoot = msfwContext.appBuild; app.use(express_1.default.static(staticRoot)); const html = await fs_extra_1.default.readFile(path_1.default.join(staticRoot, 'index.html'), 'utf8'); app.get('*', (req, res) => res.send(html)); const devServer = msfwConfig.devServer; const { host, port } = devServer; const httpsOptions = devServer.https; const publicPath = msfwContext.appPublic; if (httpsOptions) { const httpsServer = https_1.default.createServer(httpsOptions, app); httpsServer.listen(port, () => { startLog({ httpsOptions, host, port, publicPath }); }); } else { app.listen(port, () => { startLog({ httpsOptions, host, port, publicPath }); }); } }