@msfw/cli
Version:
Install the package in your project directory with:
110 lines (109 loc) • 4.36 kB
JavaScript
;
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 });
});
}
}