67 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.createPathRewriter = void 0;
 | |
| const isPlainObj = require("is-plain-obj");
 | |
| const errors_1 = require("./errors");
 | |
| const logger_1 = require("./logger");
 | |
| const logger = (0, logger_1.getInstance)();
 | |
| /**
 | |
|  * 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) {
 | |
|     let rulesCache;
 | |
|     if (!isValidRewriteConfig(rewriteConfig)) {
 | |
|         return;
 | |
|     }
 | |
|     if (typeof rewriteConfig === 'function') {
 | |
|         const customRewriteFn = rewriteConfig;
 | |
|         return customRewriteFn;
 | |
|     }
 | |
|     else {
 | |
|         rulesCache = parsePathRewriteRules(rewriteConfig);
 | |
|         return rewritePath;
 | |
|     }
 | |
|     function rewritePath(path) {
 | |
|         let result = path;
 | |
|         for (const rule of rulesCache) {
 | |
|             if (rule.regex.test(path)) {
 | |
|                 result = result.replace(rule.regex, rule.value);
 | |
|                 logger.debug('[HPM] Rewriting path from "%s" to "%s"', path, result);
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| }
 | |
| exports.createPathRewriter = createPathRewriter;
 | |
| function isValidRewriteConfig(rewriteConfig) {
 | |
|     if (typeof rewriteConfig === 'function') {
 | |
|         return true;
 | |
|     }
 | |
|     else if (isPlainObj(rewriteConfig)) {
 | |
|         return Object.keys(rewriteConfig).length !== 0;
 | |
|     }
 | |
|     else if (rewriteConfig === undefined || rewriteConfig === null) {
 | |
|         return false;
 | |
|     }
 | |
|     else {
 | |
|         throw new Error(errors_1.ERRORS.ERR_PATH_REWRITER_CONFIG);
 | |
|     }
 | |
| }
 | |
| function parsePathRewriteRules(rewriteConfig) {
 | |
|     const rules = [];
 | |
|     if (isPlainObj(rewriteConfig)) {
 | |
|         for (const [key] of Object.entries(rewriteConfig)) {
 | |
|             rules.push({
 | |
|                 regex: new RegExp(key),
 | |
|                 value: rewriteConfig[key],
 | |
|             });
 | |
|             logger.info('[HPM] Proxy rewrite rule created: "%s" ~> "%s"', key, rewriteConfig[key]);
 | |
|         }
 | |
|     }
 | |
|     return rules;
 | |
| }
 |