sbg-server
Version:
static-blog-generator server workspace
219 lines • 9.84 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SBGServer = void 0;
var cookie_parser_1 = __importDefault(require("cookie-parser"));
var cors_1 = __importDefault(require("cors"));
var express_1 = __importDefault(require("express"));
// import findWorkspaceRoot from 'find-yarn-workspace-root';
var dotenv_1 = __importDefault(require("dotenv"));
var express_session_1 = __importDefault(require("express-session"));
var fs_extra_1 = __importDefault(require("fs-extra"));
var http_1 = __importDefault(require("http"));
var nunjucks_1 = __importDefault(require("nunjucks"));
var apis = __importStar(require("sbg-api"));
var sbg_utility_1 = require("sbg-utility");
var upath_1 = __importDefault(require("upath"));
var config_1 = __importDefault(require("./config"));
var nunjucks_2 = __importDefault(require("./helper/nunjucks"));
var session_file_store_1 = require("./middleware/session-file-store");
var post_1 = __importDefault(require("./post"));
var FileStore = (0, session_file_store_1.sessionFileStore)(express_session_1.default);
var fileStoreOptions = {
logFn: (0, sbg_utility_1.debug)('sbg-server').extend('session')
};
var SBGServer = /** @class */ (function () {
function SBGServer(options) {
var _this = this;
this.cache = true;
/**
* get the configured server
* @returns express server instance
*/
this.get = function () { return _this.server; };
// update config
config_1.default.update(options || {});
// use cache
if (options.cache)
this.cache = options.cache;
// get updated config
this.config = config_1.default.get();
// search .env
var dotenvPath = upath_1.default.join(this.config.root, '.env');
if (fs_extra_1.default.existsSync(dotenvPath))
dotenv_1.default.config({ path: dotenvPath });
// start api
this.api = new apis.Application(this.config.root);
}
SBGServer.prototype.startExpress = function () {
var _this = this;
var self = this;
// init express
this.server = (0, express_1.default)();
(0, sbg_utility_1.debug)('sbg-server').extend('views')(upath_1.default.join(__dirname, 'views'));
// set views
this.server.set('views', [upath_1.default.join(__dirname, 'views')]);
// init nunjuck environment
this.env = nunjucks_1.default.configure(upath_1.default.join(__dirname, 'views'), {
// make sure cache is false
noCache: !this.cache,
autoescape: true,
express: this.server,
web: {
// make sure cache is true
useCache: this.cache,
async: true
}
});
(0, nunjucks_2.default)(this.env);
// init default middleware
fileStoreOptions.path = upath_1.default.join(this.api.cwd, 'tmp/sbg-server/sessions');
this.server.use((0, express_session_1.default)({
store: new FileStore(fileStoreOptions),
secret: 'sbg-server-session',
resave: true,
saveUninitialized: true,
genid: function (_req) {
if (typeof process.env.SESSION_ID === 'string') {
return process.env.SESSION_ID;
}
return String(Math.random());
}
}));
this.server.use((0, cors_1.default)());
this.server.use(express_1.default.urlencoded({ extended: true, limit: '50mb' }));
this.server.use(express_1.default.json({ limit: '50mb' }));
this.server.use((0, cookie_parser_1.default)());
//this.server.use(favicon(__dirname + '/public/images/nodejs.webp'));
(0, sbg_utility_1.debug)('sbg-server').extend('middleware')('redirect all trailing slashes');
// https://stackoverflow.com/questions/13442377/redirect-all-trailing-slashes-globally-in-express
this.server.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
//res.header('Access-Control-Allow-Credentials', true);
// set no cache for local development from server.runner.ts
if (_this.cache) {
_this.server.set('etag', false);
res.set('Cache-Control', 'no-store');
}
if (req.path.substring(-1) === '/' && req.path.length > 1) {
var query = req.url.slice(req.path.length);
var safepath = req.path.slice(0, -1).replace(/\/+/g, '/');
var location_1 = safepath + query;
res.setHeader('location', location_1);
res.redirect(301, location_1);
}
else {
next();
}
});
// init default express static
// const workspaceRoot = findWorkspaceRoot(process.cwd());
var statics = [
upath_1.default.join(__dirname, 'public'),
// path.join(__dirname, '/../node_modules'),
// project node_modules
upath_1.default.join(this.config.root, 'node_modules'),
// static generated site
// path.join(this.config.root, this.api.config.public_dir),
// static source post when not yet generated at source dir
upath_1.default.join(this.config.root, this.api.config.post_dir),
// static source dir such as images etc
upath_1.default.join(this.config.root, this.api.config.source_dir)
// path.join(__dirname, '/../../../node_modules'),
// resolve workspace node_modules
// path.join(workspaceRoot, 'node_modules')
]
.filter(fs_extra_1.default.existsSync)
.map(function (p) {
return upath_1.default.resolve(p);
});
/*.filter(function (elem, index, self) {
return index === self.indexOf(elem);
});*/
for (var i = 0; i < statics.length; i++) {
var p = statics[i];
(0, sbg_utility_1.debug)('sbg-server').extend('static')(p);
this.server.use(express_1.default.static(p));
this.server.use(this.api.config.root, express_1.default.static(p));
}
// register router
// index page
this.server.get('/', function (_, res) {
res.render('index.njk', self.renderData({ title: 'Static Blog Generator Manager' }));
});
var router = express_1.default.Router();
(0, sbg_utility_1.debug)('sbg-server').extend('middleware')('register /post');
router.use('/post', post_1.default.bind(this)(this.api));
this.server.use(router);
return this.server;
};
SBGServer.prototype.renderData = function (assign) {
var api = this.api;
var self = this;
return Object.assign(assign, {
config: api.config,
configserver: self.config
});
};
/**
* start server
*/
SBGServer.prototype.start = function (customServer) {
(0, sbg_utility_1.debug)('sbg-server').extend('cwd')(this.config.root);
(0, sbg_utility_1.debug)('sbg-server').extend('port')(this.config.port);
var httpserver = http_1.default
.createServer(customServer || this.startExpress())
.listen(this.config.port);
process.on('SIGTERM', function () {
(0, sbg_utility_1.debug)('sbg-server').extend('exit')('SIGTERM signal received: closing HTTP server');
httpserver.close(function () {
(0, sbg_utility_1.debug)('sbg-server').extend('exit')('HTTP server closed');
});
});
console.log('server listening at http://localhost:' + this.config.port);
return httpserver;
};
SBGServer.prototype.start2 = function () {
(0, sbg_utility_1.debug)('sbg-server').extend('cwd')(this.config.root);
(0, sbg_utility_1.debug)('sbg-server').extend('port')(this.config.port);
var httpserver = http_1.default
.createServer(this.startExpress())
.listen(this.config.port);
console.log('server listening at http://localhost:' + this.config.port);
return httpserver;
};
SBGServer.prototype.__dump = function () {
(0, sbg_utility_1.debug)('sbg-server').extend('cwd')(this.config.root);
(0, sbg_utility_1.debug)('sbg-server').extend('port')(this.config.port);
console.log(this.startExpress());
};
return SBGServer;
}());
exports.SBGServer = SBGServer;
exports.default = SBGServer;
//# sourceMappingURL=server.js.map