UNPKG

@nestjs/microservices

Version:

Nest - modern, fast, powerful node.js web framework (@microservices)

44 lines (43 loc) 1.57 kB
import { isObject, isString, isNumber } from '@nestjs/common/internal'; const DEFAULT_MAX_DEPTH = 5; const DEFAULT_MAX_KEYS = 20; const escape = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); /** * Transforms the Pattern to Route safely. * * @param pattern - client pattern * @param depth - current recursion depth * @param maxDepth - maximum allowed recursion depth * @param maxKeys - maximum allowed keys per object * @returns string */ export function transformPatternToRoute(pattern, depth = 0, maxDepth = DEFAULT_MAX_DEPTH, maxKeys = DEFAULT_MAX_KEYS) { if (isString(pattern) || isNumber(pattern)) { return `${pattern}`; } if (!isObject(pattern)) { // For non-string, non-number, non-object values return pattern; } if (depth > maxDepth) { return '[MAX_DEPTH_REACHED]'; } const keys = Object.keys(pattern); if (keys.length > maxKeys) { return '[TOO_MANY_KEYS]'; } const sortedKeys = keys.sort((a, b) => ('' + a).localeCompare(b)); const parts = sortedKeys.map(key => { const value = pattern[key]; let partialRoute = `"${escape(key)}":`; // Only quote strings, numbers and objects are handled recursively if (isString(value)) { partialRoute += `"${escape(transformPatternToRoute(value, depth + 1, maxDepth, maxKeys))}"`; } else { partialRoute += transformPatternToRoute(value, depth + 1, maxDepth, maxKeys); } return partialRoute; }); return `{${parts.join(',')}}`; }