{"version":3,"sources":["../src/index.ts","../src/query.ts","../src/bodyParser.ts","../src/router.ts"],"sourcesContent":["// src/index.ts\r\nimport type {\r\n  RequestListener,\r\n  IncomingMessage,\r\n  ServerResponse,\r\n} from \"node:http\";\r\nimport type {\r\n  App,\r\n  Handler,\r\n  AnyParams,\r\n  Response,\r\n  Request,\r\n  ErrorHandler,\r\n} from \"./types.js\";\r\nimport { parseQueryFromURL } from \"./query.js\";\r\nimport { jsonParser } from \"./bodyParser.js\";\r\nimport { Router, type Route, norm, join } from \"./router.js\";\r\n\r\n/* ---------- types ---------- */\r\ntype JsonRes = Response<Record<string, unknown>>;\r\n\r\ntype Method = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\" | \"HEAD\" | \"OPTIONS\";\r\ntype ImplHandler = (\r\n  req: any,\r\n  res: any,\r\n  next: (err?: any) => void\r\n) => void | Promise<void>;\r\ntype ImplErrorHandler = (\r\n  err: any,\r\n  req: any,\r\n  res: any,\r\n  next: (err?: any) => void\r\n) => void | Promise<void>;\r\ntype RouteEntry = { pattern: string; chain: ImplHandler[] };\r\ntype MethodMap = Map<string, RouteEntry[]>; // method -> list of (pattern, chain)\r\ntype NodeReqBits = {}; // internal additions if you want\r\n\r\n/* ---------- tiny helpers ---------- */\r\n\r\n// guardMw stages the prefixMatch test before invoking the real middleware\r\n// part of the helpers for router.use(prefix, fn)\r\nfunction guardMw(prefix: string, fn: Handler): ImplHandler {\r\n  const impl = asImpl(fn);\r\n  const p = norm(prefix);\r\n  return (req, res, next) => {\r\n    const urlPath = (req.url || \"/\").split(\"?\")[0];\r\n    if (prefixMatch(urlPath, p)) return impl(req, res, next);\r\n    next(); // skip if outside prefix\r\n  };\r\n}\r\n\r\n// guardErrMw stages the prefixMatch test before invoking the real error middleware\r\n// part of the helpers for router.use(prefix, fn)\r\nfunction guardErrMw(prefix: string, fn: ErrorHandler): ImplErrorHandler {\r\n  const impl = asImplErr(fn);\r\n  const p = norm(prefix);\r\n  return (err, req, res, next) => {\r\n    const urlPath = (req.url || \"/\").split(\"?\")[0];\r\n    if (prefixMatch(urlPath, p)) return impl(err, req, res, next);\r\n    next(err); // keep propagating error if outside prefix\r\n  };\r\n}\r\n\r\nfunction getChildRoutes(r: Router) {\r\n  return (r as any).exportRoutes\r\n    ? (r as any).exportRoutes()\r\n    : (r as any).routes ?? [];\r\n}\r\nfunction getChildMws(r: Router) {\r\n  return (r as any).exportMiddlewares\r\n    ? (r as any).exportMiddlewares()\r\n    : (r as any).middlewares ?? [];\r\n}\r\n\r\nfunction prefixMatch(urlPath: string, prefix: string) {\r\n  return urlPath === prefix || urlPath.startsWith(prefix + \"/\");\r\n}\r\n\r\nfunction ensureTable(routes: MethodMap, method: Method): RouteEntry[] {\r\n  let table = routes.get(method);\r\n  if (!table) {\r\n    table = [];\r\n    routes.set(method, table);\r\n  }\r\n  return table;\r\n}\r\nfunction mountRouter(prefix: string, child: Router, routes: MethodMap) {\r\n  const p = norm(prefix);\r\n  for (const cr of getChildRoutes(child)) {\r\n    const full = join(p, cr.path);\r\n    const table = ensureTable(routes, cr.method as Method);\r\n    table.push({ pattern: full, chain: cr.handlers.map(asImpl) });\r\n  }\r\n}\r\n\r\nfunction asImpl(h: Handler<any, any, any>): ImplHandler {\r\n  return (req, res, next) => {\r\n    try {\r\n      const maybe = (h as any)(req, res, next);\r\n      if (maybe && typeof maybe.then === \"function\")\r\n        (maybe as Promise<void>).catch(next);\r\n    } catch (e) {\r\n      next(e);\r\n    }\r\n  };\r\n}\r\nfunction asImplErr(h: ErrorHandler<any, any, any>): ImplErrorHandler {\r\n  return (err, req, res, next) => {\r\n    try {\r\n      const maybe = (h as any)(err, req, res, next);\r\n      if (maybe && typeof maybe.then === \"function\")\r\n        (maybe as Promise<void>).catch(next);\r\n    } catch (e) {\r\n      next(e);\r\n    }\r\n  };\r\n}\r\n\r\n/** Compare a stored pattern (e.g. \"/u/:id\" or \"/u/:id?\") with a URL path, returning params or null */\r\nfunction extractParams(\r\n  pattern: string,\r\n  urlPath: string\r\n): Record<string, string> | null {\r\n  if (!pattern || !urlPath) return null;\r\n  const q = urlPath.indexOf(\"?\");\r\n  const path = q === -1 ? urlPath : urlPath.slice(0, q);\r\n\r\n  const pSegs = pattern.split(\"/\").filter(Boolean);\r\n  const uSegs = path.split(\"/\").filter(Boolean);\r\n  if (pSegs.length !== uSegs.length) return null;\r\n\r\n  const out: Record<string, string> = {};\r\n  for (let i = 0; i < pSegs.length; i++) {\r\n    const p = pSegs[i]!;\r\n    const u = uSegs[i]!;\r\n    if (p.startsWith(\":\")) {\r\n      const isOptional = p.endsWith(\"?\");\r\n      const name = isOptional ? p.slice(1, -1) : p.slice(1);\r\n      try {\r\n        out[name] = decodeURIComponent(u);\r\n      } catch {\r\n        out[name] = u;\r\n      }\r\n    } else if (p !== u) {\r\n      return null;\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\n/** Compute Allow header for the current URL by checking which methods have a matching pattern */\r\nfunction allowedMethods(routes: MethodMap, url: string): Method[] {\r\n  const allow: Method[] = [];\r\n  (\r\n    [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"] as Method[]\r\n  ).forEach((m) => {\r\n    const table = routes.get(m);\r\n    if (!table) return;\r\n    for (const { pattern } of table) {\r\n      if (extractParams(pattern, url)) {\r\n        allow.push(m);\r\n        break;\r\n      }\r\n    }\r\n  });\r\n  // RFC says GET implies HEAD is allowed if GET exists; we include HEAD explicitly anyway\r\n  return Array.from(new Set(allow));\r\n}\r\n\r\n/* ---------- response augmentation (safe) ---------- */\r\nfunction augmentRes<T>(res: Response<T>): Response<T> {\r\n  const anyRes = res as any;\r\n\r\n  // Preserve original end so helpers can call it\r\n  if (!anyRes._rm_end && anyRes.end) anyRes._rm_end = anyRes.end.bind(anyRes);\r\n  if (anyRes.statusCode == null) anyRes.statusCode = 200;\r\n\r\n  anyRes.status ??= ((code: number) => {\r\n    anyRes.statusCode = code;\r\n    return res;\r\n  }) as Response<T>[\"status\"];\r\n\r\n  anyRes.set ??= ((name: string, value: string) => {\r\n    anyRes.setHeader?.(name, value);\r\n    return res;\r\n  }) as Response<T>[\"set\"];\r\n\r\n  anyRes.json ??= ((obj: T) => {\r\n    if (!anyRes.getHeader?.(\"Content-Type\")) {\r\n      anyRes.setHeader?.(\"Content-Type\", \"application/json; charset=utf-8\");\r\n    }\r\n    const payload = obj === undefined ? \"\" : JSON.stringify(obj as any);\r\n    (anyRes._rm_end ?? anyRes.end).call(anyRes, payload);\r\n  }) as Response<T>[\"json\"];\r\n\r\n  anyRes.send ??= ((body: unknown) => {\r\n    if (\r\n      body !== null &&\r\n      typeof body === \"object\" &&\r\n      !Buffer?.isBuffer?.(body) &&\r\n      !(body instanceof Uint8Array)\r\n    ) {\r\n      return anyRes.json(body);\r\n    }\r\n    if (\r\n      typeof body === \"string\" ||\r\n      Buffer?.isBuffer?.(body) ||\r\n      body instanceof Uint8Array\r\n    ) {\r\n      if (!anyRes.getHeader?.(\"Content-Type\")) {\r\n        anyRes.setHeader?.(\"Content-Type\", \"text/plain; charset=utf-8\");\r\n      }\r\n      anyRes._rm_end?.(body as any);\r\n    } else {\r\n      // fall back to JSON for non-string-ish values\r\n      anyRes.json?.(body);\r\n    }\r\n  }) as Response<T>[\"send\"];\r\n\r\n  // Provide a no-arg end that defers to original\r\n  anyRes.end = anyRes.end ?? ((() => anyRes._rm_end?.()) as Response<T>[\"end\"]);\r\n\r\n  return res;\r\n}\r\n\r\n/* ---------- app factory ---------- */\r\nfunction createApp(): App {\r\n  const routes: MethodMap = new Map(); // method -> [{pattern, chain}]\r\n  const middlewares: ImplHandler[] = [];\r\n  const errorMiddlewares: ImplErrorHandler[] = [];\r\n  let fileserver: ImplHandler | null = null;\r\n\r\n  const handle: RequestListener<\r\n    typeof IncomingMessage,\r\n    typeof ServerResponse\r\n  > = (req, res) => {\r\n    const reqX = req as Request<any, AnyParams> & NodeReqBits;\r\n    const resX = res as Response<any>;\r\n\r\n    // augment request/response\r\n    (reqX as any).query = parseQueryFromURL(req.url ?? \"/\");\r\n    augmentRes(resX);\r\n\r\n    const method = (req.method as Method) ?? \"GET\";\r\n    const url = req.url ?? \"/\";\r\n\r\n    // Find matching chain + params under method\r\n    const methodTable = routes.get(method);\r\n    let matchedChain: ImplHandler[] = [];\r\n    let matchedParams: Record<string, string> | null = null;\r\n    let matchedPattern: string | null = null;\r\n\r\n    const scanTable = (table?: RouteEntry[]) => {\r\n      if (!table) return;\r\n      for (const { pattern, chain } of table) {\r\n        const p = extractParams(pattern, url);\r\n        if (p) {\r\n          matchedChain = chain;\r\n          matchedParams = p;\r\n          matchedPattern = pattern;\r\n          break;\r\n        }\r\n      }\r\n    };\r\n\r\n    scanTable(methodTable);\r\n\r\n    // HEAD inherits GET if no explicit HEAD\r\n    if (!matchedChain.length && method === \"HEAD\") {\r\n      scanTable(routes.get(\"GET\"));\r\n    }\r\n\r\n    // Build execution stack\r\n    const stack: ImplHandler[] = [...middlewares, ...matchedChain];\r\n\r\n    // Inject params\r\n    if (matchedParams) {\r\n      (reqX as any).params = matchedParams;\r\n    }\r\n\r\n    let i = 0;\r\n\r\n    const finalizeNotFound = () => {\r\n      (resX as JsonRes).status(404).json({ error: \"Not Found\" });\r\n    };\r\n\r\n    const finalizeError = (e: any) => {\r\n      if (!(resX as any).headersSent) {\r\n        (resX as any).statusCode = e?.statusCode ?? 500;\r\n        (resX as any).json?.({ error: e?.message ?? \"Internal Server Error\" });\r\n      }\r\n    };\r\n\r\n    const runErrors = (err: any) => {\r\n      let j = 0;\r\n      const nextErr = (e?: any) => {\r\n        const layer = errorMiddlewares[j++];\r\n        if (!layer) return finalizeError(e ?? err);\r\n        try {\r\n          const maybe = layer(e ?? err, reqX, resX, nextErr);\r\n          if (maybe && typeof (maybe as any).then === \"function\") {\r\n            (maybe as Promise<void>).catch(nextErr);\r\n          }\r\n        } catch (inner) {\r\n          nextErr(inner);\r\n        }\r\n      };\r\n      nextErr(err);\r\n    };\r\n\r\n    const next = (err?: any) => {\r\n      if (err) return runErrors(err);\r\n      if ((resX as any).headersSent) return;\r\n\r\n      const layer = stack[i++];\r\n      if (layer) {\r\n        try {\r\n          const maybe = layer(reqX as any, resX as any, next);\r\n          if (maybe && typeof (maybe as any).then === \"function\") {\r\n            (maybe as Promise<void>).catch(next);\r\n          }\r\n        } catch (e) {\r\n          next(e);\r\n        }\r\n        return;\r\n      }\r\n\r\n      // OPTIONS helper (only if the URL matches *some* registered pattern)\r\n      if (method === \"OPTIONS\") {\r\n        const allow = allowedMethods(routes, url);\r\n        if (allow.length) {\r\n          (resX as any).set?.(\"Allow\", allow.join(\", \"));\r\n          // No body for 204\r\n          return (resX as Response<void>).status?.(204 as any).end?.();\r\n        }\r\n      }\r\n\r\n      // 405 if this path exists under other methods\r\n      if (!matchedChain.length) {\r\n        const allow = allowedMethods(routes, url);\r\n        if (allow.length) {\r\n          (resX as any).set?.(\"Allow\", allow.join(\", \"));\r\n          (resX as any).statusCode = 405;\r\n          return (resX as any).json?.({\r\n            error: \"Method Not Allowed\",\r\n            allow,\r\n          });\r\n        }\r\n      }\r\n\r\n      // Fileserver fallthrough for GET/HEAD\r\n      if ((method === \"GET\" || method === \"HEAD\") && fileserver) {\r\n        return fileserver(reqX as any, resX as any, finalizeNotFound);\r\n      }\r\n\r\n      return finalizeNotFound();\r\n    };\r\n\r\n    next();\r\n  };\r\n\r\n  // callable app\r\n  const app = handle as unknown as App;\r\n\r\n  function addVerb(method: Method) {\r\n    (app as any)[method.toLowerCase()] = (\r\n      path: string,\r\n      ...handlers: Handler[]\r\n    ) => {\r\n      const chain = handlers.map(asImpl);\r\n      const table = routes.get(method) ?? [];\r\n      table.push({ pattern: path, chain });\r\n      routes.set(method, table);\r\n      return app;\r\n    };\r\n  }\r\n  (\r\n    [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"] as const\r\n  ).forEach(addVerb);\r\n\r\n  // NORMAL middlewares only + router mount\r\n  (app as any).use = (first: any, ...rest: any[]) => {\r\n    // 1) use(fn[, fn...]) — global normal middlewares\r\n    if (\r\n      typeof first === \"function\" &&\r\n      (rest.length === 0 || typeof rest[0] === \"function\")\r\n    ) {\r\n      const fns = [first, ...rest].filter(Boolean);\r\n      for (const fn of fns) {\r\n        // assume fn: Handler\r\n        middlewares.push(asImpl(fn)); // no error-detection here\r\n      }\r\n      return app;\r\n    }\r\n\r\n    // 2) use(prefix, router) — mount child router (kept on .use)\r\n    if (typeof first === \"string\" && rest[0] instanceof Router) {\r\n      if (rest.length !== 1)\r\n        throw new Error(\"use(prefix, router) expects exactly 2 args\");\r\n      mountRouter(first, rest[0] as Router, routes);\r\n      return app;\r\n    }\r\n\r\n    // 3) use(prefix, fn[, fn...]) — prefix-scoped normal middlewares\r\n    if (typeof first === \"string\" && typeof rest[0] === \"function\") {\r\n      const prefix = first;\r\n      const fns = rest.filter(Boolean);\r\n      for (const fn of fns) {\r\n        middlewares.push(guardMw(prefix, fn)); // wrap with prefix guard\r\n      }\r\n      return app;\r\n    }\r\n\r\n    throw new Error(\r\n      \"use(fn...), use(prefix, fn...), or use(prefix, router) expected\"\r\n    );\r\n  };\r\n\r\n  // ERROR middlewares only\r\n  (app as any).useError = (first: any, ...rest: any[]) => {\r\n    // 1) useError(fn[, fn...]) — global error middlewares\r\n    if (\r\n      typeof first === \"function\" &&\r\n      (rest.length === 0 || typeof rest[0] === \"function\")\r\n    ) {\r\n      const fns = [first, ...rest].filter(Boolean);\r\n      for (const fn of fns) {\r\n        // assume fn: ErrorHandler\r\n        errorMiddlewares.push(asImplErr(fn));\r\n      }\r\n      return app;\r\n    }\r\n\r\n    // 2) useError(prefix, fn[, fn...]) — prefix-scoped error middlewares\r\n    if (typeof first === \"string\" && typeof rest[0] === \"function\") {\r\n      const prefix = first;\r\n      const fns = rest.filter(Boolean);\r\n      for (const fn of fns) {\r\n        errorMiddlewares.push(guardErrMw(prefix, fn)); // wrap with prefix guard\r\n      }\r\n      return app;\r\n    }\r\n\r\n    throw new Error(\"useError(fn...) or useError(prefix, fn...) expected\");\r\n  };\r\n\r\n  // fileserver (GET/HEAD fallthrough)\r\n  (app as any).fileserver = (fs: Function) => {\r\n    fileserver = asImpl(fs as any);\r\n    return app;\r\n  };\r\n\r\n  // optional explicit handle\r\n  (app as any).handle = handle;\r\n\r\n  // built-in JSON body parser middleware\r\n  (app as any).jsonParser = jsonParser;\r\n\r\n  return app;\r\n}\r\n\r\n/* re-export your public types */\r\nexport type {\r\n  App,\r\n  AppType,\r\n  Registrar,\r\n  Handler,\r\n  ErrorHandler,\r\n  Next,\r\n  Request,\r\n  Response,\r\n  AnyParams,\r\n  PathParams,\r\n  JsonOptions,\r\n  ByteLimit,\r\n} from \"./types.js\";\r\n\r\nexport { Router }; // re-export for named import\r\nexport default createApp; // default export is the app factory\r\n","// src/query.ts\r\nexport type Query = Record<string, string | string[]>;\r\n\r\nexport function parseQueryFromURL(urlOrPath: string): Query {\r\n  const u = new URL(urlOrPath, \"http://local\"); // path-only safe\r\n  return searchParamsToObject(u.searchParams);\r\n}\r\n\r\nexport function searchParamsToObject(sp: URLSearchParams): Query {\r\n  const out: Query = {};\r\n  for (const [rawKey, val] of sp) {\r\n    // Support a[]=1&a[]=2 => { a: [\"1\",\"2\"] }\r\n    const key = rawKey.endsWith(\"[]\") ? rawKey.slice(0, -2) : rawKey;\r\n    if (key in out) {\r\n      const cur = out[key];\r\n      if (Array.isArray(cur)) cur.push(val);\r\n      else out[key] = [cur as string, val];\r\n    } else {\r\n      // first seen\r\n      out[key] = rawKey.endsWith(\"[]\") ? [val] : val;\r\n    }\r\n  }\r\n  return out;\r\n}\r\n","type ByteLimit = number | `${number}${\"b\" | \"kb\" | \"mb\" | \"gb\"}`;\r\ninterface JsonOptions {\r\n  limit?: ByteLimit; // default '1mb'\r\n  type?: string | RegExp; // default /application\\/json/i\r\n  strict?: boolean; // reject primitives if true (default false)\r\n  keepRaw?: boolean; // attach req.rawBody as Buffer\r\n  onError?: (err: Error, req: any, res: any, next: any) => void; // custom error\r\n}\r\n\r\nfunction parseLimit(l?: ByteLimit): number {\r\n  if (typeof l === \"number\") return l;\r\n  const str = (l ?? \"1mb\").toString().toLowerCase();\r\n  const m = str.match(/^(\\d+(?:\\.\\d+)?)(b|kb|mb|gb)?$/);\r\n  const n = parseFloat(m?.[1] ?? \"1\");\r\n  const unit = m?.[2] ?? \"mb\";\r\n  const mult =\r\n    unit === \"gb\"\r\n      ? 1 << 30\r\n      : unit === \"mb\"\r\n      ? 1 << 20\r\n      : unit === \"kb\"\r\n      ? 1 << 10\r\n      : 1;\r\n  return Math.floor(n * mult);\r\n}\r\n\r\nexport function jsonParser(opts: JsonOptions = {}) {\r\n  const limit = parseLimit(opts.limit);\r\n  const matcher = opts.type ?? /application\\/json/i;\r\n\r\n  return (req: any, res: any, next: any) => {\r\n    if (req.body !== undefined) return next(); // already parsed\r\n    const ct = String(req.headers[\"content-type\"] || \"\");\r\n    if (\r\n      !(typeof matcher === \"string\" ? ct.includes(matcher) : matcher.test(ct))\r\n    )\r\n      return next();\r\n\r\n    let size = 0;\r\n    const chunks: Buffer[] = [];\r\n    let aborted = false;\r\n\r\n    req.on(\"aborted\", () => {\r\n      aborted = true;\r\n    });\r\n    req.on(\"data\", (c: Buffer) => {\r\n      size += c.length;\r\n      if (size > limit) {\r\n        req.removeAllListeners(\"data\");\r\n        req.removeAllListeners(\"end\");\r\n        res.statusCode = 413; // Payload Too Large\r\n        return res.end(\"Payload too large\");\r\n      }\r\n      chunks.push(c);\r\n    });\r\n\r\n    req.on(\"end\", () => {\r\n      if (aborted) return; // client disconnected\r\n      try {\r\n        const buf = Buffer.concat(chunks, size);\r\n        if (opts.keepRaw) req.rawBody = buf;\r\n        const text = buf.length ? buf.toString(\"utf8\") : \"\";\r\n        const val = text ? JSON.parse(text) : {};\r\n        if (opts.strict && (val === null || typeof val !== \"object\")) {\r\n          res.statusCode = 400;\r\n          return res.end(\"Invalid JSON (strict)\");\r\n        }\r\n        req.body = val;\r\n        next();\r\n      } catch (err: any) {\r\n        if (opts.onError) return opts.onError(err, req, res, next);\r\n        res.statusCode = 400;\r\n        res.end(\"Invalid JSON\");\r\n      }\r\n    });\r\n  };\r\n}\r\n","import { type Handler } from \"./types.js\";\r\n\r\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\r\nexport type Route = { method: Method; path: string; handlers: Handler[] };\r\nexport type Mw = { prefix: string | null; handlers: Handler[] };\r\n\r\nexport const norm = (p: string) =>\r\n  p === \"\" ? \"/\" : p.replace(/\\/+$/, \"\") || \"/\";\r\nexport const join = (a: string, b: string) =>\r\n  (a === \"/\" ? \"\" : norm(a)) + (b.startsWith(\"/\") ? b : \"/\" + b);\r\n\r\nexport class Router {\r\n  routes: Route[] = [];\r\n  middlewares: Mw[] = [];\r\n\r\n  private add(method: Method, path: string, ...handlers: Handler[]) {\r\n    this.routes.push({ method, path: norm(path), handlers });\r\n    return this;\r\n  }\r\n\r\n  get(path: string, ...h: Handler[]) {\r\n    return this.add(\"GET\", path, ...h);\r\n  }\r\n  post(path: string, ...h: Handler[]) {\r\n    return this.add(\"POST\", path, ...h);\r\n  }\r\n  put(path: string, ...h: Handler[]) {\r\n    return this.add(\"PUT\", path, ...h);\r\n  }\r\n  patch(path: string, ...h: Handler[]) {\r\n    return this.add(\"PATCH\", path, ...h);\r\n  }\r\n  del(path: string, ...h: Handler[]) {\r\n    return this.add(\"DELETE\", path, ...h);\r\n  }\r\n\r\n  // Overloads\r\n  use(fn: Handler): this;\r\n  use(prefix: string, fn: Handler): this;\r\n  use(prefix: string, child: Router): this;\r\n  use(prefixOrFn: string | Handler, maybe?: Router | Handler) {\r\n    // use(fn) — global middleware\r\n    if (typeof prefixOrFn === \"function\") {\r\n      this.middlewares.push({ prefix: null, handlers: [prefixOrFn] });\r\n      return this;\r\n    }\r\n\r\n    const prefix = norm(prefixOrFn);\r\n\r\n    // use(prefix, childRouter) — copy child routes & middleware under prefix\r\n    if (maybe instanceof Router) {\r\n      for (const r of maybe.routes) {\r\n        this.routes.push({\r\n          method: r.method,\r\n          path: join(prefix, r.path),\r\n          handlers: r.handlers,\r\n        });\r\n      }\r\n      for (const m of maybe.middlewares) {\r\n        const effective = m.prefix ? join(prefix, m.prefix) : prefix;\r\n        this.middlewares.push({ prefix: effective, handlers: m.handlers });\r\n      }\r\n      return this;\r\n    }\r\n\r\n    // use(prefix, fn) — prefix-scoped middleware\r\n    if (typeof maybe === \"function\") {\r\n      this.middlewares.push({ prefix, handlers: [maybe] });\r\n      return this;\r\n    }\r\n\r\n    throw new Error(\r\n      \"use(fn), use(prefix, fn), or use(prefix, childRouter) expected\"\r\n    );\r\n  }\r\n\r\n  exportRoutes() {\r\n    return this.routes.slice();\r\n  }\r\n  exportMiddlewares() {\r\n    return this.middlewares.slice();\r\n  }\r\n}\r\n\r\nexport default Router;\r\n"],"mappings":"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","names":[]}