UNPKG

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