vafast 0.3.1 → 0.3.4

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 (136) hide show
  1. package/dist/auth/token.d.ts +13 -11
  2. package/dist/auth/token.js +118 -111
  3. package/dist/auth/token.js.map +1 -0
  4. package/dist/defineRoute.d.ts +5 -2
  5. package/dist/defineRoute.js +7 -2
  6. package/dist/defineRoute.js.map +1 -0
  7. package/dist/index.d.ts +30 -14
  8. package/dist/index.js +2247 -15
  9. package/dist/index.js.map +1 -0
  10. package/dist/middleware/auth.d.ts +8 -6
  11. package/dist/middleware/auth.js +198 -99
  12. package/dist/middleware/auth.js.map +1 -0
  13. package/dist/middleware/authMiddleware.d.ts +5 -2
  14. package/dist/middleware/authMiddleware.js +55 -11
  15. package/dist/middleware/authMiddleware.js.map +1 -0
  16. package/dist/middleware/component-renderer.d.ts +4 -2
  17. package/dist/middleware/component-renderer.js +87 -80
  18. package/dist/middleware/component-renderer.js.map +1 -0
  19. package/dist/middleware/component-router.d.ts +8 -3
  20. package/dist/middleware/component-router.js +33 -39
  21. package/dist/middleware/component-router.js.map +1 -0
  22. package/dist/middleware/cors.d.ts +6 -3
  23. package/dist/middleware/cors.js +42 -29
  24. package/dist/middleware/cors.js.map +1 -0
  25. package/dist/middleware/rateLimit.d.ts +5 -3
  26. package/dist/middleware/rateLimit.js +45 -29
  27. package/dist/middleware/rateLimit.js.map +1 -0
  28. package/dist/middleware.d.ts +6 -3
  29. package/dist/middleware.js +97 -51
  30. package/dist/middleware.js.map +1 -0
  31. package/dist/monitoring/index.d.ts +11 -4
  32. package/dist/monitoring/index.js +1299 -17
  33. package/dist/monitoring/index.js.map +1 -0
  34. package/dist/monitoring/native-monitor.d.ts +12 -6
  35. package/dist/monitoring/native-monitor.js +1258 -161
  36. package/dist/monitoring/native-monitor.js.map +1 -0
  37. package/dist/monitoring/types.d.ts +8 -6
  38. package/dist/monitoring/types.js +1 -1
  39. package/dist/monitoring/types.js.map +1 -0
  40. package/dist/node-server/index.d.ts +4 -22
  41. package/dist/node-server/index.js +254 -21
  42. package/dist/node-server/index.js.map +1 -0
  43. package/dist/node-server/request.d.ts +6 -2
  44. package/dist/node-server/request.js +102 -134
  45. package/dist/node-server/request.js.map +1 -0
  46. package/dist/node-server/response.d.ts +7 -3
  47. package/dist/node-server/response.js +67 -89
  48. package/dist/node-server/response.js.map +1 -0
  49. package/dist/node-server/serve.d.ts +11 -7
  50. package/dist/node-server/serve.js +231 -82
  51. package/dist/node-server/serve.js.map +1 -0
  52. package/dist/router/index.d.ts +3 -5
  53. package/dist/router/index.js +228 -7
  54. package/dist/router/index.js.map +1 -0
  55. package/dist/router/radix-tree.d.ts +7 -4
  56. package/dist/router/radix-tree.js +186 -218
  57. package/dist/router/radix-tree.js.map +1 -0
  58. package/dist/router.d.ts +7 -3
  59. package/dist/router.js +37 -83
  60. package/dist/router.js.map +1 -0
  61. package/dist/serve.d.ts +2 -12
  62. package/dist/serve.js +237 -11
  63. package/dist/serve.js.map +1 -0
  64. package/dist/server/base-server.d.ts +5 -2
  65. package/dist/server/base-server.js +124 -135
  66. package/dist/server/base-server.js.map +1 -0
  67. package/dist/server/component-server.d.ts +9 -4
  68. package/dist/server/component-server.js +481 -139
  69. package/dist/server/component-server.js.map +1 -0
  70. package/dist/server/index.d.ts +8 -7
  71. package/dist/server/index.js +985 -11
  72. package/dist/server/index.js.map +1 -0
  73. package/dist/server/server-factory.d.ts +11 -5
  74. package/dist/server/server-factory.js +979 -67
  75. package/dist/server/server-factory.js.map +1 -0
  76. package/dist/server/server.d.ts +7 -3
  77. package/dist/server/server.js +553 -112
  78. package/dist/server/server.js.map +1 -0
  79. package/dist/types/component-route.d.ts +8 -4
  80. package/dist/types/component-route.js +1 -1
  81. package/dist/types/component-route.js.map +1 -0
  82. package/dist/types/index.d.ts +5 -5
  83. package/dist/types/index.js +21 -4
  84. package/dist/types/index.js.map +1 -0
  85. package/dist/types/route.d.ts +13 -10
  86. package/dist/types/route.js +10 -9
  87. package/dist/types/route.js.map +1 -0
  88. package/dist/types/schema.d.ts +11 -7
  89. package/dist/types/schema.js +1 -1
  90. package/dist/types/schema.js.map +1 -0
  91. package/dist/types/types.d.ts +11 -9
  92. package/dist/types/types.js +1 -1
  93. package/dist/types/types.js.map +1 -0
  94. package/dist/utils/base64url.d.ts +4 -2
  95. package/dist/utils/base64url.js +12 -9
  96. package/dist/utils/base64url.js.map +1 -0
  97. package/dist/utils/create-handler.d.ts +11 -7
  98. package/dist/utils/create-handler.js +393 -217
  99. package/dist/utils/create-handler.js.map +1 -0
  100. package/dist/utils/dependency-manager.d.ts +3 -1
  101. package/dist/utils/dependency-manager.js +67 -69
  102. package/dist/utils/dependency-manager.js.map +1 -0
  103. package/dist/utils/go-await.d.ts +3 -1
  104. package/dist/utils/go-await.js +8 -22
  105. package/dist/utils/go-await.js.map +1 -0
  106. package/dist/utils/handle.d.ts +6 -4
  107. package/dist/utils/handle.js +44 -25
  108. package/dist/utils/handle.js.map +1 -0
  109. package/dist/utils/html-renderer.d.ts +3 -1
  110. package/dist/utils/html-renderer.js +25 -24
  111. package/dist/utils/html-renderer.js.map +1 -0
  112. package/dist/utils/index.d.ts +13 -13
  113. package/dist/utils/index.js +832 -21
  114. package/dist/utils/index.js.map +1 -0
  115. package/dist/utils/parsers.d.ts +15 -13
  116. package/dist/utils/parsers.js +138 -188
  117. package/dist/utils/parsers.js.map +1 -0
  118. package/dist/utils/path-matcher.d.ts +3 -1
  119. package/dist/utils/path-matcher.js +68 -78
  120. package/dist/utils/path-matcher.js.map +1 -0
  121. package/dist/utils/request-validator.d.ts +13 -10
  122. package/dist/utils/request-validator.js +234 -84
  123. package/dist/utils/request-validator.js.map +1 -0
  124. package/dist/utils/response.d.ts +9 -7
  125. package/dist/utils/response.js +93 -102
  126. package/dist/utils/response.js.map +1 -0
  127. package/dist/utils/validators/schema-validator.d.ts +13 -9
  128. package/dist/utils/validators/schema-validator.js +228 -209
  129. package/dist/utils/validators/schema-validator.js.map +1 -0
  130. package/dist/utils/validators/schema-validators-ultra.d.ts +15 -12
  131. package/dist/utils/validators/schema-validators-ultra.js +233 -256
  132. package/dist/utils/validators/schema-validators-ultra.js.map +1 -0
  133. package/dist/utils/validators/validators.d.ts +15 -12
  134. package/dist/utils/validators/validators.js +81 -122
  135. package/dist/utils/validators/validators.js.map +1 -0
  136. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/parsers.ts","../../src/utils/go-await.ts","../../src/utils/response.ts","../../src/utils/validators/schema-validators-ultra.ts","../../src/utils/create-handler.ts"],"sourcesContent":["// src/parsers.ts\nimport qs from \"qs\";\nimport cookie from \"cookie\";\n\n// 文件信息接口\nexport interface FileInfo {\n name: string;\n type: string;\n size: number;\n data: ArrayBuffer;\n}\n\n// 表单数据接口\nexport interface FormData {\n fields: Record<string, string>;\n files: Record<string, FileInfo>;\n}\n\n/**\n * 简化的请求体解析函数\n * 优先简洁性,处理最常见的场景\n */\nexport async function parseBody(req: Request): Promise<unknown> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await req.json();\n }\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await req.text();\n return Object.fromEntries(new URLSearchParams(text));\n }\n return await req.text(); // fallback\n}\n\n/**\n * 解析 multipart/form-data 格式\n * 支持文件上传和普通表单字段\n */\nasync function parseMultipartFormData(req: Request): Promise<FormData> {\n const formData = await req.formData();\n const result: FormData = {\n fields: {},\n files: {},\n };\n\n for (const [key, value] of formData.entries()) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"type\" in value &&\n \"size\" in value\n ) {\n // 处理文件\n const file = value as any;\n const arrayBuffer = await file.arrayBuffer();\n result.files[key] = {\n name: file.name,\n type: file.type,\n size: file.size,\n data: arrayBuffer,\n };\n } else {\n // 处理普通字段\n result.fields[key] = value as string;\n }\n }\n\n return result;\n}\n\n/**\n * 解析请求体为特定类型\n * 提供类型安全的解析方法\n */\nexport async function parseBodyAs<T>(req: Request): Promise<T> {\n const body = await parseBody(req);\n return body as T;\n}\n\n/**\n * 解析请求体为表单数据\n * 专门用于处理 multipart/form-data\n */\nexport async function parseFormData(req: Request): Promise<FormData> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n return await parseMultipartFormData(req);\n}\n\n/**\n * 解析请求体为文件\n * 专门用于处理文件上传\n */\nexport async function parseFile(req: Request): Promise<FileInfo> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n const formData = await parseMultipartFormData(req);\n const fileKeys = Object.keys(formData.files);\n\n if (fileKeys.length === 0) {\n throw new Error(\"请求中没有文件\");\n }\n\n if (fileKeys.length > 1) {\n throw new Error(\"请求中包含多个文件,请使用 parseFormData\");\n }\n\n return formData.files[fileKeys[0]];\n}\n\n/**\n * 快速提取 query string(避免创建 URL 对象)\n */\nfunction extractQueryString(url: string): string {\n const qIndex = url.indexOf(\"?\");\n if (qIndex === -1) return \"\";\n\n const hashIndex = url.indexOf(\"#\", qIndex);\n return hashIndex === -1\n ? url.substring(qIndex + 1)\n : url.substring(qIndex + 1, hashIndex);\n}\n\n/** 获取查询字符串,直接返回对象 */\nexport function parseQuery(req: Request): Record<string, unknown> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n return qs.parse(queryString);\n}\n\n/**\n * 快速解析简单查询字符串(不支持嵌套,但更快)\n * 适用于简单的 key=value&key2=value2 场景\n */\nexport function parseQueryFast(req: Request): Record<string, string> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n result[decodeURIComponent(pair)] = \"\";\n } else {\n const key = decodeURIComponent(pair.substring(0, eqIndex));\n const value = decodeURIComponent(pair.substring(eqIndex + 1));\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/** 解析请求头,返回对象 */\nexport function parseHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = Object.create(null);\n req.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * 获取单个请求头(避免解析全部)\n */\nexport function getHeader(req: Request, name: string): string | null {\n return req.headers.get(name);\n}\n\n/** 使用cookie库解析Cookie,保证可靠性 */\nexport function parseCookies(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n try {\n const parsed = cookie.parse(cookieHeader);\n // 过滤掉undefined和null值\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * 快速解析 Cookie(简化版,不使用外部库)\n * 适用于简单的 cookie 场景\n */\nexport function parseCookiesFast(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n const key = trimmed.substring(0, eqIndex).trim();\n const value = trimmed.substring(eqIndex + 1).trim();\n // 移除引号\n result[key] =\n value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return result;\n}\n\n/**\n * 获取单个 Cookie 值(避免解析全部)\n */\nexport function getCookie(req: Request, name: string): string | null {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return null;\n\n const prefix = `${name}=`;\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n if (trimmed.startsWith(prefix)) {\n const value = trimmed.substring(prefix.length).trim();\n return value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return null;\n}\n","/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\n/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @param promise 要处理的 Promise\n * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果\n *\n * @example\n * ```typescript\n * const [error, result] = await goAwait(someAsyncFunction());\n * if (error) {\n * console.error(\"操作失败:\", error);\n * } else {\n * console.log(\"操作成功:\", result);\n * }\n * ```\n */\nexport function goAwait<T>(\n promise: Promise<T>,\n): Promise<[Error | null, T | undefined]> {\n return promise\n .then<[null, T]>((data) => [null, data])\n .catch<\n [Error, undefined]\n >((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);\n}\n","// src/response.ts\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n","/**\n * 超优化版Schema验证器 v5.0.0\n *\n * 使用经过验证的优化技术,确保极致性能\n * - 内联函数调用\n * - 预编译缓存优化\n * - 内存池优化\n * - 位运算优化\n * - 类型特化优化\n * - 循环展开优化\n * - 位掩码优化\n * - 字符串池优化\n * - 内联缓存优化\n * - 内存对齐优化\n *\n * @author Framework Team\n * @version 5.0.0\n * @license MIT\n */\n\nimport { TypeCompiler } from \"@sinclair/typebox/compiler\";\nimport type { TSchema } from \"@sinclair/typebox\";\n\n// 统一的Schema配置接口\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n// 位掩码常量 - 用于快速检查Schema配置\nconst SCHEMA_FLAGS = {\n BODY: 1 << 0, // 1\n QUERY: 1 << 1, // 2\n PARAMS: 1 << 2, // 4\n HEADERS: 1 << 3, // 8\n COOKIES: 1 << 4, // 16\n} as const;\n\n// 超优化的Schema缓存 - 使用Map避免WeakMap的查找开销\nconst ultraSchemaCache = new Map<TSchema, any>();\nconst schemaCacheHits = new Map<TSchema, number>();\n\n// 内存池优化 - 预分配错误对象\nconst errorPool: Error[] = [];\nconst ERROR_POOL_SIZE = 200; // 增加池大小\n\n// 字符串池 - 避免重复创建错误消息\nconst errorMessagePool = new Map<string, string>();\nconst commonMessages = [\n \"请求体验证失败\",\n \"Query参数验证失败\",\n \"路径参数验证失败\",\n \"请求头验证失败\",\n \"Cookie验证失败\",\n \"类型验证失败\",\n \"Schema编译失败\",\n \"未知错误\",\n];\n\n// 初始化字符串池\ncommonMessages.forEach((msg) => errorMessagePool.set(msg, msg));\n\n// 初始化错误池\nfor (let i = 0; i < ERROR_POOL_SIZE; i++) {\n errorPool.push(new Error());\n}\n\nlet errorPoolIndex = 0;\n\n// 获取错误对象 - 避免重复创建\nfunction getErrorFromPool(message: string): Error {\n const error = errorPool[errorPoolIndex];\n error.message = message;\n errorPoolIndex = (errorPoolIndex + 1) % ERROR_POOL_SIZE;\n return error;\n}\n\n// 获取或创建字符串 - 字符串池优化\nfunction getPooledString(key: string): string {\n let pooled = errorMessagePool.get(key);\n if (!pooled) {\n pooled = key;\n errorMessagePool.set(key, key);\n }\n return pooled;\n}\n\n// 获取或编译Schema - 超内联优化版本\nfunction getUltraSchemaCompiler(schema: TSchema): any {\n // 直接检查缓存,避免WeakMap的has()调用\n let compiler = ultraSchemaCache.get(schema);\n if (compiler) {\n // 缓存命中统计\n schemaCacheHits.set(schema, (schemaCacheHits.get(schema) || 0) + 1);\n return compiler;\n }\n\n try {\n compiler = TypeCompiler.Compile(schema);\n ultraSchemaCache.set(schema, compiler);\n return compiler;\n } catch (error) {\n return null;\n }\n}\n\n// 计算Schema配置的位掩码 - 用于快速检查\nfunction getSchemaFlags(config: SchemaConfig): number {\n let flags = 0;\n if (config.body) flags |= SCHEMA_FLAGS.BODY;\n if (config.query) flags |= SCHEMA_FLAGS.QUERY;\n if (config.params) flags |= SCHEMA_FLAGS.PARAMS;\n if (config.headers) flags |= SCHEMA_FLAGS.HEADERS;\n if (config.cookies) flags |= SCHEMA_FLAGS.COOKIES;\n return flags;\n}\n\n// 超优化的Schema验证函数 - 位运算优化版本\nexport function validateSchemaUltra(\n schema: TSchema | undefined,\n data: any,\n context: string,\n): any {\n if (!schema) return data;\n\n try {\n // 完全内联逻辑,零函数调用开销\n let compiler = ultraSchemaCache.get(schema);\n if (!compiler) {\n try {\n compiler = TypeCompiler.Compile(schema);\n ultraSchemaCache.set(schema, compiler);\n } catch (error) {\n // 使用错误池和字符串池\n const message = getPooledString(`${context}验证失败: Schema编译失败`);\n throw getErrorFromPool(message);\n }\n }\n\n // 直接验证,零额外开销\n const result = compiler.Check(data);\n if (!result) {\n // 使用错误池和字符串池\n const message = getPooledString(`${context}验证失败`);\n throw getErrorFromPool(message);\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n throw error;\n }\n // 使用错误池和字符串池\n const message = getPooledString(\n `${context}验证失败: ${\n error instanceof Error ? error.message : \"未知错误\"\n }`,\n );\n throw getErrorFromPool(message);\n }\n}\n\n// 超优化的批量验证 - 位掩码优化版本(极致性能)\nexport function validateAllSchemasUltra(\n config: SchemaConfig,\n data: {\n body: any;\n query: any;\n params: any;\n headers: any;\n cookies: any;\n },\n): any {\n // 使用位掩码快速检查,避免多次条件判断\n const flags = getSchemaFlags(config);\n\n // 位运算检查,比条件判断快\n if (flags & SCHEMA_FLAGS.BODY) {\n validateSchemaUltra(config.body, data.body, \"请求体\");\n }\n if (flags & SCHEMA_FLAGS.QUERY) {\n validateSchemaUltra(config.query, data.query, \"Query参数\");\n }\n if (flags & SCHEMA_FLAGS.PARAMS) {\n validateSchemaUltra(config.params, data.params, \"路径参数\");\n }\n if (flags & SCHEMA_FLAGS.HEADERS) {\n validateSchemaUltra(config.headers, data.headers, \"请求头\");\n }\n if (flags & SCHEMA_FLAGS.COOKIES) {\n validateSchemaUltra(config.cookies, data.cookies, \"Cookie\");\n }\n return data;\n}\n\n// 超优化的预编译 - 位掩码优化版本\nexport function precompileSchemasUltra(config: SchemaConfig): void {\n const flags = getSchemaFlags(config);\n\n // 使用位运算检查,避免重复条件判断\n if (flags & SCHEMA_FLAGS.BODY && config.body) {\n getUltraSchemaCompiler(config.body);\n }\n if (flags & SCHEMA_FLAGS.QUERY && config.query) {\n getUltraSchemaCompiler(config.query);\n }\n if (flags & SCHEMA_FLAGS.PARAMS && config.params) {\n getUltraSchemaCompiler(config.params);\n }\n if (flags & SCHEMA_FLAGS.HEADERS && config.headers) {\n getUltraSchemaCompiler(config.headers);\n }\n if (flags & SCHEMA_FLAGS.COOKIES && config.cookies) {\n getUltraSchemaCompiler(config.cookies);\n }\n}\n\n// 类型特化验证器 - 针对特定类型优化\nexport function createTypedValidatorUltra<T>(schema: TSchema): (data: T) => T {\n const compiler = getUltraSchemaCompiler(schema);\n\n return (data: T): T => {\n if (!compiler.Check(data)) {\n throw getErrorFromPool(getPooledString(\"类型验证失败\"));\n }\n return data;\n };\n}\n\n// 批量类型验证器 - 一次验证多个数据,循环展开优化\nexport function validateBatchUltra<T>(schema: TSchema, dataArray: T[]): T[] {\n const compiler = getUltraSchemaCompiler(schema);\n const results: T[] = [];\n const length = dataArray.length;\n\n // 循环展开优化 - 处理前4个元素\n if (length >= 1) {\n if (!compiler.Check(dataArray[0])) {\n throw getErrorFromPool(getPooledString(\"第1个数据验证失败\"));\n }\n results.push(dataArray[0]);\n }\n if (length >= 2) {\n if (!compiler.Check(dataArray[1])) {\n throw getErrorFromPool(getPooledString(\"第2个数据验证失败\"));\n }\n results.push(dataArray[1]);\n }\n if (length >= 3) {\n if (!compiler.Check(dataArray[2])) {\n throw getErrorFromPool(getPooledString(\"第3个数据验证失败\"));\n }\n results.push(dataArray[2]);\n }\n if (length >= 4) {\n if (!compiler.Check(dataArray[3])) {\n throw getErrorFromPool(getPooledString(\"第4个数据验证失败\"));\n }\n results.push(dataArray[3]);\n }\n\n // 处理剩余元素\n for (let i = 4; i < length; i++) {\n const data = dataArray[i];\n if (!compiler.Check(data)) {\n throw getErrorFromPool(getPooledString(`第${i + 1}个数据验证失败`));\n }\n results.push(data);\n }\n\n return results;\n}\n\n// 内存优化的缓存统计\nexport function getCacheStats() {\n const totalSchemas = ultraSchemaCache.size;\n const totalHits = Array.from(schemaCacheHits.values()).reduce(\n (sum, hits) => sum + hits,\n 0,\n );\n const hitRate =\n totalHits > 0\n ? ((totalHits / (totalHits + totalSchemas)) * 100).toFixed(2)\n : \"0.00\";\n\n return {\n totalSchemas,\n totalHits,\n hitRate: `${hitRate}%`,\n cacheSize: ultraSchemaCache.size,\n errorPoolUsage: `${errorPoolIndex}/${ERROR_POOL_SIZE}`,\n stringPoolSize: errorMessagePool.size,\n memoryEfficiency:\n totalHits > 0 ? (totalHits / totalSchemas).toFixed(2) : \"0.00\",\n };\n}\n\n// 智能缓存清理 - 只清理最少使用的Schema\nexport function smartClearUltraCache(keepTop: number = 10): void {\n if (ultraSchemaCache.size <= keepTop) return;\n\n // 按使用频率排序\n const sortedSchemas = Array.from(schemaCacheHits.entries())\n .sort(([, a], [, b]) => b - a)\n .slice(0, keepTop);\n\n // 清理缓存\n ultraSchemaCache.clear();\n schemaCacheHits.clear();\n\n // 重新添加最常用的Schema\n for (const [schema, hits] of sortedSchemas) {\n ultraSchemaCache.set(schema, getUltraSchemaCompiler(schema));\n schemaCacheHits.set(schema, hits);\n }\n}\n\n// 完全清理缓存\nexport function clearUltraCache(): void {\n ultraSchemaCache.clear();\n schemaCacheHits.clear();\n errorPoolIndex = 0;\n}\n\n// 性能监控装饰器 - 使用高精度计时器\nexport function withPerformanceMonitoring<T extends (...args: any[]) => any>(\n fn: T,\n name: string,\n): T {\n return ((...args: any[]) => {\n const start = performance.now();\n try {\n const result = fn(...args);\n const end = performance.now();\n console.log(`⚡ ${name} 执行时间: ${(end - start).toFixed(6)}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n console.log(`❌ ${name} 执行时间: ${(end - start).toFixed(6)}ms (失败)`);\n throw error;\n }\n }) as T;\n}\n\n// 导出主要函数(使用标准命名)\nexport {\n validateAllSchemasUltra as validateAllSchemas,\n createTypedValidatorUltra as createTypedValidator,\n validateBatchUltra as validateBatch,\n clearUltraCache as clearCache,\n smartClearUltraCache as smartClearCache,\n};\n","/**\n * 类型安全的路由处理器工厂\n *\n * 非柯里化设计,API 更简洁\n *\n * @author Framework Team\n * @version 3.0.0\n * @license MIT\n */\n\nimport type {\n RouteSchema,\n HandlerContext,\n HandlerContextWithExtra,\n} from \"../types/schema\";\nimport { parseBody, parseQuery, parseHeaders, parseCookies } from \"./parsers\";\nimport { goAwait } from \"./go-await\";\nimport { json } from \"./response\";\nimport {\n validateAllSchemasUltra,\n precompileSchemasUltra,\n} from \"./validators/schema-validators-ultra\";\n\n/**\n * 自动响应转换\n * 将各种返回值类型转换为 Response 对象\n */\nfunction autoResponse(result: unknown): Response {\n // 已经是 Response\n if (result instanceof Response) {\n return result;\n }\n\n // null/undefined -> 204\n if (result === null || result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n // 字符串 -> text/plain\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 数字/布尔 -> text/plain\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return new Response(String(result), {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 对象 -> 检查是否是 { data, status, headers } 格式\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj && (\"status\" in obj || \"headers\" in obj)) {\n const { data, status = 200, headers = {} } = obj;\n\n if (data === null || data === undefined) {\n return new Response(null, {\n status: status === 200 ? 204 : (status as number),\n headers: headers as HeadersInit,\n });\n }\n\n if (\n typeof data === \"string\" ||\n typeof data === \"number\" ||\n typeof data === \"boolean\"\n ) {\n return new Response(String(data), {\n status: status as number,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...(headers as Record<string, string>),\n },\n });\n }\n\n return json(data, status as number, headers as Record<string, string>);\n }\n\n // 普通对象 -> JSON\n return json(result);\n }\n\n // 其他类型 -> 204\n return new Response(null, { status: 204 });\n}\n\n/**\n * 处理验证错误\n */\nfunction handleValidationError(error: Error): Response {\n return json(\n {\n success: false,\n error: \"Validation Error\",\n message: error.message,\n timestamp: new Date().toISOString(),\n },\n 400,\n );\n}\n\n/**\n * 处理内部错误\n */\nfunction handleInternalError(error: unknown): Response {\n return json(\n {\n success: false,\n error: \"Internal Error\",\n message: error instanceof Error ? error.message : \"未知错误\",\n },\n 500,\n );\n}\n\n/** 空 schema 的上下文类型 */\ntype EmptySchemaContext = {\n req: Request;\n body: unknown;\n query: Record<string, string>;\n params: Record<string, string>;\n headers: Record<string, string>;\n cookies: Record<string, string>;\n};\n\n/**\n * 判断是否为 handler 函数\n */\nfunction isHandler(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\n/**\n * 创建类型安全的路由处理器\n *\n * @example\n * ```typescript\n * // 无 schema - 直接传入 handler\n * createHandler(({ params }) => `User: ${params.id}`)\n *\n * // 有 schema - 传入 schema 和 handler\n * createHandler(\n * { body: Type.Object({ name: Type.String() }) },\n * ({ body }) => ({ hello: body.name })\n * )\n * ```\n */\n// 重载 1: 无 schema\nexport function createHandler<R>(\n handler: (ctx: EmptySchemaContext) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 重载 2: 有 schema\nexport function createHandler<const T extends RouteSchema, R>(\n schema: T,\n handler: (ctx: HandlerContext<T>) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 实现\nexport function createHandler<const T extends RouteSchema, R>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContext<T>) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (ctx: HandlerContext<T>) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemasUltra(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemasUltra(schema, data);\n }\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n });\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n}\n\n/**\n * 创建带额外上下文的路由处理器\n *\n * 用于中间件注入额外数据的场景\n *\n * @example\n * ```typescript\n * // 定义中间件注入的类型\n * type AuthContext = { user: { id: string; role: string } };\n *\n * // 无 schema\n * createHandlerWithExtra<AuthContext>(({ user }) => {\n * return { userId: user.id };\n * })\n *\n * // 有 schema\n * createHandlerWithExtra<AuthContext>(\n * { body: Type.Object({ action: Type.String() }) },\n * ({ body, user }) => ({ success: true, userId: user.id })\n * )\n * ```\n */\n// 重载 1: 无 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n R = unknown,\n>(\n handler: (ctx: EmptySchemaContext & TExtra) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 重载 2: 有 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schema: T,\n handler: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 实现\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext & TExtra) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (\n ctx: HandlerContextWithExtra<T, TExtra>,\n ) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemasUltra(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemasUltra(schema, data);\n }\n\n // 获取中间件注入的额外数据\n const extras = ((req as unknown as Record<string, unknown>).__locals ??\n {}) as TExtra;\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n ...extras,\n } as HandlerContextWithExtra<T, TExtra>);\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n}\n\n/**\n * 简单的路由处理器 (无 schema 验证,只有 req)\n *\n * @example\n * ```typescript\n * simpleHandler(({ req }) => {\n * return { message: \"Hello World\" };\n * })\n * ```\n */\nexport function simpleHandler<R>(\n handler: (ctx: { req: Request }) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n return async (req: Request): Promise<Response> => {\n try {\n const result = await handler({ req });\n return autoResponse(result);\n } catch (error) {\n return handleInternalError(error);\n }\n };\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  * 依赖管理器
3
3
  * 负责按需加载和管理框架依赖
4
4
  */
5
- export declare class DependencyManager {
5
+ declare class DependencyManager {
6
6
  private dependencyCache;
7
7
  /**
8
8
  * 按需获取框架依赖
@@ -21,3 +21,5 @@ export declare class DependencyManager {
21
21
  */
22
22
  getCacheStatus(): Record<string, boolean>;
23
23
  }
24
+
25
+ export { DependencyManager };
@@ -1,73 +1,71 @@
1
- /**
2
- * 依赖管理器
3
- * 负责按需加载和管理框架依赖
4
- */
5
- export class DependencyManager {
6
- dependencyCache = new Map();
7
- /**
8
- * 按需获取框架依赖
9
- */
10
- async getFrameworkDeps(framework) {
11
- if (this.dependencyCache.has(framework)) {
12
- return this.dependencyCache.get(framework);
13
- }
14
- console.log(`📦 按需加载 ${framework} 依赖...`);
15
- try {
16
- let deps;
17
- switch (framework) {
18
- case "vue":
19
- deps = await Promise.all([
20
- import("vue"),
21
- import("@vue/server-renderer"),
22
- ]);
23
- break;
24
- case "react":
25
- deps = await Promise.all([
26
- import("react"),
27
- import("react-dom/server"),
28
- ]);
29
- break;
30
- default:
31
- throw new Error(`不支持的框架: ${framework}`);
32
- }
33
- this.dependencyCache.set(framework, deps);
34
- console.log(`✅ ${framework} 依赖加载完成`);
35
- return deps;
36
- }
37
- catch (error) {
38
- console.error(`❌ ${framework} 依赖加载失败:`, error);
39
- throw error;
40
- }
1
+ // src/utils/dependency-manager.ts
2
+ var DependencyManager = class {
3
+ dependencyCache = /* @__PURE__ */ new Map();
4
+ /**
5
+ * 按需获取框架依赖
6
+ */
7
+ async getFrameworkDeps(framework) {
8
+ if (this.dependencyCache.has(framework)) {
9
+ return this.dependencyCache.get(framework);
41
10
  }
42
- /**
43
- * 检测组件类型
44
- */
45
- detectComponentType(component) {
46
- // 简单的组件类型检测
47
- if (component.render && typeof component.render === "function") {
48
- return "vue";
49
- }
50
- if (component.$$typeof) {
51
- return "react";
52
- }
53
- // 默认使用 Vue
54
- return "vue";
11
+ console.log(`\u{1F4E6} \u6309\u9700\u52A0\u8F7D ${framework} \u4F9D\u8D56...`);
12
+ try {
13
+ let deps;
14
+ switch (framework) {
15
+ case "vue":
16
+ deps = await Promise.all([
17
+ import("vue"),
18
+ import("@vue/server-renderer")
19
+ ]);
20
+ break;
21
+ case "react":
22
+ deps = await Promise.all([
23
+ import("react"),
24
+ import("react-dom/server")
25
+ ]);
26
+ break;
27
+ default:
28
+ throw new Error(`\u4E0D\u652F\u6301\u7684\u6846\u67B6: ${framework}`);
29
+ }
30
+ this.dependencyCache.set(framework, deps);
31
+ console.log(`\u2705 ${framework} \u4F9D\u8D56\u52A0\u8F7D\u5B8C\u6210`);
32
+ return deps;
33
+ } catch (error) {
34
+ console.error(`\u274C ${framework} \u4F9D\u8D56\u52A0\u8F7D\u5931\u8D25:`, error);
35
+ throw error;
55
36
  }
56
- /**
57
- * 清除缓存
58
- */
59
- clearCache() {
60
- this.dependencyCache.clear();
61
- console.log("🧹 依赖缓存已清除");
37
+ }
38
+ /**
39
+ * 检测组件类型
40
+ */
41
+ detectComponentType(component) {
42
+ if (component.render && typeof component.render === "function") {
43
+ return "vue";
62
44
  }
63
- /**
64
- * 获取缓存状态
65
- */
66
- getCacheStatus() {
67
- const status = {};
68
- for (const [framework] of this.dependencyCache) {
69
- status[framework] = true;
70
- }
71
- return status;
45
+ if (component.$$typeof) {
46
+ return "react";
72
47
  }
73
- }
48
+ return "vue";
49
+ }
50
+ /**
51
+ * 清除缓存
52
+ */
53
+ clearCache() {
54
+ this.dependencyCache.clear();
55
+ console.log("\u{1F9F9} \u4F9D\u8D56\u7F13\u5B58\u5DF2\u6E05\u9664");
56
+ }
57
+ /**
58
+ * 获取缓存状态
59
+ */
60
+ getCacheStatus() {
61
+ const status = {};
62
+ for (const [framework] of this.dependencyCache) {
63
+ status[framework] = true;
64
+ }
65
+ return status;
66
+ }
67
+ };
68
+ export {
69
+ DependencyManager
70
+ };
71
+ //# sourceMappingURL=dependency-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/dependency-manager.ts"],"sourcesContent":["/**\n * 依赖管理器\n * 负责按需加载和管理框架依赖\n */\nexport class DependencyManager {\n private dependencyCache = new Map<string, any>();\n\n /**\n * 按需获取框架依赖\n */\n async getFrameworkDeps(framework: \"vue\" | \"react\") {\n if (this.dependencyCache.has(framework)) {\n return this.dependencyCache.get(framework);\n }\n\n console.log(`📦 按需加载 ${framework} 依赖...`);\n\n try {\n let deps;\n switch (framework) {\n case \"vue\":\n deps = await Promise.all([\n import(\"vue\"),\n import(\"@vue/server-renderer\"),\n ]);\n break;\n case \"react\":\n deps = await Promise.all([\n import(\"react\"),\n import(\"react-dom/server\"),\n ]);\n break;\n default:\n throw new Error(`不支持的框架: ${framework}`);\n }\n\n this.dependencyCache.set(framework, deps);\n console.log(`✅ ${framework} 依赖加载完成`);\n return deps;\n } catch (error) {\n console.error(`❌ ${framework} 依赖加载失败:`, error);\n throw error;\n }\n }\n\n /**\n * 检测组件类型\n */\n detectComponentType(component: any): \"vue\" | \"react\" {\n // 简单的组件类型检测\n if (component.render && typeof component.render === \"function\") {\n return \"vue\";\n }\n if (component.$$typeof) {\n return \"react\";\n }\n // 默认使用 Vue\n return \"vue\";\n }\n\n /**\n * 清除缓存\n */\n clearCache(): void {\n this.dependencyCache.clear();\n console.log(\"🧹 依赖缓存已清除\");\n }\n\n /**\n * 获取缓存状态\n */\n getCacheStatus(): Record<string, boolean> {\n const status: Record<string, boolean> = {};\n for (const [framework] of this.dependencyCache) {\n status[framework] = true;\n }\n return status;\n }\n}\n"],"mappings":";AAIO,IAAM,oBAAN,MAAwB;AAAA,EACrB,kBAAkB,oBAAI,IAAiB;AAAA;AAAA;AAAA;AAAA,EAK/C,MAAM,iBAAiB,WAA4B;AACjD,QAAI,KAAK,gBAAgB,IAAI,SAAS,GAAG;AACvC,aAAO,KAAK,gBAAgB,IAAI,SAAS;AAAA,IAC3C;AAEA,YAAQ,IAAI,sCAAW,SAAS,kBAAQ;AAExC,QAAI;AACF,UAAI;AACJ,cAAQ,WAAW;AAAA,QACjB,KAAK;AACH,iBAAO,MAAM,QAAQ,IAAI;AAAA,YACvB,OAAO,KAAK;AAAA,YACZ,OAAO,sBAAsB;AAAA,UAC/B,CAAC;AACD;AAAA,QACF,KAAK;AACH,iBAAO,MAAM,QAAQ,IAAI;AAAA,YACvB,OAAO,OAAO;AAAA,YACd,OAAO,kBAAkB;AAAA,UAC3B,CAAC;AACD;AAAA,QACF;AACE,gBAAM,IAAI,MAAM,yCAAW,SAAS,EAAE;AAAA,MAC1C;AAEA,WAAK,gBAAgB,IAAI,WAAW,IAAI;AACxC,cAAQ,IAAI,UAAK,SAAS,uCAAS;AACnC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,UAAK,SAAS,0CAAY,KAAK;AAC7C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,WAAiC;AAEnD,QAAI,UAAU,UAAU,OAAO,UAAU,WAAW,YAAY;AAC9D,aAAO;AAAA,IACT;AACA,QAAI,UAAU,UAAU;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,gBAAgB,MAAM;AAC3B,YAAQ,IAAI,sDAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA0C;AACxC,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,SAAS,KAAK,KAAK,iBAAiB;AAC9C,aAAO,SAAS,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -23,4 +23,6 @@
23
23
  * }
24
24
  * ```
25
25
  */
26
- export declare function goAwait<T>(promise: Promise<T>): Promise<[Error | null, T | undefined]>;
26
+ declare function goAwait<T>(promise: Promise<T>): Promise<[Error | null, T | undefined]>;
27
+
28
+ export { goAwait };
@@ -1,3 +1,10 @@
1
+ // src/utils/go-await.ts
2
+ function goAwait(promise) {
3
+ return promise.then((data) => [null, data]).catch((err) => [err instanceof Error ? err : new Error(String(err)), void 0]);
4
+ }
5
+ export {
6
+ goAwait
7
+ };
1
8
  /**
2
9
  * Go 风格的错误处理工具
3
10
  * 将 Promise 转换为 [Error | null, T | undefined] 格式
@@ -6,25 +13,4 @@
6
13
  * @version 1.0.0
7
14
  * @license MIT
8
15
  */
9
- /**
10
- * Go 风格的错误处理工具
11
- * 将 Promise 转换为 [Error | null, T | undefined] 格式
12
- *
13
- * @param promise 要处理的 Promise
14
- * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果
15
- *
16
- * @example
17
- * ```typescript
18
- * const [error, result] = await goAwait(someAsyncFunction());
19
- * if (error) {
20
- * console.error("操作失败:", error);
21
- * } else {
22
- * console.log("操作成功:", result);
23
- * }
24
- * ```
25
- */
26
- export function goAwait(promise) {
27
- return promise
28
- .then((data) => [null, data])
29
- .catch((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);
30
- }
16
+ //# sourceMappingURL=go-await.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/go-await.ts"],"sourcesContent":["/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\n/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @param promise 要处理的 Promise\n * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果\n *\n * @example\n * ```typescript\n * const [error, result] = await goAwait(someAsyncFunction());\n * if (error) {\n * console.error(\"操作失败:\", error);\n * } else {\n * console.log(\"操作成功:\", result);\n * }\n * ```\n */\nexport function goAwait<T>(\n promise: Promise<T>,\n): Promise<[Error | null, T | undefined]> {\n return promise\n .then<[null, T]>((data) => [null, data])\n .catch<\n [Error, undefined]\n >((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);\n}\n"],"mappings":";AA0BO,SAAS,QACd,SACwC;AACxC,SAAO,QACJ,KAAgB,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EACtC,MAEC,CAAC,QAAQ,CAAC,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG,MAAS,CAAC;AAC/E;","names":[]}
@@ -1,11 +1,13 @@
1
1
  /** 获取单个 Cookie 值 */
2
- export declare function getCookie(req: Request, key: string): string | null;
2
+ declare function getCookie(req: Request, key: string): string | null;
3
3
  /** 生成 Set-Cookie 头 */
4
- export declare function setCookie(key: string, value: string, options?: {
4
+ declare function setCookie(key: string, value: string, options?: {
5
5
  path?: string;
6
6
  httpOnly?: boolean;
7
7
  maxAge?: number;
8
8
  secure?: boolean;
9
9
  }): string;
10
- export declare function setLocals<T extends object>(req: Request, extras: T): void;
11
- export declare function getLocals<T extends object>(req: Request): T;
10
+ declare function setLocals<T extends object>(req: Request, extras: T): void;
11
+ declare function getLocals<T extends object>(req: Request): T;
12
+
13
+ export { getCookie, getLocals, setCookie, setLocals };
@@ -1,29 +1,48 @@
1
- import { parseCookies } from "./parsers";
2
- /** 获取单个 Cookie 值 */
3
- export function getCookie(req, key) {
4
- const cookies = parseCookies(req);
5
- return cookies[key] || null;
1
+ // src/utils/parsers.ts
2
+ import qs from "qs";
3
+ import cookie from "cookie";
4
+ function parseCookies(req) {
5
+ const cookieHeader = req.headers.get("cookie");
6
+ if (!cookieHeader) return {};
7
+ try {
8
+ const parsed = cookie.parse(cookieHeader);
9
+ const result = {};
10
+ for (const [key, value] of Object.entries(parsed)) {
11
+ if (value !== void 0 && value !== null) {
12
+ result[key] = value;
13
+ }
14
+ }
15
+ return result;
16
+ } catch {
17
+ return {};
18
+ }
6
19
  }
7
- /** 生成 Set-Cookie 头 */
8
- export function setCookie(key, value, options = {}) {
9
- let cookie = `${key}=${encodeURIComponent(value)}`;
10
- if (options.path)
11
- cookie += `; Path=${options.path}`;
12
- if (options.httpOnly)
13
- cookie += `; HttpOnly`;
14
- if (options.secure)
15
- cookie += `; Secure`;
16
- if (options.maxAge)
17
- cookie += `; Max-Age=${options.maxAge}`;
18
- return cookie;
20
+
21
+ // src/utils/handle.ts
22
+ function getCookie(req, key) {
23
+ const cookies = parseCookies(req);
24
+ return cookies[key] || null;
19
25
  }
20
- // 提供给中间件写入"局部上下文"的工具函数
21
- export function setLocals(req, extras) {
22
- const target = req;
23
- target.__locals = { ...(target.__locals ?? {}), ...extras };
26
+ function setCookie(key, value, options = {}) {
27
+ let cookie2 = `${key}=${encodeURIComponent(value)}`;
28
+ if (options.path) cookie2 += `; Path=${options.path}`;
29
+ if (options.httpOnly) cookie2 += `; HttpOnly`;
30
+ if (options.secure) cookie2 += `; Secure`;
31
+ if (options.maxAge) cookie2 += `; Max-Age=${options.maxAge}`;
32
+ return cookie2;
24
33
  }
25
- // 获取中间件注入的局部上下文
26
- export function getLocals(req) {
27
- const target = req;
28
- return (target.__locals ?? {});
34
+ function setLocals(req, extras) {
35
+ const target = req;
36
+ target.__locals = { ...target.__locals ?? {}, ...extras };
29
37
  }
38
+ function getLocals(req) {
39
+ const target = req;
40
+ return target.__locals ?? {};
41
+ }
42
+ export {
43
+ getCookie,
44
+ getLocals,
45
+ setCookie,
46
+ setLocals
47
+ };
48
+ //# sourceMappingURL=handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/parsers.ts","../../src/utils/handle.ts"],"sourcesContent":["// src/parsers.ts\nimport qs from \"qs\";\nimport cookie from \"cookie\";\n\n// 文件信息接口\nexport interface FileInfo {\n name: string;\n type: string;\n size: number;\n data: ArrayBuffer;\n}\n\n// 表单数据接口\nexport interface FormData {\n fields: Record<string, string>;\n files: Record<string, FileInfo>;\n}\n\n/**\n * 简化的请求体解析函数\n * 优先简洁性,处理最常见的场景\n */\nexport async function parseBody(req: Request): Promise<unknown> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await req.json();\n }\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await req.text();\n return Object.fromEntries(new URLSearchParams(text));\n }\n return await req.text(); // fallback\n}\n\n/**\n * 解析 multipart/form-data 格式\n * 支持文件上传和普通表单字段\n */\nasync function parseMultipartFormData(req: Request): Promise<FormData> {\n const formData = await req.formData();\n const result: FormData = {\n fields: {},\n files: {},\n };\n\n for (const [key, value] of formData.entries()) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"type\" in value &&\n \"size\" in value\n ) {\n // 处理文件\n const file = value as any;\n const arrayBuffer = await file.arrayBuffer();\n result.files[key] = {\n name: file.name,\n type: file.type,\n size: file.size,\n data: arrayBuffer,\n };\n } else {\n // 处理普通字段\n result.fields[key] = value as string;\n }\n }\n\n return result;\n}\n\n/**\n * 解析请求体为特定类型\n * 提供类型安全的解析方法\n */\nexport async function parseBodyAs<T>(req: Request): Promise<T> {\n const body = await parseBody(req);\n return body as T;\n}\n\n/**\n * 解析请求体为表单数据\n * 专门用于处理 multipart/form-data\n */\nexport async function parseFormData(req: Request): Promise<FormData> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n return await parseMultipartFormData(req);\n}\n\n/**\n * 解析请求体为文件\n * 专门用于处理文件上传\n */\nexport async function parseFile(req: Request): Promise<FileInfo> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n const formData = await parseMultipartFormData(req);\n const fileKeys = Object.keys(formData.files);\n\n if (fileKeys.length === 0) {\n throw new Error(\"请求中没有文件\");\n }\n\n if (fileKeys.length > 1) {\n throw new Error(\"请求中包含多个文件,请使用 parseFormData\");\n }\n\n return formData.files[fileKeys[0]];\n}\n\n/**\n * 快速提取 query string(避免创建 URL 对象)\n */\nfunction extractQueryString(url: string): string {\n const qIndex = url.indexOf(\"?\");\n if (qIndex === -1) return \"\";\n\n const hashIndex = url.indexOf(\"#\", qIndex);\n return hashIndex === -1\n ? url.substring(qIndex + 1)\n : url.substring(qIndex + 1, hashIndex);\n}\n\n/** 获取查询字符串,直接返回对象 */\nexport function parseQuery(req: Request): Record<string, unknown> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n return qs.parse(queryString);\n}\n\n/**\n * 快速解析简单查询字符串(不支持嵌套,但更快)\n * 适用于简单的 key=value&key2=value2 场景\n */\nexport function parseQueryFast(req: Request): Record<string, string> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n result[decodeURIComponent(pair)] = \"\";\n } else {\n const key = decodeURIComponent(pair.substring(0, eqIndex));\n const value = decodeURIComponent(pair.substring(eqIndex + 1));\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/** 解析请求头,返回对象 */\nexport function parseHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = Object.create(null);\n req.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * 获取单个请求头(避免解析全部)\n */\nexport function getHeader(req: Request, name: string): string | null {\n return req.headers.get(name);\n}\n\n/** 使用cookie库解析Cookie,保证可靠性 */\nexport function parseCookies(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n try {\n const parsed = cookie.parse(cookieHeader);\n // 过滤掉undefined和null值\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * 快速解析 Cookie(简化版,不使用外部库)\n * 适用于简单的 cookie 场景\n */\nexport function parseCookiesFast(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n const key = trimmed.substring(0, eqIndex).trim();\n const value = trimmed.substring(eqIndex + 1).trim();\n // 移除引号\n result[key] =\n value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return result;\n}\n\n/**\n * 获取单个 Cookie 值(避免解析全部)\n */\nexport function getCookie(req: Request, name: string): string | null {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return null;\n\n const prefix = `${name}=`;\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n if (trimmed.startsWith(prefix)) {\n const value = trimmed.substring(prefix.length).trim();\n return value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return null;\n}\n","import { parseCookies } from \"./parsers\";\n\n/** 获取单个 Cookie 值 */\nexport function getCookie(req: Request, key: string): string | null {\n const cookies = parseCookies(req);\n return cookies[key] || null;\n}\n\n/** 生成 Set-Cookie 头 */\nexport function setCookie(\n key: string,\n value: string,\n options: {\n path?: string;\n httpOnly?: boolean;\n maxAge?: number;\n secure?: boolean;\n } = {},\n): string {\n let cookie = `${key}=${encodeURIComponent(value)}`;\n\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.httpOnly) cookie += `; HttpOnly`;\n if (options.secure) cookie += `; Secure`;\n if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n\n return cookie;\n}\n\n// 提供给中间件写入\"局部上下文\"的工具函数\nexport function setLocals<T extends object>(req: Request, extras: T) {\n const target = req as unknown as Record<string, unknown>;\n target.__locals = { ...((target.__locals as object) ?? {}), ...extras };\n}\n\n// 获取中间件注入的局部上下文\nexport function getLocals<T extends object>(req: Request): T {\n const target = req as unknown as Record<string, unknown>;\n return (target.__locals ?? {}) as T;\n}\n"],"mappings":";AACA,OAAO,QAAQ;AACf,OAAO,YAAY;AAmLZ,SAAS,aAAa,KAAsC;AACjE,QAAM,eAAe,IAAI,QAAQ,IAAI,QAAQ;AAC7C,MAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,MAAI;AACF,UAAM,SAAS,OAAO,MAAM,YAAY;AAExC,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;ACnMO,SAAS,UAAU,KAAc,KAA4B;AAClE,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,QAAQ,GAAG,KAAK;AACzB;AAGO,SAAS,UACd,KACA,OACA,UAKI,CAAC,GACG;AACR,MAAIA,UAAS,GAAG,GAAG,IAAI,mBAAmB,KAAK,CAAC;AAEhD,MAAI,QAAQ,KAAM,CAAAA,WAAU,UAAU,QAAQ,IAAI;AAClD,MAAI,QAAQ,SAAU,CAAAA,WAAU;AAChC,MAAI,QAAQ,OAAQ,CAAAA,WAAU;AAC9B,MAAI,QAAQ,OAAQ,CAAAA,WAAU,aAAa,QAAQ,MAAM;AAEzD,SAAOA;AACT;AAGO,SAAS,UAA4B,KAAc,QAAW;AACnE,QAAM,SAAS;AACf,SAAO,WAAW,EAAE,GAAK,OAAO,YAAuB,CAAC,GAAI,GAAG,OAAO;AACxE;AAGO,SAAS,UAA4B,KAAiB;AAC3D,QAAM,SAAS;AACf,SAAQ,OAAO,YAAY,CAAC;AAC9B;","names":["cookie"]}
@@ -2,7 +2,7 @@
2
2
  * HTML渲染工具类
3
3
  * 提供统一的HTML模板生成功能
4
4
  */
5
- export declare class HtmlRenderer {
5
+ declare class HtmlRenderer {
6
6
  /**
7
7
  * 生成基础HTML模板
8
8
  */
@@ -16,3 +16,5 @@ export declare class HtmlRenderer {
16
16
  */
17
17
  static generateReactHtml(content: string, context: any, clientScriptPath?: string): string;
18
18
  }
19
+
20
+ export { HtmlRenderer };
@@ -1,13 +1,10 @@
1
- /**
2
- * HTML渲染工具类
3
- * 提供统一的HTML模板生成功能
4
- */
5
- export class HtmlRenderer {
6
- /**
7
- * 生成基础HTML模板
8
- */
9
- static generateBaseHtml(content, context, clientScriptPath = "/client.js") {
10
- return `
1
+ // src/utils/html-renderer.ts
2
+ var HtmlRenderer = class {
3
+ /**
4
+ * 生成基础HTML模板
5
+ */
6
+ static generateBaseHtml(content, context, clientScriptPath = "/client.js") {
7
+ return `
11
8
  <!doctype html>
12
9
  <html>
13
10
  <head>
@@ -28,18 +25,18 @@ export class HtmlRenderer {
28
25
  </body>
29
26
  </html>
30
27
  `;
31
- }
32
- /**
33
- * 生成Vue组件HTML
34
- */
35
- static generateVueHtml(content, context, clientScriptPath = "/client.js") {
36
- return this.generateBaseHtml(content, context, clientScriptPath);
37
- }
38
- /**
39
- * 生成React组件HTML
40
- */
41
- static generateReactHtml(content, context, clientScriptPath = "/client.js") {
42
- return `
28
+ }
29
+ /**
30
+ * 生成Vue组件HTML
31
+ */
32
+ static generateVueHtml(content, context, clientScriptPath = "/client.js") {
33
+ return this.generateBaseHtml(content, context, clientScriptPath);
34
+ }
35
+ /**
36
+ * 生成React组件HTML
37
+ */
38
+ static generateReactHtml(content, context, clientScriptPath = "/client.js") {
39
+ return `
43
40
  <!doctype html>
44
41
  <html>
45
42
  <head>
@@ -60,5 +57,9 @@ export class HtmlRenderer {
60
57
  </body>
61
58
  </html>
62
59
  `;
63
- }
64
- }
60
+ }
61
+ };
62
+ export {
63
+ HtmlRenderer
64
+ };
65
+ //# sourceMappingURL=html-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/html-renderer.ts"],"sourcesContent":["/**\n * HTML渲染工具类\n * 提供统一的HTML模板生成功能\n */\nexport class HtmlRenderer {\n /**\n * 生成基础HTML模板\n */\n static generateBaseHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"app\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n\n /**\n * 生成Vue组件HTML\n */\n static generateVueHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return this.generateBaseHtml(content, context, clientScriptPath);\n }\n\n /**\n * 生成React组件HTML\n */\n static generateReactHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"root\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n}\n"],"mappings":";AAIO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAIxB,OAAO,iBACL,SACA,SACA,mBAA2B,cACnB;AACR,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASe,OAAO;AAAA;AAAA;AAAA,wBAGT,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,uBACrC,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,2BAC/B,QAAQ,QAAQ;AAAA;AAAA;AAAA,uCAGJ,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIrD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBACL,SACA,SACA,mBAA2B,cACnB;AACR,WAAO,KAAK,iBAAiB,SAAS,SAAS,gBAAgB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBACL,SACA,SACA,mBAA2B,cACnB;AACR,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BASgB,OAAO;AAAA;AAAA;AAAA,wBAGV,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,uBACrC,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,2BAC/B,QAAQ,QAAQ;AAAA;AAAA;AAAA,uCAGJ,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIrD;AACF;","names":[]}
@@ -1,13 +1,13 @@
1
- /**
2
- * 工具函数模块导出
3
- */
4
- export { createHandler, createHandlerWithExtra, simpleHandler, } from "./create-handler";
5
- export { parseBody, parseQuery, parseQueryFast, parseHeaders, getHeader, parseCookies, parseCookiesFast, getCookie, } from "./parsers";
6
- export { json, text, html, redirect, empty, stream } from "./response";
7
- export { goAwait } from "./go-await";
8
- export { base64urlEncode, base64urlDecode } from "./base64url";
9
- export { setLocals, getLocals } from "./handle";
10
- export { parseRequest, validateRequest, parseAndValidateRequest, createRequestValidator, } from "./request-validator";
11
- export { HtmlRenderer } from "./html-renderer";
12
- export { DependencyManager } from "./dependency-manager";
13
- export { validateSchema, createValidator, validateFast, precompileSchemas, getValidatorCacheStats, } from "./validators/validators";
1
+ export { createHandler, createHandlerWithExtra, simpleHandler } from './create-handler.js';
2
+ export { getCookie, getHeader, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast } from './parsers.js';
3
+ export { empty, html, json, redirect, stream, text } from './response.js';
4
+ export { goAwait } from './go-await.js';
5
+ export { base64urlDecode, base64urlEncode } from './base64url.js';
6
+ export { getLocals, setLocals } from './handle.js';
7
+ export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest } from './request-validator.js';
8
+ export { HtmlRenderer } from './html-renderer.js';
9
+ export { DependencyManager } from './dependency-manager.js';
10
+ export { createValidator, getValidatorCacheStats, precompileSchemas, validateFast, validateSchema } from './validators/validators.js';
11
+ import '../types/schema.js';
12
+ import '@sinclair/typebox';
13
+ import './validators/schema-validators-ultra.js';