UNPKG

curated-node

Version:

Not a framework. Not a module. Just a bunch of Node.js packages you most likely familiar with and probably already use, bundled together in a modular fashion.

189 lines 19 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpressKernel = void 0; var normalize_path_1 = __importDefault(require("normalize-path")); var express_1 = __importDefault(require("express")); var cors_1 = __importDefault(require("cors")); var http_1 = require("http"); var _BaseKernel_1 = require("../_BaseKernel"); var ExpressKernel = (function (_super) { __extends(ExpressKernel, _super); function ExpressKernel(config, _expressRouterWrappers, logger) { var _a; var _this = _super.call(this, ExpressKernel, config, logger) || this; _this._expressRouterWrappers = _expressRouterWrappers; _this._expressApp = express_1.default(); _this._httpServer = http_1.createServer(_this._expressApp); if (_this.config.path) { _this.config.path = normalize_path_1.default("/" + _this.config.path); } if (_this.config.cors) { _this._expressApp.use(cors_1.default(Object.assign({ origin: (_a = _this.config.cors) === null || _a === void 0 ? void 0 : _a.allowedOrigins, credentials: true }, _this.config.cors))); } return _this; } ExpressKernel.getMiddleware = function (mw, mwOptions) { switch (mw) { case "bodyparser_json": return express_1.default.json(); case "bodyparser_urlencoded": return express_1.default.urlencoded(Object.assign({ extended: false }, mwOptions)); } }; ExpressKernel.prototype.use = function () { var _a; var _b; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } (_b = this._logger) === null || _b === void 0 ? void 0 : _b.info(args .map(function (arg) { var _a; return "use " + (((_a = arg.prototype) === null || _a === void 0 ? void 0 : _a.constructor.name) || "...") + "(...)"; }) .join(", ")); (_a = this._expressApp).use.apply(_a, args); return this; }; ExpressKernel.prototype.enable = function (setting) { var _a; (_a = this._logger) === null || _a === void 0 ? void 0 : _a.info("enable \"" + setting + "\""); this._expressApp.enable(setting); return this; }; ExpressKernel.prototype.disable = function (setting) { var _a; (_a = this._logger) === null || _a === void 0 ? void 0 : _a.info("disable \"" + setting + "\""); this._expressApp.disable(setting); return this; }; ExpressKernel.prototype.set = function (setting, val) { var _a; (_a = this._logger) === null || _a === void 0 ? void 0 : _a.info("set \"" + setting + "\" = " + val); this._expressApp.set(setting, val); return this; }; ExpressKernel.prototype.boot = function () { var _this = this; var _a; (_a = this._logger) === null || _a === void 0 ? void 0 : _a.info("boot"); return new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () { var _i, _a, expressRouterWrapper; var _this = this; var _b; return __generator(this, function (_c) { try { for (_i = 0, _a = this._expressRouterWrappers; _i < _a.length; _i++) { expressRouterWrapper = _a[_i]; this._expressApp.use(this.config.path, expressRouterWrapper.router); } this._httpServer.listen(this.config.port, this.config.host, function () { var _a; (_a = _this._logger) === null || _a === void 0 ? void 0 : _a.success("HTTP server is listening on " + _this.config.host + ":" + _this.config.port + (_this.config.path ? " at " + _this.config.path : "")); resolve(true); }); } catch (e) { (_b = this._logger) === null || _b === void 0 ? void 0 : _b.error(e.name + ": " + e.message); resolve(false); } return [2]; }); }); }); }; ExpressKernel.prototype.halt = function () { var _this = this; var _a; (_a = this._logger) === null || _a === void 0 ? void 0 : _a.warn("halt"); return new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { if (this.httpServer.listening) { this._httpServer.close(function (err) { var _a; if (err) { (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.error(err.name + ": " + err.message); return resolve(true); } resolve(false); }); } else resolve(false); return [2]; }); }); }); }; Object.defineProperty(ExpressKernel.prototype, "app", { get: function () { return this._expressApp; }, enumerable: false, configurable: true }); Object.defineProperty(ExpressKernel.prototype, "httpServer", { get: function () { return this._httpServer; }, enumerable: false, configurable: true }); return ExpressKernel; }(_BaseKernel_1._BaseKernel)); exports.ExpressKernel = ExpressKernel; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rZXJuZWxzL0V4cHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtFQUEwQztBQUMxQyxvREFBNEQ7QUFDNUQsOENBQXdDO0FBQ3hDLDZCQUF5RDtBQUV6RCw4Q0FBNEM7QUFjNUM7SUFBbUMsaUNBR2xDO0lBSUMsdUJBQ0UsTUFBMkIsRUFDbkIsc0JBQThDLEVBQ3RELE1BQWtCOztRQUhwQixZQUtFLGtCQUFNLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFNBdUJyQztRQTFCUyw0QkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBSXRELEtBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQU8sRUFBRSxDQUFBO1FBQzVCLEtBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQVksQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFJakQsSUFBSSxLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyx3QkFBYSxDQUFDLE1BQUksS0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFNLENBQUMsQ0FBQTtTQUN6RDtRQUVELElBQUksS0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDcEIsS0FBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQ2xCLGNBQUksQ0FDRixNQUFNLENBQUMsTUFBTSxDQUNYO2dCQUNFLE1BQU0sUUFBRSxLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksMENBQUUsY0FBYztnQkFDeEMsV0FBVyxFQUFFLElBQUk7YUFDbEIsRUFDRCxLQUFJLENBQUMsTUFBTSxDQUFDLElBQW1CLENBQ2hDLENBQ0YsQ0FDRixDQUFBO1NBQ0Y7O0lBQ0gsQ0FBQztJQUVhLDJCQUFhLEdBQTNCLFVBQ0UsRUFB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emUtcGF0aFwiXG5pbXBvcnQgZXhwcmVzcywgeyBBcHBsaWNhdGlvbiBhcyBFeHByZXNzQXBwIH0gZnJvbSBcImV4cHJlc3NcIlxuaW1wb3J0IGNvcnMsIHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiY29yc1wiXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIsIFNlcnZlciBhcyBIdHRwU2VydmVyIH0gZnJvbSBcImh0dHBcIlxuaW1wb3J0IHsgTG9nTW9kdWxlLCBMb2dNb2R1bGVDb25maWcgfSBmcm9tIFwiLi4vbW9kdWxlcy9Mb2dcIlxuaW1wb3J0IHsgX0Jhc2VLZXJuZWwgfSBmcm9tIFwiLi4vX0Jhc2VLZXJuZWxcIlxuaW1wb3J0IHsgRXhwcmVzc1JvdXRlcldyYXBwZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9FeHByZXNzUm91dGVyV3JhcHBlclwiXG5cbmV4cG9ydCB0eXBlIEV4cHJlc3NLZXJuZWxDb25maWcgPSB7XG4gIGlkPzogc3RyaW5nXG4gIGxvZ2dlcj86IExvZ01vZHVsZUNvbmZpZ1xuICBob3N0OiBzdHJpbmdcbiAgcG9ydDogbnVtYmVyXG4gIHBhdGg6IHN0cmluZ1xuICBjb3JzPzoge1xuICAgIGFsbG93ZWRPcmlnaW5zOiBzdHJpbmdbXVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzS2VybmVsIGV4dGVuZHMgX0Jhc2VLZXJuZWw8XG4gIEV4cHJlc3NLZXJuZWwsXG4gIEV4cHJlc3NLZXJuZWxDb25maWdcbj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9leHByZXNzQXBwOiBFeHByZXNzQXBwXG4gIHByaXZhdGUgcmVhZG9ubHkgX2h0dHBTZXJ2ZXI6IEh0dHBTZXJ2ZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IEV4cHJlc3NLZXJuZWxDb25maWcsXG4gICAgcHJpdmF0ZSBfZXhwcmVzc1JvdXRlcldyYXBwZXJzOiBFeHByZXNzUm91dGVyV3JhcHBlcltdLFxuICAgIGxvZ2dlcj86IExvZ01vZHVsZVxuICApIHtcbiAgICBzdXBlcihFeHByZXNzS2VybmVsLCBjb25maWcsIGxvZ2dlcilcbiAgICB0aGlzLl9leHByZXNzQXBwID0gZXhwcmVzcygpXG4gICAgdGhpcy5faHR0cFNlcnZlciA9IGNyZWF0ZVNlcnZlcih0aGlzLl9leHByZXNzQXBwKVxuXG4gICAgLy8gaWYgcGF0aCBkb2Vzbid0IGJlZ2luIHdpdGggYSBcIi9cIiwgU29ja2V0SU8gbWlzYmVoYXZlc1xuICAgIC8vIHRoaXMgZml4ZXMgdGhhdFxuICAgIGlmICh0aGlzLmNvbmZpZy5wYXRoKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wYXRoID0gbm9ybWFsaXplUGF0aChgLyR7dGhpcy5jb25maWcucGF0aH1gKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5jb3JzKSB7XG4gICAgICB0aGlzLl9leHByZXNzQXBwLnVzZShcbiAgICAgICAgY29ycyhcbiAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcmlnaW46IHRoaXMuY29uZmlnLmNvcnM/LmFsbG93ZWRPcmlnaW5zLFxuICAgICAgICAgICAgICBjcmVkZW50aWFsczogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNvcnMgYXMgQ29yc09wdGlvbnNcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldE1pZGRsZXdhcmUoXG4gICAgbXc6IFwiYm9keXBhcnNlcl9qc29uXCIgfCBcImJvZHlwYXJzZXJfdXJsZW5jb2RlZFwiLFxuICAgIG13T3B0aW9ucz86IGFueVxuICApIHtcbiAgICBzd2l0Y2ggKG13KSB7XG4gICAgICBjYXNlIFwiYm9keXBhcnNlcl9qc29uXCI6XG4gICAgICAgIHJldHVybiBleHByZXNzLmpzb24oKVxuICAgICAgY2FzZSBcImJvZHlwYXJzZXJfdXJsZW5jb2RlZFwiOlxuICAgICAgICByZXR1cm4gZXhwcmVzcy51cmxlbmNvZGVkKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV4dGVuZGVkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG13T3B0aW9uc1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1c2UoLi4uYXJnczogYW55W10pIHtcbiAgICB0aGlzLl9sb2dnZXI/LmluZm8oXG4gICAgICBhcmdzXG4gICAgICAgIC5tYXAoKGFyZykgPT4gYHVzZSAke2FyZy5wcm90b3R5cGU/LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCIuLi5cIn0oLi4uKWApXG4gICAgICAgIC5qb2luKFwiLCBcIilcbiAgICApXG4gICAgdGhpcy5fZXhwcmVzc0FwcC51c2UoLi4uYXJncylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShzZXR0aW5nOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXI/LmluZm8oYGVuYWJsZSBcIiR7c2V0dGluZ31cImApXG4gICAgdGhpcy5fZXhwcmVzc0FwcC5lbmFibGUoc2V0dGluZylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIGRpc2FibGUoc2V0dGluZzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyPy5pbmZvKGBkaXNhYmxlIFwiJHtzZXR0aW5nfVwiYClcbiAgICB0aGlzLl9leHByZXNzQXBwLmRpc2FibGUoc2V0dGluZylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIHNldChzZXR0aW5nOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdGhpcy5fbG9nZ2VyPy5pbmZvKGBzZXQgXCIke3NldHRpbmd9XCIgPSAke3ZhbH1gKVxuICAgIHRoaXMuX2V4cHJlc3NBcHAuc2V0KHNldHRpbmcsIHZhbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIGJvb3QoKSB7XG4gICAgdGhpcy5fbG9nZ2VyPy5pbmZvKFwiYm9vdFwiKVxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzUm91dGVyV3JhcHBlciBvZiB0aGlzLl9leHByZXNzUm91dGVyV3JhcHBlcnMpIHtcbiAgICAgICAgICB0aGlzLl9leHByZXNzQXBwLnVzZSh0aGlzLmNvbmZpZy5wYXRoLCBleHByZXNzUm91dGVyV3JhcHBlci5yb3V0ZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9odHRwU2VydmVyLmxpc3Rlbih0aGlzLmNvbmZpZy5wb3J0LCB0aGlzLmNvbmZpZy5ob3N0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyPy5zdWNjZXNzKFxuICAgICAgICAgICAgYEhUVFAgc2VydmVyIGlzIGxpc3RlbmluZyBvbiAke3RoaXMuY29uZmlnLmhvc3R9OiR7XG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnBvcnRcbiAgICAgICAgICAgIH0ke3RoaXMuY29uZmlnLnBhdGggPyBgIGF0ICR7dGhpcy5jb25maWcucGF0aH1gIDogXCJcIn1gXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLl9sb2dnZXI/LmVycm9yKGAke2UubmFtZX06ICR7ZS5tZXNzYWdlfWApXG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBoYWx0KCkge1xuICAgIHRoaXMuX2xvZ2dlcj8ud2FybihcImhhbHRcIilcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLmh0dHBTZXJ2ZXIubGlzdGVuaW5nKSB7XG4gICAgICAgIHRoaXMuX2h0dHBTZXJ2ZXIuY2xvc2UoKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyPy5lcnJvcihgJHtlcnIubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSByZXNvbHZlKGZhbHNlKVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwcmVzc0FwcFxuICB9XG5cbiAgcHVibGljIGdldCBodHRwU2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9odHRwU2VydmVyXG4gIH1cbn1cbiJdfQ==