{"version":3,"sources":["../src/middleware/context.ts","../src/middleware/manager.ts","../src/middleware/path.ts"],"sourcesContent":["/**\n * Middleware Context Implementation\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { ViteDevServer } from \"vite\";\nimport type { MiddlewareContext, CookieJar, CookieOptions } from \"./types\";\nimport type { FarmServerConfig, ResolvedFarmServerConfig } from \"../server-http\";\nimport { resolveFarmRequestURL } from \"../server/request\";\nimport {\n  parseMiddlewareCookieHeader,\n  serializeMiddlewareCookie as serializeCookie,\n  serializeMiddlewareCookieDeletion,\n} from \"./cookie-header\";\n\n/**\n * Serialize a cookie\n */\n/**\n * Cookie Jar implementation\n */\nclass CookieJarImpl implements CookieJar {\n  private cookies: Record<string, string>;\n  private setCookies: string[];\n\n  constructor(\n    private req: IncomingMessage,\n    private res: ServerResponse,\n  ) {\n    this.cookies = parseMiddlewareCookieHeader(req.headers.cookie);\n    const existing = res.getHeader(\"Set-Cookie\");\n    this.setCookies = Array.isArray(existing)\n      ? existing.map(String)\n      : existing === undefined\n        ? []\n        : [String(existing)];\n  }\n\n  get(name: string): string | undefined {\n    return this.cookies[name];\n  }\n\n  set(name: string, value: string, options: CookieOptions = {}): void {\n    this.cookies[name] = value;\n    const cookieString = serializeCookie(name, value, options);\n    this.setCookies.push(cookieString);\n\n    // Update Set-Cookie header\n    this.res.setHeader(\"Set-Cookie\", this.setCookies);\n  }\n\n  delete(name: string, options: CookieOptions = {}): void {\n    delete this.cookies[name];\n    // Path and Domain must match the cookie that was set, or the tombstone\n    // addresses a different cookie and the original survives.\n    this.setCookies.push(serializeMiddlewareCookieDeletion(name, options));\n    this.res.setHeader(\"Set-Cookie\", this.setCookies);\n  }\n\n  getAll(): Record<string, string> {\n    return { ...this.cookies };\n  }\n}\n\n/**\n * Create a middleware context from request/response\n */\nexport function createContext(\n  req: IncomingMessage,\n  res: ServerResponse,\n  viteServer?: ViteDevServer,\n  parent?: MiddlewareContext[\"parent\"],\n  server?: FarmServerConfig | ResolvedFarmServerConfig,\n): MiddlewareContext {\n  const url = resolveFarmRequestURL(req, { trustProxy: server?.trustProxy });\n  const headers = new Map<string, string>();\n  const data = parent?.data ? new Map(parent.data) : new Map<string, any>();\n  const locals = parent?.locals ? new Map(parent.locals) : new Map<string, any>();\n  const cookies = new CookieJarImpl(req, res);\n\n  if (parent?.headers) {\n    for (const [key, value] of Object.entries(parent.headers)) {\n      headers.set(key, value);\n    }\n  }\n\n  let handled = false;\n\n  const applyResponseHeaders = () => {\n    for (const [key, value] of headers) {\n      try {\n        res.setHeader(key, value);\n      } catch {\n        // Keep helper behavior aligned with the middleware manager: an invalid\n        // optional header must not prevent the response itself from completing.\n      }\n    }\n  };\n\n  const ctx: MiddlewareContext = {\n    request: req,\n    response: res,\n    url,\n    pathname: url.pathname,\n    searchParams: url.searchParams,\n    method: req.method || \"GET\",\n    params: {},\n    route: url.pathname,\n    parent,\n    vite: {\n      isDev: process.env.NODE_ENV !== \"production\",\n      hmr: !!viteServer?.hot,\n      server: viteServer,\n    },\n    data,\n    locals,\n    headers,\n    cookies,\n    _handled: false,\n\n    redirect(redirectUrl: string, status = 307): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot redirect\");\n        return;\n      }\n\n      ctx._redirectUrl = redirectUrl;\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        Location: redirectUrl,\n        \"Content-Type\": \"text/plain\",\n      });\n      res.end(`Redirecting to ${redirectUrl}`);\n    },\n\n    rewrite(rewriteUrl: string): void {\n      ctx._rewriteUrl = rewriteUrl;\n      // Update the URL for downstream middleware\n      const newUrl = new URL(rewriteUrl, `http://${req.headers.host || \"localhost\"}`);\n      ctx.url = newUrl;\n      ctx.pathname = newUrl.pathname;\n      ctx.searchParams = newUrl.searchParams;\n      ctx.route = newUrl.pathname;\n      // Update the original request URL\n      req.url = rewriteUrl;\n    },\n\n    json(jsonData: any, status = 200): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot send JSON\");\n        return;\n      }\n\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        \"Content-Type\": \"application/json\",\n      });\n      res.end(JSON.stringify(jsonData));\n    },\n\n    text(content: string, status = 200): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot send text\");\n        return;\n      }\n\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        \"Content-Type\": \"text/plain\",\n      });\n      res.end(content);\n    },\n\n    html(content: string, status = 200): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot send HTML\");\n        return;\n      }\n\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        \"Content-Type\": \"text/html\",\n      });\n      res.end(content);\n    },\n  };\n\n  return ctx;\n}\n","/**\n * Middleware Manager\n *\n * Discovers and executes middleware files in the file system\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ViteDevServer } from \"vite\";\nimport { decodeRouteSegment } from \"../utils/decode\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type {\n  FarmMiddlewareConfig,\n  MiddlewareFunction,\n  MiddlewareMatcher,\n  MiddlewareConfig,\n  MiddlewareContext,\n  MiddlewareResult,\n} from \"./types\";\nimport { createContext } from \"./context\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { logger } from \"../utils\";\nimport { sendWebResponse } from \"../server/response\";\nimport { emitFarmEvent } from \"../observability\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport { createCliColors } from \"../cli-colors\";\nimport { appendMiddlewareRoutePath } from \"./path\";\nimport type { FarmServerConfig, ResolvedFarmServerConfig } from \"../server-http\";\nimport { resolveFarmRequestURL } from \"../server/request\";\n\nexport interface DiscoveredMiddleware {\n  path: string;\n  filePath: string;\n  handlers: MiddlewareFunction[];\n  config?: MiddlewareConfig;\n  source?: \"config\" | \"file\";\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n  return value instanceof Response;\n}\n\n/**\n * Middleware Manager - discovers and executes middleware\n */\nexport class MiddlewareManager {\n  private middleware: DiscoveredMiddleware[] = [];\n  private configMiddleware: DiscoveredMiddleware[] = [];\n  private globalConfig?: MiddlewareConfig;\n  private viteServer?: ViteDevServer;\n  private appDirs: string[];\n  private i18n?: ResolvedFarmI18nConfig;\n  private server?: FarmServerConfig | ResolvedFarmServerConfig;\n\n  constructor(\n    appDir: string | readonly string[],\n    viteServer?: ViteDevServer,\n    config?: FarmMiddlewareConfig,\n    i18n?: ResolvedFarmI18nConfig,\n    server?: FarmServerConfig | ResolvedFarmServerConfig,\n  ) {\n    this.appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n    this.viteServer = viteServer;\n    this.i18n = i18n;\n    this.server = server;\n    this.configure(config);\n  }\n\n  configure(config?: FarmMiddlewareConfig): void {\n    this.configMiddleware = [];\n    this.globalConfig = undefined;\n\n    if (!config) return;\n\n    const entries = Array.isArray(config) ? config : [config];\n\n    for (const [index, entry] of entries.entries()) {\n      const handlers = this.getConfigHandlers(entry);\n      const middlewareConfig = this.toMiddlewareConfig(entry);\n\n      if (handlers.length === 0) {\n        this.globalConfig = middlewareConfig;\n        continue;\n      }\n\n      this.configMiddleware.push({\n        path: \"/\",\n        filePath: `farm.config.ts#middleware-${index}`,\n        handlers,\n        config: middlewareConfig,\n        source: \"config\",\n      });\n    }\n  }\n\n  /**\n   * Discover all middleware.ts files\n   */\n  async discover(): Promise<void> {\n    const middlewareByPath = new Map<string, DiscoveredMiddleware>();\n    for (const appDir of this.appDirs) {\n      const discovered: DiscoveredMiddleware[] = [];\n      await this.discoverInDirectory(appDir, \"/\", discovered);\n      for (const middleware of discovered) {\n        middlewareByPath.set(middleware.path, middleware);\n      }\n    }\n    this.middleware = Array.from(middlewareByPath.values());\n\n    // Sort by path depth (root first, then nested)\n    this.middleware.sort((a, b) => {\n      const depthA = a.path.split(\"/\").filter(Boolean).length;\n      const depthB = b.path.split(\"/\").filter(Boolean).length;\n      return depthA - depthB;\n    });\n\n    if (process.env.FARM_VERBOSE && this.middleware.length > 0) {\n      logger.success(`Discovered ${this.middleware.length} middleware files`);\n      for (const mw of this.middleware) {\n        logger.info(`  ${mw.path} (${mw.handlers.length} handlers)`);\n      }\n    }\n  }\n\n  /**\n   * Recursively discover middleware files\n   */\n  private async discoverInDirectory(\n    dir: string,\n    routePath: string,\n    discovered: DiscoveredMiddleware[],\n  ): Promise<void> {\n    if (!fs.existsSync(dir)) {\n      return;\n    }\n\n    // Check for middleware.ts in current directory\n    const middlewareFile = this.findMiddlewareFile(dir);\n    if (middlewareFile) {\n      const middleware = await this.loadMiddleware(middlewareFile, routePath);\n      if (middleware) {\n        discovered.push(middleware);\n      }\n    }\n\n    // Recursively check subdirectories\n    const entries = fs.readdirSync(dir, { withFileTypes: true });\n    for (const entry of entries) {\n      if (entry.isDirectory() && !entry.name.startsWith(\".\") && !entry.name.startsWith(\"_\")) {\n        const subPath = path.join(dir, entry.name);\n        const subRoutePath = appendMiddlewareRoutePath(routePath, entry.name);\n        await this.discoverInDirectory(subPath, subRoutePath, discovered);\n      }\n    }\n  }\n\n  /**\n   * Find middleware file in directory\n   */\n  private findMiddlewareFile(dir: string): string | null {\n    const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n    for (const ext of extensions) {\n      const filePath = path.join(dir, `middleware${ext}`);\n      if (fs.existsSync(filePath)) {\n        return filePath;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Load a middleware file\n   */\n  private async loadMiddleware(filePath: string, routePath: string): Promise<DiscoveredMiddleware> {\n    try {\n      // Load the module\n      let module: any;\n      if (this.viteServer) {\n        module = await this.viteServer.ssrLoadModule(filePath);\n      } else {\n        const fileUrl = `file://${filePath}`;\n        module = await import(/* @vite-ignore */ fileUrl);\n      }\n\n      const normalized = normalizeMiddlewareModule(module, routePath);\n      if (!normalized) {\n        throw new Error(\"must export a default handler or a named middleware handler\");\n      }\n\n      return {\n        path: routePath,\n        filePath,\n        handlers: normalized.handlers,\n        config: normalized.config,\n        source: \"file\",\n      };\n    } catch (error) {\n      throw new Error(`Failed to load middleware ${filePath}: ${error}`);\n    }\n  }\n\n  /**\n   * Execute middleware for a request\n   */\n  async execute(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n    const url = resolveFarmRequestURL(req, { trustProxy: this.server?.trustProxy });\n    const pathname = url.pathname;\n    const routePathname = this.i18n?.enabled\n      ? stripFarmLocaleFromPathname(pathname, this.i18n)\n      : pathname;\n    const method = req.method || \"GET\";\n    const startTime = Date.now();\n\n    let parentData: MiddlewareContext[\"parent\"] | undefined;\n    let ctx = createContext(req, res, this.viteServer, undefined, this.server);\n\n    if (this.globalConfig) {\n      const globalMatch = this.matchesConfig(routePathname, this.globalConfig, ctx);\n      if (!globalMatch.matched) {\n        return false;\n      }\n      if (globalMatch.params) {\n        ctx.params = { ...ctx.params, ...globalMatch.params };\n      }\n    }\n\n    // Find applicable middleware (config entries first, then cascading files)\n    const applicable: Array<{\n      mw: DiscoveredMiddleware;\n      routeMatch: { matched: boolean; params?: Record<string, string> };\n    }> = [\n      ...this.configMiddleware.map((mw) => ({ mw, routeMatch: { matched: true } })),\n      ...this.middleware\n        .map((mw) => ({ mw, routeMatch: this.matchRoutePath(routePathname, mw.path) }))\n        .filter((entry) => entry.routeMatch.matched),\n    ];\n\n    if (applicable.length === 0) {\n      return false; // No middleware to run\n    }\n    const pc = createCliColors();\n    const log = [\n      pc.dim(\"[\") + pc.bold(pc.blue(\"FARM\")) + pc.dim(\"]\"),\n      pc.dim(\"[\") + pc.bold(pc.magenta(\"MIDDLEWARE\")) + pc.dim(\"]\"),\n      pc.dim(\"[\") + pc.bold(pc.white(method.padEnd(3))) + pc.dim(\"]\"),\n      pc.gray(\"Executing middleware: \"),\n      pc.gray(pathname),\n      pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`),\n    ].join(\" \");\n    console.log(log);\n\n    // Execute middleware in cascade order\n    for (const entry of applicable) {\n      // Check matcher configuration\n      const { mw, routeMatch } = entry;\n      const configMatch = mw.config\n        ? this.matchesConfig(routePathname, mw.config, ctx)\n        : { matched: true };\n      if (!configMatch.matched) {\n        continue;\n      }\n      if (routeMatch.params) {\n        ctx.params = { ...ctx.params, ...routeMatch.params };\n      }\n      if (configMatch.params) {\n        ctx.params = { ...ctx.params, ...configMatch.params };\n      }\n\n      // Create new context with parent data\n      if (parentData) {\n        ctx = createContext(req, res, this.viteServer, parentData, this.server);\n        if (routeMatch.params) {\n          ctx.params = { ...ctx.params, ...routeMatch.params };\n        }\n        if (configMatch.params) {\n          ctx.params = { ...ctx.params, ...configMatch.params };\n        }\n      }\n\n      const middlewareStartTime = Date.now();\n      const middlewareEvent = {\n        route: mw.path,\n        pathname,\n        name: mw.filePath,\n      };\n      emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n      try {\n        // Execute all handlers in this middleware\n        let handlerIndex = 0;\n        let returnedResponse: Response | undefined;\n        const executeNext = async (): Promise<MiddlewareResult> => {\n          if (handlerIndex < mw.handlers.length) {\n            const handler = mw.handlers[handlerIndex++];\n            const result = await handler(ctx, executeNext);\n            if (isMiddlewareResponse(result)) {\n              returnedResponse = result;\n              return result;\n            }\n          }\n          return returnedResponse;\n        };\n\n        const result = await executeNext();\n        const response = isMiddlewareResponse(result) ? result : returnedResponse;\n        if (response) {\n          if (!res.headersSent && !res.writableEnded) {\n            for (const [key, value] of ctx.headers) {\n              try {\n                res.setHeader(key, value);\n              } catch (error) {}\n            }\n          }\n          emitFarmEvent({\n            type: \"middleware.shortCircuit\",\n            ...middlewareEvent,\n            status: response.status,\n          });\n          await sendWebResponse(res, response);\n          return true;\n        }\n\n        // Check if response has been sent or handled by middleware helpers.\n        if (ctx._handled || res.headersSent || res.writableEnded) {\n          emitFarmEvent({\n            type: \"middleware.shortCircuit\",\n            ...middlewareEvent,\n            status: res.statusCode,\n          });\n          return true;\n        }\n\n        emitFarmEvent({\n          type: \"middleware.complete\",\n          ...middlewareEvent,\n          durationMs: Date.now() - middlewareStartTime,\n        });\n      } catch (error) {\n        emitFarmEvent({\n          type: \"middleware.error\",\n          ...middlewareEvent,\n          error,\n        });\n        throw error;\n      }\n\n      parentData = {\n        data: new Map(ctx.data),\n        locals: new Map(ctx.locals),\n        headers: Object.fromEntries(ctx.headers),\n      };\n    }\n\n    if (!res.headersSent && !res.writableEnded) {\n      for (const [key, value] of ctx.headers) {\n        try {\n          res.setHeader(key, value);\n        } catch (error) {}\n      }\n    }\n\n    (req as any).__FARM_MIDDLEWARE_DATA__ = new Map(ctx.data);\n    (req as any).__FARM_MIDDLEWARE_CONTEXT__ = new Map(ctx.locals);\n\n    return false; // Continue to page rendering\n  }\n\n  /**\n   * Check if pathname matches middleware config\n   */\n  private matchesConfig(\n    pathname: string,\n    config: MiddlewareConfig,\n    ctx: MiddlewareContext,\n  ): { matched: boolean; params?: Record<string, string> } {\n    // Check exclusions\n    if (config.exclude) {\n      for (const pattern of config.exclude) {\n        if (this.matchPattern(pattern, pathname).matched) {\n          return { matched: false };\n        }\n      }\n    }\n\n    // Check matchers\n    if (config.matcher) {\n      for (const matcher of this.toMatcherList(config.matcher)) {\n        if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n          const result = this.matchPattern(matcher, pathname);\n          if (result.matched) {\n            return result;\n          }\n        } else if (typeof matcher === \"function\" && matcher(ctx)) {\n          return { matched: true };\n        }\n      }\n      return { matched: false };\n    }\n\n    return { matched: true };\n  }\n\n  /**\n   * Match a pattern against pathname\n   */\n  private matchPattern(\n    pattern: string | RegExp,\n    pathname: string,\n  ): { matched: boolean; params?: Record<string, string> } {\n    if (pattern instanceof RegExp) {\n      pattern.lastIndex = 0;\n      const match = pattern.exec(pathname);\n      return {\n        matched: !!match,\n        params: match?.groups ? { ...match.groups } : undefined,\n      };\n    }\n\n    if (pattern === \"*\" || pattern === \"/(.*)\") {\n      return { matched: true };\n    }\n\n    if (pattern.endsWith(\"(.*)\")) {\n      // Strip a trailing slash before the wildcard so `/admin/(.*)` matches the\n      // `/admin` subtree like `/admin/**` does. Without this the prefix keeps\n      // its slash and the check becomes startsWith(\"/admin//\"), which no path\n      // satisfies, so the matcher silently matches nothing.\n      const prefix = pattern.slice(0, -4).replace(/\\/$/, \"\");\n      return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n    }\n\n    const { regex, params } = this.compilePathPattern(pattern);\n    const match = regex.exec(pathname);\n    if (!match) {\n      return { matched: false };\n    }\n\n    const values: Record<string, string> = {};\n    params.forEach((param, index) => {\n      values[param] = decodeRouteSegment(match[index + 1] || \"\");\n    });\n\n    return {\n      matched: true,\n      params: Object.keys(values).length > 0 ? values : undefined,\n    };\n  }\n\n  /**\n   * Reload middleware (for HMR)\n   */\n  async reload(): Promise<void> {\n    await this.discover();\n  }\n\n  getMiddlewares(): DiscoveredMiddleware[] {\n    return [...this.configMiddleware, ...this.middleware];\n  }\n\n  hasMiddleware(): boolean {\n    return this.configMiddleware.length > 0 || this.middleware.length > 0;\n  }\n\n  private matchRoutePath(\n    pathname: string,\n    middlewarePath: string,\n  ): { matched: boolean; params?: Record<string, string> } {\n    if (middlewarePath === \"/\") return { matched: true };\n\n    const exactMatch = this.matchPattern(middlewarePath, pathname);\n    if (exactMatch.matched) {\n      return exactMatch;\n    }\n\n    const nestedMatch = this.matchPattern(`${middlewarePath}/:__farmRest*`, pathname);\n    if (!nestedMatch.matched) {\n      return { matched: false };\n    }\n\n    const params = { ...nestedMatch.params };\n    delete params.__farmRest;\n    return {\n      matched: true,\n      params: Object.keys(params).length > 0 ? params : undefined,\n    };\n  }\n\n  private toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n    if (!matcher) return [];\n    return Array.isArray(matcher) ? matcher : [matcher];\n  }\n\n  private getConfigHandlers(\n    entry:\n      | MiddlewareConfig\n      | (MiddlewareConfig & {\n          handler?: MiddlewareFunction;\n          handlers?: MiddlewareFunction[];\n        }),\n  ): MiddlewareFunction[] {\n    const handlers: MiddlewareFunction[] = [];\n    if (\"handler\" in entry && typeof entry.handler === \"function\") {\n      handlers.push(entry.handler);\n    }\n    if (\"handlers\" in entry && Array.isArray(entry.handlers)) {\n      handlers.push(...entry.handlers.filter((handler) => typeof handler === \"function\"));\n    }\n    return handlers;\n  }\n\n  private toMiddlewareConfig(\n    entry: MiddlewareConfig & {\n      handler?: MiddlewareFunction;\n      handlers?: MiddlewareFunction[];\n    },\n  ): MiddlewareConfig {\n    const { matcher, exclude, runtime } = entry;\n    return { matcher, exclude, runtime };\n  }\n\n  private compilePathPattern(pattern: string): { regex: RegExp; params: string[] } {\n    const params: string[] = [];\n    const segments = pattern.split(\"/\").filter(Boolean);\n\n    if (segments.length === 0) {\n      return { regex: /^\\/$/, params };\n    }\n\n    const parts = segments.map((segment) => {\n      if (segment === \"**\") {\n        return \"(?:/.*)?\";\n      }\n\n      if (segment === \"*\") {\n        return \"/[^/]+\";\n      }\n\n      if (segment.startsWith(\":\")) {\n        const { name, modifier } = this.parseColonParam(segment);\n        params.push(name);\n\n        if (modifier === \"*\") {\n          return \"(?:/(.*))?\";\n        }\n        if (modifier === \"+\") {\n          return \"/(.+)\";\n        }\n        return \"/([^/]+)\";\n      }\n\n      if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n        params.push(segment.slice(4, -1));\n        return \"(?:/(.*))?\";\n      }\n\n      if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n        params.push(segment.slice(1, -1));\n        return \"/([^/]+)\";\n      }\n\n      return `/${this.escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n    });\n\n    return {\n      regex: new RegExp(`^${parts.join(\"\")}$`),\n      params,\n    };\n  }\n\n  private parseColonParam(segment: string): { name: string; modifier?: string } {\n    const raw = segment.slice(1);\n    const last = raw[raw.length - 1];\n    const modifier = last === \"*\" || last === \"+\" || last === \"?\" ? last : undefined;\n    return {\n      name: modifier ? raw.slice(0, -1) : raw,\n      modifier,\n    };\n  }\n\n  private escapeRegex(value: string): string {\n    return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n  }\n}\n","export function appendMiddlewareRoutePath(routePath: string, directoryName: string): string {\n  if (directoryName.startsWith(\"(\") && directoryName.endsWith(\")\")) {\n    return routePath;\n  }\n\n  return routePath === \"/\" ? `/${directoryName}` : `${routePath}/${directoryName}`;\n}\n"],"mappings":"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","names":["result","match"]}