lynx-framework
Version:
lynx is a NodeJS framework for Web Development, based on decorators and the async/await support.
242 lines (240 loc) • 17.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigBuilder = void 0;
var user_entity_1 = require("./entities/user.entity");
var mail_client_1 = require("./mail-client");
var ufs_1 = require("./ufs");
var ConfigBuilder = /** @class */ (function () {
/**
* Create a new configuration builder
* @param basePath the current base path of the application
* @param legacyMode enable or disable the legacy mode (default: true)
*/
function ConfigBuilder(basePath, legacyMode) {
if (legacyMode === void 0) { legacyMode = true; }
this.config = {
disabledDb: false,
disabledGraphQL: false,
db: {
type: 'mysql',
host: 'localhost',
port: 8889,
username: 'root',
password: 'root',
database: 'koa_typescript2',
entities: [basePath + '/entities/*.entity.js'],
synchronize: true,
logging: false,
},
publicFolders: [basePath + '/public'],
viewFolders: [basePath + '/views'],
translationFolders: [basePath + '/locale'],
middlewaresFolders: [basePath + '/middlewares'],
controllersFolders: [basePath + '/controllers'],
migrationsFolders: [basePath + '/migrations'],
templatingFolders: [basePath + '/templating'],
disableMigrations: false,
sessionSecret: 'session_secret',
sessionStore: null,
tokenSecret: 'token_secret',
mailer: {
sender: 'Lynx Framework <lynx.framework@fakemail.com>',
host: '',
port: 587,
secure: false,
auth: {
user: '',
pass: '',
},
},
mailFactoryConstructor: function () { return new mail_client_1.NodemailerClient(); },
defaultLanguage: 'it',
uploadPath: basePath + '/../uploads',
cachePath: basePath + '/../cache',
ufs: new ufs_1.LocalUFS(),
onDatabaseInit: function () { },
cachingImages: false,
onlyModules: !legacyMode,
globalInterceptors: [],
beforePerformResponseInterceptors: [],
};
if (!legacyMode) {
this.config.db.entities = [];
this.config.publicFolders = [];
this.config.viewFolders = [];
this.config.translationFolders = [];
this.config.middlewaresFolders = [];
this.config.controllersFolders = [];
this.config.migrationsFolders = [];
this.config.templatingFolders = [];
}
}
ConfigBuilder.prototype.setPublicFolders = function (folders) {
this.config.publicFolders = folders;
return this;
};
ConfigBuilder.prototype.setViewFolders = function (folders) {
this.config.viewFolders = folders;
return this;
};
ConfigBuilder.prototype.setTranslationFolders = function (folders) {
this.config.translationFolders = folders;
return this;
};
ConfigBuilder.prototype.setMiddlewaresFolders = function (folders) {
this.config.middlewaresFolders = folders;
return this;
};
ConfigBuilder.prototype.setControllersFolders = function (folders) {
this.config.controllersFolders = folders;
return this;
};
ConfigBuilder.prototype.setMigrationsFolders = function (folders) {
this.config.migrationsFolders = folders;
return this;
};
ConfigBuilder.prototype.setSessionSecret = function (secret) {
this.config.sessionSecret = secret;
return this;
};
ConfigBuilder.prototype.setTokenSecret = function (secret) {
this.config.tokenSecret = secret;
return this;
};
ConfigBuilder.prototype.setSessionStore = function (store) {
this.config.sessionStore = store;
return this;
};
ConfigBuilder.prototype.setUploadPath = function (path) {
this.config.uploadPath = path;
return this;
};
ConfigBuilder.prototype.setCachePath = function (path) {
this.config.cachePath = path;
return this;
};
ConfigBuilder.prototype.setDefaultLanguage = function (language) {
this.config.defaultLanguage = language;
return this;
};
ConfigBuilder.prototype.setEntitiesFolders = function (folders) {
this.config.db.entities = folders;
return this;
};
ConfigBuilder.prototype.setDatabaseType = function (type) {
this.config.disabledDb = false;
this.config.db.type = type;
return this;
};
ConfigBuilder.prototype.setDatabaseHost = function (host) {
this.config.disabledDb = false;
this.config.db.host = host;
return this;
};
ConfigBuilder.prototype.setDatabasePort = function (port) {
this.config.disabledDb = false;
this.config.db.port = port;
return this;
};
ConfigBuilder.prototype.setDatabaseLogin = function (username, password) {
this.config.disabledDb = false;
this.config.db.username = username;
this.config.db.password = password;
return this;
};
ConfigBuilder.prototype.setDatabase = function (database) {
this.config.disabledDb = false;
this.config.db.database = database;
return this;
};
ConfigBuilder.prototype.disableDB = function () {
this.config.disabledDb = true;
return this;
};
ConfigBuilder.prototype.disableMigration = function () {
this.config.disableMigrations = true;
return this;
};
ConfigBuilder.prototype.enableMigration = function () {
this.config.disableMigrations = false;
return this;
};
ConfigBuilder.prototype.disableGraphQL = function () {
this.config.disabledGraphQL = true;
return this;
};
ConfigBuilder.prototype.setMailerSender = function (address) {
this.config.mailer.sender = address;
return this;
};
ConfigBuilder.prototype.setMailerAuth = function (user, password) {
this.config.mailer.auth.user = user;
this.config.mailer.auth.pass = password;
return this;
};
ConfigBuilder.prototype.setMailerServer = function (host, port, secure) {
this.config.mailer.host = host;
this.config.mailer.port = port;
this.config.mailer.secure = secure;
return this;
};
/**
* Set a different method to istantiace a mailer client.
* @param fn a function that istantiate a `MailClient` object
*/
ConfigBuilder.prototype.setMailClientFactoryConstructor = function (fn) {
this.config.mailFactoryConstructor = fn;
return this;
};
ConfigBuilder.prototype.setCustomUserEntity = function (hasCustom) {
user_entity_1.setSkipSync(!hasCustom);
return this;
};
ConfigBuilder.prototype.setJsonLimit = function (limit) {
this.config.jsonLimit = limit;
return this;
};
ConfigBuilder.prototype.setUFS = function (ufs) {
this.config.ufs = ufs;
return this;
};
ConfigBuilder.prototype.setOnDatabaseInit = function (cb) {
this.config.onDatabaseInit = cb;
return this;
};
ConfigBuilder.prototype.enableCachingImages = function () {
this.config.cachingImages = true;
return this;
};
/**
* Add global interceptor to the Lynx application.
* They are mounted before any other routes and middleware, using the
* `express.use` methods.
* @param cb The interceptor function that needs to be executed
* @param onlyFor A sub-path for the interceptor (optional, default to anything)
* @returns
*/
ConfigBuilder.prototype.addGlobalRoutingInterceptor = function (cb, onlyFor) {
this.config.globalInterceptors.push({ cb: cb, onlyFor: onlyFor });
return this;
};
/**
* Add "Response" interceptor to the Lynx application.
* This interceptor will be executed when a request is completed, just before the
* execution of the `performResponse` method of any response object.
*
* This method must return a (potentially) new response, or edit the current response
* @param cb The interceptor function that needs to be executed
* @returns
*/
ConfigBuilder.prototype.addBeforePerformResponseInterceptor = function (cb) {
this.config.beforePerformResponseInterceptors.push(cb);
return this;
};
ConfigBuilder.prototype.build = function () {
return this.config;
};
return ConfigBuilder;
}());
exports.ConfigBuilder = ConfigBuilder;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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