shaman-website-compiler
Version:
Compile raw HTML, CSS and Javascript into the smallest possible, SEO friendly website.
119 lines • 5.78 kB
JavaScript
;
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