import isPlainObj = require ( 'is-plain-obj' ) ; import { ERRORS } from './errors' ; import { getInstance } from './logger' ; const logger = getInstance ( ) ; param { Object } rewriteConfig return { Function } export 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 ; } } 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 . 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 ; }