sa2kit 1.0.0 → 1.0.2

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 (99) hide show
  1. package/dist/UniversalFileService-CEZRJ87g.d.mts +727 -0
  2. package/dist/UniversalFileService-CEZRJ87g.d.ts +727 -0
  3. package/dist/api/index.d.mts +248 -0
  4. package/dist/api/index.d.ts +248 -0
  5. package/dist/api/index.js +294 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/index.mjs +290 -0
  8. package/dist/api/index.mjs.map +1 -0
  9. package/dist/auth/client/index.d.mts +52 -3
  10. package/dist/auth/client/index.d.ts +52 -3
  11. package/dist/auth/components/index.d.mts +149 -4
  12. package/dist/auth/components/index.d.ts +149 -4
  13. package/dist/auth/components/index.js +243 -9
  14. package/dist/auth/components/index.js.map +1 -1
  15. package/dist/auth/components/index.mjs +237 -4
  16. package/dist/auth/components/index.mjs.map +1 -1
  17. package/dist/auth/hooks/index.d.mts +31 -2
  18. package/dist/auth/hooks/index.d.ts +31 -2
  19. package/dist/auth/index.d.mts +5 -5
  20. package/dist/auth/index.d.ts +5 -5
  21. package/dist/auth/index.js +49 -17
  22. package/dist/auth/index.mjs +1 -1
  23. package/dist/auth/routes/index.d.mts +103 -5
  24. package/dist/auth/routes/index.d.ts +103 -5
  25. package/dist/auth/routes/index.js +37 -5
  26. package/dist/auth/routes/index.mjs +1 -1
  27. package/dist/chunk-42IJ7HEI.js +573 -0
  28. package/dist/chunk-42IJ7HEI.js.map +1 -0
  29. package/dist/chunk-7XLFSPDG.mjs +31 -0
  30. package/dist/chunk-7XLFSPDG.mjs.map +1 -0
  31. package/dist/chunk-GCVOKQZP.js +36 -0
  32. package/dist/chunk-GCVOKQZP.js.map +1 -0
  33. package/dist/chunk-IBLB7ARJ.mjs +560 -0
  34. package/dist/chunk-IBLB7ARJ.mjs.map +1 -0
  35. package/dist/{chunk-6FNUWAIV.js → chunk-LX4XX6W7.js} +54 -8
  36. package/dist/chunk-LX4XX6W7.js.map +1 -0
  37. package/dist/{chunk-HXFFYNIF.mjs → chunk-T5OZHYVM.mjs} +54 -8
  38. package/dist/chunk-T5OZHYVM.mjs.map +1 -0
  39. package/dist/config/server/index.d.mts +1533 -0
  40. package/dist/config/server/index.d.ts +1533 -0
  41. package/dist/config/server/index.js +1177 -0
  42. package/dist/config/server/index.js.map +1 -0
  43. package/dist/config/server/index.mjs +1138 -0
  44. package/dist/config/server/index.mjs.map +1 -0
  45. package/dist/i18n/index.d.mts +2 -1
  46. package/dist/i18n/index.d.ts +2 -1
  47. package/dist/i18n/index.js +125 -61
  48. package/dist/i18n/index.js.map +1 -1
  49. package/dist/i18n/index.mjs +126 -62
  50. package/dist/i18n/index.mjs.map +1 -1
  51. package/dist/index.js +6 -6
  52. package/dist/index.mjs +1 -1
  53. package/dist/mmd/index.d.mts +346 -0
  54. package/dist/mmd/index.d.ts +346 -0
  55. package/dist/mmd/index.js +1535 -0
  56. package/dist/mmd/index.js.map +1 -0
  57. package/dist/mmd/index.mjs +1503 -0
  58. package/dist/mmd/index.mjs.map +1 -0
  59. package/dist/storage/index.d.mts +1 -0
  60. package/dist/storage/index.d.ts +1 -0
  61. package/dist/storage/index.js +9 -9
  62. package/dist/storage/index.mjs +1 -1
  63. package/dist/{index-8VoHap_4.d.mts → types-CroexXnI.d.ts} +38 -44
  64. package/dist/{index-8VoHap_4.d.ts → types-DmsXCWvm.d.mts} +38 -44
  65. package/dist/{types-DAxQ1MeY.d.ts → types-Dt0oqeFM.d.mts} +1 -1
  66. package/dist/{types-DT8LVCvE.d.mts → types-zK6kDzDQ.d.ts} +1 -1
  67. package/dist/universalExport/index.js +17 -32
  68. package/dist/universalExport/index.js.map +1 -1
  69. package/dist/universalExport/index.mjs +2 -29
  70. package/dist/universalExport/index.mjs.map +1 -1
  71. package/dist/universalExport/server/index.d.mts +849 -8
  72. package/dist/universalExport/server/index.d.ts +849 -8
  73. package/dist/universalExport/server/index.js +1382 -2
  74. package/dist/universalExport/server/index.js.map +1 -1
  75. package/dist/universalExport/server/index.mjs +1355 -3
  76. package/dist/universalExport/server/index.mjs.map +1 -1
  77. package/dist/universalFile/index.d.mts +54 -3
  78. package/dist/universalFile/index.d.ts +54 -3
  79. package/dist/universalFile/index.js +272 -0
  80. package/dist/universalFile/index.js.map +1 -1
  81. package/dist/universalFile/index.mjs +267 -1
  82. package/dist/universalFile/index.mjs.map +1 -1
  83. package/dist/universalFile/server/index.d.mts +2541 -469
  84. package/dist/universalFile/server/index.d.ts +2541 -469
  85. package/dist/universalFile/server/index.js +830 -64
  86. package/dist/universalFile/server/index.js.map +1 -1
  87. package/dist/universalFile/server/index.mjs +803 -66
  88. package/dist/universalFile/server/index.mjs.map +1 -1
  89. package/package.json +47 -23
  90. package/dist/chunk-6FNUWAIV.js.map +0 -1
  91. package/dist/chunk-APY57REU.js +0 -300
  92. package/dist/chunk-APY57REU.js.map +0 -1
  93. package/dist/chunk-C64RY2OW.mjs +0 -295
  94. package/dist/chunk-C64RY2OW.mjs.map +0 -1
  95. package/dist/chunk-HXFFYNIF.mjs.map +0 -1
  96. package/dist/types-CoGG1rNV.d.mts +0 -258
  97. package/dist/types-CoGG1rNV.d.ts +0 -258
  98. package/dist/types-DW9qar-w.d.mts +0 -52
  99. package/dist/types-DW9qar-w.d.ts +0 -52
@@ -0,0 +1,573 @@
1
+ 'use strict';
2
+
3
+ var chunk6BL3AZGD_js = require('./chunk-6BL3AZGD.js');
4
+
5
+ // src/auth/routes/login.ts
6
+ function addCorsHeaders(response, config, request) {
7
+ if (!config.cors?.enabled) return response;
8
+ const origin = request.headers.get("origin");
9
+ const allowedOrigins = config.cors.origin;
10
+ if (allowedOrigins) {
11
+ if (typeof allowedOrigins === "string") {
12
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
13
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
14
+ response.headers.set("Access-Control-Allow-Origin", origin);
15
+ }
16
+ } else {
17
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
18
+ }
19
+ if (config.cors.credentials) {
20
+ response.headers.set("Access-Control-Allow-Credentials", "true");
21
+ }
22
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
23
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
24
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
25
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
26
+ return response;
27
+ }
28
+ function createLoginHandler(config) {
29
+ return async (request) => {
30
+ let requestBody = {};
31
+ try {
32
+ requestBody = await request.json();
33
+ const { email, password } = requestBody;
34
+ if (!email || !password) {
35
+ const response2 = new Response(
36
+ JSON.stringify({
37
+ success: false,
38
+ error: "\u90AE\u7BB1\u548C\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A"
39
+ }),
40
+ {
41
+ status: 400,
42
+ headers: { "Content-Type": "application/json" }
43
+ }
44
+ );
45
+ return addCorsHeaders(response2, config, request);
46
+ }
47
+ const result = await config.authService.signIn(email, password);
48
+ if (config.analytics) {
49
+ try {
50
+ await config.analytics.track("user_login_success", {
51
+ userId: result.user.id,
52
+ userRole: result.user.role,
53
+ email: result.user.email,
54
+ loginMethod: "email_password",
55
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
56
+ });
57
+ } catch (analyticsError) {
58
+ console.error("Failed to track login analytics:", analyticsError);
59
+ }
60
+ }
61
+ const response = new Response(
62
+ JSON.stringify({
63
+ success: true,
64
+ data: {
65
+ user: result.user,
66
+ token: result.token
67
+ },
68
+ message: "\u767B\u5F55\u6210\u529F"
69
+ }),
70
+ {
71
+ status: 200,
72
+ headers: { "Content-Type": "application/json" }
73
+ }
74
+ );
75
+ if (config.cookieOptions) {
76
+ const cookieOptions = {
77
+ name: config.cookieOptions?.name || "auth_token",
78
+ httpOnly: config.cookieOptions?.httpOnly !== false,
79
+ secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === "production",
80
+ sameSite: config.cookieOptions?.sameSite || "lax",
81
+ maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7,
82
+ // 7天
83
+ path: config.cookieOptions?.path || "/"
84
+ };
85
+ const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;
86
+ response.headers.set("Set-Cookie", cookieValue);
87
+ }
88
+ return addCorsHeaders(response, config, request);
89
+ } catch (error) {
90
+ console.error("Login error:", error);
91
+ if (config.analytics) {
92
+ try {
93
+ await config.analytics.track("user_login_failed", {
94
+ errorMessage: error.message || "\u767B\u5F55\u5931\u8D25",
95
+ email: requestBody.email,
96
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
97
+ });
98
+ } catch (analyticsError) {
99
+ console.error("Failed to track login failure analytics:", analyticsError);
100
+ }
101
+ }
102
+ const response = new Response(
103
+ JSON.stringify({
104
+ success: false,
105
+ error: error.message || "\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u90AE\u7BB1\u548C\u5BC6\u7801"
106
+ }),
107
+ {
108
+ status: 401,
109
+ headers: { "Content-Type": "application/json" }
110
+ }
111
+ );
112
+ return addCorsHeaders(response, config, request);
113
+ }
114
+ };
115
+ }
116
+ function createLoginOptionsHandler(config) {
117
+ return async (request) => {
118
+ const response = new Response(null, {
119
+ status: 204,
120
+ headers: {
121
+ "Content-Length": "0"
122
+ }
123
+ });
124
+ return addCorsHeaders(response, config, request);
125
+ };
126
+ }
127
+
128
+ // src/auth/routes/register.ts
129
+ function addCorsHeaders2(response, config, request) {
130
+ if (!config.cors?.enabled) return response;
131
+ const origin = request.headers.get("origin");
132
+ const allowedOrigins = config.cors.origin;
133
+ if (allowedOrigins) {
134
+ if (typeof allowedOrigins === "string") {
135
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
136
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
137
+ response.headers.set("Access-Control-Allow-Origin", origin);
138
+ }
139
+ } else {
140
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
141
+ }
142
+ if (config.cors.credentials) {
143
+ response.headers.set("Access-Control-Allow-Credentials", "true");
144
+ }
145
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
146
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
147
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
148
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
149
+ return response;
150
+ }
151
+ function createRegisterHandler(config) {
152
+ return async (request) => {
153
+ try {
154
+ const { email, password, username } = await request.json();
155
+ if (!email || !password) {
156
+ const response2 = new Response(
157
+ JSON.stringify({
158
+ success: false,
159
+ error: "\u90AE\u7BB1\u548C\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A"
160
+ }),
161
+ {
162
+ status: 400,
163
+ headers: { "Content-Type": "application/json" }
164
+ }
165
+ );
166
+ return addCorsHeaders2(response2, config, request);
167
+ }
168
+ if (password.length < 6) {
169
+ const response2 = new Response(
170
+ JSON.stringify({
171
+ success: false,
172
+ error: "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D"
173
+ }),
174
+ {
175
+ status: 400,
176
+ headers: { "Content-Type": "application/json" }
177
+ }
178
+ );
179
+ return addCorsHeaders2(response2, config, request);
180
+ }
181
+ const result = await config.authService.signUp(
182
+ email,
183
+ password,
184
+ username,
185
+ config.defaultRole || "USER"
186
+ );
187
+ if (config.analytics) {
188
+ try {
189
+ await config.analytics.track("user_register_success", {
190
+ userId: result.user.id,
191
+ email: result.user.email,
192
+ username: result.user.username,
193
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
194
+ });
195
+ } catch (analyticsError) {
196
+ console.error("Failed to track register analytics:", analyticsError);
197
+ }
198
+ }
199
+ const response = new Response(
200
+ JSON.stringify({
201
+ success: true,
202
+ data: {
203
+ user: result.user,
204
+ token: result.token
205
+ },
206
+ message: "\u6CE8\u518C\u6210\u529F"
207
+ }),
208
+ {
209
+ status: 201,
210
+ headers: { "Content-Type": "application/json" }
211
+ }
212
+ );
213
+ if (config.cookieOptions) {
214
+ const cookieOptions = {
215
+ name: config.cookieOptions?.name || "auth_token",
216
+ httpOnly: config.cookieOptions?.httpOnly !== false,
217
+ secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === "production",
218
+ sameSite: config.cookieOptions?.sameSite || "lax",
219
+ maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7,
220
+ path: config.cookieOptions?.path || "/"
221
+ };
222
+ const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;
223
+ response.headers.set("Set-Cookie", cookieValue);
224
+ }
225
+ return addCorsHeaders2(response, config, request);
226
+ } catch (error) {
227
+ console.error("Register error:", error);
228
+ if (config.analytics) {
229
+ try {
230
+ await config.analytics.track("user_register_failed", {
231
+ errorMessage: error.message || "\u6CE8\u518C\u5931\u8D25",
232
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
233
+ });
234
+ } catch (analyticsError) {
235
+ console.error("Failed to track register failure analytics:", analyticsError);
236
+ }
237
+ }
238
+ const response = new Response(
239
+ JSON.stringify({
240
+ success: false,
241
+ error: error.message || "\u6CE8\u518C\u5931\u8D25"
242
+ }),
243
+ {
244
+ status: 400,
245
+ headers: { "Content-Type": "application/json" }
246
+ }
247
+ );
248
+ return addCorsHeaders2(response, config, request);
249
+ }
250
+ };
251
+ }
252
+ function createRegisterOptionsHandler(config) {
253
+ return async (request) => {
254
+ const response = new Response(null, {
255
+ status: 204,
256
+ headers: {
257
+ "Content-Length": "0"
258
+ }
259
+ });
260
+ if (config.cors?.enabled) {
261
+ const origin = request.headers.get("origin");
262
+ const allowedOrigins = config.cors.origin;
263
+ if (allowedOrigins) {
264
+ if (typeof allowedOrigins === "string") {
265
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
266
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
267
+ response.headers.set("Access-Control-Allow-Origin", origin);
268
+ }
269
+ } else {
270
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
271
+ }
272
+ if (config.cors.credentials) {
273
+ response.headers.set("Access-Control-Allow-Credentials", "true");
274
+ }
275
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
276
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
277
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
278
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
279
+ }
280
+ return response;
281
+ };
282
+ }
283
+
284
+ // src/auth/routes/me.ts
285
+ function addCorsHeaders3(response, config, request) {
286
+ if (!config.cors?.enabled) return response;
287
+ const origin = request.headers.get("origin");
288
+ const allowedOrigins = config.cors.origin;
289
+ if (allowedOrigins) {
290
+ if (typeof allowedOrigins === "string") {
291
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
292
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
293
+ response.headers.set("Access-Control-Allow-Origin", origin);
294
+ }
295
+ } else {
296
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
297
+ }
298
+ if (config.cors.credentials) {
299
+ response.headers.set("Access-Control-Allow-Credentials", "true");
300
+ }
301
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
302
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
303
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
304
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
305
+ return response;
306
+ }
307
+ function createMeHandler(config) {
308
+ return async (request) => {
309
+ try {
310
+ const token = chunk6BL3AZGD_js.getTokenFromRequest(request);
311
+ if (!token) {
312
+ const response2 = new Response(
313
+ JSON.stringify({
314
+ success: false,
315
+ error: "\u672A\u63D0\u4F9B\u8BA4\u8BC1\u4EE4\u724C"
316
+ }),
317
+ {
318
+ status: 401,
319
+ headers: { "Content-Type": "application/json" }
320
+ }
321
+ );
322
+ return addCorsHeaders3(response2, config, request);
323
+ }
324
+ const result = await config.authService.verifyToken(token);
325
+ const response = new Response(
326
+ JSON.stringify({
327
+ success: true,
328
+ data: result.user
329
+ }),
330
+ {
331
+ status: 200,
332
+ headers: { "Content-Type": "application/json" }
333
+ }
334
+ );
335
+ return addCorsHeaders3(response, config, request);
336
+ } catch (error) {
337
+ console.error("Get user info error:", error);
338
+ const response = new Response(
339
+ JSON.stringify({
340
+ success: false,
341
+ error: "\u8BA4\u8BC1\u5931\u8D25"
342
+ }),
343
+ {
344
+ status: 401,
345
+ headers: { "Content-Type": "application/json" }
346
+ }
347
+ );
348
+ return addCorsHeaders3(response, config, request);
349
+ }
350
+ };
351
+ }
352
+ function createMeOptionsHandler(config) {
353
+ return async (request) => {
354
+ const response = new Response(null, {
355
+ status: 204,
356
+ headers: {
357
+ "Content-Length": "0"
358
+ }
359
+ });
360
+ return addCorsHeaders3(response, config, request);
361
+ };
362
+ }
363
+
364
+ // src/auth/routes/logout.ts
365
+ function addCorsHeaders4(response, config, request) {
366
+ if (!config.cors?.enabled) return response;
367
+ const origin = request.headers.get("origin");
368
+ const allowedOrigins = config.cors.origin;
369
+ if (allowedOrigins) {
370
+ if (typeof allowedOrigins === "string") {
371
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
372
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
373
+ response.headers.set("Access-Control-Allow-Origin", origin);
374
+ }
375
+ } else {
376
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
377
+ }
378
+ if (config.cors.credentials) {
379
+ response.headers.set("Access-Control-Allow-Credentials", "true");
380
+ }
381
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
382
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
383
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
384
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
385
+ return response;
386
+ }
387
+ function createLogoutHandler(config) {
388
+ return async (request) => {
389
+ try {
390
+ const token = chunk6BL3AZGD_js.getTokenFromRequest(request);
391
+ if (!token) {
392
+ const response2 = new Response(
393
+ JSON.stringify({
394
+ success: false,
395
+ error: "\u672A\u63D0\u4F9B\u8BA4\u8BC1\u4EE4\u724C"
396
+ }),
397
+ {
398
+ status: 401,
399
+ headers: { "Content-Type": "application/json" }
400
+ }
401
+ );
402
+ return addCorsHeaders4(response2, config, request);
403
+ }
404
+ await config.authService.signOut(token);
405
+ if (config.analytics) {
406
+ try {
407
+ await config.analytics.track("user_logout", {
408
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
409
+ });
410
+ } catch (analyticsError) {
411
+ console.error("Failed to track logout analytics:", analyticsError);
412
+ }
413
+ }
414
+ const response = new Response(
415
+ JSON.stringify({
416
+ success: true,
417
+ message: "\u767B\u51FA\u6210\u529F"
418
+ }),
419
+ {
420
+ status: 200,
421
+ headers: { "Content-Type": "application/json" }
422
+ }
423
+ );
424
+ response.headers.set(
425
+ "Set-Cookie",
426
+ "auth_token=; HttpOnly; Secure; SameSite=Lax; Max-Age=0; Path=/"
427
+ );
428
+ return addCorsHeaders4(response, config, request);
429
+ } catch (error) {
430
+ console.error("Logout error:", error);
431
+ const response = new Response(
432
+ JSON.stringify({
433
+ success: false,
434
+ error: "\u767B\u51FA\u5931\u8D25"
435
+ }),
436
+ {
437
+ status: 500,
438
+ headers: { "Content-Type": "application/json" }
439
+ }
440
+ );
441
+ return addCorsHeaders4(response, config, request);
442
+ }
443
+ };
444
+ }
445
+ function createLogoutOptionsHandler(config) {
446
+ return async (request) => {
447
+ const response = new Response(null, {
448
+ status: 204,
449
+ headers: {
450
+ "Content-Length": "0"
451
+ }
452
+ });
453
+ return addCorsHeaders4(response, config, request);
454
+ };
455
+ }
456
+
457
+ // src/auth/routes/defaults.ts
458
+ function createDefaultBaseConfig(authService, overrides) {
459
+ return {
460
+ authService,
461
+ cors: {
462
+ enabled: true,
463
+ credentials: true,
464
+ ...overrides?.cors
465
+ },
466
+ analytics: overrides?.analytics
467
+ };
468
+ }
469
+ function createDefaultLoginConfig(authService, overrides) {
470
+ return {
471
+ authService,
472
+ cors: {
473
+ enabled: true,
474
+ credentials: true,
475
+ ...overrides?.cors
476
+ },
477
+ cookieOptions: {
478
+ name: "auth_token",
479
+ httpOnly: true,
480
+ secure: process.env.NODE_ENV === "production",
481
+ sameSite: "lax",
482
+ maxAge: 60 * 60 * 24 * 7,
483
+ // 7天
484
+ path: "/",
485
+ ...overrides?.cookieOptions
486
+ },
487
+ analytics: overrides?.analytics
488
+ };
489
+ }
490
+ function createDefaultRegisterConfig(authService, overrides) {
491
+ return {
492
+ authService,
493
+ defaultRole: overrides?.defaultRole || "USER",
494
+ cors: {
495
+ enabled: true,
496
+ credentials: true,
497
+ ...overrides?.cors
498
+ },
499
+ cookieOptions: overrides?.cookieOptions !== void 0 ? {
500
+ name: "auth_token",
501
+ httpOnly: true,
502
+ secure: process.env.NODE_ENV === "production",
503
+ sameSite: "lax",
504
+ maxAge: 60 * 60 * 24 * 7,
505
+ // 7天
506
+ path: "/",
507
+ ...overrides.cookieOptions
508
+ } : void 0,
509
+ analytics: overrides?.analytics,
510
+ emailVerificationRequired: overrides?.emailVerificationRequired
511
+ };
512
+ }
513
+
514
+ // src/auth/routes/analytics-adapter.ts
515
+ function createAnalyticsAdapter(analyticsService, options) {
516
+ const config = {
517
+ platform: options?.platform || "backend",
518
+ appVersion: options?.appVersion || "1.0.0",
519
+ sdkVersion: options?.sdkVersion || "1.0.0",
520
+ deviceId: options?.deviceId || "server",
521
+ generateId: options?.generateId || (() => {
522
+ return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
523
+ })
524
+ };
525
+ return {
526
+ track: async (eventName, properties) => {
527
+ try {
528
+ let eventType = "event";
529
+ if (eventName.includes("login_success")) {
530
+ eventType = "login";
531
+ } else if (eventName.includes("register_success")) {
532
+ eventType = "register";
533
+ } else if (eventName.includes("logout")) {
534
+ eventType = "logout";
535
+ } else if (eventName.includes("failed") || eventName.includes("error")) {
536
+ eventType = "error";
537
+ }
538
+ const event = {
539
+ id: config.generateId(),
540
+ eventType,
541
+ eventName,
542
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
543
+ priority: 1,
544
+ userId: properties.userId || "anonymous",
545
+ sessionId: properties.sessionId || `session_${Date.now()}_${properties.userId || "anonymous"}`,
546
+ deviceId: config.deviceId,
547
+ platform: config.platform,
548
+ appVersion: config.appVersion,
549
+ sdkVersion: config.sdkVersion,
550
+ properties
551
+ };
552
+ await analyticsService.insertAnalyticsEvents([event]);
553
+ } catch (error) {
554
+ console.error("Failed to track analytics:", error);
555
+ }
556
+ }
557
+ };
558
+ }
559
+
560
+ exports.createAnalyticsAdapter = createAnalyticsAdapter;
561
+ exports.createDefaultBaseConfig = createDefaultBaseConfig;
562
+ exports.createDefaultLoginConfig = createDefaultLoginConfig;
563
+ exports.createDefaultRegisterConfig = createDefaultRegisterConfig;
564
+ exports.createLoginHandler = createLoginHandler;
565
+ exports.createLoginOptionsHandler = createLoginOptionsHandler;
566
+ exports.createLogoutHandler = createLogoutHandler;
567
+ exports.createLogoutOptionsHandler = createLogoutOptionsHandler;
568
+ exports.createMeHandler = createMeHandler;
569
+ exports.createMeOptionsHandler = createMeOptionsHandler;
570
+ exports.createRegisterHandler = createRegisterHandler;
571
+ exports.createRegisterOptionsHandler = createRegisterOptionsHandler;
572
+ //# sourceMappingURL=chunk-42IJ7HEI.js.map
573
+ //# sourceMappingURL=chunk-42IJ7HEI.js.map
@@ -0,0 +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","getTokenFromRequest"],"mappings":"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","file":"chunk-42IJ7HEI.js","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"]}