diff --git a/README.md b/README.md index c7d6a77..2788698 100644 --- a/README.md +++ b/README.md @@ -50,3 +50,58 @@ Use the [npm package __dotenv__][dotenv] to set environment variables. Take a look at the unit tests for example usage. [dotenv]: https://www.npmjs.com/package/dotenv + +## DEV NOTES ## + +- vi fimpar local-/prod-/ref-/devSettings.js + - läggs i commonSettings.js, serverSettings.js, browserSettings.js + +- fimpa full, safe och secure + +När vi skapar nya settings-objektet +- vi mergear commonSettings.js + serverSettings.js till servern +- vi mergear commonSettings.js + browserSettings.js till browsern + - returneras på endpointen ./browserConfig som javascript + TODO: - lägg till script-tag i början av all layout-filer + (eller kan vi referera den från JS-filen?) + +Migrering: + +- Search and replace: + + require('../**/configuration') => require('../**/configuration').server + + config.full => config + config.safe => config + config.secure: .secure => '' + server.full => server + +- What are these used for (kth-node-configuration) + + module.exports.getEnv = _env + module.exports.getEnvString = _str + module.exports.getEnvBool = _bool + module.exports.getEnvInt = _int + +- Update tests + +- Update kth-node-server (to 1.2.0) + + config.full => config + +- change how we start server: + + server.setConfig(config) => server.setConfig({ full: config }) + +- change in adldap.js + + attributes: config.ldapClient.userattrs => attributes: config.ldap.userattrs + config.ldapClient.filterReplaceHolder, kthid => config.ldap.filterReplaceHolder, kthid + +- Add endpoint .../browserConfig +- Remove the handlebars helper + + <> + +- Add + diff --git a/configurator.js b/configurator.js deleted file mode 100644 index 88ac796..0000000 --- a/configurator.js +++ /dev/null @@ -1,102 +0,0 @@ -'use strict' - -const _ = require('lodash') - -const defaults = { - dev: {}, - ref: {}, - prod: {}, - defaults: {}, - local: {} -} - -function _env (key, def) { - let type = typeof def - if (!process.env[key]) return def - switch (type) { - case 'boolean': - return process.env[key] === 'true' - case 'number': - return parseInt(process.env[key], 10) - default: - return process.env[key] - } -} - -function _str (key, def) { - return process.env[key] || def -} - -function _bool (key, def) { - if (process.env[key]) return process.env[key] === 'true' - else return def -} - -function _int (key, def) { - return parseInt(process.env[key], 10) || def -} - -module.exports = function (options) { - options = _.merge({}, defaults, options) - - function _getLowerCaseNodeEnv () { - return process.env.NODE_ENV && process.env.NODE_ENV.toLowerCase() - } - - function _merged () { - return _.merge({}, options.defaults, options[env()], options.local) - } - - function _isProduction (nodeEnv) { - return nodeEnv === 'produktion' || nodeEnv === 'production' || nodeEnv === 'prod' - } - - function _isReference (nodeEnv) { - return nodeEnv === 'referens' || nodeEnv === 'reference' || nodeEnv === 'ref' - } - - function _isDevelopment (nodeEnv) { - return nodeEnv === 'development' || nodeEnv === 'dev' - } - - function env () { - const nodeEnv = _getLowerCaseNodeEnv() - - if (_isProduction(nodeEnv)) { - return 'prod' - } - - if (_isReference(nodeEnv)) { - return 'ref' - } - - if (_isDevelopment(nodeEnv)) { - return 'dev' - } - - throw new Error(`Invalid NODE_ENV variable: ${nodeEnv}`) - } - - return { - env: env, - - full: function () { - return _merged() - }, - - safe: function () { - const full = this.full() - full.secure = {} - return full - }, - - secure: function () { - return this.full().secure - } - } -} - -module.exports.getEnv = _env -module.exports.getEnvString = _str -module.exports.getEnvBool = _bool -module.exports.getEnvInt = _int diff --git a/lib/decodeUri.js b/lib/decodeUri.js new file mode 100644 index 0000000..db23b5c --- /dev/null +++ b/lib/decodeUri.js @@ -0,0 +1,8 @@ +'use strict' + +const { getEnv } = require('./utils') +const urlgrey = require('urlgrey') + +module.exports = function (envVarName, defaultUri) { + return urlgrey(getEnv(envVarName, defaultUri)) +} diff --git a/lib/generateConfig.js b/lib/generateConfig.js new file mode 100644 index 0000000..3c46b21 --- /dev/null +++ b/lib/generateConfig.js @@ -0,0 +1,32 @@ +'use strict' + +const deepAssign = require('deep-assign') + +function _currentNodeEnv () { + const nodeEnv = process.env.NODE_ENV && process.env.NODE_ENV.toLowerCase() + + if (nodeEnv === 'production') { + return 'prod' + } else if (nodeEnv === 'referens' || nodeEnv === 'reference' || nodeEnv === 'ref') { + return 'ref' + } else if (nodeEnv === 'development' || nodeEnv === 'dev' || !nodeEnv) { + return 'dev' + } + + // To run Node in production mode NODE_currentNodeEnv must be 'production' + throw new Error(`Invalid NODE_currentNodeEnv variable: ${nodeEnv}`) +} + +module.exports = function (inpArr) { + // Create array of source objects + const mergeThese = inpArr.slice() + // Add target object + const mergedObj = {} + mergeThese.unshift(mergedObj) + // Merge all objects + deepAssign.apply(this, mergeThese) + // Add the env variable + mergedObj.env = _currentNodeEnv() + + return mergedObj +} diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..6250f5b --- /dev/null +++ b/lib/index.js @@ -0,0 +1,8 @@ +module.exports = { + generateConfig: require('./generateConfig'), + decodeUri: require('./decodeUri'), + unpackLDAPConfig: require('./unpackLDAPConfig'), + unpackNodeApiConfig: require('./unpackNodeApiConfig'), + unpackRedisConfig: require('./unpackRedisConfig'), + getEnv: require('./utils').getEnv +} diff --git a/lib/unpackLDAPConfig.js b/lib/unpackLDAPConfig.js new file mode 100644 index 0000000..bce7e19 --- /dev/null +++ b/lib/unpackLDAPConfig.js @@ -0,0 +1,40 @@ +'use strict' + +const { getEnv, typeConversion } = require('./utils') +const urlgrey = require('urlgrey') + +module.exports = function (envVarName, password, defaultUri, options) { + const envObj = urlgrey(getEnv(envVarName, defaultUri)) + + const outp = { + uri: `${envObj.protocol()}://${envObj.hostname()}`, + username: envObj.username(), + password: password + } + + if (typeof options === 'object') { + Object.assign(outp, options) + } + + if (typeof envObj.query === 'object') { + var tmpQuery = envObj.query() + Object.keys(tmpQuery).forEach((key) => { + outp[key] = typeConversion(tmpQuery[key]) + }) + } + return outp +} + +module.exports.defaultSettings = { + ldapClient: { + version: 3, + searchlimit: 10, + searchtimeout: 10, // seconds + connecttimeout: 3000, // ms + timeout: 3000, // ms + maxconnections: 10, // + checkinterval: 10000, // ms + maxidletime: 300000, // ms + scope: 'sub' + } +} diff --git a/lib/unpackNodeApiConfig.js b/lib/unpackNodeApiConfig.js new file mode 100644 index 0000000..ab94e40 --- /dev/null +++ b/lib/unpackNodeApiConfig.js @@ -0,0 +1,27 @@ +'use strict' + +const { getEnv, typeConversion } = require('./utils') +const urlgrey = require('urlgrey') + +module.exports = function (envVarName, defaultUri, options) { + const envObj = urlgrey(getEnv(envVarName, defaultUri)) + const outp = { + https: envObj.protocol() === 'https', + // Netscaler doesn't answer https calls properly if we pass the port to kth-node-api-call + port: (envObj.protocol() === 'https' ? undefined : envObj.port()), + host: envObj.hostname(), + proxyBasePath: envObj.path() + } + + if (typeof options === 'object') { + Object.assign(outp, options) + } + + if (typeof envObj.query === 'object') { + var tmpQuery = envObj.query() + Object.keys(tmpQuery).forEach((key) => { + outp[key] = typeConversion(tmpQuery[key]) + }) + } + return outp +} diff --git a/lib/unpackRedisConfig.js b/lib/unpackRedisConfig.js new file mode 100644 index 0000000..1ee2dcf --- /dev/null +++ b/lib/unpackRedisConfig.js @@ -0,0 +1,25 @@ +'use strict' + +const { getEnv, typeConversion } = require('./utils') +const urlgrey = require('urlgrey') + +module.exports = function (envVarName, defaultUri, options) { + const envObj = urlgrey(getEnv(envVarName, defaultUri)) + + const outp = { + host: envObj.hostname(), + port: envObj.port() + } + + if (typeof options === 'object') { + Object.assign(outp, options) + } + + if (typeof envObj.query === 'object') { + var tmpQuery = envObj.query() + Object.keys(tmpQuery).forEach((key) => { + outp[key] = typeConversion(tmpQuery[key]) + }) + } + return outp +} diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..e3139aa --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,19 @@ +'use strict' + +module.exports.getEnv = function (name, defaultVal) { + return process.env[name] || defaultVal +} + +module.exports.typeConversion = function (inp) { + if (parseInt(inp).toString === inp) { + return parseInt(inp) + } else if (inp === 'true') { + return true + } else if (inp === 'false') { + return false + } else if (inp === 'undefined') { + return undefined + } else { + return inp + } +} diff --git a/package.json b/package.json index 1ac05fe..1d8cacb 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,15 @@ { "name": "kth-node-configuration", - "version": "1.0.1", + "version": "1.1.0", "description": "Configuration module for Node.js projects", - "main": "configurator.js", + "main": "lib/index.js", "repository": { "type": "git", "url": "https://github.com/KTH/kth-node-configuration" }, "dependencies": { - "lodash": "4.13.1" + "deep-assign": "^2.0.0", + "urlgrey": "^0.4.4" }, "keywords": [ "node",