simplr-gulp
Version:
Fully functional gulpfile.js implementation. Tailored for Single Page Application. Written in TypeScript.
109 lines (108 loc) • 4.77 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const express = require("express");
const http = require("http");
const logger_1 = require("./utils/logger");
const configuration_1 = require("./configuration/configuration");
const child_process_1 = require("child_process");
const path = require("path");
const connectLiveReload = require("connect-livereload");
const tinyLr = require("tiny-lr");
const actions_emitter_1 = require("./utils/actions-emitter");
const live_reload_actions_1 = require("./actions/live-reload/live-reload-actions");
class Server {
constructor() {
this.server = express();
this.liveReloadServer = tinyLr({});
this.actionsListeners = new Array();
this.onReloadFilesList = (action) => {
this.reloadFiles(action.FilesNames.join(","));
};
this.onReloadPage = (action) => {
this.reloadFiles("index.html");
};
this.onRequest = (req, res) => {
let { Build } = configuration_1.Configuration.GulpConfig.Directories;
res.sendFile('index.html', { root: Build });
};
this.onClose = () => {
logger_1.LoggerInstance.info(`Server closed.`);
this.removeActionsListeners();
};
this.onError = (err) => {
if (err.code === 'EADDRINUSE') {
logger_1.LoggerInstance.error(`Port ${configuration_1.Configuration.GulpConfig.ServerConfig.Port} already in use.`);
this.Listener.close();
}
else {
logger_1.LoggerInstance.error(`Exeption not handled. Please create issues with error code "${err.code}" here: https://github.com/QuatroCode/simplr-gulp/issues \n`, err);
}
};
let { ServerConfig, Directories } = configuration_1.Configuration.GulpConfig;
let serverUrl = `http://${ServerConfig.Ip}:${ServerConfig.Port}`;
this.configureServer(Directories.Build);
this.startListeners(ServerConfig.Port, ServerConfig.LiveReloadPort);
this.addEventListeners();
this.openBrowser(serverUrl);
logger_1.LoggerInstance.info(`Server started at '${serverUrl}'`);
this.addActionsListeners();
}
get isQuiet() {
return (process.argv.findIndex(x => x === "--quiet") !== -1 || process.argv.findIndex(x => x === "-Q") !== -1);
}
addActionsListeners() {
this.actionsListeners.push(actions_emitter_1.Emitter.addListener(live_reload_actions_1.ReloadFiles, this.onReloadFilesList));
this.actionsListeners.push(actions_emitter_1.Emitter.addListener(live_reload_actions_1.ReloadPage, this.onReloadPage));
}
removeActionsListeners() {
this.actionsListeners.forEach(x => { x.remove(); });
this.actionsListeners = new Array();
}
reloadFiles(files) {
http.get({
hostname: configuration_1.Configuration.GulpConfig.ServerConfig.Ip,
port: configuration_1.Configuration.GulpConfig.ServerConfig.LiveReloadPort,
path: `/changed?files=${files}`,
agent: false
});
}
configureServer(wwwroot) {
this.server.use(connectLiveReload({ port: configuration_1.Configuration.GulpConfig.ServerConfig.LiveReloadPort }));
this.server.use(express.static(wwwroot));
}
startListeners(serverPort, liveReloadServerPort) {
this.Listener = this.server.listen(serverPort);
this.liveReloadServer.listen(liveReloadServerPort);
}
openBrowser(serverUrl) {
if (!this.isQuiet) {
let opener = '';
switch (process.platform) {
case 'darwin':
opener = 'open';
break;
case 'win32':
opener = 'start ""';
break;
default:
opener = path.join(__dirname, '../vendor/xdg-open');
break;
}
if (process.env.SUDO_USER) {
opener = `sudo -u ${process.env.SUDO_USER} ${opener}`;
}
try {
child_process_1.exec(`${opener} "${serverUrl}"`);
}
catch (error) {
logger_1.LoggerInstance.error("Error with openBrowser.", error);
logger_1.LoggerInstance.info("Please create new issue here: https://github.com/quatrocode/simplr-gulp/issues");
}
}
}
addEventListeners() {
this.Listener.once("close", this.onClose);
this.Listener.once('error', this.onError);
this.server.all('/*', this.onRequest);
}
}
exports.Server = Server;