sa2kit 1.6.2 → 1.6.5

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 (128) hide show
  1. package/dist/audioDetection/index.js.map +1 -1
  2. package/dist/audioDetection/index.mjs.map +1 -1
  3. package/dist/auth/index.d.mts +16 -1
  4. package/dist/auth/index.d.ts +16 -1
  5. package/dist/auth/index.js +42 -23
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/index.mjs +26 -3
  8. package/dist/auth/index.mjs.map +1 -1
  9. package/dist/auth/middleware/index.js +3 -3
  10. package/dist/auth/middleware/index.mjs +2 -2
  11. package/dist/auth/routes/index.js +14 -14
  12. package/dist/auth/routes/index.mjs +2 -2
  13. package/dist/auth/services/index.d.mts +1 -0
  14. package/dist/auth/services/index.d.ts +1 -0
  15. package/dist/auth/services/index.js +7 -7
  16. package/dist/auth/services/index.mjs +1 -1
  17. package/dist/calendar/index.d.mts +1311 -0
  18. package/dist/calendar/index.d.ts +1311 -0
  19. package/dist/calendar/index.js +5360 -0
  20. package/dist/calendar/index.js.map +1 -0
  21. package/dist/calendar/index.mjs +5294 -0
  22. package/dist/calendar/index.mjs.map +1 -0
  23. package/dist/calendar/routes/index.d.mts +118 -0
  24. package/dist/calendar/routes/index.d.ts +118 -0
  25. package/dist/calendar/routes/index.js +335 -0
  26. package/dist/calendar/routes/index.js.map +1 -0
  27. package/dist/calendar/routes/index.mjs +327 -0
  28. package/dist/calendar/routes/index.mjs.map +1 -0
  29. package/dist/calendar/server.d.mts +1189 -0
  30. package/dist/calendar/server.d.ts +1189 -0
  31. package/dist/calendar/server.js +219 -0
  32. package/dist/calendar/server.js.map +1 -0
  33. package/dist/calendar/server.mjs +165 -0
  34. package/dist/calendar/server.mjs.map +1 -0
  35. package/dist/chunk-2ODO4HEI.js +195 -0
  36. package/dist/chunk-2ODO4HEI.js.map +1 -0
  37. package/dist/{chunk-RCNNVNLT.mjs → chunk-3BGPZN4X.mjs} +8 -3
  38. package/dist/chunk-3BGPZN4X.mjs.map +1 -0
  39. package/dist/{chunk-FV3FNHQY.js → chunk-6W5BMXJG.js} +4 -4
  40. package/dist/{chunk-FV3FNHQY.js.map → chunk-6W5BMXJG.js.map} +1 -1
  41. package/dist/{chunk-NMF4ANIC.js → chunk-7Z5LLJ3A.js} +8 -2
  42. package/dist/chunk-7Z5LLJ3A.js.map +1 -0
  43. package/dist/{chunk-42IJ7HEI.js → chunk-CD77U7LZ.js} +5 -5
  44. package/dist/{chunk-42IJ7HEI.js.map → chunk-CD77U7LZ.js.map} +1 -1
  45. package/dist/{chunk-6BL3AZGD.js → chunk-DUHZ7VZP.js} +2 -2
  46. package/dist/chunk-DUHZ7VZP.js.map +1 -0
  47. package/dist/{chunk-6VHWOPRR.mjs → chunk-ESRCX5TQ.mjs} +3 -3
  48. package/dist/{chunk-6VHWOPRR.mjs.map → chunk-ESRCX5TQ.mjs.map} +1 -1
  49. package/dist/chunk-FJU3NA6B.js +318 -0
  50. package/dist/chunk-FJU3NA6B.js.map +1 -0
  51. package/dist/{chunk-DQVPZTVC.js → chunk-G4AMEDO5.js} +2 -2
  52. package/dist/{chunk-DQVPZTVC.js.map → chunk-G4AMEDO5.js.map} +1 -1
  53. package/dist/chunk-GAC4J5GX.js +228 -0
  54. package/dist/chunk-GAC4J5GX.js.map +1 -0
  55. package/dist/chunk-KFDEOLDH.mjs +100 -0
  56. package/dist/chunk-KFDEOLDH.mjs.map +1 -0
  57. package/dist/chunk-NRYHBGU6.js +106 -0
  58. package/dist/chunk-NRYHBGU6.js.map +1 -0
  59. package/dist/chunk-OCIJT5VO.mjs +306 -0
  60. package/dist/chunk-OCIJT5VO.mjs.map +1 -0
  61. package/dist/{chunk-U2L6V7KD.mjs → chunk-OCR5DS4C.mjs} +2 -2
  62. package/dist/chunk-OCR5DS4C.mjs.map +1 -0
  63. package/dist/{chunk-IBLB7ARJ.mjs → chunk-QAT2RWAO.mjs} +3 -3
  64. package/dist/{chunk-IBLB7ARJ.mjs.map → chunk-QAT2RWAO.mjs.map} +1 -1
  65. package/dist/chunk-T6TE7GTY.mjs +218 -0
  66. package/dist/chunk-T6TE7GTY.mjs.map +1 -0
  67. package/dist/chunk-ZCLAF3XN.mjs +182 -0
  68. package/dist/chunk-ZCLAF3XN.mjs.map +1 -0
  69. package/dist/{chunk-5XUE72Y3.mjs → chunk-ZYXF3L6T.mjs} +2 -2
  70. package/dist/{chunk-5XUE72Y3.mjs.map → chunk-ZYXF3L6T.mjs.map} +1 -1
  71. package/dist/imageCrop/index.js.map +1 -1
  72. package/dist/imageCrop/index.mjs.map +1 -1
  73. package/dist/index-DSel44Ke.d.mts +93 -0
  74. package/dist/index-DSel44Ke.d.ts +93 -0
  75. package/dist/index.d.mts +433 -3
  76. package/dist/index.d.ts +433 -3
  77. package/dist/index.js +2148 -64
  78. package/dist/index.js.map +1 -1
  79. package/dist/index.mjs +1980 -33
  80. package/dist/index.mjs.map +1 -1
  81. package/dist/mmd/admin/index.d.mts +1 -1
  82. package/dist/mmd/admin/index.d.ts +1 -1
  83. package/dist/mmd/index.d.mts +94 -3
  84. package/dist/mmd/index.d.ts +94 -3
  85. package/dist/mmd/index.js +677 -180
  86. package/dist/mmd/index.js.map +1 -1
  87. package/dist/mmd/index.mjs +679 -183
  88. package/dist/mmd/index.mjs.map +1 -1
  89. package/dist/mmd/server/index.d.mts +1 -1
  90. package/dist/mmd/server/index.d.ts +1 -1
  91. package/dist/music/index.d.mts +79 -0
  92. package/dist/music/index.d.ts +79 -0
  93. package/dist/music/index.js +58 -0
  94. package/dist/music/index.js.map +1 -0
  95. package/dist/music/index.mjs +5 -0
  96. package/dist/music/index.mjs.map +1 -0
  97. package/dist/music/server/index.d.mts +1 -0
  98. package/dist/music/server/index.d.ts +1 -0
  99. package/dist/music/server/index.js +37 -0
  100. package/dist/music/server/index.js.map +1 -0
  101. package/dist/music/server/index.mjs +4 -0
  102. package/dist/music/server/index.mjs.map +1 -0
  103. package/dist/testYourself/admin/index.js +3 -3
  104. package/dist/testYourself/admin/index.mjs +1 -1
  105. package/dist/testYourself/index.js +7 -7
  106. package/dist/testYourself/index.js.map +1 -1
  107. package/dist/testYourself/index.mjs +2 -2
  108. package/dist/testYourself/index.mjs.map +1 -1
  109. package/dist/{types-DxYJqqes.d.mts → types-B60F7EZZ.d.mts} +16 -1
  110. package/dist/{types-DxYJqqes.d.ts → types-B60F7EZZ.d.ts} +16 -1
  111. package/dist/universalFile/index.d.mts +125 -7
  112. package/dist/universalFile/index.d.ts +125 -7
  113. package/dist/universalFile/index.js +1253 -30
  114. package/dist/universalFile/index.js.map +1 -1
  115. package/dist/universalFile/index.mjs +1244 -23
  116. package/dist/universalFile/index.mjs.map +1 -1
  117. package/dist/universalFile/server/index.js +5 -5
  118. package/dist/universalFile/server/index.mjs +1 -1
  119. package/dist/utils/index.d.mts +5 -1
  120. package/dist/utils/index.d.ts +5 -1
  121. package/dist/utils/index.js +13 -9
  122. package/dist/utils/index.mjs +1 -1
  123. package/package.json +47 -19
  124. package/tailwind.animations.js +5 -0
  125. package/dist/chunk-6BL3AZGD.js.map +0 -1
  126. package/dist/chunk-NMF4ANIC.js.map +0 -1
  127. package/dist/chunk-RCNNVNLT.mjs.map +0 -1
  128. package/dist/chunk-U2L6V7KD.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth/routes/login.ts","../src/auth/routes/register.ts","../src/auth/routes/me.ts","../src/auth/routes/logout.ts","../src/auth/routes/defaults.ts","../src/auth/routes/analytics-adapter.ts"],"names":["response","addCorsHeaders"],"mappings":"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","file":"chunk-IBLB7ARJ.mjs","sourcesContent":["/**\n * Auth Routes - Login\n * 登录路由处理器\n */\n\nimport type { LoginRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: LoginRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建登录路由处理器\n *\n * @example\n * ```typescript\n * import { createLoginHandler } from 'sa2kit/auth/routes';\n *\n * export const POST = createLoginHandler({\n * authService: myAuthService,\n * analytics: myAnalytics,\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createLoginHandler(config: LoginRouteConfig) {\n return async (request: Request) => {\n let requestBody: any = {};\n\n try {\n // 解析请求体\n requestBody = await request.json();\n const { email, password } = requestBody;\n\n // 验证必填字段\n if (!email || !password) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '邮箱和密码不能为空',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 执行登录\n const result = await config.authService.signIn(email, password);\n\n // 记录登录成功埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_login_success', {\n userId: result.user.id,\n userRole: result.user.role,\n email: result.user.email,\n loginMethod: 'email_password',\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track login analytics:', analyticsError);\n }\n }\n\n // 创建响应\n const response = new Response(\n JSON.stringify({\n success: true,\n data: {\n user: result.user,\n token: result.token,\n },\n message: '登录成功',\n } as ApiResponse),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n // 设置 Cookie(如果有配置)\n if (config.cookieOptions) {\n const cookieOptions = {\n name: config.cookieOptions?.name || 'auth_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === 'production',\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7, // 7天\n path: config.cookieOptions?.path || '/',\n };\n\n // 设置 Set-Cookie header\n const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;\n response.headers.set('Set-Cookie', cookieValue);\n }\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Login error:', error);\n\n // 记录登录失败埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_login_failed', {\n errorMessage: (error as any).message || '登录失败',\n email: requestBody.email,\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track login failure analytics:', analyticsError);\n }\n }\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: (error as any).message || '登录失败,请检查邮箱和密码',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createLoginOptionsHandler(config: LoginRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n return addCorsHeaders(response, config, request);\n };\n}\n\n","/**\n * Auth Routes - Register\n * 注册路由处理器\n */\n\nimport type { RegisterRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: RegisterRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建注册路由处理器\n *\n * @example\n * ```typescript\n * import { createRegisterHandler } from 'sa2kit/auth/routes';\n *\n * export const POST = createRegisterHandler({\n * authService: myAuthService,\n * defaultRole: 'USER',\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createRegisterHandler(config: RegisterRouteConfig) {\n return async (request: Request) => {\n try {\n // 解析请求体\n const { email, password, username } = await request.json();\n\n // 验证必填字段\n if (!email || !password) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '邮箱和密码不能为空',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 密码强度验证\n if (password.length < 6) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '密码长度至少为 6 位',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 执行注册\n const result = await config.authService.signUp(\n email,\n password,\n username,\n config.defaultRole || 'USER'\n );\n\n // 记录注册成功埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_register_success', {\n userId: result.user.id,\n email: result.user.email,\n username: result.user.username,\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track register analytics:', analyticsError);\n }\n }\n\n // 创建响应\n const response = new Response(\n JSON.stringify({\n success: true,\n data: {\n user: result.user,\n token: result.token,\n },\n message: '注册成功',\n } as ApiResponse),\n {\n status: 201,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n // 设置 Cookie(如果有配置)\n if (config.cookieOptions) {\n const cookieOptions = {\n name: config.cookieOptions?.name || 'auth_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === 'production',\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7,\n path: config.cookieOptions?.path || '/',\n };\n\n const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;\n response.headers.set('Set-Cookie', cookieValue);\n }\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Register error:', error);\n\n // 记录注册失败埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_register_failed', {\n errorMessage: (error as any).message || '注册失败',\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track register failure analytics:', analyticsError);\n }\n }\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: (error as any).message || '注册失败',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createRegisterOptionsHandler(config: RegisterRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n // 复用 addCorsHeaders 函数\n if (config.cors?.enabled) {\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n }\n\n return response;\n };\n}\n\n","/**\n * Auth Routes - Me\n * 获取当前用户信息路由处理器\n */\n\nimport { getTokenFromRequest } from '../services';\nimport type { BaseRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: BaseRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建获取当前用户信息路由处理器\n *\n * @example\n * ```typescript\n * import { createMeHandler } from 'sa2kit/auth/routes';\n *\n * export const GET = createMeHandler({\n * authService: myAuthService,\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createMeHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n try {\n // 获取 token\n const token = getTokenFromRequest(request);\n\n if (!token) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '未提供认证令牌',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 验证 token 并获取用户信息\n const result = await config.authService.verifyToken(token);\n\n const response = new Response(\n JSON.stringify({\n success: true,\n data: result.user,\n } as ApiResponse),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Get user info error:', error);\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '认证失败',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createMeOptionsHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n return addCorsHeaders(response, config, request);\n };\n}\n","/**\n * Auth Routes - Logout\n * 登出路由处理器\n */\n\nimport { getTokenFromRequest } from '../services';\nimport type { BaseRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: BaseRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建登出路由处理器\n *\n * @example\n * ```typescript\n * import { createLogoutHandler } from 'sa2kit/auth/routes';\n *\n * export const POST = createLogoutHandler({\n * authService: myAuthService,\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createLogoutHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n try {\n // 获取 token\n const token = getTokenFromRequest(request);\n\n if (!token) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '未提供认证令牌',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 删除会话\n await config.authService.signOut(token);\n\n // 记录登出埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_logout', {\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track logout analytics:', analyticsError);\n }\n }\n\n // 创建响应并清除 Cookie\n const response = new Response(\n JSON.stringify({\n success: true,\n message: '登出成功',\n } as ApiResponse),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n // 清除 auth_token cookie\n response.headers.set(\n 'Set-Cookie',\n 'auth_token=; HttpOnly; Secure; SameSite=Lax; Max-Age=0; Path=/'\n );\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Logout error:', error);\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '登出失败',\n } as ApiResponse),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createLogoutOptionsHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n return addCorsHeaders(response, config, request);\n };\n}\n","/**\n * Auth Routes - Default Configurations\n * 默认路由配置\n */\n\nimport type { \n BaseRouteConfig, \n LoginRouteConfig, \n RegisterRouteConfig \n} from './types';\nimport type { DrizzleAuthService } from '../services';\n\n/**\n * 创建默认的基础路由配置\n */\nexport function createDefaultBaseConfig(\n authService: DrizzleAuthService,\n overrides?: Partial<BaseRouteConfig>\n): BaseRouteConfig {\n return {\n authService,\n cors: {\n enabled: true,\n credentials: true,\n ...overrides?.cors,\n },\n analytics: overrides?.analytics,\n };\n}\n\n/**\n * 创建默认的登录路由配置\n */\nexport function createDefaultLoginConfig(\n authService: DrizzleAuthService,\n overrides?: Partial<LoginRouteConfig>\n): LoginRouteConfig {\n return {\n authService,\n cors: {\n enabled: true,\n credentials: true,\n ...overrides?.cors,\n },\n cookieOptions: {\n name: 'auth_token',\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 60 * 60 * 24 * 7, // 7天\n path: '/',\n ...overrides?.cookieOptions,\n },\n analytics: overrides?.analytics,\n };\n}\n\n/**\n * 创建默认的注册路由配置\n */\nexport function createDefaultRegisterConfig(\n authService: DrizzleAuthService,\n overrides?: Partial<RegisterRouteConfig>\n): RegisterRouteConfig {\n return {\n authService,\n defaultRole: overrides?.defaultRole || 'USER',\n cors: {\n enabled: true,\n credentials: true,\n ...overrides?.cors,\n },\n cookieOptions: overrides?.cookieOptions !== undefined ? {\n name: 'auth_token',\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 60 * 60 * 24 * 7, // 7天\n path: '/',\n ...overrides.cookieOptions,\n } : undefined,\n analytics: overrides?.analytics,\n emailVerificationRequired: overrides?.emailVerificationRequired,\n };\n}\n\n","/**\n * Auth Routes - Analytics Adapter\n * 埋点适配器,用于适配不同的埋点服务\n */\n\n/**\n * 埋点事件接口\n */\nexport interface AnalyticsEvent {\n id: string;\n eventType: string;\n eventName: string;\n timestamp: string;\n priority: number;\n userId: string;\n sessionId: string;\n deviceId: string;\n platform: string;\n appVersion: string;\n sdkVersion: string;\n properties: Record<string, any>;\n}\n\n/**\n * 埋点服务接口\n */\nexport interface AnalyticsService {\n insertAnalyticsEvents(events: AnalyticsEvent[]): Promise<void>;\n}\n\n/**\n * 创建埋点适配器\n *\n * @param analyticsService 埋点服务实例\n * @param options 可选配置\n * @returns 符合 sa2kit 格式的埋点函数\n *\n * @example\n * ```typescript\n * import { createAnalyticsAdapter } from 'sa2kit/auth/routes';\n * import { analyticsService } from '@/lib/analytics';\n *\n * const analytics = createAnalyticsAdapter(analyticsService, {\n * platform: 'backend',\n * appVersion: '1.0.0',\n * });\n *\n * // 在路由配置中使用\n * const config = createDefaultLoginConfig(authService, {\n * analytics,\n * });\n * ```\n */\nexport function createAnalyticsAdapter(\n analyticsService: AnalyticsService,\n options?: {\n platform?: string;\n appVersion?: string;\n sdkVersion?: string;\n deviceId?: string;\n generateId?: () => string;\n }\n): {\n track: (eventName: string, properties: any) => Promise<void>;\n} {\n // 默认配置\n const config = {\n platform: options?.platform || 'backend',\n appVersion: options?.appVersion || '1.0.0',\n sdkVersion: options?.sdkVersion || '1.0.0',\n deviceId: options?.deviceId || 'server',\n generateId: options?.generateId || (() => {\n // 简单的 ID 生成器(仅用于浏览器环境)\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }),\n };\n\n return {\n track: async (eventName: string, properties: any) => {\n try {\n // 推断事件类型\n let eventType = 'event';\n if (eventName.includes('login_success')) {\n eventType = 'login';\n } else if (eventName.includes('register_success')) {\n eventType = 'register';\n } else if (eventName.includes('logout')) {\n eventType = 'logout';\n } else if (eventName.includes('failed') || eventName.includes('error')) {\n eventType = 'error';\n }\n\n // 构建埋点事件\n const event: AnalyticsEvent = {\n id: config.generateId(),\n eventType,\n eventName,\n timestamp: new Date().toISOString(),\n priority: 1,\n userId: properties.userId || 'anonymous',\n sessionId: properties.sessionId || `session_${Date.now()}_${properties.userId || 'anonymous'}`,\n deviceId: config.deviceId,\n platform: config.platform,\n appVersion: config.appVersion,\n sdkVersion: config.sdkVersion,\n properties,\n };\n\n // 插入埋点事件\n await analyticsService.insertAnalyticsEvents([event]);\n } catch (error) {\n console.error('Failed to track analytics:', error);\n }\n },\n };\n}\n\n"]}
1
+ {"version":3,"sources":["../src/auth/routes/login.ts","../src/auth/routes/register.ts","../src/auth/routes/me.ts","../src/auth/routes/logout.ts","../src/auth/routes/defaults.ts","../src/auth/routes/analytics-adapter.ts"],"names":["response","addCorsHeaders"],"mappings":"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","file":"chunk-QAT2RWAO.mjs","sourcesContent":["/**\n * Auth Routes - Login\n * 登录路由处理器\n */\n\nimport type { LoginRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: LoginRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建登录路由处理器\n *\n * @example\n * ```typescript\n * import { createLoginHandler } from 'sa2kit/auth/routes';\n *\n * export const POST = createLoginHandler({\n * authService: myAuthService,\n * analytics: myAnalytics,\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createLoginHandler(config: LoginRouteConfig) {\n return async (request: Request) => {\n let requestBody: any = {};\n\n try {\n // 解析请求体\n requestBody = await request.json();\n const { email, password } = requestBody;\n\n // 验证必填字段\n if (!email || !password) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '邮箱和密码不能为空',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 执行登录\n const result = await config.authService.signIn(email, password);\n\n // 记录登录成功埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_login_success', {\n userId: result.user.id,\n userRole: result.user.role,\n email: result.user.email,\n loginMethod: 'email_password',\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track login analytics:', analyticsError);\n }\n }\n\n // 创建响应\n const response = new Response(\n JSON.stringify({\n success: true,\n data: {\n user: result.user,\n token: result.token,\n },\n message: '登录成功',\n } as ApiResponse),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n // 设置 Cookie(如果有配置)\n if (config.cookieOptions) {\n const cookieOptions = {\n name: config.cookieOptions?.name || 'auth_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === 'production',\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7, // 7天\n path: config.cookieOptions?.path || '/',\n };\n\n // 设置 Set-Cookie header\n const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;\n response.headers.set('Set-Cookie', cookieValue);\n }\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Login error:', error);\n\n // 记录登录失败埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_login_failed', {\n errorMessage: (error as any).message || '登录失败',\n email: requestBody.email,\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track login failure analytics:', analyticsError);\n }\n }\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: (error as any).message || '登录失败,请检查邮箱和密码',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createLoginOptionsHandler(config: LoginRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n return addCorsHeaders(response, config, request);\n };\n}\n\n","/**\n * Auth Routes - Register\n * 注册路由处理器\n */\n\nimport type { RegisterRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: RegisterRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建注册路由处理器\n *\n * @example\n * ```typescript\n * import { createRegisterHandler } from 'sa2kit/auth/routes';\n *\n * export const POST = createRegisterHandler({\n * authService: myAuthService,\n * defaultRole: 'USER',\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createRegisterHandler(config: RegisterRouteConfig) {\n return async (request: Request) => {\n try {\n // 解析请求体\n const { email, password, username } = await request.json();\n\n // 验证必填字段\n if (!email || !password) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '邮箱和密码不能为空',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 密码强度验证\n if (password.length < 6) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '密码长度至少为 6 位',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 执行注册\n const result = await config.authService.signUp(\n email,\n password,\n username,\n config.defaultRole || 'USER'\n );\n\n // 记录注册成功埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_register_success', {\n userId: result.user.id,\n email: result.user.email,\n username: result.user.username,\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track register analytics:', analyticsError);\n }\n }\n\n // 创建响应\n const response = new Response(\n JSON.stringify({\n success: true,\n data: {\n user: result.user,\n token: result.token,\n },\n message: '注册成功',\n } as ApiResponse),\n {\n status: 201,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n // 设置 Cookie(如果有配置)\n if (config.cookieOptions) {\n const cookieOptions = {\n name: config.cookieOptions?.name || 'auth_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === 'production',\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7,\n path: config.cookieOptions?.path || '/',\n };\n\n const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;\n response.headers.set('Set-Cookie', cookieValue);\n }\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Register error:', error);\n\n // 记录注册失败埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_register_failed', {\n errorMessage: (error as any).message || '注册失败',\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track register failure analytics:', analyticsError);\n }\n }\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: (error as any).message || '注册失败',\n } as ApiResponse),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createRegisterOptionsHandler(config: RegisterRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n // 复用 addCorsHeaders 函数\n if (config.cors?.enabled) {\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n }\n\n return response;\n };\n}\n\n","/**\n * Auth Routes - Me\n * 获取当前用户信息路由处理器\n */\n\nimport { getTokenFromRequest } from '../services';\nimport type { BaseRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: BaseRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建获取当前用户信息路由处理器\n *\n * @example\n * ```typescript\n * import { createMeHandler } from 'sa2kit/auth/routes';\n *\n * export const GET = createMeHandler({\n * authService: myAuthService,\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createMeHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n try {\n // 获取 token\n const token = getTokenFromRequest(request);\n\n if (!token) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '未提供认证令牌',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 验证 token 并获取用户信息\n const result = await config.authService.verifyToken(token);\n\n const response = new Response(\n JSON.stringify({\n success: true,\n data: result.user,\n } as ApiResponse),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Get user info error:', error);\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '认证失败',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createMeOptionsHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n return addCorsHeaders(response, config, request);\n };\n}\n","/**\n * Auth Routes - Logout\n * 登出路由处理器\n */\n\nimport { getTokenFromRequest } from '../services';\nimport type { BaseRouteConfig, ApiResponse } from './types';\n\n/**\n * 添加 CORS 头到响应\n */\nfunction addCorsHeaders(response: Response, config: BaseRouteConfig, request: Request): Response {\n if (!config.cors?.enabled) return response;\n\n const origin = request.headers.get('origin');\n const allowedOrigins = config.cors.origin;\n\n // 处理允许的源\n if (allowedOrigins) {\n if (typeof allowedOrigins === 'string') {\n response.headers.set('Access-Control-Allow-Origin', allowedOrigins);\n } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {\n response.headers.set('Access-Control-Allow-Origin', origin);\n }\n } else {\n // 默认允许所有源\n response.headers.set('Access-Control-Allow-Origin', origin || '*');\n }\n\n if (config.cors.credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = config.cors.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n\n const headers = config.cors.allowedHeaders || ['Content-Type', 'Authorization'];\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n\n return response;\n}\n\n/**\n * 创建登出路由处理器\n *\n * @example\n * ```typescript\n * import { createLogoutHandler } from 'sa2kit/auth/routes';\n *\n * export const POST = createLogoutHandler({\n * authService: myAuthService,\n * cors: { enabled: true },\n * });\n * ```\n */\nexport function createLogoutHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n try {\n // 获取 token\n const token = getTokenFromRequest(request);\n\n if (!token) {\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '未提供认证令牌',\n } as ApiResponse),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return addCorsHeaders(response, config, request);\n }\n\n // 删除会话\n await config.authService.signOut(token);\n\n // 记录登出埋点\n if (config.analytics) {\n try {\n await config.analytics.track('user_logout', {\n timestamp: new Date().toISOString(),\n });\n } catch (analyticsError) {\n console.error('Failed to track logout analytics:', analyticsError);\n }\n }\n\n // 创建响应并清除 Cookie\n const response = new Response(\n JSON.stringify({\n success: true,\n message: '登出成功',\n } as ApiResponse),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n // 清除 auth_token cookie\n response.headers.set(\n 'Set-Cookie',\n 'auth_token=; HttpOnly; Secure; SameSite=Lax; Max-Age=0; Path=/'\n );\n\n return addCorsHeaders(response, config, request);\n } catch (error) {\n console.error('Logout error:', error);\n\n const response = new Response(\n JSON.stringify({\n success: false,\n error: '登出失败',\n } as ApiResponse),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return addCorsHeaders(response, config, request);\n }\n };\n}\n\n/**\n * 创建 CORS 预检请求处理器\n */\nexport function createLogoutOptionsHandler(config: BaseRouteConfig) {\n return async (request: Request) => {\n const response = new Response(null, {\n status: 204,\n headers: {\n 'Content-Length': '0',\n },\n });\n\n return addCorsHeaders(response, config, request);\n };\n}\n","/**\n * Auth Routes - Default Configurations\n * 默认路由配置\n */\n\nimport type { \n BaseRouteConfig, \n LoginRouteConfig, \n RegisterRouteConfig \n} from './types';\nimport type { DrizzleAuthService } from '../services';\n\n/**\n * 创建默认的基础路由配置\n */\nexport function createDefaultBaseConfig(\n authService: DrizzleAuthService,\n overrides?: Partial<BaseRouteConfig>\n): BaseRouteConfig {\n return {\n authService,\n cors: {\n enabled: true,\n credentials: true,\n ...overrides?.cors,\n },\n analytics: overrides?.analytics,\n };\n}\n\n/**\n * 创建默认的登录路由配置\n */\nexport function createDefaultLoginConfig(\n authService: DrizzleAuthService,\n overrides?: Partial<LoginRouteConfig>\n): LoginRouteConfig {\n return {\n authService,\n cors: {\n enabled: true,\n credentials: true,\n ...overrides?.cors,\n },\n cookieOptions: {\n name: 'auth_token',\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 60 * 60 * 24 * 7, // 7天\n path: '/',\n ...overrides?.cookieOptions,\n },\n analytics: overrides?.analytics,\n };\n}\n\n/**\n * 创建默认的注册路由配置\n */\nexport function createDefaultRegisterConfig(\n authService: DrizzleAuthService,\n overrides?: Partial<RegisterRouteConfig>\n): RegisterRouteConfig {\n return {\n authService,\n defaultRole: overrides?.defaultRole || 'USER',\n cors: {\n enabled: true,\n credentials: true,\n ...overrides?.cors,\n },\n cookieOptions: overrides?.cookieOptions !== undefined ? {\n name: 'auth_token',\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 60 * 60 * 24 * 7, // 7天\n path: '/',\n ...overrides.cookieOptions,\n } : undefined,\n analytics: overrides?.analytics,\n emailVerificationRequired: overrides?.emailVerificationRequired,\n };\n}\n\n","/**\n * Auth Routes - Analytics Adapter\n * 埋点适配器,用于适配不同的埋点服务\n */\n\n/**\n * 埋点事件接口\n */\nexport interface AnalyticsEvent {\n id: string;\n eventType: string;\n eventName: string;\n timestamp: string;\n priority: number;\n userId: string;\n sessionId: string;\n deviceId: string;\n platform: string;\n appVersion: string;\n sdkVersion: string;\n properties: Record<string, any>;\n}\n\n/**\n * 埋点服务接口\n */\nexport interface AnalyticsService {\n insertAnalyticsEvents(events: AnalyticsEvent[]): Promise<void>;\n}\n\n/**\n * 创建埋点适配器\n *\n * @param analyticsService 埋点服务实例\n * @param options 可选配置\n * @returns 符合 sa2kit 格式的埋点函数\n *\n * @example\n * ```typescript\n * import { createAnalyticsAdapter } from 'sa2kit/auth/routes';\n * import { analyticsService } from '@/lib/analytics';\n *\n * const analytics = createAnalyticsAdapter(analyticsService, {\n * platform: 'backend',\n * appVersion: '1.0.0',\n * });\n *\n * // 在路由配置中使用\n * const config = createDefaultLoginConfig(authService, {\n * analytics,\n * });\n * ```\n */\nexport function createAnalyticsAdapter(\n analyticsService: AnalyticsService,\n options?: {\n platform?: string;\n appVersion?: string;\n sdkVersion?: string;\n deviceId?: string;\n generateId?: () => string;\n }\n): {\n track: (eventName: string, properties: any) => Promise<void>;\n} {\n // 默认配置\n const config = {\n platform: options?.platform || 'backend',\n appVersion: options?.appVersion || '1.0.0',\n sdkVersion: options?.sdkVersion || '1.0.0',\n deviceId: options?.deviceId || 'server',\n generateId: options?.generateId || (() => {\n // 简单的 ID 生成器(仅用于浏览器环境)\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }),\n };\n\n return {\n track: async (eventName: string, properties: any) => {\n try {\n // 推断事件类型\n let eventType = 'event';\n if (eventName.includes('login_success')) {\n eventType = 'login';\n } else if (eventName.includes('register_success')) {\n eventType = 'register';\n } else if (eventName.includes('logout')) {\n eventType = 'logout';\n } else if (eventName.includes('failed') || eventName.includes('error')) {\n eventType = 'error';\n }\n\n // 构建埋点事件\n const event: AnalyticsEvent = {\n id: config.generateId(),\n eventType,\n eventName,\n timestamp: new Date().toISOString(),\n priority: 1,\n userId: properties.userId || 'anonymous',\n sessionId: properties.sessionId || `session_${Date.now()}_${properties.userId || 'anonymous'}`,\n deviceId: config.deviceId,\n platform: config.platform,\n appVersion: config.appVersion,\n sdkVersion: config.sdkVersion,\n properties,\n };\n\n // 插入埋点事件\n await analyticsService.insertAnalyticsEvents([event]);\n } catch (error) {\n console.error('Failed to track analytics:', error);\n }\n },\n };\n}\n\n"]}
@@ -0,0 +1,218 @@
1
+ import { DEFAULT_MUSIC_SOURCE } from './chunk-ZCLAF3XN.mjs';
2
+ import { useState, useMemo, useCallback } from 'react';
3
+ import useSWR from 'swr';
4
+
5
+ // src/music/adapters/kugou.ts
6
+ var kugouAdapter = {
7
+ parseSearchResult(data) {
8
+ const root = typeof data === "string" ? JSON.parse(data) : data;
9
+ const info = root.data?.data?.info || root.data?.info || root.info || [];
10
+ const total = root.data?.data?.total || root.data?.total || info.length;
11
+ return {
12
+ tracks: info.map((item) => {
13
+ let pic = item.pic || "";
14
+ if (item.trans_param?.union_cover) {
15
+ pic = item.trans_param.union_cover.replace("{size}", "400");
16
+ }
17
+ return {
18
+ id: item.hash || item.id,
19
+ name: item.songname || item.filename || "Unknown",
20
+ artist: item.singername || "Unknown Artist",
21
+ album: item.album_name || item.album || "",
22
+ pic,
23
+ url: item.url,
24
+ lrc: item.lrc,
25
+ source: "kugou",
26
+ isVip: item.privilege >= 8,
27
+ playable: item.status !== 0
28
+ };
29
+ }),
30
+ total
31
+ };
32
+ },
33
+ parseGetSongUrl(data) {
34
+ return data.url?.url || data.url?.backup_url?.[0] || null;
35
+ },
36
+ parseGetLyric(data) {
37
+ const root = typeof data === "string" ? JSON.parse(data) : data;
38
+ return root.lyric || root.lrc || root.data?.lyric || root.data || "";
39
+ }
40
+ };
41
+
42
+ // src/music/adapters/netease.ts
43
+ var neteaseAdapter = {
44
+ parseSearchResult(data) {
45
+ const root = typeof data === "string" ? JSON.parse(data) : data;
46
+ const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);
47
+ return {
48
+ tracks: songs.map((item) => ({
49
+ id: item.id,
50
+ name: item.name,
51
+ artist: Array.isArray(item.artist) ? item.artist.join(", ") : item.artist,
52
+ album: item.album?.name || item.album,
53
+ pic: item.pic || item.album?.picUrl,
54
+ url: item.url,
55
+ lrc: item.lrc,
56
+ source: "netease",
57
+ isVip: item.fee === 1 || item.fee === 4,
58
+ playable: item.noCopyrightRcmd === null
59
+ })),
60
+ total: root.result?.songCount || songs.length
61
+ };
62
+ },
63
+ parseGetSongUrl(data) {
64
+ const root = typeof data === "string" ? JSON.parse(data) : data;
65
+ const item = root.data?.[0] || root[0] || root;
66
+ return item.url || null;
67
+ },
68
+ parseGetLyric(data) {
69
+ const root = typeof data === "string" ? JSON.parse(data) : data;
70
+ return root.lyric || root.lrc || root.data?.lyric || "";
71
+ }
72
+ };
73
+
74
+ // src/music/adapters/tencent.ts
75
+ var tencentAdapter = {
76
+ parseSearchResult(data) {
77
+ const root = typeof data === "string" ? JSON.parse(data) : data;
78
+ const songData = root.data?.data?.song || root.data?.song || root.data || root;
79
+ const list = songData.list || root.songs || [];
80
+ const total = songData.totalnum || root.total || list.length;
81
+ return {
82
+ tracks: list.map((item) => {
83
+ const artist = Array.isArray(item.singer) ? item.singer.map((s) => s.name).join(", ") : item.singer?.[0]?.name || item.artist || "Unknown";
84
+ let pic = item.pic;
85
+ if (!pic && item.album?.mid) {
86
+ pic = `https://y.gtimg.cn/music/photo_new/T002R300x300M000${item.album.mid}.jpg`;
87
+ }
88
+ return {
89
+ id: item.mid || item.id || item.songid,
90
+ name: item.name || item.title || item.songname,
91
+ artist,
92
+ album: item.album?.name || item.albumname || item.album,
93
+ pic: pic || "",
94
+ url: item.url,
95
+ lrc: item.lrc,
96
+ source: "tencent",
97
+ isVip: item.pay?.pay_play === 1,
98
+ playable: item.action?.switch !== 0
99
+ };
100
+ }),
101
+ total
102
+ };
103
+ },
104
+ parseGetSongUrl(data) {
105
+ const root = data;
106
+ const urlData = root.url.url;
107
+ let finalUrl = Object.values(urlData)[0];
108
+ console.log("finalUrl2", finalUrl);
109
+ return finalUrl.startsWith("http") ? finalUrl : `http://${finalUrl}`;
110
+ },
111
+ parseGetLyric(data) {
112
+ const root = typeof data === "string" ? JSON.parse(data) : data;
113
+ return root.lyric || root.lrc || root.data?.lyric || "";
114
+ }
115
+ };
116
+
117
+ // src/music/adapters/xiami.ts
118
+ var xiamiAdapter = {
119
+ parseSearchResult(data) {
120
+ const root = typeof data === "string" ? JSON.parse(data) : data;
121
+ const result = root.data?.result || root.result || root;
122
+ const songs = result.songs || (Array.isArray(root) ? root : []);
123
+ return {
124
+ tracks: songs.map((item) => ({
125
+ id: item.id?.toString() || "",
126
+ name: item.name || "Unknown",
127
+ artist: Array.isArray(item.ar) ? item.ar.map((a) => a.name).join(", ") : item.artist || "Unknown Artist",
128
+ album: item.al?.name || item.album || "",
129
+ pic: item.al?.picUrl || item.pic || "",
130
+ url: item.url,
131
+ lrc: item.lrc,
132
+ source: "xiami",
133
+ // 这里的逻辑参考提供的数据结构
134
+ isVip: item.fee === 1 || item.fee === 8,
135
+ playable: item.copyright !== 0
136
+ })),
137
+ total: result.songCount || songs.length
138
+ };
139
+ },
140
+ parseGetSongUrl(data) {
141
+ const root = typeof data === "string" ? JSON.parse(data) : data;
142
+ const item = root.data?.[0] || root.data || root[0] || root;
143
+ return item.url || null;
144
+ },
145
+ parseGetLyric(data) {
146
+ const root = typeof data === "string" ? JSON.parse(data) : data;
147
+ return root.lyric || root.lrc || root.data?.lyric || root.data || "";
148
+ }
149
+ };
150
+
151
+ // src/music/hooks/useMusic.ts
152
+ var fetcher = (url) => fetch(url).then((res) => res.json());
153
+ var ADAPTERS = {
154
+ kugou: kugouAdapter,
155
+ netease: neteaseAdapter,
156
+ tencent: tencentAdapter,
157
+ xiami: xiamiAdapter
158
+ };
159
+ function useMusic() {
160
+ const [searchOptions, setSearchOptions] = useState(null);
161
+ const { data: rawData, error: searchError, isLoading: isSearching } = useSWR(
162
+ searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source || DEFAULT_MUSIC_SOURCE}&limit=${searchOptions.limit || 20}&offset=${searchOptions.offset || 0}${searchOptions.miku ? "&miku=true" : ""}` : null,
163
+ fetcher
164
+ );
165
+ const searchResult = useMemo(() => {
166
+ if (!rawData?.data || !searchOptions) return void 0;
167
+ const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];
168
+ if (adapter) {
169
+ return adapter.parseSearchResult(rawData.data);
170
+ }
171
+ return void 0;
172
+ }, [rawData, searchOptions]);
173
+ const search = useCallback((options) => {
174
+ setSearchOptions(options);
175
+ }, []);
176
+ const getSongUrl = useCallback(async (id, source = DEFAULT_MUSIC_SOURCE) => {
177
+ try {
178
+ const res = await fetch(`/api/music/url?id=${id}&source=${source}`);
179
+ const json = await res.json();
180
+ const adapter = ADAPTERS[source];
181
+ console.log("json2", json.data, source, adapter);
182
+ if (adapter && json.data) {
183
+ console.log("getSongUrl2", json.data);
184
+ return adapter.parseGetSongUrl(json.data) || void 0;
185
+ }
186
+ return json.data?.url;
187
+ } catch (err) {
188
+ console.error("[Music] Failed to get song URL:", err);
189
+ return void 0;
190
+ }
191
+ }, []);
192
+ const getLyric = useCallback(async (id, source = DEFAULT_MUSIC_SOURCE) => {
193
+ try {
194
+ const res = await fetch(`/api/music/lyric?id=${id}&source=${source}`);
195
+ const json = await res.json();
196
+ const adapter = ADAPTERS[source];
197
+ if (adapter && json.data) {
198
+ return adapter.parseGetLyric(json.data);
199
+ }
200
+ return json.data?.lyric;
201
+ } catch (err) {
202
+ console.error("[Music] Failed to get lyric:", err);
203
+ return void 0;
204
+ }
205
+ }, []);
206
+ return {
207
+ search,
208
+ searchResult,
209
+ isSearching,
210
+ searchError,
211
+ getSongUrl,
212
+ getLyric
213
+ };
214
+ }
215
+
216
+ export { kugouAdapter, neteaseAdapter, tencentAdapter, useMusic, xiamiAdapter };
217
+ //# sourceMappingURL=chunk-T6TE7GTY.mjs.map
218
+ //# sourceMappingURL=chunk-T6TE7GTY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/music/adapters/kugou.ts","../src/music/adapters/netease.ts","../src/music/adapters/tencent.ts","../src/music/adapters/xiami.ts","../src/music/hooks/useMusic.ts"],"names":["useState","useCallback"],"mappings":"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","file":"chunk-T6TE7GTY.mjs","sourcesContent":["import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const kugouAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const info = root.data?.data?.info || root.data?.info || root.info || [];\n const total = root.data?.data?.total || root.data?.total || info.length;\n return {\n tracks: info.map((item: any) => {\n // 优先从 trans_param.union_cover 提取封面,并替换 {size} 为 400\n let pic = item.pic || '';\n if (item.trans_param?.union_cover) {\n pic = item.trans_param.union_cover.replace('{size}', '400');\n }\n\n return {\n id: item.hash || item.id,\n name: item.songname || item.filename || 'Unknown',\n artist: item.singername || 'Unknown Artist',\n album: item.album_name || item.album || '',\n pic: pic,\n url: item.url,\n lrc: item.lrc,\n source: 'kugou',\n isVip: item.privilege >= 8,\n playable: item.status !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n return data.url?.url || data.url?.backup_url?.[0] || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const neteaseAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id,\n name: item.name,\n artist: Array.isArray(item.artist) ? item.artist.join(', ') : item.artist,\n album: item.album?.name || item.album,\n pic: item.pic || item.album?.picUrl,\n url: item.url,\n lrc: item.lrc,\n source: 'netease',\n isVip: item.fee === 1 || item.fee === 4,\n playable: item.noCopyrightRcmd === null,\n })),\n total: root.result?.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const item = root.data?.[0] || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const tencentAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n \n // 兼容多种 QQ 音乐返回结构\n const songData = root.data?.data?.song || root.data?.song || root.data || root;\n const list = songData.list || root.songs || [];\n const total = songData.totalnum || root.total || list.length;\n \n return {\n tracks: list.map((item: any) => {\n // 解析歌手名\n const artist = Array.isArray(item.singer) \n ? item.singer.map((s: any) => s.name).join(', ') \n : (item.singer?.[0]?.name || item.artist || 'Unknown');\n\n // 处理封面图 (QQ 音乐封面通常基于 album mid)\n let pic = item.pic;\n if (!pic && item.album?.mid) {\n pic = `https://y.gtimg.cn/music/photo_new/T002R300x300M000${item.album.mid}.jpg`;\n }\n\n return {\n id: item.mid || item.id || item.songid,\n name: item.name || item.title || item.songname,\n artist: artist,\n album: item.album?.name || item.albumname || item.album,\n pic: pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'tencent',\n isVip: item.pay?.pay_play === 1,\n playable: item.action?.switch !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n\n const root = data\n\n const urlData = root.url.url;\n let finalUrl = Object.values(urlData)[0] as string;\n console.log('finalUrl2', finalUrl);\n return finalUrl.startsWith('http') ? finalUrl : `http://${finalUrl}`;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const xiamiAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 虾米返回的结构(根据提供的数据,类似于网易云的结构)\n const result = root.data?.result || root.result || root;\n const songs = result.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id?.toString() || '',\n name: item.name || 'Unknown',\n artist: Array.isArray(item.ar) \n ? item.ar.map((a: any) => a.name).join(', ') \n : (item.artist || 'Unknown Artist'),\n album: item.al?.name || item.album || '',\n pic: item.al?.picUrl || item.pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'xiami',\n // 这里的逻辑参考提供的数据结构\n isVip: item.fee === 1 || item.fee === 8,\n playable: item.copyright !== 0,\n })),\n total: result.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 兼容多种可能的包装结构\n const item = root.data?.[0] || root.data || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n\n","import useSWR from 'swr';\nimport { useState, useCallback, useMemo } from 'react';\nimport { MusicTrack, SearchOptions, SearchResult, MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\nimport { \n kugouAdapter, \n neteaseAdapter, \n tencentAdapter, \n xiamiAdapter,\n MusicSourceAdapter \n} from '../adapters';\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\n\nconst ADAPTERS: Record<string, MusicSourceAdapter> = {\n kugou: kugouAdapter,\n netease: neteaseAdapter,\n tencent: tencentAdapter,\n xiami: xiamiAdapter,\n};\n\nexport function useMusic() {\n const [searchOptions, setSearchOptions] = useState<SearchOptions | null>(null);\n\n // 搜索歌曲\n const { data: rawData, error: searchError, isLoading: isSearching } = useSWR<MusicApiResponse<any>>(\n searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source || DEFAULT_MUSIC_SOURCE}&limit=${searchOptions.limit || 20}&offset=${searchOptions.offset || 0}${searchOptions.miku ? '&miku=true' : ''}` : null,\n fetcher\n );\n\n const searchResult = useMemo(() => {\n if (!rawData?.data || !searchOptions) return undefined;\n const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];\n if (adapter) {\n return adapter.parseSearchResult(rawData.data);\n }\n return undefined;\n }, [rawData, searchOptions]);\n\n const search = useCallback((options: SearchOptions) => {\n setSearchOptions(options);\n }, []);\n\n // 获取播放链接\n const getSongUrl = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch(`/api/music/url?id=${id}&source=${source}`);\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n console.log('json2', json.data,source,adapter);\n if (adapter && json.data) {\n console.log('getSongUrl2', json.data);\n return adapter.parseGetSongUrl(json.data) || undefined;\n }\n return json.data?.url;\n } catch (err) {\n console.error('[Music] Failed to get song URL:', err);\n return undefined;\n }\n }, []);\n\n // 获取歌词\n const getLyric = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch(`/api/music/lyric?id=${id}&source=${source}`);\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n if (adapter && json.data) {\n return adapter.parseGetLyric(json.data);\n }\n return json.data?.lyric;\n } catch (err) {\n console.error('[Music] Failed to get lyric:', err);\n return undefined;\n }\n }, []);\n\n return {\n search,\n searchResult,\n isSearching,\n searchError,\n getSongUrl,\n getLyric,\n };\n}\n\n"]}