var _ = require('lodash') var logger = require('./logger').getInstance() var ERRORS = require('./errors') module.exports = { create: createPathRewriter } /** * Create rewrite function, to cache parsed rewrite rules. * * @param {Object} rewriteConfig * @return {Function} Function to rewrite paths; This function should accept `path` (request.url) as parameter */ function createPathRewriter(rewriteConfig) { var rulesCache if (!isValidRewriteConfig(rewriteConfig)) { return } if (_.isFunction(rewriteConfig)) { var customRewriteFn = rewriteConfig return customRewriteFn } else { rulesCache = parsePathRewriteRules(rewriteConfig) return rewritePath } function rewritePath(path) { var result = path _.forEach(rulesCache, function(rule) { if (rule.regex.test(path)) { result = result.replace(rule.regex, rule.value) logger.debug('[HPM] Rewriting path from "%s" to "%s"', path, result) return false } }) return result } } function isValidRewriteConfig(rewriteConfig) { if (_.isFunction(rewriteConfig)) { return true } else if (!_.isEmpty(rewriteConfig) && _.isPlainObject(rewriteConfig)) { return true } else if ( _.isUndefined(rewriteConfig) || _.isNull(rewriteConfig) || _.isEqual(rewriteConfig, {}) ) { return false } else { throw new Error(ERRORS.ERR_PATH_REWRITER_CONFIG) } } function parsePathRewriteRules(rewriteConfig) { var rules = [] if (_.isPlainObject(rewriteConfig)) { _.forIn(rewriteConfig, function(value, key) { rules.push({ regex: new RegExp(key), value: rewriteConfig[key] }) logger.info( '[HPM] Proxy rewrite rule created: "%s" ~> "%s"', key, rewriteConfig[key] ) }) } return rules }