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
JavaScript
"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==