{"version":3,"sources":["../../src/Route.mts"],"sourcesContent":["import { MiddlewareFactory } from './MiddlewareFactory.mjs';\nimport type {\n  HandlerType,\n  HttpMethod,\n  LexerToken,\n  MiddlewareProvider,\n  Request,\n  Response,\n  RouteCheck,\n} from './types.mjs';\n\nexport class Route {\n  private middlewares: MiddlewareProvider[] = [];\n  private checks: RouteCheck[] = [];\n  private urlRegex: RegExp;\n  constructor(\n    public methods: HttpMethod[],\n    public path: string,\n    public handler: HandlerType\n  ) {\n    this.urlRegex = this.pathToRegex(path);\n  }\n  pathToRegex(path: string): RegExp {\n    const lex = this.lexUrlPath(path);\n    return this.tokensToRegex(lex);\n  }\n\n  lexUrlPath(path: string) {\n    const tokens = [];\n    let i = 0;\n\n    while (i < path.length) {\n      const char = path[i];\n\n      if (char === '/') {\n        tokens.push({ type: 'SLASH', value: '/' });\n        i++;\n      } else if (char === ':') {\n        let start = i + 1;\n        while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n          start++;\n        }\n        tokens.push({ type: 'PARAM', value: path.slice(i + 1, start) });\n        i = start;\n      } else if (char === '*') {\n        let start = i + 1;\n        while (start < path.length && /[a-zA-Z0-9_]/.test(path[start])) {\n          start++;\n        }\n        tokens.push({ type: 'WILDCARD', value: path.slice(i + 1, start) });\n        i = start;\n      } else {\n        let start = i;\n        while (start < path.length && !['/', ':', '*'].includes(path[start])) {\n          start++;\n        }\n        tokens.push({ type: 'TEXT', value: path.slice(i, start) });\n        i = start;\n      }\n    }\n\n    return tokens;\n  }\n  tokensToRegex(tokens: LexerToken[]) {\n    const regexParts = [];\n\n    for (const token of tokens) {\n      if (token.type === 'SLASH') {\n        regexParts.push('\\\\/');\n      } else if (token.type === 'PARAM') {\n        regexParts.push(`(?<${token.value}>[^\\\\/]+)`);\n      } else if (token.type === 'WILDCARD') {\n        regexParts.push('(.+)');\n      } else if (token.type === 'TEXT') {\n        regexParts.push(token.value.replace(/[-/\\\\^$.*+?()[\\]{}|]/g, '\\\\$&'));\n      }\n    }\n\n    if (regexParts.length > 0 && regexParts[regexParts.length - 1] === '\\\\/') {\n      regexParts[regexParts.length - 1] = '\\\\/?';\n    } else {\n      regexParts.push('\\\\/?');\n    }\n\n    return new RegExp(`^${regexParts.join('')}$`);\n  }\n\n  /**\n   * to evaluadate if request is a match for this route\n   * @param request http request\n   * @returns return true if route is a match for this request\n   */\n  test(request: Request) {\n    if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n      return false;\n    }\n    const url = new URL(request.url || '/', 'http://localhost');\n    return this.testPath(url.pathname);\n  }\n\n  testPath(pathname: string) {\n    return this.urlRegex.test(pathname);\n  }\n\n  /**\n   * returns details of the match, otherwise it returns false\n   * @param request the request to match\n   * @returns object cotaining details of match including matched params\n   */\n  match(request: Request) {\n    if (this.methods.indexOf(request.method as HttpMethod) === -1) {\n      return false;\n    }\n\n    const url = new URL(request.url || '/', 'http://localhost');\n\n    const r = this.urlRegex.exec(url.pathname);\n    if (!r) {\n      return false;\n    }\n\n    return {\n      url,\n      params: r.groups || {},\n    };\n  }\n\n  prependMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n    this.middlewares = ([] as MiddlewareProvider[]).concat(middlewares, this.middlewares);\n    return this;\n  }\n\n  addMiddleware(middlewares: MiddlewareProvider | MiddlewareProvider[]) {\n    this.middlewares = this.middlewares.concat(middlewares);\n    return this;\n  }\n\n  getMiddlewares() {\n    return this.middlewares;\n  }\n\n  addCheck(checks: RouteCheck | RouteCheck[]) {\n    this.checks = this.checks.concat(checks);\n    return this;\n  }\n\n  getChecks() {\n    return [...this.checks];\n  }\n\n  callHanlder(request: Request, response: Response) {\n    return this.handler(request, response);\n  }\n}\n"],"mappings":"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","names":[]}