path-rewriter.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.createPathRewriter = createPathRewriter;
  4. const is_plain_object_1 = require("is-plain-object");
  5. const errors_1 = require("./errors");
  6. const debug_1 = require("./debug");
  7. const debug = debug_1.Debug.extend('path-rewriter');
  8. /**
  9. * Create rewrite function, to cache parsed rewrite rules.
  10. *
  11. * @param {Object} rewriteConfig
  12. * @return {Function} Function to rewrite paths; This function should accept `path` (request.url) as parameter
  13. */
  14. function createPathRewriter(rewriteConfig) {
  15. let rulesCache;
  16. if (!isValidRewriteConfig(rewriteConfig)) {
  17. return;
  18. }
  19. if (typeof rewriteConfig === 'function') {
  20. const customRewriteFn = rewriteConfig;
  21. return customRewriteFn;
  22. }
  23. else {
  24. rulesCache = parsePathRewriteRules(rewriteConfig);
  25. return rewritePath;
  26. }
  27. function rewritePath(path) {
  28. let result = path;
  29. for (const rule of rulesCache) {
  30. if (rule.regex.test(path)) {
  31. result = result.replace(rule.regex, rule.value);
  32. debug('rewriting path from "%s" to "%s"', path, result);
  33. break;
  34. }
  35. }
  36. return result;
  37. }
  38. }
  39. function isValidRewriteConfig(rewriteConfig) {
  40. if (typeof rewriteConfig === 'function') {
  41. return true;
  42. }
  43. else if ((0, is_plain_object_1.isPlainObject)(rewriteConfig)) {
  44. return Object.keys(rewriteConfig).length !== 0;
  45. }
  46. else if (rewriteConfig === undefined || rewriteConfig === null) {
  47. return false;
  48. }
  49. else {
  50. throw new Error(errors_1.ERRORS.ERR_PATH_REWRITER_CONFIG);
  51. }
  52. }
  53. function parsePathRewriteRules(rewriteConfig) {
  54. const rules = [];
  55. if ((0, is_plain_object_1.isPlainObject)(rewriteConfig)) {
  56. for (const [key, value] of Object.entries(rewriteConfig)) {
  57. rules.push({
  58. regex: new RegExp(key),
  59. value: value,
  60. });
  61. debug('rewrite rule created: "%s" ~> "%s"', key, value);
  62. }
  63. }
  64. return rules;
  65. }