routup 4.0.2 → 5.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/README.md +87 -134
  2. package/dist/bun.cjs +66 -0
  3. package/dist/bun.cjs.map +1 -0
  4. package/dist/bun.d.cts +8 -0
  5. package/dist/bun.d.mts +8 -0
  6. package/dist/bun.mjs +13 -0
  7. package/dist/bun.mjs.map +1 -0
  8. package/dist/cloudflare.cjs +66 -0
  9. package/dist/cloudflare.cjs.map +1 -0
  10. package/dist/cloudflare.d.cts +8 -0
  11. package/dist/cloudflare.d.mts +8 -0
  12. package/dist/cloudflare.mjs +13 -0
  13. package/dist/cloudflare.mjs.map +1 -0
  14. package/dist/deno.cjs +66 -0
  15. package/dist/deno.cjs.map +1 -0
  16. package/dist/deno.d.cts +8 -0
  17. package/dist/deno.d.mts +8 -0
  18. package/dist/deno.mjs +13 -0
  19. package/dist/deno.mjs.map +1 -0
  20. package/dist/generic.cjs +66 -0
  21. package/dist/generic.cjs.map +1 -0
  22. package/dist/generic.d.cts +8 -0
  23. package/dist/generic.d.mts +8 -0
  24. package/dist/generic.mjs +13 -0
  25. package/dist/generic.mjs.map +1 -0
  26. package/dist/index-9K5FcIb3.d.cts +786 -0
  27. package/dist/index-B6F5CzQy.d.mts +786 -0
  28. package/dist/node.cjs +70 -0
  29. package/dist/node.cjs.map +1 -0
  30. package/dist/node.d.cts +11 -0
  31. package/dist/node.d.mts +11 -0
  32. package/dist/node.mjs +16 -0
  33. package/dist/node.mjs.map +1 -0
  34. package/dist/service-worker.cjs +66 -0
  35. package/dist/service-worker.cjs.map +1 -0
  36. package/dist/service-worker.d.cts +10 -0
  37. package/dist/service-worker.d.mts +10 -0
  38. package/dist/service-worker.mjs +13 -0
  39. package/dist/service-worker.mjs.map +1 -0
  40. package/dist/src-C789deGE.mjs +1599 -0
  41. package/dist/src-C789deGE.mjs.map +1 -0
  42. package/dist/src-Ca2_b8P0.cjs +1939 -0
  43. package/dist/src-Ca2_b8P0.cjs.map +1 -0
  44. package/package.json +76 -36
  45. package/dist/adapters/index.d.ts +0 -3
  46. package/dist/adapters/node/index.d.ts +0 -1
  47. package/dist/adapters/node/module.d.ts +0 -6
  48. package/dist/adapters/raw/header.d.ts +0 -3
  49. package/dist/adapters/raw/index.d.ts +0 -3
  50. package/dist/adapters/raw/module.d.ts +0 -4
  51. package/dist/adapters/raw/type.d.ts +0 -18
  52. package/dist/adapters/web/index.d.ts +0 -2
  53. package/dist/adapters/web/module.d.ts +0 -4
  54. package/dist/adapters/web/type.d.ts +0 -3
  55. package/dist/constants.d.ts +0 -42
  56. package/dist/dispatcher/event/dispatch.d.ts +0 -4
  57. package/dist/dispatcher/event/error.d.ts +0 -5
  58. package/dist/dispatcher/event/index.d.ts +0 -5
  59. package/dist/dispatcher/event/is.d.ts +0 -3
  60. package/dist/dispatcher/event/module.d.ts +0 -56
  61. package/dist/dispatcher/event/types.d.ts +0 -9
  62. package/dist/dispatcher/index.d.ts +0 -2
  63. package/dist/dispatcher/type.d.ts +0 -4
  64. package/dist/error/create.d.ts +0 -11
  65. package/dist/error/index.d.ts +0 -3
  66. package/dist/error/is.d.ts +0 -2
  67. package/dist/error/module.d.ts +0 -3
  68. package/dist/handler/constants.d.ts +0 -5
  69. package/dist/handler/core/define.d.ts +0 -4
  70. package/dist/handler/core/index.d.ts +0 -2
  71. package/dist/handler/core/types.d.ts +0 -10
  72. package/dist/handler/error/define.d.ts +0 -4
  73. package/dist/handler/error/index.d.ts +0 -2
  74. package/dist/handler/error/types.d.ts +0 -11
  75. package/dist/handler/index.d.ts +0 -7
  76. package/dist/handler/is.d.ts +0 -4
  77. package/dist/handler/module.d.ts +0 -23
  78. package/dist/handler/types-base.d.ts +0 -10
  79. package/dist/handler/types.d.ts +0 -4
  80. package/dist/hook/constants.d.ts +0 -8
  81. package/dist/hook/index.d.ts +0 -3
  82. package/dist/hook/module.d.ts +0 -19
  83. package/dist/hook/types.d.ts +0 -5
  84. package/dist/index.cjs +0 -2314
  85. package/dist/index.cjs.map +0 -1
  86. package/dist/index.d.ts +0 -11
  87. package/dist/index.mjs +0 -2235
  88. package/dist/index.mjs.map +0 -1
  89. package/dist/path/index.d.ts +0 -3
  90. package/dist/path/matcher.d.ts +0 -11
  91. package/dist/path/type.d.ts +0 -7
  92. package/dist/path/utils.d.ts +0 -2
  93. package/dist/plugin/index.d.ts +0 -2
  94. package/dist/plugin/is.d.ts +0 -2
  95. package/dist/plugin/types.d.ts +0 -23
  96. package/dist/request/helpers/cache.d.ts +0 -2
  97. package/dist/request/helpers/env.d.ts +0 -6
  98. package/dist/request/helpers/header-accept-charset.d.ts +0 -3
  99. package/dist/request/helpers/header-accept-encoding.d.ts +0 -3
  100. package/dist/request/helpers/header-accept-language.d.ts +0 -3
  101. package/dist/request/helpers/header-accept.d.ts +0 -3
  102. package/dist/request/helpers/header-content-type.d.ts +0 -2
  103. package/dist/request/helpers/header.d.ts +0 -4
  104. package/dist/request/helpers/hostname.d.ts +0 -7
  105. package/dist/request/helpers/http2.d.ts +0 -2
  106. package/dist/request/helpers/index.d.ts +0 -17
  107. package/dist/request/helpers/ip.d.ts +0 -7
  108. package/dist/request/helpers/mount-path.d.ts +0 -3
  109. package/dist/request/helpers/negotiator.d.ts +0 -3
  110. package/dist/request/helpers/params.d.ts +0 -5
  111. package/dist/request/helpers/path.d.ts +0 -2
  112. package/dist/request/helpers/protocol.d.ts +0 -8
  113. package/dist/request/helpers/router.d.ts +0 -3
  114. package/dist/request/index.d.ts +0 -3
  115. package/dist/request/module.d.ts +0 -3
  116. package/dist/request/types.d.ts +0 -12
  117. package/dist/response/helpers/cache.d.ts +0 -7
  118. package/dist/response/helpers/event-stream/factory.d.ts +0 -3
  119. package/dist/response/helpers/event-stream/index.d.ts +0 -2
  120. package/dist/response/helpers/event-stream/module.d.ts +0 -17
  121. package/dist/response/helpers/event-stream/types.d.ts +0 -24
  122. package/dist/response/helpers/event-stream/utils.d.ts +0 -2
  123. package/dist/response/helpers/gone.d.ts +0 -3
  124. package/dist/response/helpers/header-attachment.d.ts +0 -2
  125. package/dist/response/helpers/header-content-type.d.ts +0 -2
  126. package/dist/response/helpers/header.d.ts +0 -4
  127. package/dist/response/helpers/index.d.ts +0 -16
  128. package/dist/response/helpers/send-accepted.d.ts +0 -2
  129. package/dist/response/helpers/send-created.d.ts +0 -2
  130. package/dist/response/helpers/send-file.d.ts +0 -17
  131. package/dist/response/helpers/send-format.d.ts +0 -7
  132. package/dist/response/helpers/send-redirect.d.ts +0 -2
  133. package/dist/response/helpers/send-stream.d.ts +0 -3
  134. package/dist/response/helpers/send-web-blob.d.ts +0 -3
  135. package/dist/response/helpers/send-web-response.d.ts +0 -3
  136. package/dist/response/helpers/send.d.ts +0 -2
  137. package/dist/response/helpers/utils.d.ts +0 -2
  138. package/dist/response/index.d.ts +0 -3
  139. package/dist/response/module.d.ts +0 -3
  140. package/dist/response/types.d.ts +0 -3
  141. package/dist/router/constants.d.ts +0 -9
  142. package/dist/router/index.d.ts +0 -1
  143. package/dist/router/module.d.ts +0 -89
  144. package/dist/router/types.d.ts +0 -7
  145. package/dist/router/utils.d.ts +0 -3
  146. package/dist/router-options/index.d.ts +0 -2
  147. package/dist/router-options/module.d.ts +0 -4
  148. package/dist/router-options/transform.d.ts +0 -2
  149. package/dist/router-options/type.d.ts +0 -41
  150. package/dist/types.d.ts +0 -9
  151. package/dist/utils/cookie.d.ts +0 -1
  152. package/dist/utils/etag/index.d.ts +0 -3
  153. package/dist/utils/etag/module.d.ts +0 -11
  154. package/dist/utils/etag/type.d.ts +0 -15
  155. package/dist/utils/etag/utils.d.ts +0 -2
  156. package/dist/utils/index.d.ts +0 -13
  157. package/dist/utils/is-instance.d.ts +0 -1
  158. package/dist/utils/method.d.ts +0 -3
  159. package/dist/utils/mime.d.ts +0 -2
  160. package/dist/utils/next.d.ts +0 -2
  161. package/dist/utils/object.d.ts +0 -3
  162. package/dist/utils/path.d.ts +0 -5
  163. package/dist/utils/promise.d.ts +0 -1
  164. package/dist/utils/stream.d.ts +0 -6
  165. package/dist/utils/trust-proxy/index.d.ts +0 -2
  166. package/dist/utils/trust-proxy/module.d.ts +0 -2
  167. package/dist/utils/trust-proxy/type.d.ts +0 -2
  168. package/dist/utils/url.d.ts +0 -7
  169. package/dist/utils/web.d.ts +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-C789deGE.mjs","names":[],"sources":["../src/constants.ts","../src/utils/header.ts","../src/utils/object.ts","../src/utils/etag/module.ts","../src/utils/etag/utils.ts","../src/utils/trust-proxy/module.ts","../src/utils/is-instance.ts","../src/utils/mime.ts","../src/utils/method.ts","../src/utils/path.ts","../src/utils/url.ts","../src/error/is.ts","../src/error/module.ts","../src/error/create.ts","../src/event/module.ts","../src/handler/constants.ts","../src/hook/constants.ts","../src/hook/module.ts","../src/path/matcher.ts","../src/path/utils.ts","../src/response/helpers/cache.ts","../src/response/helpers/event-stream/utils.ts","../src/response/helpers/event-stream/module.ts","../src/response/helpers/gone.ts","../src/response/helpers/header.ts","../src/response/helpers/utils.ts","../src/response/helpers/header-attachment.ts","../src/response/helpers/header-content-type.ts","../src/router-options/module.ts","../src/response/to-response.ts","../src/response/helpers/send-accepted.ts","../src/response/helpers/send-created.ts","../src/response/helpers/send-file.ts","../src/request/helpers/header.ts","../src/request/helpers/negotiator.ts","../src/request/helpers/header-accept.ts","../src/response/helpers/send-format.ts","../src/response/helpers/send-redirect.ts","../src/response/helpers/send-stream.ts","../src/handler/module.ts","../src/handler/core/define.ts","../src/handler/error/define.ts","../src/handler/helpers/from-node-handler.ts","../src/handler/is.ts","../src/request/helpers/body.ts","../src/request/helpers/cache.ts","../src/request/helpers/header-accept-charset.ts","../src/request/helpers/header-accept-encoding.ts","../src/request/helpers/header-accept-language.ts","../src/request/helpers/header-content-type.ts","../src/request/helpers/hostname.ts","../src/request/helpers/ip.ts","../src/request/helpers/protocol.ts","../src/plugin/is.ts","../src/router-options/normalize.ts","../src/router/constants.ts","../src/router/utils.ts","../src/router/module.ts"],"sourcesContent":["export enum MethodName {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n DELETE = 'DELETE',\n OPTIONS = 'OPTIONS',\n HEAD = 'HEAD',\n}\n\nexport enum HeaderName {\n ACCEPT = 'accept',\n ACCEPT_CHARSET = 'accept-charset',\n ACCEPT_ENCODING = 'accept-encoding',\n ACCEPT_LANGUAGE = 'accept-language',\n ACCEPT_RANGES = 'accept-ranges',\n ALLOW = 'allow',\n CACHE_CONTROL = 'cache-control',\n CONTENT_DISPOSITION = 'content-disposition',\n CONTENT_ENCODING = 'content-encoding',\n CONTENT_LENGTH = 'content-length',\n CONTENT_RANGE = 'content-range',\n CONTENT_TYPE = 'content-type',\n CONNECTION = 'connection',\n COOKIE = 'cookie',\n ETag = 'etag',\n HOST = 'host',\n IF_MODIFIED_SINCE = 'if-modified-since',\n IF_NONE_MATCH = 'if-none-match',\n LAST_MODIFIED = 'last-modified',\n LOCATION = 'location',\n RANGE = 'range',\n RATE_LIMIT_LIMIT = 'ratelimit-limit',\n RATE_LIMIT_REMAINING = 'ratelimit-remaining',\n RATE_LIMIT_RESET = 'ratelimit-reset',\n RETRY_AFTER = 'retry-after',\n SET_COOKIE = 'set-cookie',\n TRANSFER_ENCODING = 'transfer-encoding',\n X_ACCEL_BUFFERING = 'x-accel-buffering',\n X_FORWARDED_HOST = 'x-forwarded-host',\n X_FORWARDED_FOR = 'x-forwarded-for',\n X_FORWARDED_PROTO = 'x-forwarded-proto',\n}\n","export function sanitizeHeaderValue(value: string) : string {\n return value.replace(/[\\r\\n]/g, '');\n}","export function isObject(item: unknown) : item is Record<string, any> {\n return (\n !!item &&\n typeof item === 'object' &&\n !Array.isArray(item)\n );\n}\n\nexport function setProperty(\n record: Record<PropertyKey, any>,\n property: PropertyKey,\n value: any,\n): void {\n (record as any)[property] = value;\n}\n\nexport function getProperty<T = any>(\n req: Record<PropertyKey, any>,\n property: PropertyKey,\n): T {\n return (req as any)[property];\n}\n","import { Buffer } from 'node:buffer';\nimport { subtle } from 'uncrypto';\nimport { type Stats } from 'node:fs';\nimport { isObject } from '../object';\nimport type { EtagOptions } from './type';\n\n/**\n * Determine if object is a Stats object.\n *\n * @param {object} obj\n * @return {boolean}\n * @api private\n */\nfunction isStatsObject(obj: unknown) : obj is Stats {\n // quack quack\n return isObject(obj) &&\n 'ctime' in obj && Object.prototype.toString.call(obj.ctime) === '[object Date]' &&\n 'mtime' in obj && Object.prototype.toString.call(obj.mtime) === '[object Date]' &&\n 'ino' in obj && typeof obj.ino === 'number' &&\n 'size' in obj && typeof obj.size === 'number';\n}\n\nasync function sha1(str: string) : Promise<string> {\n const enc = new TextEncoder();\n const hash = await subtle.digest('SHA-1', enc.encode(str));\n\n return btoa(String.fromCharCode(...new Uint8Array(hash)));\n}\n\n/**\n * Generate an ETag.\n */\nexport async function generateETag(input: string | Buffer | Stats) : Promise<string> {\n if (isStatsObject(input)) {\n const mtime = input.mtime.getTime().toString(16);\n const size = input.size.toString(16);\n\n return `\"${size}-${mtime}\"`;\n }\n\n if (input.length === 0) {\n // fast-path empty\n return '\"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk\"';\n }\n\n const entity = Buffer.isBuffer(input) ?\n input.toString('utf-8') :\n input;\n\n // compute hash of entity\n const hash = await sha1(entity);\n\n return `\"${entity.length.toString(16)}-${hash.substring(0, 27)}\"`;\n}\n\n/**\n * Create a simple ETag.\n */\nexport async function createEtag(\n input: string | Buffer | Stats,\n options?: EtagOptions,\n) : Promise<string> {\n options = options || {};\n\n const weak = typeof options.weak === 'boolean' ?\n options.weak :\n isStatsObject(input);\n\n // generate entity tag\n const tag = await generateETag(input);\n\n return weak ?\n `W/${tag}` :\n tag;\n}\n","import { Buffer } from 'node:buffer';\nimport { merge } from 'smob';\nimport { isObject } from '../object';\nimport { createEtag } from './module';\nimport type { EtagFn, EtagOptions } from './type';\n\nexport function buildEtagFn(input?: boolean | EtagOptions | EtagFn) : EtagFn {\n if (typeof input === 'function') {\n return input;\n }\n\n input = input ?? true;\n\n if (input === false) {\n return () => Promise.resolve(undefined);\n }\n\n let options : EtagOptions = { weak: true };\n\n if (isObject(input)) {\n options = merge(input, options);\n }\n\n return async (body: any, encoding?: BufferEncoding, size?: number) => {\n const buff = Buffer.isBuffer(body) ?\n body :\n Buffer.from(body, encoding);\n\n if (typeof options.threshold !== 'undefined') {\n size = size ?? Buffer.byteLength(buff);\n\n if (size <= options.threshold) {\n return undefined;\n }\n }\n\n return createEtag(buff, options);\n };\n}\n","import { compile } from 'proxy-addr';\nimport type { TrustProxyFn } from './type';\n\nexport function buildTrustProxyFn(\n input?: boolean | number | string | string[] | TrustProxyFn,\n) : TrustProxyFn {\n if (typeof input === 'function') {\n return input;\n }\n\n if (input === true) {\n return () => true;\n }\n\n if (typeof input === 'number') {\n return (_address, hop) => hop < (input as number);\n }\n\n if (typeof input === 'string') {\n input = input.split(',')\n .map((value) => value.trim());\n }\n\n return compile(input || []);\n}\n","import { isObject } from './object';\n\nexport function isInstance(\n input: unknown,\n sym: symbol,\n) {\n if (!isObject(input)) {\n return false;\n }\n\n return (input as { '@instanceof': symbol })['@instanceof'] === sym;\n}\n","import { get, getType } from 'mime-explorer';\n\nexport function getMimeType(type: string) : string | undefined {\n if (type.includes('/')) {\n return type;\n }\n\n return getType(type);\n}\n\nexport function getCharsetForMimeType(type: string) : string | undefined {\n if ((/^text\\/|^application\\/(javascript|json)/).test(type)) {\n return 'utf-8';\n }\n\n const meta = get(type);\n if (\n meta &&\n meta.charset\n ) {\n return meta.charset.toLowerCase();\n }\n\n return undefined;\n}\n","import type { MethodName } from '../constants';\n\nexport function toMethodName(input: string | undefined) : MethodName | undefined;\nexport function toMethodName(input: string | undefined, alt: MethodName) : MethodName;\nexport function toMethodName(\n input?: string,\n alt?: MethodName,\n) : MethodName | undefined {\n if (input) {\n return input.toUpperCase() as MethodName;\n }\n\n return alt;\n}\n","/**\n * Based on https://github.com/unjs/pathe v1.1.1 (055f50a6f1131f4e5c56cf259dd8816168fba329)\n */\n\nfunction normalizeWindowsPath(input = '') {\n if (!input || !input.includes('\\\\')) {\n return input;\n }\n\n return input.replace(/\\\\/g, '/');\n}\n\nconst EXTNAME_RE = /.(\\.[^./]+)$/;\nexport function extname(input: string) {\n const match = EXTNAME_RE.exec(normalizeWindowsPath(input));\n return (match && match[1]) || '';\n}\n\nexport function basename(input: string, extension? :string) {\n const lastSegment = normalizeWindowsPath(input)\n .split('/')\n .pop();\n\n if (!lastSegment) {\n return input;\n }\n\n return extension && lastSegment.endsWith(extension) ?\n lastSegment.slice(0, -extension.length) :\n lastSegment;\n}\n","const TRAILING_SLASH_RE = /\\/$|\\/\\?/;\n\nexport function hasTrailingSlash(input = '', queryParams = false): boolean {\n if (!queryParams) {\n return input.endsWith('/');\n }\n\n return TRAILING_SLASH_RE.test(input);\n}\n\nexport function withoutTrailingSlash(input = '', queryParams = false): string {\n if (!queryParams) {\n return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || '/';\n }\n\n if (!hasTrailingSlash(input, true)) {\n return input || '/';\n }\n\n const [s0, ...s] = input.split('?');\n\n return (s0!.slice(0, -1) || '/') + (s.length ? `?${s.join('?')}` : '');\n}\n\nexport function withTrailingSlash(input = '', queryParams = false): string {\n if (!queryParams) {\n return input.endsWith('/') ? input : (`${input}/`);\n }\n\n if (hasTrailingSlash(input, true)) {\n return input || '/';\n }\n\n const [s0, ...s] = input.split('?');\n return `${s0}/${s.length ? `?${s.join('?')}` : ''}`;\n}\n\nexport function hasLeadingSlash(input = ''): boolean {\n return input.startsWith('/');\n}\n\nexport function withoutLeadingSlash(input = ''): string {\n return (hasLeadingSlash(input) ? input.substring(1) : input) || '/';\n}\n\nexport function withLeadingSlash(input = ''): string {\n return hasLeadingSlash(input) ? input : `/${input}`;\n}\n\nexport function cleanDoubleSlashes(input = ''): string {\n if (input.includes('://')) {\n return input.split('://')\n .map((str) => cleanDoubleSlashes(str))\n .join('://');\n }\n\n return input.replace(/\\/+/g, '/');\n}\n","import { isHTTPError } from '@ebec/http';\nimport type { RoutupError } from './module';\n\nexport function isError(input: unknown) : input is RoutupError {\n if (!isHTTPError(input)) {\n return false;\n }\n\n return (input as unknown as { name?: string }).name === 'RoutupError';\n}\n","import { HTTPError } from '@ebec/http';\nimport type { HTTPErrorInput } from '@ebec/http';\n\nexport type { HTTPErrorInput };\n\nexport class RoutupError extends HTTPError {\n constructor(input: HTTPErrorInput = {}) {\n super(input);\n this.name = 'RoutupError';\n }\n}\n","import { isHTTPError } from '@ebec/http';\nimport type { HTTPErrorInput } from '@ebec/http';\nimport { isObject } from '../utils';\nimport { isError } from './is';\nimport { RoutupError } from './module';\n\nfunction isNativeError(input: unknown): input is Error {\n return isObject(input) &&\n typeof (input as Record<string, unknown>).message === 'string' &&\n typeof (input as Record<string, unknown>).name === 'string';\n}\n\n/**\n * Create an internal error object by\n * - an existing RoutupError (returned as-is)\n * - an HTTPError (wrapped into a RoutupError preserving status)\n * - an Error (wrapped preserving message and cause)\n * - an options object (statusCode, statusMessage, etc.)\n * - a message string\n *\n * @param input\n */\nexport function createError(input: HTTPErrorInput | unknown) : RoutupError {\n if (isError(input)) {\n return input;\n }\n\n if (typeof input === 'string') {\n return new RoutupError(input);\n }\n\n if (isHTTPError(input)) {\n return new RoutupError({\n message: input.message,\n code: input.code,\n statusCode: input.statusCode,\n statusMessage: input.statusMessage,\n redirectURL: input.redirectURL,\n cause: input,\n });\n }\n\n if (isNativeError(input)) {\n return new RoutupError({\n message: input.message,\n cause: input,\n });\n }\n\n if (!isObject(input)) {\n return new RoutupError();\n }\n\n const options = { ...input as Record<string, unknown> };\n if (options.cause === undefined) {\n options.cause = input;\n }\n\n return new RoutupError(options as HTTPErrorInput);\n}\n","import { FastURL } from 'srvx';\nimport type { RoutupError } from '../error/module.ts';\nimport type { IRoutupEvent, RoutupRequest, RoutupResponse } from './types.ts';\n\nexport class RoutupEvent implements IRoutupEvent {\n readonly request: RoutupRequest;\n\n params: Record<string, any>;\n\n path: string;\n\n readonly method: string;\n\n mountPath: string;\n\n error?: RoutupError;\n\n routerPath: number[];\n\n /**\n * Collected allowed methods (for OPTIONS).\n */\n methodsAllowed: string[];\n\n readonly store: Record<string | symbol, unknown>;\n\n protected _dispatched: boolean;\n\n protected _response?: RoutupResponse;\n\n /**\n * Cached parsed URL (avoids double-parsing).\n */\n protected _url: InstanceType<typeof FastURL>;\n\n protected _searchParams?: URLSearchParams;\n\n /**\n * Continuation function for middleware onion model.\n */\n _next?: () => Promise<Response | undefined>;\n\n /**\n * Whether _next has already been called (guard against double-invocation).\n */\n _nextCalled: boolean;\n\n /**\n * The cached result of the next handler.\n */\n _nextResult?: Promise<Response | undefined>;\n\n constructor(request: RoutupRequest) {\n this.request = request;\n this._url = new FastURL(request.url);\n this.method = request.method;\n this.path = this._url.pathname;\n this.mountPath = '/';\n this.params = {};\n this.routerPath = [];\n this.methodsAllowed = [];\n this.store = Object.create(null);\n this._dispatched = false;\n this._nextCalled = false;\n }\n\n get headers(): Headers {\n return this.request.headers;\n }\n\n get searchParams(): URLSearchParams {\n if (!this._searchParams) {\n this._searchParams = new URLSearchParams(this._url.search);\n }\n return this._searchParams;\n }\n\n get response(): RoutupResponse {\n if (!this._response) {\n this._response = { status: 200, headers: new Headers() };\n }\n\n return this._response;\n }\n\n get dispatched(): boolean {\n return this._dispatched;\n }\n\n set dispatched(value: boolean) {\n this._dispatched = value;\n }\n\n async next(): Promise<Response | undefined> {\n if (this._nextCalled) {\n return this._nextResult;\n }\n this._nextCalled = true;\n\n if (this._next) {\n this._nextResult = this._next();\n }\n\n return this._nextResult;\n }\n}\n","export enum HandlerType {\n CORE = 'core',\n ERROR = 'error',\n}\n\nexport const HandlerSymbol = /* @__PURE__ */ Symbol.for('Handler');\n","export enum HookName {\n REQUEST = 'request',\n RESPONSE = 'response',\n ERROR = 'error',\n\n CHILD_MATCH = 'childMatch',\n CHILD_DISPATCH_BEFORE = 'childDispatchBefore',\n CHILD_DISPATCH_AFTER = 'childDispatchAfter',\n}\n","import type { IRoutupEvent } from '../event/index.ts';\nimport type { RoutupError } from '../error/module.ts';\nimport { HookName } from './constants.ts';\nimport type {\n HookDefaultListener,\n HookErrorListener,\n HookListener,\n HookUnsubscribeFn,\n} from './types.ts';\n\nexport class HookManager {\n protected items: Record<string, HookListener[]>;\n\n // --------------------------------------------------\n\n constructor() {\n this.items = {};\n }\n\n // --------------------------------------------------\n\n addListener(\n name: `${HookName}`,\n fn: HookListener,\n ): HookUnsubscribeFn {\n this.items[name] = this.items[name] || [];\n this.items[name].push(fn);\n\n return () => {\n this.removeListener(name, fn);\n };\n }\n\n removeListener(name: `${HookName}`): void;\n\n removeListener(name: `${HookName}`, fn: HookListener): void;\n\n removeListener(name: `${HookName}`, fn?: HookListener): void {\n if (!this.items[name]) {\n return;\n }\n\n if (typeof fn === 'undefined') {\n delete this.items[name];\n return;\n }\n\n if (typeof fn === 'function') {\n const index = this.items[name].indexOf(fn);\n if (index !== -1) {\n this.items[name].splice(index, 1);\n }\n }\n\n if (this.items[name].length === 0) {\n delete this.items[name];\n }\n }\n\n // --------------------------------------------------\n\n async trigger(\n name: `${HookName}`,\n event: IRoutupEvent,\n ): Promise<void> {\n if (!this.items[name] || this.items[name].length === 0) {\n return;\n }\n\n try {\n for (let i = 0; i < this.items[name].length; i++) {\n const listener = this.items[name][i]!;\n await this.triggerListener(name, event, listener);\n\n if (event.dispatched) {\n if (event.error) {\n event.error = undefined;\n }\n return;\n }\n }\n } catch (e) {\n event.error = e as RoutupError;\n\n if (!this.isErrorListenerHook(name)) {\n await this.trigger(HookName.ERROR, event);\n\n if (event.dispatched) {\n if (event.error) {\n event.error = undefined;\n }\n }\n }\n }\n }\n\n private triggerListener(name: `${HookName}`, event: IRoutupEvent, listener: HookListener) {\n if (this.isErrorListenerHook(name)) {\n if (event.error) {\n return (listener as HookErrorListener)(event);\n }\n return undefined;\n }\n\n return (listener as HookDefaultListener)(event);\n }\n\n private isErrorListenerHook(input: `${HookName}`) {\n return input === HookName.ERROR;\n }\n}\n","import type { Key } from 'path-to-regexp';\nimport { pathToRegexp } from 'path-to-regexp';\nimport type { Path, PathMatcherExecResult, PathMatcherOptions } from './type';\n\nfunction decodeParam(val: unknown) {\n /* istanbul ignore next */\n if (typeof val !== 'string' || val.length === 0) {\n return val;\n }\n\n try {\n return decodeURIComponent(val);\n } catch {\n return val;\n }\n}\n\nexport class PathMatcher {\n protected path: Path;\n\n protected regexp : RegExp;\n\n protected regexpKeys : Key[] = [];\n\n protected regexpOptions: PathMatcherOptions;\n\n constructor(path: Path, options?: PathMatcherOptions) {\n this.path = path;\n\n this.regexpOptions = options || {};\n const regexp = pathToRegexp(path, options);\n\n this.regexp = regexp.regexp;\n this.regexpKeys = regexp.keys;\n }\n\n test(path: string) {\n return this.regexp.test(path);\n }\n\n exec(path: string) : PathMatcherExecResult | undefined {\n if (\n this.path === '/' &&\n this.regexpOptions.end === false\n ) {\n return {\n path: '/',\n params: Object.create(null),\n };\n }\n\n const match = this.regexp.exec(path);\n\n if (!match) {\n return undefined;\n }\n\n const params : Record<string, unknown> = Object.create(null);\n\n for (let i = 1; i < match.length; i++) {\n const key = this.regexpKeys[i - 1];\n if (!key) continue;\n const prop = key.name;\n const val = decodeParam(match[i]);\n\n if (typeof val !== 'undefined') {\n params[prop] = val;\n }\n }\n\n return {\n path: match[0],\n params,\n };\n }\n}\n","import type { Path } from './type';\n\nexport function isPath(input: unknown): input is Path {\n return typeof input === 'string';\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\n\nexport type ResponseCacheHeadersOptions = {\n maxAge?: number,\n modifiedTime?: string | Date,\n cacheControls?: string[]\n};\n\nexport function setResponseCacheHeaders(event: IRoutupEvent, options?: ResponseCacheHeadersOptions) {\n options = options || {};\n\n const cacheControls = ['public'].concat(options.cacheControls || []);\n\n if (options.maxAge !== undefined) {\n cacheControls.push(`max-age=${+options.maxAge}`, `s-maxage=${+options.maxAge}`);\n }\n\n if (options.modifiedTime) {\n const modifiedTime = typeof options.modifiedTime === 'string' ?\n new Date(options.modifiedTime) :\n options.modifiedTime;\n\n event.response.headers.set('last-modified', modifiedTime.toUTCString());\n }\n\n event.response.headers.set('cache-control', cacheControls.join(', '));\n}\n","import type { EventStreamMessage } from './types';\n\nfunction stripNewlines(value: string) : string {\n return value.replace(/[\\r\\n]/g, '');\n}\n\nexport function serializeEventStreamMessage(message: EventStreamMessage): string {\n let result = '';\n\n if (message.id) {\n result += `id: ${stripNewlines(message.id)}\\n`;\n }\n\n if (message.event) {\n result += `event: ${stripNewlines(message.event)}\\n`;\n }\n\n if (\n typeof message.retry === 'number' &&\n Number.isInteger(message.retry)\n ) {\n result += `retry: ${message.retry}\\n`;\n }\n\n const lines = message.data.replace(/\\r/g, '').split('\\n');\n for (const line of lines) {\n result += `data: ${line}\\n`;\n }\n result += '\\n';\n\n return result;\n}\n","import { HeaderName } from '../../../constants.ts';\nimport type { IRoutupEvent } from '../../../event/index.ts';\nimport { RoutupError } from '../../../error/module.ts';\nimport type { EventStreamMessage } from './types.ts';\nimport { serializeEventStreamMessage } from './utils.ts';\n\nexport type EventStreamOptions = {\n maxMessageSize?: number,\n};\n\nexport type EventStreamHandle = {\n write(message: string | EventStreamMessage): void;\n end(): void;\n response: Response;\n};\n\nexport function createEventStream(\n event: IRoutupEvent,\n options?: EventStreamOptions,\n): EventStreamHandle {\n if (options?.maxMessageSize !== undefined) {\n if (!Number.isInteger(options.maxMessageSize) || options.maxMessageSize < 0) {\n throw new RoutupError('maxMessageSize must be a non-negative integer.');\n }\n }\n\n let controller: ReadableStreamDefaultController<Uint8Array>;\n let closed = false;\n const encoder = new TextEncoder();\n\n const stream = new ReadableStream<Uint8Array>({\n start(ctrl) {\n controller = ctrl;\n },\n cancel() {\n closed = true;\n },\n });\n\n const headers = new Headers(event.response.headers);\n headers.set(HeaderName.CONTENT_TYPE, 'text/event-stream');\n headers.set(HeaderName.CACHE_CONTROL, 'private, no-cache, no-store, no-transform, must-revalidate, max-age=0');\n headers.set(HeaderName.X_ACCEL_BUFFERING, 'no');\n headers.set(HeaderName.CONNECTION, 'keep-alive');\n\n const response = new Response(stream, {\n status: event.response.status,\n statusText: event.response.statusText,\n headers,\n });\n\n const handle: EventStreamHandle = {\n write(message: string | EventStreamMessage): void {\n if (closed) return;\n\n if (typeof message === 'string') {\n handle.write({ data: message });\n return;\n }\n\n const serialized = serializeEventStreamMessage(message);\n\n if (options?.maxMessageSize !== undefined) {\n const serializedSize = encoder.encode(serialized).byteLength;\n if (serializedSize > options.maxMessageSize) {\n return;\n }\n }\n\n controller.enqueue(encoder.encode(serialized));\n },\n\n end(): void {\n if (closed) return;\n\n closed = true;\n controller.close();\n },\n\n response,\n };\n\n return handle;\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\n\nexport function isResponseGone(event: IRoutupEvent) : boolean {\n return event.dispatched;\n}\n\nexport function setResponseGone(event: IRoutupEvent) {\n event.dispatched = true;\n}\n","import { sanitizeHeaderValue } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport function appendResponseHeader(\n event: IRoutupEvent,\n name: string,\n value: string | string[],\n) {\n const { headers } = event.response;\n\n if (Array.isArray(value)) {\n for (const v of value) {\n headers.append(name, sanitizeHeaderValue(v));\n }\n } else {\n headers.append(name, sanitizeHeaderValue(value));\n }\n}\n\nexport function appendResponseHeaderDirective(\n event: IRoutupEvent,\n name: string,\n value: string | string[],\n) {\n const { headers } = event.response;\n const existing = headers.get(name);\n\n if (!existing) {\n if (Array.isArray(value)) {\n headers.set(name, sanitizeHeaderValue(value.join('; ')));\n } else {\n headers.set(name, sanitizeHeaderValue(value));\n }\n return;\n }\n\n const directives = existing.split('; ');\n\n if (Array.isArray(value)) {\n directives.push(...value);\n } else {\n directives.push(value);\n }\n\n const unique = [...new Set(directives)];\n\n headers.set(name, sanitizeHeaderValue(unique.join('; ')));\n}\n","import { HeaderName } from '../../constants.ts';\nimport { extname, getCharsetForMimeType, getMimeType } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport function setResponseContentTypeByFileName(event: IRoutupEvent, fileName: string) {\n const ext = extname(fileName);\n if (ext) {\n let type = getMimeType(ext.substring(1));\n if (type) {\n const charset = getCharsetForMimeType(type);\n if (charset) {\n type += `; charset=${charset}`;\n }\n event.response.headers.set(HeaderName.CONTENT_TYPE, type);\n }\n }\n}\n","import { HeaderName } from '../../constants.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\nimport { setResponseContentTypeByFileName } from './utils.ts';\n\nfunction sanitizeFilename(filename: string) : string {\n return filename.replace(/[\\r\\n]/g, '');\n}\n\nfunction toAsciiFilename(filename: string) : string {\n // Strip non-ASCII characters and escape double quotes\n return filename.replace(/[^\\x20-\\x7E]/g, '').replace(/\"/g, '\\\\\"');\n}\n\nfunction encodeRfc5987(filename: string) : string {\n return encodeURIComponent(filename)\n .replace(/['()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n .replace(/\\*/g, '%2A');\n}\n\nexport function setResponseHeaderAttachment(event: IRoutupEvent, filename?: string) {\n if (typeof filename === 'string') {\n setResponseContentTypeByFileName(event, filename);\n }\n\n let disposition = 'attachment';\n\n if (filename) {\n const sanitized = sanitizeFilename(filename);\n const ascii = toAsciiFilename(sanitized);\n disposition += `; filename=\"${ascii}\"`;\n disposition += `; filename*=UTF-8''${encodeRfc5987(sanitized)}`;\n }\n\n event.response.headers.set(\n HeaderName.CONTENT_DISPOSITION,\n disposition,\n );\n}\n","import { HeaderName } from '../../constants.ts';\nimport { getMimeType } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport function setResponseHeaderContentType(event: IRoutupEvent, input: string, ifNotExists?: boolean) {\n if (ifNotExists) {\n const header = event.response.headers.get(HeaderName.CONTENT_TYPE);\n if (header) {\n return;\n }\n }\n\n const contentType = getMimeType(input);\n if (contentType) {\n event.response.headers.set(HeaderName.CONTENT_TYPE, contentType);\n }\n}\n","import { hasOwnProperty } from 'smob';\nimport { buildEtagFn } from '../utils';\nimport type { RouterOptions } from './type';\n\nconst defaults : RouterOptions = {\n trustProxy: () => false,\n subdomainOffset: 2,\n etag: buildEtagFn(),\n proxyIpMax: 0,\n};\n\nconst instances : Record<number, Partial<RouterOptions>> = {};\n\nexport function setRouterOptions(id: number, input: Partial<RouterOptions>) {\n instances[id] = input;\n}\n\nexport function unsetRouterOptions(id: number) {\n delete instances[id];\n}\n\nexport function findRouterOption<\n K extends keyof RouterOptions,\n>(key: K, path?: number[]) : RouterOptions[K] {\n if (!path || path.length === 0) {\n return defaults[key];\n }\n\n if (path.length > 0) {\n for (let i = path.length; i >= 0; i--) {\n const segment = path[i];\n if (\n segment !== undefined &&\n hasOwnProperty(instances, segment) &&\n typeof instances[segment]![key] !== 'undefined'\n ) {\n return instances[segment]![key] as RouterOptions[K];\n }\n }\n }\n\n return defaults[key];\n}\n","import type { IRoutupEvent } from '../event/index.ts';\nimport { findRouterOption } from '../router-options/module.ts';\n\nfunction stripWeakPrefix(etag: string): string {\n return etag.startsWith('W/') ? etag.slice(2) : etag;\n}\n\nasync function applyEtag(\n body: string,\n event: IRoutupEvent,\n headers: Headers,\n): Promise<Response | undefined> {\n const etagFn = findRouterOption('etag', event.routerPath);\n if (!etagFn) return undefined;\n\n const etag = await etagFn(body);\n if (!etag) return undefined;\n\n headers.set('etag', etag);\n\n const ifNoneMatch = event.headers.get('if-none-match');\n if (ifNoneMatch && (ifNoneMatch === '*' || ifNoneMatch.split(',').some((t) => stripWeakPrefix(t.trim()) === stripWeakPrefix(etag)))) {\n return new Response(null, {\n status: 304,\n headers,\n });\n }\n\n return undefined;\n}\n\nexport async function toResponse(\n value: unknown,\n event: IRoutupEvent,\n): Promise<Response | undefined> {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return new Response(null, {\n status: event.response.status,\n statusText: event.response.statusText,\n headers: event.response.headers,\n });\n }\n\n if (value instanceof Response) {\n return value;\n }\n\n const {\n status,\n headers,\n statusText,\n } = event.response;\n\n if (typeof value === 'string') {\n if (!headers.has('content-type')) {\n headers.set('content-type', 'text/plain; charset=utf-8');\n }\n\n const cached = await applyEtag(value, event, headers);\n if (cached) return cached;\n\n return new Response(value, {\n status,\n statusText,\n headers,\n });\n }\n\n if (value instanceof ArrayBuffer || value instanceof Uint8Array) {\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/octet-stream');\n }\n return new Response(value as BodyInit, {\n status,\n statusText,\n headers,\n });\n }\n\n if (value instanceof ReadableStream) {\n return new Response(value, {\n status,\n statusText,\n headers,\n });\n }\n\n if (value instanceof Blob) {\n if (!headers.has('content-type')) {\n headers.set('content-type', value.type || 'application/octet-stream');\n }\n return new Response(value, {\n status,\n statusText,\n headers,\n });\n }\n\n // object/array/number/boolean — JSON serialize\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json; charset=utf-8');\n }\n\n const json = JSON.stringify(value);\n\n const cached = await applyEtag(json, event, headers);\n if (cached) return cached;\n\n return new Response(json, {\n status,\n statusText,\n headers,\n });\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\nimport { toResponse } from '../to-response.ts';\n\nexport async function sendAccepted(event: IRoutupEvent, data?: unknown): Promise<Response> {\n event.response.status = 202;\n event.response.statusText = 'Accepted';\n event.dispatched = true;\n\n return await toResponse(data ?? '', event) as Response;\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\nimport { toResponse } from '../to-response.ts';\n\nexport async function sendCreated(event: IRoutupEvent, data?: unknown): Promise<Response> {\n event.response.status = 201;\n event.response.statusText = 'Created';\n event.dispatched = true;\n\n return await toResponse(data ?? '', event) as Response;\n}\n","import { HeaderName } from '../../constants.ts';\nimport { basename } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\nimport { setResponseHeaderAttachment } from './header-attachment.ts';\nimport { setResponseContentTypeByFileName } from './utils.ts';\n\nexport type SendFileContentOptions = {\n end?: number,\n start?: number;\n};\n\nexport type SendFileStats = {\n size?: number,\n mtime?: Date | number | string,\n name?: string\n};\n\nexport type SendFileOptions = {\n stats: () => Promise<SendFileStats> | SendFileStats,\n content: (\n options: SendFileContentOptions,\n ) => Promise<ReadableStream | ArrayBuffer | Uint8Array> | ReadableStream | ArrayBuffer | Uint8Array,\n attachment?: boolean,\n name?: string\n};\n\nexport async function sendFile(\n event: IRoutupEvent,\n options: SendFileOptions,\n) : Promise<Response> {\n const stats = await options.stats();\n\n const name = options.name || stats.name;\n const { headers } = event.response;\n\n if (name) {\n const fileName = basename(name);\n\n if (options.attachment) {\n const dispositionHeader = headers.get(HeaderName.CONTENT_DISPOSITION);\n if (!dispositionHeader) {\n setResponseHeaderAttachment(event, fileName);\n }\n } else {\n setResponseContentTypeByFileName(event, fileName);\n }\n }\n\n const contentOptions : SendFileContentOptions = {};\n let statusCode = event.response.status;\n\n if (stats.size) {\n const rangeHeader = event.headers.get(HeaderName.RANGE);\n if (rangeHeader) {\n const [x, y] = rangeHeader.replace('bytes=', '')\n .split('-') as [string, string];\n\n const parsedStart = Number.parseInt(x, 10);\n const parsedEnd = Number.parseInt(y, 10);\n\n contentOptions.start = Number.isFinite(parsedStart) && parsedStart >= 0 ? parsedStart : 0;\n contentOptions.end = Number.isFinite(parsedEnd) && parsedEnd >= 0 ?\n Math.min(parsedEnd, stats.size - 1) :\n stats.size - 1;\n\n if (\n contentOptions.start >= stats.size ||\n contentOptions.start > contentOptions.end\n ) {\n event.dispatched = true;\n const rangeHeaders = new Headers(headers);\n rangeHeaders.set(HeaderName.CONTENT_RANGE, `bytes */${stats.size}`);\n return new Response(null, {\n status: 416,\n statusText: event.response.statusText,\n headers: rangeHeaders,\n });\n }\n\n headers.set(HeaderName.CONTENT_RANGE, `bytes ${contentOptions.start}-${contentOptions.end}/${stats.size}`);\n headers.set(HeaderName.CONTENT_LENGTH, `${contentOptions.end - contentOptions.start + 1}`);\n statusCode = 206;\n } else {\n headers.set(HeaderName.CONTENT_LENGTH, `${stats.size}`);\n }\n\n headers.set(HeaderName.ACCEPT_RANGES, 'bytes');\n\n if (stats.mtime) {\n const mtime = new Date(stats.mtime);\n headers.set(HeaderName.LAST_MODIFIED, mtime.toUTCString());\n headers.set(HeaderName.ETag, `W/\"${stats.size}-${mtime.getTime()}\"`);\n }\n }\n\n const content = await options.content(contentOptions);\n\n event.dispatched = true;\n\n return new Response(content as BodyInit, {\n status: statusCode,\n statusText: event.response.statusText,\n headers,\n });\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\n\nexport function getRequestHeader(\n event: IRoutupEvent,\n name: string,\n) : string | null {\n return event.headers.get(name);\n}\n","import Negotiator from 'negotiator';\n\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nconst NEGOTIATOR_KEY = /* @__PURE__ */ Symbol.for('routup:negotiator');\n\nfunction headersToPlainObject(headers: Headers) : Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nexport function useRequestNegotiator(event: IRoutupEvent) : Negotiator {\n let value = event.store[NEGOTIATOR_KEY] as Negotiator | undefined;\n if (value) {\n return value;\n }\n\n value = new Negotiator({ headers: headersToPlainObject(event.headers) });\n event.store[NEGOTIATOR_KEY] = value;\n return value;\n}\n","import { HeaderName } from '../../constants.ts';\nimport { getMimeType } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\nimport { getRequestHeader } from './header.ts';\nimport { useRequestNegotiator } from './negotiator.ts';\n\nexport function getRequestAcceptableContentTypes(event: IRoutupEvent) : string[] {\n const negotiator = useRequestNegotiator(event);\n\n return negotiator.mediaTypes();\n}\n\nexport function getRequestAcceptableContentType(event: IRoutupEvent, input?: string | string[]) : string | undefined {\n input = input || [];\n\n const items = Array.isArray(input) ? input : [input];\n\n if (items.length === 0) {\n return getRequestAcceptableContentTypes(event).shift();\n }\n\n const header = getRequestHeader(event, HeaderName.ACCEPT);\n if (!header) {\n return items[0];\n }\n\n let polluted = false;\n const mimeTypes : string[] = [];\n for (const item of items) {\n const mimeType = getMimeType(item);\n if (mimeType) {\n mimeTypes.push(mimeType);\n } else {\n polluted = true;\n }\n }\n\n const negotiator = useRequestNegotiator(event);\n const matches = negotiator.mediaTypes(mimeTypes);\n if (matches.length > 0) {\n if (polluted) {\n return items[0];\n }\n\n return items[mimeTypes.indexOf(matches[0]!)];\n }\n\n return undefined;\n}\n","import { getRequestAcceptableContentType } from '../../request/helpers/header-accept.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\ntype ResponseFormatHandler = () => Response | unknown;\n\ntype ResponseFormats = {\n default: ResponseFormatHandler,\n [key: string]: ResponseFormatHandler,\n};\n\nexport function sendFormat(event: IRoutupEvent, input: ResponseFormats): Response | unknown | undefined {\n const {\n default: formatDefault,\n ...formats\n } = input;\n\n const contentTypes = Object.keys(formats);\n\n if (contentTypes.length === 0) {\n return formatDefault();\n }\n\n const contentType = getRequestAcceptableContentType(event, contentTypes);\n if (contentType && formats[contentType]) {\n return formats[contentType]();\n }\n\n return formatDefault();\n}\n","import { RoutupError } from '../../error/module.ts';\nimport { sanitizeHeaderValue } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nfunction escapeHtml(str: string) : string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction isAllowedRedirectUrl(location: string) : boolean {\n // Block protocol-relative URLs (e.g. //evil.com)\n if (location.startsWith('//')) {\n return false;\n }\n\n if (location.startsWith('/') || location.startsWith('.')) {\n return true;\n }\n\n try {\n const url = new URL(location);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return true;\n }\n}\n\nexport function sendRedirect(event: IRoutupEvent, location: string, statusCode = 302): Response {\n if (!isAllowedRedirectUrl(location)) {\n throw new RoutupError({\n statusCode: 400,\n statusMessage: 'Invalid redirect URL scheme.',\n });\n }\n\n const sanitizedLocation = sanitizeHeaderValue(location);\n const escapedLoc = escapeHtml(location);\n const html = `<!DOCTYPE html><html><head><meta http-equiv=\"refresh\" content=\"0; url=${escapedLoc}\"></head></html>`;\n\n const headers = new Headers(event.response.headers);\n headers.set('location', sanitizedLocation);\n headers.set('content-type', 'text/html; charset=utf-8');\n headers.delete('content-length');\n\n const response = new Response(html, {\n status: statusCode,\n statusText: event.response.statusText,\n headers,\n });\n\n event.dispatched = true;\n\n return response;\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\n\nexport function sendStream(event: IRoutupEvent, stream: ReadableStream): Response {\n event.dispatched = true;\n\n const {\n status,\n statusText,\n headers,\n } = event.response;\n\n return new Response(stream, {\n status,\n statusText,\n headers,\n });\n}\n","import { MethodName } from '../constants.ts';\nimport type { IDispatcher } from '../dispatcher/index.ts';\nimport type { RoutupEvent } from '../event/index.ts';\nimport { createError, isError } from '../error/index.ts';\nimport { HookManager, HookName } from '../hook/index.ts';\nimport type { Path } from '../path/index.ts';\nimport { PathMatcher } from '../path/index.ts';\nimport { toResponse } from '../response/index.ts';\nimport { toMethodName, withLeadingSlash } from '../utils/index.ts';\nimport { HandlerSymbol, HandlerType } from './constants.ts';\nimport type { HandlerConfig } from './types.ts';\n\nexport class Handler implements IDispatcher {\n readonly '@instanceof' = HandlerSymbol;\n\n protected config: HandlerConfig;\n\n protected hookManager: HookManager;\n\n protected pathMatcher: PathMatcher | undefined;\n\n protected _method: MethodName | undefined;\n\n // --------------------------------------------------\n\n constructor(handler: HandlerConfig) {\n this.config = handler;\n this.hookManager = new HookManager();\n\n this.mountHooks();\n this.setPath(handler.path);\n }\n\n // --------------------------------------------------\n\n get type() {\n return this.config.type;\n }\n\n get path() {\n return this.config.path;\n }\n\n get method() {\n if (this._method || !this.config.method) {\n return this._method;\n }\n\n this._method = toMethodName(this.config.method);\n return this._method;\n }\n\n // --------------------------------------------------\n\n async dispatch(event: RoutupEvent): Promise<Response | undefined> {\n if (this.pathMatcher) {\n const pathMatch = this.pathMatcher.exec(event.path);\n if (pathMatch) {\n event.params = {\n ...event.params,\n ...pathMatch.params,\n };\n }\n }\n\n await this.hookManager.trigger(HookName.CHILD_DISPATCH_BEFORE, event);\n if (event.dispatched) {\n return undefined;\n }\n\n let response: Response | undefined;\n\n try {\n let result: unknown;\n\n if (this.config.type === HandlerType.ERROR) {\n if (event.error) {\n result = await this.config.fn(event.error, event);\n }\n } else {\n result = await this.config.fn(event);\n }\n\n response = await toResponse(result, event);\n\n if (response) {\n event.dispatched = true;\n }\n } catch (e) {\n event.error = isError(e) ? e : createError(e);\n\n await this.hookManager.trigger(HookName.ERROR, event);\n\n if (event.dispatched) {\n event.error = undefined;\n } else {\n throw event.error;\n }\n }\n\n await this.hookManager.trigger(HookName.CHILD_DISPATCH_AFTER, event);\n\n return response;\n }\n\n // --------------------------------------------------\n\n matchPath(path: string): boolean {\n if (!this.pathMatcher) {\n return true;\n }\n\n return this.pathMatcher.test(path);\n }\n\n setPath(path?: Path): void {\n if (typeof path === 'string') {\n path = withLeadingSlash(path);\n }\n\n this.config.path = path;\n\n if (typeof path === 'undefined') {\n this.pathMatcher = undefined;\n return;\n }\n\n this.pathMatcher = new PathMatcher(path, { end: !!this.config.method });\n }\n\n // --------------------------------------------------\n\n matchMethod(method: `${MethodName}`): boolean {\n return !this.method ||\n method === this.method ||\n (\n method === MethodName.HEAD &&\n this.method === MethodName.GET\n );\n }\n\n setMethod(input?: `${MethodName}`): void {\n const method = toMethodName(input);\n\n this.config.method = method;\n this._method = method;\n }\n\n // --------------------------------------------------\n\n protected mountHooks() {\n if (this.config.onBefore) {\n this.hookManager.addListener(HookName.CHILD_DISPATCH_BEFORE, this.config.onBefore);\n }\n\n if (this.config.onAfter) {\n this.hookManager.addListener(HookName.CHILD_DISPATCH_AFTER, this.config.onAfter);\n }\n\n if (this.config.onError) {\n this.hookManager.addListener(HookName.ERROR, this.config.onError);\n }\n }\n}\n","import { HandlerType } from '../constants';\nimport { Handler } from '../module';\nimport type {\n CoreHandlerConfig,\n CoreHandlerFn,\n} from './types';\n\nexport function coreHandler(input: Omit<CoreHandlerConfig, | 'type'>) : Handler;\n\nexport function coreHandler(input: CoreHandlerFn) : Handler;\nexport function coreHandler(input: any) : Handler {\n if (typeof input === 'function') {\n return new Handler({\n type: HandlerType.CORE,\n fn: input,\n });\n }\n\n return new Handler({\n type: HandlerType.CORE,\n ...input,\n });\n}\n","import { HandlerType } from '../constants';\nimport { Handler } from '../module';\nimport type {\n ErrorHandlerConfig,\n ErrorHandlerFn,\n} from './types';\n\nexport function errorHandler(input: Omit<ErrorHandlerConfig, 'type'>) : Handler;\n\nexport function errorHandler(input: ErrorHandlerFn) : Handler;\nexport function errorHandler(input: any) : Handler {\n if (typeof input === 'function') {\n return new Handler({\n type: HandlerType.ERROR,\n fn: input,\n });\n }\n\n return new Handler({\n type: HandlerType.ERROR,\n ...input,\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { IRoutupEvent } from '../../event/index.ts';\nimport { RoutupError } from '../../error/module.ts';\nimport { Handler } from '../module.ts';\nimport { HandlerType } from '../constants.ts';\nimport type { CoreHandlerFn } from '../core/types.ts';\n\nexport type NodeHandler = (req: IncomingMessage, res: ServerResponse) => unknown | Promise<unknown>;\nexport type NodeMiddleware = (req: IncomingMessage, res: ServerResponse, next: (err?: unknown) => void) => unknown | Promise<unknown>;\n\nconst kHandled = /* @__PURE__ */ Symbol('handled');\n\nfunction callHandler(\n handler: NodeHandler,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<typeof kHandled | void> {\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const onClose = () => settle(kHandled);\n const onFinish = () => settle(kHandled);\n const onError = (error: Error) => fail(error);\n\n function cleanup() {\n res.removeListener('close', onClose);\n res.removeListener('finish', onFinish);\n res.removeListener('error', onError);\n }\n\n function settle(value: typeof kHandled | void) {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n }\n\n function fail(error: unknown) {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n }\n\n res.once('close', onClose);\n res.once('finish', onFinish);\n res.once('error', onError);\n\n try {\n Promise.resolve(handler(req, res))\n .then(() => settle(kHandled))\n .catch(fail);\n } catch (error) {\n fail(error);\n }\n });\n}\n\nfunction callMiddleware(\n handler: NodeMiddleware,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<typeof kHandled | void> {\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const onClose = () => settle(kHandled);\n const onFinish = () => settle(kHandled);\n const onError = (error: Error) => fail(error);\n\n function cleanup() {\n res.removeListener('close', onClose);\n res.removeListener('finish', onFinish);\n res.removeListener('error', onError);\n }\n\n function settle(value: typeof kHandled | void) {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n }\n\n function fail(error: unknown) {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n }\n\n res.once('close', onClose);\n res.once('finish', onFinish);\n res.once('error', onError);\n\n try {\n Promise.resolve(\n handler(req, res, (error) => {\n if (error) {\n fail(error);\n } else {\n settle(res.writableEnded || res.destroyed ? kHandled : undefined);\n }\n }),\n ).catch(fail);\n } catch (error) {\n fail(error);\n }\n });\n}\n\nfunction createNodeBridge(handler: NodeHandler | NodeMiddleware, isMiddleware: boolean): Handler {\n if (typeof handler !== 'function') {\n throw new RoutupError('fromNodeHandler/fromNodeMiddleware expects a function.');\n }\n\n return new Handler({\n type: HandlerType.CORE,\n fn: (async (event: IRoutupEvent) => {\n const node = event.request.runtime?.node;\n if (!node?.req || !node?.res) {\n throw new RoutupError('fromNodeHandler/fromNodeMiddleware requires a Node.js runtime.');\n }\n\n const req = node.req as unknown as IncomingMessage;\n const res = node.res as unknown as ServerResponse;\n\n const result = isMiddleware ?\n await callMiddleware(handler as NodeMiddleware, req, res) :\n await callHandler(handler as NodeHandler, req, res);\n\n if (result === kHandled) {\n event.dispatched = true;\n }\n\n return undefined;\n }) as CoreHandlerFn,\n });\n}\n\n/**\n * Wraps a Node.js `(req, res)` handler for use in the routup pipeline.\n *\n * @example\n * ```typescript\n * import { fromNodeHandler } from 'routup/node';\n *\n * router.use(fromNodeHandler((req, res) => {\n * res.end('Hello');\n * }));\n * ```\n */\nexport function fromNodeHandler(handler: NodeHandler): Handler {\n return createNodeBridge(handler, false);\n}\n\n/**\n * Wraps a Node.js `(req, res, next)` middleware for use in the routup pipeline.\n *\n * @example\n * ```typescript\n * import cors from 'cors';\n * import { fromNodeMiddleware } from 'routup/node';\n *\n * router.use(fromNodeMiddleware(cors()));\n * ```\n */\nexport function fromNodeMiddleware(handler: NodeMiddleware): Handler {\n return createNodeBridge(handler, true);\n}\n","import { isInstance, isObject } from '../utils';\nimport { HandlerSymbol } from './constants';\nimport type { Handler } from './module';\nimport type { HandlerConfig } from './types';\n\nexport function isHandlerConfig(input: unknown) : input is HandlerConfig {\n return isObject(input) &&\n typeof input.fn === 'function' &&\n typeof input.type === 'string';\n}\n\nexport function isHandler(input: unknown): input is Handler {\n return isInstance(input, HandlerSymbol);\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\n\nconst BODY_KEY = /* @__PURE__ */ Symbol.for('routup:body');\n\n/**\n * Read and parse the request body.\n *\n * - `application/x-www-form-urlencoded` → plain object (duplicate keys become arrays)\n * - `application/json` or other → attempts JSON parse, returns undefined on failure\n *\n * The result is cached on the event store — calling `readBody()` multiple\n * times returns the same parsed result.\n *\n * For binary or streaming access, use `event.request.arrayBuffer()`,\n * `event.request.blob()`, or `event.request.body` directly.\n *\n * @experimental\n */\nexport async function readBody<T = unknown>(event: IRoutupEvent): Promise<T | undefined> {\n if (BODY_KEY in event.store) {\n return event.store[BODY_KEY] as T;\n }\n\n const text = await event.request.text();\n\n let result: unknown | undefined;\n\n const contentType = event.headers.get('content-type') || '';\n if (contentType.includes('application/x-www-form-urlencoded')) {\n result = parseURLEncodedBody(text);\n } else {\n try {\n result = JSON.parse(text);\n } catch {\n result = undefined;\n }\n }\n\n event.store[BODY_KEY] = result;\n return result as T;\n}\n\nfunction parseURLEncodedBody(body: string): Record<string, unknown> {\n const form = new URLSearchParams(body);\n const parsed: Record<string, unknown> = Object.create(null);\n\n for (const [key, value] of form.entries()) {\n const existing = parsed[key];\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n parsed[key] = [existing, value];\n }\n } else {\n parsed[key] = value;\n }\n }\n\n return parsed;\n}\n","import { HeaderName } from '../../constants.ts';\n\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport function isRequestCacheable(event: IRoutupEvent, modifiedTime: string | Date) : boolean {\n const modifiedSince = event.headers.get(HeaderName.IF_MODIFIED_SINCE);\n if (!modifiedSince) {\n return false;\n }\n\n modifiedTime = typeof modifiedTime === 'string' ?\n new Date(modifiedTime) :\n modifiedTime;\n\n const sinceDate = new Date(modifiedSince);\n if (Number.isNaN(sinceDate.getTime()) || Number.isNaN(modifiedTime.getTime())) {\n return false;\n }\n\n return sinceDate >= modifiedTime;\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\nimport { useRequestNegotiator } from './negotiator.ts';\n\nexport function getRequestAcceptableCharsets(event: IRoutupEvent) : string[] {\n const negotiator = useRequestNegotiator(event);\n\n return negotiator.charsets();\n}\n\nexport function getRequestAcceptableCharset(event: IRoutupEvent, input: string | string[]) : string | undefined {\n input = input || [];\n\n const items = Array.isArray(input) ? input : [input];\n\n if (items.length === 0) {\n return getRequestAcceptableCharsets(event).shift();\n }\n\n const negotiator = useRequestNegotiator(event);\n return negotiator.charsets(items).shift() || undefined;\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\nimport { useRequestNegotiator } from './negotiator.ts';\n\nexport function getRequestAcceptableEncodings(event: IRoutupEvent) : string[] {\n const negotiator = useRequestNegotiator(event);\n return negotiator.encodings();\n}\n\nexport function getRequestAcceptableEncoding(event: IRoutupEvent, input: string | string[]) : string | undefined {\n input = input || [];\n\n const items = Array.isArray(input) ? input : [input];\n\n if (items.length === 0) {\n return getRequestAcceptableEncodings(event).shift();\n }\n\n const negotiator = useRequestNegotiator(event);\n return negotiator.encodings(items).shift() || undefined;\n}\n","import type { IRoutupEvent } from '../../event/index.ts';\nimport { useRequestNegotiator } from './negotiator.ts';\n\nexport function getRequestAcceptableLanguages(event: IRoutupEvent) : string[] {\n const negotiator = useRequestNegotiator(event);\n return negotiator.languages();\n}\n\nexport function getRequestAcceptableLanguage(event: IRoutupEvent, input?: string | string[]) : string | undefined {\n input = input || [];\n\n const items = Array.isArray(input) ? input : [input];\n\n if (items.length === 0) {\n return getRequestAcceptableLanguages(event).shift();\n }\n\n const negotiator = useRequestNegotiator(event);\n return negotiator.languages(items).shift() || undefined;\n}\n","import { HeaderName } from '../../constants.ts';\nimport { getMimeType } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\nimport { getRequestHeader } from './header.ts';\n\nexport function matchRequestContentType(event: IRoutupEvent, contentType: string) : boolean {\n const header = getRequestHeader(event, HeaderName.CONTENT_TYPE);\n if (!header) {\n return true;\n }\n\n return header.split(';')[0]!.trim() === getMimeType(contentType);\n}\n","import { HeaderName } from '../../constants.ts';\nimport { findRouterOption } from '../../router-options/index.ts';\nimport type { TrustProxyFn, TrustProxyInput } from '../../utils/index.ts';\nimport { buildTrustProxyFn } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport type RequestHostNameOptions = {\n trustProxy?: TrustProxyInput,\n};\n\nexport function getRequestHostName(event: IRoutupEvent, options: RequestHostNameOptions = {}) : string | undefined {\n let trustProxy : TrustProxyFn;\n if (typeof options.trustProxy !== 'undefined') {\n trustProxy = buildTrustProxyFn(options.trustProxy);\n } else {\n trustProxy = findRouterOption(\n 'trustProxy',\n event.routerPath,\n );\n }\n\n let hostname = event.headers.get(HeaderName.X_FORWARDED_HOST);\n if (!hostname || !event.request.ip || !trustProxy(event.request.ip, 0)) {\n hostname = event.headers.get(HeaderName.HOST);\n } else if (hostname && hostname.includes(',')) {\n hostname = hostname.substring(0, hostname.indexOf(',')).trimEnd();\n }\n\n if (!hostname) {\n return undefined;\n }\n\n // IPv6 literal support\n const offset = hostname[0] === '[' ?\n hostname.indexOf(']') + 1 :\n 0;\n const index = hostname.indexOf(':', offset);\n\n const result = index !== -1 ?\n hostname.substring(0, index) :\n hostname;\n\n // Reject hostnames with obviously invalid characters\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1F\\x7F\\s/@\\\\]/.test(result)) {\n return undefined;\n }\n\n return result;\n}\n","import { HeaderName } from '../../constants.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport type RequestIpOptions = {\n trustProxy?: boolean,\n};\n\nexport function getRequestIP(event: IRoutupEvent, options: RequestIpOptions = {}) : string | undefined {\n // When proxy is trusted, prefer x-forwarded-for header\n if (options.trustProxy) {\n const forwarded = event.headers.get(HeaderName.X_FORWARDED_FOR);\n if (forwarded) {\n const first = forwarded.split(',')[0];\n if (first) {\n return first.trim();\n }\n }\n }\n\n // Fall back to srvx ServerRequest .ip (direct connection IP)\n const request = event.request as { ip?: string };\n if (request.ip) {\n return request.ip;\n }\n\n return undefined;\n}\n","import { HeaderName } from '../../constants.ts';\nimport { findRouterOption } from '../../router-options/index.ts';\nimport type { TrustProxyFn, TrustProxyInput } from '../../utils/index.ts';\nimport { buildTrustProxyFn } from '../../utils/index.ts';\nimport type { IRoutupEvent } from '../../event/index.ts';\n\nexport type RequestProtocolOptions = {\n trustProxy?: TrustProxyInput,\n default?: string,\n};\n\nexport function getRequestProtocol(\n event: IRoutupEvent,\n options: RequestProtocolOptions = {},\n) : string {\n let trustProxy : TrustProxyFn;\n if (typeof options.trustProxy !== 'undefined') {\n trustProxy = buildTrustProxyFn(options.trustProxy);\n } else {\n trustProxy = findRouterOption(\n 'trustProxy',\n event.routerPath,\n );\n }\n\n // Derive protocol from the request URL scheme\n let protocol : string;\n try {\n const url = new URL(event.request.url);\n if (url.protocol === 'https:') {\n protocol = 'https';\n } else {\n protocol = 'http';\n }\n } catch {\n protocol = options.default || 'http';\n }\n\n if (!event.request.ip || !trustProxy(event.request.ip, 0)) {\n return protocol;\n }\n\n const header = event.headers.get(HeaderName.X_FORWARDED_PROTO);\n if (!header) {\n return protocol;\n }\n\n const index = header.indexOf(',');\n\n const forwarded = index !== -1 ?\n header.substring(0, index).trim().toLowerCase() :\n header.trim().toLowerCase();\n\n if (forwarded === 'http' || forwarded === 'https') {\n return forwarded;\n }\n\n return protocol;\n}\n","import { isObject } from '../utils';\nimport type { Plugin } from './types';\n\nexport function isPlugin(input: unknown): input is Plugin {\n if (!isObject(input)) {\n return false;\n }\n\n if (\n typeof input.name !== 'undefined' &&\n typeof input.name !== 'string'\n ) {\n return false;\n }\n\n return typeof input.install === 'function' &&\n input.install.length === 1;\n}\n","import { buildEtagFn, buildTrustProxyFn } from '../utils';\nimport type { RouterOptions, RouterOptionsInput } from './type';\n\nexport function normalizeRouterOptions(input: RouterOptionsInput): Partial<RouterOptions> {\n if (typeof input.etag !== 'undefined') {\n input.etag = buildEtagFn(input.etag);\n }\n\n if (typeof input.trustProxy !== 'undefined') {\n input.trustProxy = buildTrustProxyFn(input.trustProxy);\n }\n\n return input as Partial<RouterOptions>;\n}\n","export const RouterSymbol = /* @__PURE__ */ Symbol.for('Router');\n\nexport enum RouterPipelineStep {\n START,\n LOOKUP,\n CHILD_BEFORE,\n CHILD_DISPATCH,\n CHILD_AFTER,\n FINISH,\n}\n","import { isInstance } from '../utils/index.ts';\nimport { RouterSymbol } from './constants.ts';\nimport type { Router } from './module.ts';\n\nlet nextId = 0;\nexport function generateRouterID(): number {\n return ++nextId;\n}\n\nexport function isRouterInstance(input: unknown): input is Router {\n return isInstance(input, RouterSymbol);\n}\n\n/**\n * Check if the request accepts JSON responses.\n * Matches application/json and +json suffixes (e.g. application/vnd.api+json).\n * Returns true if no Accept header is present (API-first default).\n */\nexport function acceptsJson(request: Request): boolean {\n const accept = request.headers.get('accept');\n if (!accept) {\n return true;\n }\n\n return accept.includes('application/json') ||\n accept.includes('+json') ||\n accept.includes('*/*');\n}\n","import { distinctArray } from 'smob';\nimport { HeaderName, MethodName } from '../constants.ts';\nimport { RoutupEvent } from '../event/index.ts';\nimport type { IRoutupEvent, RoutupRequest } from '../event/index.ts';\nimport { createError } from '../error/index.ts';\nimport type { HandlerConfig } from '../handler/index.ts';\nimport {\n Handler,\n HandlerType,\n coreHandler,\n isHandler,\n isHandlerConfig,\n} from '../handler/index.ts';\nimport type {\n HookDefaultListener,\n HookErrorListener,\n HookListener,\n HookUnsubscribeFn,\n} from '../hook/index.ts';\nimport { HookManager, HookName } from '../hook/index.ts';\nimport type { Path } from '../path/index.ts';\nimport { PathMatcher, isPath } from '../path/index.ts';\nimport type { Plugin, PluginInstallContext } from '../plugin/index.ts';\nimport { isPlugin } from '../plugin/index.ts';\nimport type { RouterOptionsInput } from '../router-options/index.ts';\nimport { setRouterOptions } from '../router-options/index.ts';\nimport { normalizeRouterOptions } from '../router-options/normalize.ts';\nimport { cleanDoubleSlashes, withLeadingSlash, withoutTrailingSlash } from '../utils/index.ts';\nimport { RouterPipelineStep, RouterSymbol } from './constants.ts';\nimport type { IRouter, RouterPipelineContext } from './types.ts';\nimport { acceptsJson, generateRouterID, isRouterInstance } from './utils.ts';\n\nexport class Router implements IRouter {\n readonly '@instanceof' = RouterSymbol;\n\n /**\n * An identifier for the router instance.\n */\n readonly id: number;\n\n /**\n * A label for the router instance.\n */\n readonly name?: string;\n\n /**\n * Array of mounted layers, routes & routers.\n *\n * @protected\n */\n protected stack: (Router | Handler)[] = [];\n\n /**\n * Path matcher for the current mount path.\n *\n * @protected\n */\n protected pathMatcher: PathMatcher | undefined;\n\n /**\n * A hook manager.\n *\n * @protected\n */\n protected hookManager: HookManager;\n\n // --------------------------------------------------\n\n constructor(options: RouterOptionsInput = {}) {\n this.id = generateRouterID();\n this.name = options.name;\n\n this.hookManager = new HookManager();\n\n this.setPath(options.path);\n\n setRouterOptions(this.id, normalizeRouterOptions(options));\n }\n\n // --------------------------------------------------\n\n matchPath(path: string): boolean {\n if (this.pathMatcher) {\n return this.pathMatcher.test(path);\n }\n\n return true;\n }\n\n setPath(value?: Path) {\n if (value === '/' || typeof value === 'undefined') {\n this.pathMatcher = undefined;\n return;\n }\n\n this.pathMatcher = new PathMatcher(\n withLeadingSlash(withoutTrailingSlash(`${value}`)),\n { end: false },\n );\n }\n\n // --------------------------------------------------\n\n /**\n * Public entry point — creates a RoutupEvent from the request,\n * runs the pipeline, and returns a Response (with 404/500 fallbacks).\n */\n async fetch(request: RoutupRequest): Promise<Response> {\n const event = new RoutupEvent(request);\n\n let response: Response | undefined;\n\n try {\n response = await this.dispatch(event);\n } catch (e) {\n event.error = createError(e);\n }\n\n if (response) {\n return response;\n }\n\n if (event.error) {\n const status = event.error.statusCode || 500;\n const message = event.error.statusMessage || 'Internal Server Error';\n return this.buildFallbackResponse(request, event, status, message);\n }\n\n return this.buildFallbackResponse(request, event, 404, 'Not Found');\n }\n\n protected buildFallbackResponse(request: RoutupRequest, event: RoutupEvent, status: number, message: string): Response {\n const headers = new Headers(event.response.headers);\n\n if (acceptsJson(request)) {\n headers.set('content-type', 'application/json; charset=utf-8');\n return new Response(JSON.stringify({ status, message }), {\n status,\n statusText: message,\n headers,\n });\n }\n\n headers.set('content-type', 'text/plain; charset=utf-8');\n return new Response(message, {\n status,\n statusText: message,\n headers,\n });\n }\n\n // --------------------------------------------------\n\n protected async executePipelineStep(context: RouterPipelineContext): Promise<void> {\n switch (context.step) {\n case RouterPipelineStep.START: {\n return this.executePipelineStepStart(context);\n }\n case RouterPipelineStep.LOOKUP: {\n return this.executePipelineStepLookup(context);\n }\n case RouterPipelineStep.CHILD_BEFORE: {\n return this.executePipelineStepChildBefore(context);\n }\n case RouterPipelineStep.CHILD_DISPATCH: {\n return this.executePipelineStepChildDispatch(context);\n }\n case RouterPipelineStep.CHILD_AFTER: {\n return this.executePipelineStepChildAfter(context);\n }\n case RouterPipelineStep.FINISH:\n default: {\n return this.executePipelineStepFinish(context);\n }\n }\n }\n\n protected async executePipelineStepStart(context: RouterPipelineContext): Promise<void> {\n await this.hookManager.trigger(HookName.REQUEST, context.event);\n\n if (context.event.dispatched) {\n context.step = RouterPipelineStep.FINISH;\n } else {\n context.step = RouterPipelineStep.LOOKUP;\n }\n\n return this.executePipelineStep(context);\n }\n\n protected async executePipelineStepLookup(context: RouterPipelineContext): Promise<void> {\n while (\n !context.event.dispatched &&\n context.stackIndex < this.stack.length\n ) {\n const item = this.stack[context.stackIndex]!;\n\n if (isHandler(item)) {\n if (\n (context.event.error && item.type === HandlerType.CORE) ||\n (!context.event.error && item.type === HandlerType.ERROR)\n ) {\n context.stackIndex++;\n continue;\n }\n\n const match = item.matchPath(context.event.path);\n\n if (match) {\n if (item.method) {\n context.event.methodsAllowed.push(item.method);\n }\n\n if (item.matchMethod(context.event.method as `${MethodName}`)) {\n await this.hookManager.trigger(HookName.CHILD_MATCH, context.event);\n\n if (context.event.dispatched) {\n context.step = RouterPipelineStep.FINISH;\n } else {\n context.step = RouterPipelineStep.CHILD_BEFORE;\n }\n\n return this.executePipelineStep(context);\n }\n }\n\n context.stackIndex++;\n continue;\n }\n\n const match = item.matchPath(context.event.path);\n\n if (match) {\n await this.hookManager.trigger(HookName.CHILD_MATCH, context.event);\n\n if (context.event.dispatched) {\n context.step = RouterPipelineStep.FINISH;\n } else {\n context.step = RouterPipelineStep.CHILD_BEFORE;\n }\n\n return this.executePipelineStep(context);\n }\n\n context.stackIndex++;\n }\n\n context.step = RouterPipelineStep.FINISH;\n return this.executePipelineStep(context);\n }\n\n protected async executePipelineStepChildBefore(context: RouterPipelineContext): Promise<void> {\n await this.hookManager.trigger(HookName.CHILD_DISPATCH_BEFORE, context.event);\n\n if (context.event.dispatched) {\n context.step = RouterPipelineStep.FINISH;\n } else {\n context.step = RouterPipelineStep.CHILD_DISPATCH;\n }\n\n return this.executePipelineStep(context);\n }\n\n protected async executePipelineStepChildAfter(context: RouterPipelineContext): Promise<void> {\n await this.hookManager.trigger(HookName.CHILD_DISPATCH_AFTER, context.event);\n\n if (context.event.dispatched) {\n context.step = RouterPipelineStep.FINISH;\n } else {\n context.step = RouterPipelineStep.LOOKUP;\n }\n\n return this.executePipelineStep(context);\n }\n\n protected async executePipelineStepChildDispatch(context: RouterPipelineContext): Promise<void> {\n if (\n context.event.dispatched ||\n typeof this.stack[context.stackIndex] === 'undefined'\n ) {\n context.step = RouterPipelineStep.FINISH;\n return this.executePipelineStep(context);\n }\n\n const item = this.stack[context.stackIndex]!;\n const { event } = context;\n\n // Save next state before wiring up onion model\n const savedNext = event._next;\n const savedNextCalled = event._nextCalled;\n\n try {\n event._nextCalled = false;\n event._next = async () => {\n // Continue pipeline from the next stack item\n const nextContext: RouterPipelineContext = {\n step: RouterPipelineStep.LOOKUP,\n event,\n stackIndex: context.stackIndex + 1,\n response: undefined,\n };\n\n event.routerPath.push(this.id);\n try {\n await this.executePipelineStep(nextContext);\n } finally {\n event.routerPath.pop();\n }\n\n return nextContext.response;\n };\n\n const response = await item.dispatch(event);\n\n if (response) {\n context.response = response;\n event.dispatched = true;\n }\n } catch (e) {\n event.error = createError(e);\n\n await this.hookManager.trigger(HookName.ERROR, event);\n } finally {\n // Restore next state regardless of success or failure\n event._next = savedNext;\n event._nextCalled = savedNextCalled;\n }\n\n context.stackIndex++;\n context.step = RouterPipelineStep.CHILD_AFTER;\n\n return this.executePipelineStep(context);\n }\n\n protected async executePipelineStepFinish(context: RouterPipelineContext): Promise<void> {\n if (context.event.error || context.event.dispatched) {\n return this.hookManager.trigger(HookName.RESPONSE, context.event);\n }\n\n if (\n !context.event.dispatched &&\n context.event.routerPath.length === 1 &&\n context.event.method &&\n context.event.method === MethodName.OPTIONS\n ) {\n if (context.event.methodsAllowed.includes(MethodName.GET)) {\n context.event.methodsAllowed.push(MethodName.HEAD);\n }\n\n distinctArray(context.event.methodsAllowed);\n\n const options = context.event.methodsAllowed\n .map((key) => key.toUpperCase())\n .join(',');\n\n const optionsHeaders = new Headers(context.event.response.headers);\n optionsHeaders.set(HeaderName.ALLOW, options);\n context.response = new Response(options, {\n status: context.event.response.status || 200,\n statusText: context.event.response.statusText,\n headers: optionsHeaders,\n });\n\n context.event.dispatched = true;\n }\n\n return this.hookManager.trigger(HookName.RESPONSE, context.event);\n }\n\n // --------------------------------------------------\n\n async dispatch(\n event: RoutupEvent,\n ): Promise<Response | undefined> {\n if (this.pathMatcher) {\n const output = this.pathMatcher.exec(event.path);\n if (typeof output !== 'undefined') {\n event.mountPath = cleanDoubleSlashes(`${event.mountPath}/${output.path}`);\n\n if (event.path === output.path) {\n event.path = '/';\n } else {\n event.path = withLeadingSlash(event.path.substring(output.path.length));\n }\n\n event.params = {\n ...event.params,\n ...output.params,\n };\n }\n }\n\n const context: RouterPipelineContext = {\n step: RouterPipelineStep.START,\n event,\n stackIndex: 0,\n };\n\n event.routerPath.push(this.id);\n\n try {\n await this.executePipelineStep(context);\n } finally {\n event.routerPath.pop();\n }\n\n return context.response;\n }\n\n // --------------------------------------------------\n\n delete(...handlers: (Handler | HandlerConfig)[]): this;\n\n delete(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n delete(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.DELETE, ...input);\n\n return this;\n }\n\n get(...handlers: (Handler | HandlerConfig)[]): this;\n\n get(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n get(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.GET, ...input);\n\n return this;\n }\n\n post(...handlers: (Handler | HandlerConfig)[]): this;\n\n post(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n post(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.POST, ...input);\n\n return this;\n }\n\n put(...handlers: (Handler | HandlerConfig)[]): this;\n\n put(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n put(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.PUT, ...input);\n\n return this;\n }\n\n patch(...handlers: (Handler | HandlerConfig)[]): this;\n\n patch(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n patch(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.PATCH, ...input);\n\n return this;\n }\n\n head(...handlers: (Handler | HandlerConfig)[]): this;\n\n head(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n head(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.HEAD, ...input);\n\n return this;\n }\n\n options(...handlers: (Handler | HandlerConfig)[]): this;\n\n options(path: Path, ...handlers: (Handler | HandlerConfig)[]): this;\n\n options(...input: (Path | Handler | HandlerConfig)[]): this {\n this.useForMethod(MethodName.OPTIONS, ...input);\n\n return this;\n }\n\n // --------------------------------------------------\n\n protected useForMethod(\n method: MethodName,\n ...input: (Path | Handler | HandlerConfig)[]\n ) {\n let path: Path | undefined;\n\n for (const element of input) {\n if (isPath(element)) {\n path = element;\n continue;\n }\n\n if (isHandlerConfig(element)) {\n if (path) {\n element.path = path;\n }\n\n element.method = method;\n\n this.use(element);\n\n continue;\n }\n\n if (isHandler(element)) {\n if (path) {\n element.setPath(path);\n }\n\n element.setMethod(method);\n\n this.use(element);\n }\n }\n }\n\n // --------------------------------------------------\n\n /**\n * Mount an external fetch handler at the given path.\n * The handler receives requests with the mount prefix stripped from the URL.\n *\n * @experimental\n */\n mount(path: Path, handler: { fetch: (request: Request) => Response | Promise<Response> }): this;\n mount(path: Path, handler: (request: Request) => Response | Promise<Response>): this;\n mount(path: Path, handler: unknown): this {\n const fn = typeof handler === 'function' ?\n handler as (request: Request) => Response | Promise<Response> :\n (handler as { fetch: (request: Request) => Response | Promise<Response> }).fetch.bind(handler);\n\n this.use(path, coreHandler({\n fn: async (event: IRoutupEvent) => {\n const url = new URL(event.request.url);\n url.pathname = event.path;\n\n const adjusted = new Request(url.toString(), event.request);\n return fn(adjusted);\n },\n }));\n\n return this;\n }\n\n // --------------------------------------------------\n\n use(router: Router): this;\n\n use(handler: Handler | HandlerConfig): this;\n\n use(plugin: Plugin): this;\n\n use(path: Path, router: Router): this;\n\n use(path: Path, handler: Handler | HandlerConfig): this;\n\n use(path: Path, plugin: Plugin): this;\n\n use(...input: unknown[]): this {\n let path: Path | undefined;\n for (const item of input) {\n if (isPath(item)) {\n path = withLeadingSlash(item);\n continue;\n }\n\n if (isRouterInstance(item)) {\n if (path) {\n item.setPath(path);\n }\n this.stack.push(item);\n continue;\n }\n\n if (isHandlerConfig(item)) {\n item.path = path || item.path;\n\n this.stack.push(new Handler(item));\n continue;\n }\n\n if (isHandler(item)) {\n item.setPath(path || item.path);\n\n this.stack.push(item);\n continue;\n }\n\n if (isPlugin(item)) {\n if (path) {\n this.install(item, { path });\n } else {\n this.install(item);\n }\n }\n }\n\n return this;\n }\n\n // --------------------------------------------------\n protected install(\n plugin: Plugin,\n context: PluginInstallContext = {},\n ): this {\n const name = context.name || plugin.name;\n\n const router = new Router({ name });\n plugin.install(router);\n\n if (context.path) {\n this.use(context.path, router);\n } else {\n this.use(router);\n }\n\n return this;\n }\n\n //---------------------------------------------------------------------------------\n\n /**\n * Add a hook listener.\n *\n * @param name\n * @param fn\n */\n on(\n name: `${HookName.REQUEST}` |\n `${HookName.RESPONSE}` |\n `${HookName.CHILD_DISPATCH_BEFORE}` |\n `${HookName.CHILD_DISPATCH_AFTER}`,\n fn: HookDefaultListener\n ): HookUnsubscribeFn;\n\n on(\n name: `${HookName.CHILD_MATCH}`,\n fn: HookDefaultListener\n ): HookUnsubscribeFn;\n\n on(\n name: `${HookName.ERROR}`,\n fn: HookErrorListener\n ): HookUnsubscribeFn;\n\n on(name: `${HookName}`, fn: HookListener): HookUnsubscribeFn {\n return this.hookManager.addListener(name, fn);\n }\n\n /**\n * Remove single or all hook listeners.\n *\n * @param name\n */\n off(name: `${HookName}`): this;\n\n off(name: `${HookName}`, fn: HookListener): this;\n\n off(name: `${HookName}`, fn?: HookListener): this {\n if (typeof fn === 'undefined') {\n this.hookManager.removeListener(name);\n\n return this;\n }\n\n this.hookManager.removeListener(name, fn);\n return this;\n }\n}\n"],"mappings":"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"}