| var _ = require('lodash') | 
| var url = require('url') | 
| var ERRORS = require('./errors') | 
| var logger = require('./logger').getInstance() | 
|   | 
| module.exports = { | 
|   createConfig: createConfig | 
| } | 
|   | 
| function createConfig(context, opts) { | 
|   // structure of config object to be returned | 
|   var config = { | 
|     context: undefined, | 
|     options: {} | 
|   } | 
|   | 
|   // app.use('/api', proxy({target:'http://localhost:9000'})); | 
|   if (isContextless(context, opts)) { | 
|     config.context = '/' | 
|     config.options = _.assign(config.options, context) | 
|   | 
|     // app.use('/api', proxy('http://localhost:9000')); | 
|     // app.use(proxy('http://localhost:9000/api')); | 
|   } else if (isStringShortHand(context)) { | 
|     var oUrl = url.parse(context) | 
|     var target = [oUrl.protocol, '//', oUrl.host].join('') | 
|   | 
|     config.context = oUrl.pathname || '/' | 
|     config.options = _.assign(config.options, { target: target }, opts) | 
|   | 
|     if (oUrl.protocol === 'ws:' || oUrl.protocol === 'wss:') { | 
|       config.options.ws = true | 
|     } | 
|     // app.use('/api', proxy({target:'http://localhost:9000'})); | 
|   } else { | 
|     config.context = context | 
|     config.options = _.assign(config.options, opts) | 
|   } | 
|   | 
|   configureLogger(config.options) | 
|   | 
|   if (!config.options.target) { | 
|     throw new Error(ERRORS.ERR_CONFIG_FACTORY_TARGET_MISSING) | 
|   } | 
|   | 
|   // Legacy option.proxyHost | 
|   config.options = mapLegacyProxyHostOption(config.options) | 
|   | 
|   // Legacy option.proxyTable > option.router | 
|   config.options = mapLegacyProxyTableOption(config.options) | 
|   | 
|   return config | 
| } | 
|   | 
| /** | 
|  * Checks if a String only target/config is provided. | 
|  * This can be just the host or with the optional path. | 
|  * | 
|  * @example | 
|  *      app.use('/api', proxy('http://localhost:9000')); | 
|         app.use(proxy('http://localhost:9000/api')); | 
|  * | 
|  * @param  {String}  context [description] | 
|  * @return {Boolean}         [description] | 
|  */ | 
| function isStringShortHand(context) { | 
|   if (_.isString(context)) { | 
|     return !!url.parse(context).host | 
|   } | 
| } | 
|   | 
| /** | 
|  * Checks if a Object only config is provided, without a context. | 
|  * In this case the all paths will be proxied. | 
|  * | 
|  * @example | 
|  *     app.use('/api', proxy({target:'http://localhost:9000'})); | 
|  * | 
|  * @param  {Object}  context [description] | 
|  * @param  {*}       opts    [description] | 
|  * @return {Boolean}         [description] | 
|  */ | 
| function isContextless(context, opts) { | 
|   return _.isPlainObject(context) && _.isEmpty(opts) | 
| } | 
|   | 
| function mapLegacyProxyHostOption(options) { | 
|   // set options.headers.host when option.proxyHost is provided | 
|   if (options.proxyHost) { | 
|     logger.warn('*************************************') | 
|     logger.warn('[HPM] Deprecated "option.proxyHost"') | 
|     logger.warn( | 
|       '      Use "option.changeOrigin" or "option.headers.host" instead' | 
|     ) | 
|     logger.warn('      "option.proxyHost" will be removed in future release.') | 
|     logger.warn('*************************************') | 
|   | 
|     options.headers = options.headers || {} | 
|     options.headers.host = options.proxyHost | 
|   } | 
|   | 
|   return options | 
| } | 
|   | 
| // Warn deprecated proxyTable api usage | 
| function mapLegacyProxyTableOption(options) { | 
|   if (options.proxyTable) { | 
|     logger.warn('*************************************') | 
|     logger.warn('[HPM] Deprecated "option.proxyTable"') | 
|     logger.warn('      Use "option.router" instead') | 
|     logger.warn('      "option.proxyTable" will be removed in future release.') | 
|     logger.warn('*************************************') | 
|   | 
|     options.router = _.clone(options.proxyTable) | 
|     _.omit(options, 'proxyTable') | 
|   } | 
|   | 
|   return options | 
| } | 
|   | 
| function configureLogger(options) { | 
|   if (options.logLevel) { | 
|     logger.setLevel(options.logLevel) | 
|   } | 
|   | 
|   if (options.logProvider) { | 
|     logger.setProvider(options.logProvider) | 
|   } | 
| } |