{"version":3,"sources":["../src/middleware/chain.ts","../src/middleware/helpers.ts","../src/middleware/vite-plugin.ts"],"sourcesContent":["/**\n * Middleware Chain Builder\n */\n\nimport type {\n  MiddlewareChain,\n  MiddlewareFunction,\n  MiddlewareContext,\n  MiddlewareConfig,\n  RateLimitConfig,\n  RateLimitStorage,\n  RateLimitStatus,\n  RateLimitIncrementResult,\n  MemoryRateLimitStorageOptions,\n  MiddlewareResult,\n} from \"./types\";\n\nconst DEFAULT_MEMORY_RATE_LIMIT_ENTRIES = 100_000;\n\nexport class UnsupportedRateLimitStorageError extends TypeError {\n  constructor() {\n    super(\n      \"RateLimitStorage must implement atomic increment(key, windowMs). Legacy get/set adapters can lose increments under concurrency. Use memoryRateLimitStorage() for one process or redisRateLimitStorage() from @farm.js/cache-redis for production.\",\n    );\n    this.name = \"UnsupportedRateLimitStorageError\";\n  }\n}\n\n/** Create an atomic, process-local fixed-window rate-limit store. */\nexport function memoryRateLimitStorage(\n  options: MemoryRateLimitStorageOptions = {},\n): RateLimitStorage {\n  const maxEntries = options.maxEntries ?? DEFAULT_MEMORY_RATE_LIMIT_ENTRIES;\n  if (!Number.isSafeInteger(maxEntries) || maxEntries <= 0) {\n    throw new TypeError(\"memoryRateLimitStorage maxEntries must be a positive safe integer.\");\n  }\n\n  const records = new Map<string, RateLimitIncrementResult>();\n\n  function read(key: string, now: number): RateLimitIncrementResult | null {\n    const record = records.get(key);\n    if (!record) return null;\n    if (record.resetAt <= now) {\n      records.delete(key);\n      return null;\n    }\n    return record;\n  }\n\n  function pruneExpired(now: number): void {\n    for (const [key, record] of records) {\n      if (record.resetAt <= now) records.delete(key);\n    }\n  }\n\n  return {\n    increment(key, windowMs) {\n      if (!Number.isSafeInteger(windowMs) || windowMs <= 0) {\n        throw new TypeError(\"Rate-limit windowMs must be a positive safe integer.\");\n      }\n      const now = Date.now();\n      const current = read(key, now);\n      if (current) {\n        const next = { count: current.count + 1, resetAt: current.resetAt };\n        records.set(key, next);\n        return next;\n      }\n\n      if (records.size >= maxEntries) pruneExpired(now);\n      if (records.size >= maxEntries) {\n        throw new Error(\n          `Process-local rate-limit storage reached its ${maxEntries} active-key capacity. Configure a shared production adapter or increase maxEntries.`,\n        );\n      }\n\n      const next = { count: 1, resetAt: now + windowMs };\n      records.set(key, next);\n      return next;\n    },\n    get(key) {\n      const record = read(key, Date.now());\n      return record ? { ...record } : null;\n    },\n  };\n}\n\nconst defaultRateLimitStorage = memoryRateLimitStorage();\n\nfunction parseTimeWindow(window: string): number {\n  const match = window.match(/^(\\d+)(ms|s|m|h|d)$/);\n  if (!match) throw new Error(`Invalid time window: ${window}`);\n\n  const [, amount, unit] = match;\n  const value = Number.parseInt(amount, 10);\n\n  const multipliers: Record<string, number> = {\n    ms: 1,\n    s: 1000,\n    m: 60 * 1000,\n    h: 60 * 60 * 1000,\n    d: 24 * 60 * 60 * 1000,\n  };\n\n  const windowMs = value * multipliers[unit];\n  if (!Number.isSafeInteger(windowMs) || windowMs <= 0) {\n    throw new Error(`Invalid time window: ${window}`);\n  }\n  return windowMs;\n}\n\nfunction createRateLimitMiddleware(config: RateLimitConfig): MiddlewareFunction {\n  if (!Number.isSafeInteger(config.requests) || config.requests <= 0) {\n    throw new TypeError(\"Rate limit requests must be a positive safe integer.\");\n  }\n  const windowMs = parseTimeWindow(config.window);\n  const storage = config.storage || defaultRateLimitStorage;\n  assertAtomicRateLimitStorage(storage);\n\n  return async (ctx: MiddlewareContext, next) => {\n    const key = config.keyGenerator\n      ? config.keyGenerator(ctx)\n      : `${ctx.request.socket.remoteAddress}:${ctx.pathname}`;\n\n    const current = await storage.increment(key, windowMs);\n    assertRateLimitIncrementResult(current);\n    const now = Date.now();\n    const resetIn = Math.max(1, Math.ceil((current.resetAt - now) / 1000));\n    const remaining = Math.max(0, config.requests - current.count);\n    setRateLimitHeaders(ctx, config.requests, remaining, resetIn, Math.ceil(windowMs / 1000));\n\n    if (current.count > config.requests) {\n      setMiddlewareResponseHeader(ctx, \"Retry-After\", String(resetIn));\n      if (config.onLimit) {\n        const result = await config.onLimit(ctx);\n        if (result) return result;\n      }\n\n      ctx.json(\n        {\n          error: \"Rate limit exceeded\",\n          retryAfter: resetIn,\n        },\n        429,\n      );\n      return;\n    }\n\n    return next();\n  };\n}\n\nfunction assertAtomicRateLimitStorage(storage: RateLimitStorage): void {\n  if (!storage || typeof storage.increment !== \"function\") {\n    throw new UnsupportedRateLimitStorageError();\n  }\n}\n\nfunction assertRateLimitIncrementResult(\n  result: RateLimitIncrementResult,\n): asserts result is RateLimitIncrementResult {\n  if (\n    !result ||\n    !Number.isSafeInteger(result.count) ||\n    result.count <= 0 ||\n    !Number.isFinite(result.resetAt) ||\n    result.resetAt <= 0\n  ) {\n    throw new TypeError(\n      \"RateLimitStorage.increment() must return a positive integer count and a resetAt timestamp.\",\n    );\n  }\n}\n\nfunction setRateLimitHeaders(\n  ctx: MiddlewareContext,\n  limit: number,\n  remaining: number,\n  resetIn: number,\n  windowSeconds: number,\n): void {\n  setMiddlewareResponseHeader(ctx, \"RateLimit-Policy\", `\"farm\";q=${limit};w=${windowSeconds}`);\n  setMiddlewareResponseHeader(ctx, \"RateLimit\", `\"farm\";r=${remaining};t=${resetIn}`);\n}\n\nfunction setMiddlewareResponseHeader(ctx: MiddlewareContext, name: string, value: string): void {\n  ctx.headers.set(name, value);\n  if (!ctx.response.headersSent && !ctx.response.writableEnded) {\n    ctx.response.setHeader(name, value);\n  }\n}\n\nfunction matchPattern(pattern: string | RegExp, pathname: string): boolean {\n  if (pattern instanceof RegExp) {\n    return pattern.test(pathname);\n  }\n\n  // Protect glob stars, escape every regex metacharacter, then restore the\n  // globs — otherwise \"/promo.html\" also matches \"/promoXhtml\" and a pattern\n  // containing \"(\" throws at request time.\n  const regexPattern = pattern\n    .replace(/\\*\\*/g, \"__DOUBLE_STAR__\")\n    .replace(/\\*/g, \"__SINGLE_STAR__\")\n    .replace(/[.+?^${}()|[\\]\\\\/]/g, \"\\\\$&\")\n    .replace(/__DOUBLE_STAR__/g, \".*\")\n    .replace(/__SINGLE_STAR__/g, \"[^/]+\");\n\n  const regex = new RegExp(`^${regexPattern}$`);\n  return regex.test(pathname);\n}\n\nclass MiddlewareChainImpl implements MiddlewareChain {\n  private handlers: MiddlewareFunction[] = [];\n  public config?: MiddlewareConfig;\n  private basePath: string;\n\n  constructor(basePath = \"/\") {\n    this.basePath =\n      basePath === \"/\" ? \"/\" : basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n  }\n\n  /**\n   * Set the base path for this middleware chain (called by manager when loading)\n   */\n  setBasePath(path: string): void {\n    this.basePath = path === \"/\" ? \"/\" : path.endsWith(\"/\") ? path.slice(0, -1) : path;\n  }\n\n  use(fn: MiddlewareFunction): MiddlewareChain {\n    this.handlers.push(fn);\n    return this;\n  }\n\n  /**\n   * Normalize a path pattern - auto-scope to middleware route\n   * If middleware is in /contact, then \"/api\" becomes \"/contact/api\"\n   */\n  private normalizePattern(pattern: string): string {\n    // If we're at root middleware, use pattern as-is\n    if (this.basePath === \"/\") {\n      // Ensure it starts with /\n      return pattern.startsWith(\"/\") ? pattern : `/${pattern}`;\n    }\n\n    // For route-specific middleware, always scope the pattern\n    // Remove leading / from pattern if present, then join with basePath\n    const cleanPattern = pattern.startsWith(\"/\") ? pattern.slice(1) : pattern;\n    return `${this.basePath}/${cleanPattern}`;\n  }\n\n  /**\n   * Conditionally run middleware based on a condition.\n   * Only supports boolean values or functions that evaluate to boolean.\n   * Route-based string matching has been removed - use function conditions instead.\n   *\n   * @example\n   * .when(true, (ctx, next) => { ... })  // Always run\n   * .when((ctx) => ctx.data.get('flag'), (ctx, next) => { ... })  // Conditional\n   * .when((ctx) => ctx.pathname === '/contact', (ctx, next) => { ... })  // Path-based condition\n   */\n  when(\n    condition: boolean | ((ctx: MiddlewareContext) => boolean),\n    fn: MiddlewareFunction | ((chain: MiddlewareChain) => void),\n  ): MiddlewareChain {\n    const conditionalMiddleware: MiddlewareFunction = async (ctx, next) => {\n      // Evaluate condition - boolean or function\n      const shouldRun = typeof condition === \"function\" ? condition(ctx) : condition;\n\n      if (!shouldRun) {\n        return next();\n      }\n\n      if (typeof fn === \"function\" && fn.length === 2) {\n        return (fn as MiddlewareFunction)(ctx, next);\n      } else {\n        const subChain = middleware(this.basePath);\n        (fn as (chain: MiddlewareChain) => void)(subChain);\n        const { handlers } = subChain.build();\n\n        let index = 0;\n        let returnedResponse: Response | undefined;\n        const executeNext = async (): Promise<MiddlewareResult> => {\n          if (index < handlers.length) {\n            const handler = handlers[index++];\n            const result = await handler(ctx, executeNext);\n            if (result instanceof Response) {\n              returnedResponse = result;\n              return result;\n            }\n          } else {\n            const result = await next();\n            if (result instanceof Response) {\n              returnedResponse = result;\n              return result;\n            }\n          }\n          return returnedResponse;\n        };\n\n        return executeNext();\n      }\n    };\n    this.handlers.push(conditionalMiddleware);\n    return this;\n  }\n\n  rateLimit(config: RateLimitConfig): MiddlewareChain {\n    this.handlers.push(createRateLimitMiddleware(config));\n    return this;\n  }\n\n  redirect(source: string, destination: string, permanent = false): MiddlewareChain {\n    const redirectMiddleware: MiddlewareFunction = async (ctx, next) => {\n      // Auto-scope source pattern to the middleware route\n      const normalizedSource = this.normalizePattern(source);\n      if (matchPattern(normalizedSource, ctx.pathname)) {\n        ctx.redirect(destination, permanent ? 308 : 307);\n        return;\n      }\n      return next();\n    };\n\n    this.handlers.push(redirectMiddleware);\n    return this;\n  }\n\n  /**\n   * Rewrite the current middleware route to a new destination.\n   * Since each middleware file is route-specific, the source is automatically\n   * the middleware's route, so you only need to specify the destination.\n   *\n   * @param destination - The destination path to rewrite to\n   * @param condition - Optional boolean or function that evaluates to boolean.\n   *                    If provided and evaluates to false, rewrite is skipped.\n   *                    If not provided, rewrite always happens.\n   *\n   * @example\n   * // In /contact/middleware.ts\n   * .rewrite('/about')  // Always rewrites /contact to /about\n   * .rewrite('/about', true)  // Always rewrites\n   * .rewrite('/about', false)  // Never rewrites\n   * .rewrite('/about', (ctx) => ctx.data.get('shouldRewrite'))  // Conditional rewrite\n   */\n  rewrite(\n    destination: string,\n    condition?: boolean | ((ctx: MiddlewareContext) => boolean),\n  ): MiddlewareChain {\n    const rewriteMiddleware: MiddlewareFunction = async (ctx, next) => {\n      // Check condition if provided\n      if (condition !== undefined) {\n        const shouldRewrite = typeof condition === \"function\" ? condition(ctx) : condition;\n        if (!shouldRewrite) {\n          return next();\n        }\n      }\n\n      // If this middleware is route-specific (not root)\n      if (this.basePath !== \"/\") {\n        // Rewrite when the pathname exactly matches this middleware's route\n        // This rewrites the entire route (e.g., /contact -> /about)\n        if (ctx.pathname === this.basePath) {\n          ctx.rewrite(destination);\n        }\n        // Also handle sub-routes: rewrite /contact/something to /destination/something\n        else if (ctx.pathname.startsWith(this.basePath + \"/\")) {\n          const subPath = ctx.pathname.slice(this.basePath.length);\n          const newPath = destination + subPath;\n          ctx.rewrite(newPath);\n        }\n      } else {\n        // For root middleware, this is less common\n        // Only rewrite if pathname matches exactly (edge case)\n        ctx.rewrite(destination);\n      }\n      return next();\n    };\n\n    this.handlers.push(rewriteMiddleware);\n    return this;\n  }\n\n  build() {\n    return {\n      handlers: this.handlers,\n      config: this.config,\n    };\n  }\n}\n\n/**\n * Get rate limit status for a key\n * @example\n * const status = await getRateLimitStatus('user:123', 100, storage);\n */\nexport async function getRateLimitStatus(\n  key: string,\n  limit: number,\n  storage: RateLimitStorage = defaultRateLimitStorage,\n): Promise<RateLimitStatus> {\n  if (!Number.isSafeInteger(limit) || limit <= 0) {\n    throw new TypeError(\"Rate limit must be a positive safe integer.\");\n  }\n  assertAtomicRateLimitStorage(storage);\n  if (typeof storage.get !== \"function\") {\n    throw new TypeError(\n      \"getRateLimitStatus() requires a RateLimitStorage adapter that implements get(key).\",\n    );\n  }\n  const record = await storage.get(key);\n\n  if (!record) {\n    return {\n      requests: 0,\n      limit,\n      remaining: limit,\n      resetIn: null,\n      resetAt: null,\n      isLimited: false,\n    };\n  }\n  assertRateLimitIncrementResult(record);\n\n  const now = Date.now();\n\n  if (record.resetAt && now > record.resetAt) {\n    return {\n      requests: 0,\n      limit,\n      remaining: limit,\n      resetIn: null,\n      resetAt: null,\n      isLimited: false,\n    };\n  }\n\n  const requests = record.count || 0;\n  const remaining = Math.max(0, limit - requests);\n  const isLimited = requests >= limit;\n\n  let resetIn: number | null = null;\n  let resetAt: Date | null = null;\n\n  if (record.resetAt) {\n    const remainingMs = record.resetAt - now;\n    resetIn = remainingMs > 0 ? Math.ceil(remainingMs / 1000) : null;\n    resetAt = new Date(record.resetAt);\n  }\n\n  return {\n    requests,\n    limit,\n    remaining,\n    resetIn,\n    resetAt,\n    isLimited,\n  };\n}\n\nexport function middleware(basePath = \"/\"): MiddlewareChain {\n  return new MiddlewareChainImpl(basePath);\n}\n","/**\n * Middleware helper utilities for pages\n */\n\nimport type { MiddlewareProps } from \"../types\";\n\n/**\n * Unwrap middleware data from PageProps\n *\n * @example\n * ```tsx\n * export default async function Page(props: PageProps) {\n *   const { user, stats } = await unwrapMiddleware(props.middleware, {\n *     user: null,\n *     stats: { views: 0, clicks: 0 }\n *   });\n *\n *   return <div>Welcome {user?.name}</div>;\n * }\n * ```\n */\nexport function unwrapMiddleware<T extends Record<string, any>>(\n  middleware: MiddlewareProps | undefined,\n  defaults?: Partial<T>,\n): Partial<T> {\n  if (!middleware) {\n    return (defaults || {}) as Partial<T>;\n  }\n\n  const result: any = { ...defaults };\n\n  for (const [key, value] of middleware.data) {\n    result[key] = value;\n  }\n\n  return result as Partial<T>;\n}\n\n/**\n * Get a single value from middleware with a default\n *\n * @example\n * ```tsx\n * export default async function Page(props: PageProps) {\n *   const user = await getMiddlewareValue(props.middleware, 'user', null);\n *   return <div>Welcome {user?.name || 'Guest'}</div>;\n * }\n * ```\n */\nexport function getFromMiddleware<T = any>(\n  middleware: MiddlewareProps | undefined,\n  key: string,\n  defaultValue?: T,\n): T | undefined {\n  if (!middleware) {\n    return defaultValue;\n  }\n\n  const value = middleware.data.get(key);\n  return value !== undefined ? value : defaultValue;\n}\n\n/**\n * Check if middleware data exists\n */\nexport function hasMiddlewareData(middleware: MiddlewareProps | undefined): boolean {\n  if (!middleware) return false;\n  return middleware.data.size > 0;\n}\n","/**\n * Standalone Vite middleware support used by Farm's RSC and API plugins.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { MiddlewareManager } from \"./manager\";\n\nexport interface FarmMiddlewarePluginOptions {\n  /** Source directory (default: `src`). */\n  srcDir?: string;\n  /** Enable debug logging. */\n  debug?: boolean;\n}\n\nfunction getMiddlewareAppDirectory(root: string, srcDir: string): string {\n  const sourceDirectory = path.join(root, srcDir);\n  const appDirectory = path.join(sourceDirectory, \"app\");\n  return fs.existsSync(appDirectory) ? appDirectory : sourceDirectory;\n}\n\nexport function farmMiddlewarePlugin(options: FarmMiddlewarePluginOptions = {}): Plugin {\n  const srcDir = options.srcDir ?? \"src\";\n  let manager: MiddlewareManager | null = null;\n  let discoveryComplete = false;\n  let discoveryPromise: Promise<void> | null = null;\n\n  const discover = async (server: ViteDevServer): Promise<void> => {\n    manager = new MiddlewareManager(getMiddlewareAppDirectory(server.config.root, srcDir), server);\n    await manager.discover();\n    discoveryComplete = true;\n  };\n\n  return {\n    name: \"@farm.js/core:middleware\",\n    enforce: \"pre\",\n\n    configureServer(server) {\n      discoveryPromise = discover(server);\n      void discoveryPromise.catch((error) => {\n        console.error(\"[FARM] Middleware discovery error:\", error);\n      });\n\n      const execute = async (\n        req: IncomingMessage,\n        res: ServerResponse,\n        _pathname?: string,\n        sharedData?: Map<string, any>,\n      ): Promise<boolean> => {\n        if (discoveryPromise) {\n          await discoveryPromise;\n        }\n\n        if (!manager) {\n          return false;\n        }\n\n        const handled = await manager.execute(req, res);\n        const middlewareData = (req as any).__FARM_MIDDLEWARE_DATA__;\n        if (sharedData && middlewareData instanceof Map) {\n          for (const [key, value] of middlewareData) {\n            sharedData.set(key, value);\n          }\n        }\n        return handled;\n      };\n\n      (server as any).__farmMiddleware__ = {\n        execute,\n        getMiddlewares: () => manager?.getMiddlewares() ?? [],\n        isReady: () => discoveryComplete,\n        waitForDiscovery: () => discoveryPromise,\n      };\n    },\n\n    async handleHotUpdate({ file, server, modules }) {\n      if (!/^middleware\\.[tj]sx?$/.test(path.basename(file))) {\n        return;\n      }\n\n      for (const module of modules) {\n        server.moduleGraph.invalidateModule(module);\n      }\n\n      await manager?.reload();\n      server.ws.send({ type: \"full-reload\", path: \"*\" });\n      return [];\n    },\n  };\n}\n"],"mappings":"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","names":["next","path","middleware"]}