UNPKG

shaman-website-compiler

Version:

Compile raw HTML, CSS and Javascript into the smallest possible, SEO friendly website.

119 lines 5.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Website = void 0; var _fsx = require("fs-extra"); var _path = require("path"); var _upath = require("upath"); var _gaze = require("gaze"); var app_composition_1 = require("./composition/app.composition"); var logger_1 = require("./logger"); var file_functions_1 = require("./functions/file.functions"); var Website = /** @class */ (function () { function Website() { var _this = this; this.gaze = _gaze; this.build = function (render) { if (render === void 0) { render = false; } var pretask = render ? _this.reloadHtmlPages() : Promise.resolve(); return pretask .then(function (_) { return _this.compiler.compile(); }) .then(_this.outputFiles) .then(_this.startServer) .then(function (routes) { _this.routes = routes; _this.watchFiles(); return routes; }); }; this.outputFiles = function (routes, skipAssets) { if (skipAssets === void 0) { skipAssets = false; } if (!_this.config.output) return Promise.resolve(routes); var operations = routes.map(function (route) { var path = _path.join(_this.config.output, route.path); var extension = (0, file_functions_1.GetFileExtension)(path); if (extension == '' && route.extension == 'html') path = "".concat(path, ".html"); return _fsx.ensureFile(path).then(function (_) { return _fsx.outputFile(path, route.content); }); }); var assets = _this.context.models.assets.filter(function (a) { return !!a; }); if (!skipAssets) { operations = operations.concat(assets.map(function (asset) { var path = _path.join(_this.config.output, asset.name); return _fsx.copy(asset.path, path); })); } return Promise.all(operations).then(function (_) { return (routes); }); }; this.startServer = function (routes) { if (!_this.config.serve) return Promise.resolve(routes); if (_this.server.listening) return Promise.resolve(routes); _this.server.start(routes); return Promise.resolve(routes); }; this.watchFiles = function () { if (!_this.config.serve) return; var watchlist = _this.context.models.files.filter(function (f) { return !!f; }).map(function (f) { return f.path; }); _this.gaze(watchlist, function (ex, watcher) { if (ex) { _this.logger.log("Error starting file watcher: ".concat(ex.message), logger_1.LogLevels.error); return; } watcher.on('changed', _this.fileChanged); }); }; this.fileChanged = function (path) { path = _upath.resolve(path); var fileName = path.replace(_upath.resolve(_this.config.root), "").slice(1); _this.logger.log("File change detected: ".concat(fileName), logger_1.LogLevels.info); _this.context.models.files.update(fileName, function (f) { f.available = false; return f; }); var file = _this.context.models.files.find(fileName); setTimeout(function () { return _this.eventService.publish('file-added', file); }); return _this.context.saveChanges() .then(_this.compiler.compile) .then(function (routes) { return _this.outputFiles(routes, true); }) .then(function (routes) { _this.routes = routes; _this.server.updateRoutes(routes); _this.logger.log("File updated: ".concat(fileName), logger_1.LogLevels.info); }); }; this.getFileData = function (path) { path = _upath.resolve(path); var fileName = path.replace(_upath.resolve(_this.config.root), "").slice(1); return _this.context.models.files.find(fileName); }; this.getBundleData = function (name) { return _this.context.models.bundles.find(name); }; this.reloadHtmlPages = function () { _this.logger.log("Website rebuild requested.", logger_1.LogLevels.info); var pages = _this.context.models.files.filter(function (f) { return f.extension == 'html'; }); pages.forEach(function (page) { _this.eventService.publish('file-added', page); _this.context.models.files.update(page.name, function (f) { f.available = false; return f; }); }); return _this.context.saveChanges(); }; this._config = app_composition_1.IoC.get(app_composition_1.TYPES.WebsiteConfig); this.compiler = app_composition_1.IoC.get(app_composition_1.TYPES.WebsiteCompiler); this.server = app_composition_1.IoC.get(app_composition_1.TYPES.WebsiteServer); this.context = app_composition_1.IoC.get(app_composition_1.TYPES.CompilerDataContext); this.eventService = app_composition_1.IoC.get(app_composition_1.TYPES.CompilerEvents); this.logger = app_composition_1.IoC.get(app_composition_1.TYPES.Logger); } Object.defineProperty(Website.prototype, "config", { get: function () { return this._config; }, enumerable: false, configurable: true }); return Website; }()); exports.Website = Website; //# sourceMappingURL=website.js.map