sa2kit 2.0.4 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{UniversalFileService-GsP6D3Rc.d.ts → UniversalFileService-CC4d3wkc.d.ts} +2 -2
- package/dist/{UniversalFileService-BpvbZitV.d.mts → UniversalFileService-CzAE_G4V.d.mts} +2 -2
- package/dist/ai/llm/ui/miniapp/index.d.mts +2 -2
- package/dist/ai/llm/ui/miniapp/index.d.ts +2 -2
- package/dist/ai/llm/ui/rn/index.d.mts +2 -2
- package/dist/ai/llm/ui/rn/index.d.ts +2 -2
- package/dist/ai/llm/ui/web/index.d.mts +3 -3
- package/dist/ai/llm/ui/web/index.d.ts +3 -3
- package/dist/analytics/index.d.mts +1 -1
- package/dist/analytics/index.d.ts +1 -1
- package/dist/business/index.d.mts +1 -5
- package/dist/business/index.d.ts +1 -5
- package/dist/business/index.js +34 -1135
- package/dist/business/index.js.map +1 -1
- package/dist/business/index.mjs +5 -1105
- package/dist/business/index.mjs.map +1 -1
- package/dist/calendar/routes/index.d.mts +74 -1
- package/dist/calendar/routes/index.d.ts +74 -1
- package/dist/calendar/routes/index.js +186 -97
- package/dist/calendar/routes/index.js.map +1 -1
- package/dist/calendar/routes/index.mjs +178 -99
- package/dist/calendar/routes/index.mjs.map +1 -1
- package/dist/{chunk-RJP2BRJD.mjs → chunk-4OOANEJV.mjs} +2 -2
- package/dist/{chunk-RJP2BRJD.mjs.map → chunk-4OOANEJV.mjs.map} +1 -1
- package/dist/chunk-5FUAQLGC.mjs +14 -0
- package/dist/chunk-5FUAQLGC.mjs.map +1 -0
- package/dist/{chunk-IIVNHQEI.mjs → chunk-5GBDDXYL.mjs} +4 -3
- package/dist/chunk-5GBDDXYL.mjs.map +1 -0
- package/dist/{chunk-S732H246.js → chunk-6PMXAK7F.js} +2 -2
- package/dist/{chunk-S732H246.js.map → chunk-6PMXAK7F.js.map} +1 -1
- package/dist/chunk-6YLCRWKM.mjs +8 -0
- package/dist/chunk-6YLCRWKM.mjs.map +1 -0
- package/dist/chunk-CAYOQDBR.js +78 -0
- package/dist/chunk-CAYOQDBR.js.map +1 -0
- package/dist/{chunk-PTMSDNGO.mjs → chunk-CX2GHCAI.mjs} +4 -75
- package/dist/chunk-CX2GHCAI.mjs.map +1 -0
- package/dist/chunk-EBHPTFG6.mjs +82 -0
- package/dist/chunk-EBHPTFG6.mjs.map +1 -0
- package/dist/chunk-HQLKOXG7.js +16 -0
- package/dist/chunk-HQLKOXG7.js.map +1 -0
- package/dist/chunk-IS7O4LPI.js +146 -0
- package/dist/chunk-IS7O4LPI.js.map +1 -0
- package/dist/chunk-LGHUCQIU.js +93 -0
- package/dist/chunk-LGHUCQIU.js.map +1 -0
- package/dist/chunk-LKBIVQBT.mjs +34 -0
- package/dist/chunk-LKBIVQBT.mjs.map +1 -0
- package/dist/chunk-MIDXG6LS.js +32 -0
- package/dist/chunk-MIDXG6LS.js.map +1 -0
- package/dist/chunk-NDGHXVGS.js +25 -0
- package/dist/chunk-NDGHXVGS.js.map +1 -0
- package/dist/chunk-PA4ELVGI.js +20 -0
- package/dist/chunk-PA4ELVGI.js.map +1 -0
- package/dist/chunk-Q5VFBPMG.mjs +76 -0
- package/dist/chunk-Q5VFBPMG.mjs.map +1 -0
- package/dist/{chunk-WZDTNDYR.js → chunk-QSKLQX6H.js} +11 -11
- package/dist/{chunk-WZDTNDYR.js.map → chunk-QSKLQX6H.js.map} +1 -1
- package/dist/{chunk-QQ2WFYOD.js → chunk-S6YSGVWD.js} +4 -76
- package/dist/chunk-S6YSGVWD.js.map +1 -0
- package/dist/chunk-TNJ6LYX7.mjs +18 -0
- package/dist/chunk-TNJ6LYX7.mjs.map +1 -0
- package/dist/chunk-TTYCVBIQ.mjs +144 -0
- package/dist/chunk-TTYCVBIQ.mjs.map +1 -0
- package/dist/chunk-VJNDOYEC.js +41 -0
- package/dist/chunk-VJNDOYEC.js.map +1 -0
- package/dist/{chunk-J77KR2EV.mjs → chunk-WJ7IMUEJ.mjs} +3 -3
- package/dist/{chunk-J77KR2EV.mjs.map → chunk-WJ7IMUEJ.mjs.map} +1 -1
- package/dist/chunk-YTGUIRRH.js +10 -0
- package/dist/chunk-YTGUIRRH.js.map +1 -0
- package/dist/chunk-ZF7DKR5A.mjs +26 -0
- package/dist/chunk-ZF7DKR5A.mjs.map +1 -0
- package/dist/common/auth/client/index.d.mts +3209 -0
- package/dist/common/auth/client/index.d.ts +3209 -0
- package/dist/common/auth/client/index.js +13 -0
- package/dist/common/auth/client/index.mjs +4 -0
- package/dist/common/auth/components/index.d.mts +140 -0
- package/dist/common/auth/components/index.d.ts +140 -0
- package/dist/common/auth/components/index.js +899 -0
- package/dist/common/auth/components/index.js.map +1 -0
- package/dist/common/auth/components/index.mjs +875 -0
- package/dist/common/auth/components/index.mjs.map +1 -0
- package/dist/common/auth/hooks/index.d.mts +48 -0
- package/dist/common/auth/hooks/index.d.ts +48 -0
- package/dist/common/auth/hooks/index.js +19 -0
- package/dist/common/auth/hooks/index.mjs +6 -0
- package/dist/common/auth/index.d.mts +11 -7
- package/dist/common/auth/index.d.ts +11 -7
- package/dist/common/auth/index.js +7 -19
- package/dist/common/auth/index.mjs +3 -3
- package/dist/common/auth/react/index.d.mts +3056 -0
- package/dist/common/auth/react/index.d.ts +3056 -0
- package/dist/common/auth/react/index.js +31 -0
- package/dist/common/auth/react/index.js.map +1 -0
- package/dist/common/auth/react/index.mjs +21 -0
- package/dist/common/auth/react/index.mjs.map +1 -0
- package/dist/common/auth/rn/index.d.mts +3122 -0
- package/dist/common/auth/rn/index.d.ts +3122 -0
- package/dist/common/auth/rn/index.js +316 -0
- package/dist/common/auth/rn/index.js.map +1 -0
- package/dist/common/auth/rn/index.mjs +298 -0
- package/dist/common/auth/rn/index.mjs.map +1 -0
- package/dist/common/auth/schema/index.d.mts +1479 -0
- package/dist/common/auth/schema/index.d.ts +1479 -0
- package/dist/common/auth/schema/index.js +49 -0
- package/dist/common/auth/schema/index.mjs +4 -0
- package/dist/common/auth/server/index.d.mts +81 -25
- package/dist/common/auth/server/index.d.ts +81 -25
- package/dist/common/auth/server/index.js +146 -98
- package/dist/common/auth/server/index.js.map +1 -1
- package/dist/common/auth/server/index.mjs +125 -5
- package/dist/common/auth/server/index.mjs.map +1 -1
- package/dist/common/auth/services/index.d.mts +14 -0
- package/dist/common/auth/services/index.d.ts +14 -0
- package/dist/common/auth/services/index.js +20 -0
- package/dist/common/auth/services/index.js.map +1 -0
- package/dist/common/auth/services/index.mjs +13 -0
- package/dist/common/auth/services/index.mjs.map +1 -0
- package/dist/common/file/server/index.js +32 -32
- package/dist/common/file/server/index.mjs +3 -3
- package/dist/common/index.d.mts +13 -8
- package/dist/common/index.d.ts +13 -8
- package/dist/common/index.js +19 -18
- package/dist/common/index.mjs +8 -7
- package/dist/common/storage/index.js +13 -12
- package/dist/common/storage/index.mjs +3 -2
- package/dist/festivalCard/index.d.mts +3 -3
- package/dist/festivalCard/index.d.ts +3 -3
- package/dist/festivalCard/routes/index.d.mts +1 -1
- package/dist/festivalCard/routes/index.d.ts +1 -1
- package/dist/festivalCard/server/index.d.mts +2 -2
- package/dist/festivalCard/server/index.d.ts +2 -2
- package/dist/{festivalCardService-BFCRhJrq.d.ts → festivalCardService-B3GsnNpV.d.ts} +1 -1
- package/dist/{festivalCardService-GriR2VMc.d.mts → festivalCardService-CWhrLNE9.d.mts} +1 -1
- package/dist/i18n/index.d.mts +1 -1
- package/dist/i18n/index.d.ts +1 -1
- package/dist/imageCrop/index.d.mts +3 -3
- package/dist/imageCrop/index.d.ts +3 -3
- package/dist/index-Bd7cKF1j.d.mts +50 -0
- package/dist/{index-CLB80GCP.d.mts → index-D0cqaQEH.d.mts} +5 -5
- package/dist/{index-CLB80GCP.d.ts → index-D0cqaQEH.d.ts} +5 -5
- package/dist/index-DRQxtCDw.d.ts +50 -0
- package/dist/{index-1Ag7IBXN.d.ts → index-DZ5iJtNO.d.mts} +2 -44
- package/dist/{index-DdeZSeTJ.d.mts → index-DZ5iJtNO.d.ts} +2 -44
- package/dist/{index-BxZauNN_.d.ts → index-DoUo8IrU.d.mts} +8 -8
- package/dist/{index-BxZauNN_.d.mts → index-DoUo8IrU.d.ts} +8 -8
- package/dist/index.d.mts +6382 -105
- package/dist/index.d.ts +6382 -105
- package/dist/index.js +1037 -2616
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +976 -2555
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/admin/index.d.mts +1 -1
- package/dist/mmd/admin/index.d.ts +1 -1
- package/dist/mmd/index.d.mts +1 -1
- package/dist/mmd/index.d.ts +1 -1
- package/dist/mmd/server/index.d.mts +3 -3
- package/dist/mmd/server/index.d.ts +3 -3
- package/dist/ossFile/server/index.js +32 -32
- package/dist/ossFile/server/index.mjs +3 -3
- package/dist/storage/index.js +12 -11
- package/dist/storage/index.mjs +2 -1
- package/dist/{types-DyG3ZV9V.d.mts → types-B6B210gX.d.mts} +1 -1
- package/dist/{types-DyG3ZV9V.d.ts → types-B6B210gX.d.ts} +1 -1
- package/dist/{types-BTiaMsBz.d.mts → types-Bdnte5EN.d.mts} +1 -1
- package/dist/{types-tQfupO6d.d.ts → types-Cs0CLvrH.d.mts} +1 -1
- package/dist/{types-tQfupO6d.d.mts → types-Cs0CLvrH.d.ts} +1 -1
- package/dist/{types-ERmJyjx8.d.ts → types-_rFX1atk.d.ts} +1 -1
- package/dist/universalExport/index.d.mts +3 -3
- package/dist/universalExport/index.d.ts +3 -3
- package/dist/universalFile/index.d.mts +5 -5
- package/dist/universalFile/index.d.ts +5 -5
- package/dist/universalFile/server/index.js +62 -62
- package/dist/universalFile/server/index.mjs +2 -2
- package/dist/useAuthActions-7S5dL7Oh.d.mts +77 -0
- package/dist/useAuthActions-7S5dL7Oh.d.ts +77 -0
- package/dist/vocaloidBooth/server/index.d.mts +3 -3
- package/dist/vocaloidBooth/server/index.d.ts +3 -3
- package/package.json +44 -111
- package/dist/auth/client/index.d.mts +0 -32
- package/dist/auth/client/index.d.ts +0 -32
- package/dist/auth/client/index.js +0 -21
- package/dist/auth/client/index.mjs +0 -4
- package/dist/auth/components/index.d.mts +0 -227
- package/dist/auth/components/index.d.ts +0 -227
- package/dist/auth/components/index.js +0 -327
- package/dist/auth/components/index.js.map +0 -1
- package/dist/auth/components/index.mjs +0 -319
- package/dist/auth/components/index.mjs.map +0 -1
- package/dist/auth/hooks/index.d.mts +0 -31
- package/dist/auth/hooks/index.d.ts +0 -31
- package/dist/auth/hooks/index.js +0 -17
- package/dist/auth/hooks/index.mjs +0 -4
- package/dist/auth/index.d.mts +0 -18
- package/dist/auth/index.d.ts +0 -18
- package/dist/auth/index.js +0 -151
- package/dist/auth/index.mjs +0 -10
- package/dist/auth/legacy/core/index.d.mts +0 -42
- package/dist/auth/legacy/core/index.d.ts +0 -42
- package/dist/auth/legacy/core/index.js +0 -242
- package/dist/auth/legacy/core/index.js.map +0 -1
- package/dist/auth/legacy/core/index.mjs +0 -226
- package/dist/auth/legacy/core/index.mjs.map +0 -1
- package/dist/auth/legacy/db/index.d.mts +0 -5
- package/dist/auth/legacy/db/index.d.ts +0 -5
- package/dist/auth/legacy/db/index.js +0 -261
- package/dist/auth/legacy/db/index.js.map +0 -1
- package/dist/auth/legacy/db/index.mjs +0 -250
- package/dist/auth/legacy/db/index.mjs.map +0 -1
- package/dist/auth/legacy/index.d.mts +0 -5
- package/dist/auth/legacy/index.d.ts +0 -5
- package/dist/auth/legacy/index.js +0 -1107
- package/dist/auth/legacy/index.js.map +0 -1
- package/dist/auth/legacy/index.mjs +0 -1086
- package/dist/auth/legacy/index.mjs.map +0 -1
- package/dist/auth/legacy/logic/index.d.mts +0 -9
- package/dist/auth/legacy/logic/index.d.ts +0 -9
- package/dist/auth/legacy/logic/index.js +0 -194
- package/dist/auth/legacy/logic/index.js.map +0 -1
- package/dist/auth/legacy/logic/index.mjs +0 -187
- package/dist/auth/legacy/logic/index.mjs.map +0 -1
- package/dist/auth/legacy/miniapp/index.d.mts +0 -5
- package/dist/auth/legacy/miniapp/index.d.ts +0 -5
- package/dist/auth/legacy/miniapp/index.js +0 -506
- package/dist/auth/legacy/miniapp/index.js.map +0 -1
- package/dist/auth/legacy/miniapp/index.mjs +0 -487
- package/dist/auth/legacy/miniapp/index.mjs.map +0 -1
- package/dist/auth/legacy/routes/index.d.mts +0 -53
- package/dist/auth/legacy/routes/index.d.ts +0 -53
- package/dist/auth/legacy/routes/index.js +0 -278
- package/dist/auth/legacy/routes/index.js.map +0 -1
- package/dist/auth/legacy/routes/index.mjs +0 -271
- package/dist/auth/legacy/routes/index.mjs.map +0 -1
- package/dist/auth/legacy/schema/index.d.mts +0 -401
- package/dist/auth/legacy/schema/index.d.ts +0 -401
- package/dist/auth/legacy/schema/index.js +0 -50
- package/dist/auth/legacy/schema/index.js.map +0 -1
- package/dist/auth/legacy/schema/index.mjs +0 -44
- package/dist/auth/legacy/schema/index.mjs.map +0 -1
- package/dist/auth/legacy/server/index.d.mts +0 -13
- package/dist/auth/legacy/server/index.d.ts +0 -13
- package/dist/auth/legacy/server/index.js +0 -21
- package/dist/auth/legacy/server/index.js.map +0 -1
- package/dist/auth/legacy/server/index.mjs +0 -19
- package/dist/auth/legacy/server/index.mjs.map +0 -1
- package/dist/auth/legacy/services/index.d.mts +0 -40
- package/dist/auth/legacy/services/index.d.ts +0 -40
- package/dist/auth/legacy/services/index.js +0 -258
- package/dist/auth/legacy/services/index.js.map +0 -1
- package/dist/auth/legacy/services/index.mjs +0 -252
- package/dist/auth/legacy/services/index.mjs.map +0 -1
- package/dist/auth/legacy/ui/miniapp/index.d.mts +0 -10
- package/dist/auth/legacy/ui/miniapp/index.d.ts +0 -10
- package/dist/auth/legacy/ui/miniapp/index.js +0 -298
- package/dist/auth/legacy/ui/miniapp/index.js.map +0 -1
- package/dist/auth/legacy/ui/miniapp/index.mjs +0 -290
- package/dist/auth/legacy/ui/miniapp/index.mjs.map +0 -1
- package/dist/auth/legacy/ui/web/index.d.mts +0 -22
- package/dist/auth/legacy/ui/web/index.d.ts +0 -22
- package/dist/auth/legacy/ui/web/index.js +0 -899
- package/dist/auth/legacy/ui/web/index.js.map +0 -1
- package/dist/auth/legacy/ui/web/index.mjs +0 -889
- package/dist/auth/legacy/ui/web/index.mjs.map +0 -1
- package/dist/auth/legacy/web/index.d.mts +0 -5
- package/dist/auth/legacy/web/index.d.ts +0 -5
- package/dist/auth/legacy/web/index.js +0 -1107
- package/dist/auth/legacy/web/index.js.map +0 -1
- package/dist/auth/legacy/web/index.mjs +0 -1086
- package/dist/auth/legacy/web/index.mjs.map +0 -1
- package/dist/auth/middleware/index.d.mts +0 -75
- package/dist/auth/middleware/index.d.ts +0 -75
- package/dist/auth/middleware/index.js +0 -15
- package/dist/auth/middleware/index.js.map +0 -1
- package/dist/auth/middleware/index.mjs +0 -6
- package/dist/auth/middleware/index.mjs.map +0 -1
- package/dist/auth/rn/index.d.mts +0 -64
- package/dist/auth/rn/index.d.ts +0 -64
- package/dist/auth/rn/index.js +0 -765
- package/dist/auth/rn/index.js.map +0 -1
- package/dist/auth/rn/index.mjs +0 -754
- package/dist/auth/rn/index.mjs.map +0 -1
- package/dist/auth/routes/index.d.mts +0 -261
- package/dist/auth/routes/index.d.ts +0 -261
- package/dist/auth/routes/index.js +0 -59
- package/dist/auth/routes/index.js.map +0 -1
- package/dist/auth/routes/index.mjs +0 -6
- package/dist/auth/routes/index.mjs.map +0 -1
- package/dist/auth/schema/index.d.mts +0 -789
- package/dist/auth/schema/index.d.ts +0 -789
- package/dist/auth/schema/index.js +0 -41
- package/dist/auth/schema/index.js.map +0 -1
- package/dist/auth/schema/index.mjs +0 -4
- package/dist/auth/schema/index.mjs.map +0 -1
- package/dist/auth/services/index.d.mts +0 -48
- package/dist/auth/services/index.d.ts +0 -48
- package/dist/auth/services/index.js +0 -34
- package/dist/auth/services/index.js.map +0 -1
- package/dist/auth/services/index.mjs +0 -5
- package/dist/auth/services/index.mjs.map +0 -1
- package/dist/base-api-client-ACKKt13v.d.mts +0 -277
- package/dist/base-api-client-ACKKt13v.d.ts +0 -277
- package/dist/base-api-client-B3wZZoaH.d.ts +0 -103
- package/dist/base-api-client-DrL35Ea2.d.mts +0 -103
- package/dist/chunk-37HYTHEC.mjs +0 -90
- package/dist/chunk-37HYTHEC.mjs.map +0 -1
- package/dist/chunk-5WV35FPV.js +0 -131
- package/dist/chunk-5WV35FPV.js.map +0 -1
- package/dist/chunk-DCRD5CZB.js +0 -573
- package/dist/chunk-DCRD5CZB.js.map +0 -1
- package/dist/chunk-DDX4JKFS.js +0 -19
- package/dist/chunk-DDX4JKFS.js.map +0 -1
- package/dist/chunk-DV6M7MFP.js +0 -283
- package/dist/chunk-DV6M7MFP.js.map +0 -1
- package/dist/chunk-HBF4HPRK.js +0 -186
- package/dist/chunk-HBF4HPRK.js.map +0 -1
- package/dist/chunk-HCI6JQOU.mjs +0 -183
- package/dist/chunk-HCI6JQOU.mjs.map +0 -1
- package/dist/chunk-I44HXJ3X.mjs +0 -17
- package/dist/chunk-I44HXJ3X.mjs.map +0 -1
- package/dist/chunk-IIVNHQEI.mjs.map +0 -1
- package/dist/chunk-IJ4YYWE3.mjs +0 -122
- package/dist/chunk-IJ4YYWE3.mjs.map +0 -1
- package/dist/chunk-J4BEIZUC.js +0 -92
- package/dist/chunk-J4BEIZUC.js.map +0 -1
- package/dist/chunk-OKPWFVXC.js +0 -24
- package/dist/chunk-OKPWFVXC.js.map +0 -1
- package/dist/chunk-PNOTQAYK.mjs +0 -560
- package/dist/chunk-PNOTQAYK.mjs.map +0 -1
- package/dist/chunk-PTMSDNGO.mjs.map +0 -1
- package/dist/chunk-Q2IAL7YV.js +0 -36
- package/dist/chunk-Q2IAL7YV.js.map +0 -1
- package/dist/chunk-QQ2WFYOD.js.map +0 -1
- package/dist/chunk-VQ54PUQV.js +0 -216
- package/dist/chunk-VQ54PUQV.js.map +0 -1
- package/dist/chunk-W5JEGA76.mjs +0 -33
- package/dist/chunk-W5JEGA76.mjs.map +0 -1
- package/dist/chunk-YGI7UU2D.mjs +0 -212
- package/dist/chunk-YGI7UU2D.mjs.map +0 -1
- package/dist/chunk-ZCLQSI5F.mjs +0 -271
- package/dist/chunk-ZCLQSI5F.mjs.map +0 -1
- package/dist/drizzle-auth-service-D-pljzCD.d.mts +0 -145
- package/dist/drizzle-auth-service-D3qryE_I.d.ts +0 -145
- package/dist/index-Bnh6VqFv.d.ts +0 -35
- package/dist/index-DNKZ7-R_.d.mts +0 -184
- package/dist/index-DNKZ7-R_.d.ts +0 -184
- package/dist/index-DPYkrKZf.d.mts +0 -35
- package/dist/types-C5vUWf9u.d.ts +0 -70
- package/dist/types-C_W_CoUD.d.ts +0 -99
- package/dist/types-DCRvasyH.d.mts +0 -99
- package/dist/types-IYCqCk2g.d.mts +0 -70
- /package/dist/{auth → common/auth}/client/index.js.map +0 -0
- /package/dist/{auth → common/auth}/client/index.mjs.map +0 -0
- /package/dist/{auth → common/auth}/hooks/index.js.map +0 -0
- /package/dist/{auth → common/auth}/hooks/index.mjs.map +0 -0
- /package/dist/{auth → common/auth/schema}/index.js.map +0 -0
- /package/dist/{auth → common/auth/schema}/index.mjs.map +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/common/auth/client/types.ts","../../../src/common/auth/client/base-api-client.ts","../../../src/storage/adapters/react-native-adapter.ts","../../../src/request/adapters/react-native-adapter.ts","../../../src/common/auth/rn/client.ts","../../../src/business/auth-legacy/utils/authUtils.ts","../../../src/business/auth-legacy/rn/legacy-login.ts","../../../src/common/auth/hooks/useAuth.ts","../../../src/common/auth/components/LoginForm.tsx","../../../src/business/auth-legacy/rn/components/AccountLoginForm.tsx"],"names":["useState","React","useEffect","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Auth Client - Types\n * API 客户端类型定义\n */\n\nimport type { UserRole, User, ApiResponse, AuthResponse } from '../types';\n\nexport type { UserRole, User, ApiResponse, AuthResponse };\n\n/**\n * 存储键名\n */\nexport const STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n} as const;\n\n/**\n * API 路由\n */\nexport const API_ROUTES = {\n AUTH: {\n LOGIN: '/auth/login',\n REGISTER: '/auth/register',\n LOGOUT: '/auth/logout',\n ME: '/auth/me',\n },\n} as const;\n\n","/**\n * Auth Client - Base API Client\n * 基础 API 客户端\n */\n\nimport type { StorageAdapter } from '../../storage';\nimport type { RequestAdapter, RequestConfig } from '../../request';\nimport { API_ROUTES, STORAGE_KEYS, type ApiResponse, type User, type AuthResponse } from './types';\nimport type { IAuthClient } from '../types';\n\n/**\n * 基础 API 客户端\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n *\n * @example\n * ```typescript\n * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';\n * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';\n * import { WebRequestAdapter } from '@qhr123/sa2kit/request';\n *\n * const apiClient = new BaseApiClient(\n * new WebStorageAdapter(),\n * new WebRequestAdapter(),\n * '/api'\n * );\n *\n * await apiClient.init();\n * const result = await apiClient.login('user@example.com', 'password');\n * ```\n */\nexport class BaseApiClient implements IAuthClient {\n private token: string | null = null;\n private user: User | null = null;\n\n constructor(\n private storage: StorageAdapter,\n private request: RequestAdapter,\n private baseUrl: string\n ) {}\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(STORAGE_KEYS.AUTH_TOKEN);\n const userData = await this.storage.getItem(STORAGE_KEYS.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData);\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(STORAGE_KEYS.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: User | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): User | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n private async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n // ==================== 认证相关 API ====================\n\n /**\n * 用户注册\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.REGISTER,\n method: 'POST',\n body: { email, password, username },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n }\n\n return response;\n }\n\n /**\n * 用户登录\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.LOGIN,\n method: 'POST',\n body: { email, password },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n\n // 触发自定义事件通知登录成功\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('user_login_success', {\n detail: {\n userId: response.data.user.id,\n email: response.data.user.email,\n role: response.data.user.role,\n },\n })\n );\n }\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n */\n async logout(): Promise<void> {\n await this.sendRequest<void>({\n url: API_ROUTES.AUTH.LOGOUT,\n method: 'POST',\n });\n\n // 无论成功与否,都清除本地数据\n await this.clearUserData();\n }\n\n /**\n * 获取当前用户信息\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n const response = await this.sendRequest<any>({\n url: API_ROUTES.AUTH.ME,\n method: 'GET',\n });\n\n // 统一处理响应格式\n if (response.success && response.data) {\n const userData = response.data.user || response.data;\n await this.setUser(userData);\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 通用方法 ====================\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n}\n\n","/**\n * React Native 平台存储适配器 (AsyncStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 动态导入 AsyncStorage(避免在非 RN 环境报错)\nlet AsyncStorage: any = null;\n\ntry {\n AsyncStorage = require('@react-native-async-storage/async-storage').default;\n} catch (e) {\n // AsyncStorage 不可用(非 React Native 环境)\n // 这是正常的,不需要警告\n}\n\nexport class ReactNativeStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!AsyncStorage) return null;\n\n try {\n return await AsyncStorage.getItem(key);\n } catch (error) {\n console.error('[ReactNativeStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.setItem(key, value);\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[ReactNativeStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.removeItem(key);\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[ReactNativeStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.clear();\n } catch (error) {\n console.error('[ReactNativeStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // React Native 没有原生的跨实例存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * React Native 请求适配器(fetch,不携带 Cookie)\n * 与 WebRequestAdapter 的区别:RN 跨域场景下 credentials:include 无效且易误导\n */\nexport class ReactNativeRequestAdapter implements RequestAdapter {\n async request<T = unknown>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const qs = searchParams.toString();\n if (qs) {\n fullUrl += url.includes('?') ? `&${qs}` : `?${qs}`;\n }\n }\n\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as T & { error?: string };\n if (!response.ok) {\n return {\n success: false,\n error:\n (data as { error?: string }).error ??\n `请求失败 (${response.status})`,\n } as T;\n }\n return data;\n }\n}\n","import { BaseApiClient } from '../client/base-api-client';\nimport { ReactNativeStorageAdapter } from '../../../storage/adapters/react-native-adapter';\nimport { ReactNativeRequestAdapter } from '../../../request/adapters/react-native-adapter';\n\nlet cached: BaseApiClient | null = null;\nlet cachedBase = '';\n\n/** 创建 RN 用 BaseApiClient(AsyncStorage + fetch,无 Cookie) */\nexport function createRnAuthClient(authApiBase: string): BaseApiClient {\n const base = authApiBase.replace(/\\/+$/, '');\n if (cached && cachedBase === base) {\n return cached;\n }\n const client = new BaseApiClient(\n new ReactNativeStorageAdapter(),\n new ReactNativeRequestAdapter(),\n base,\n );\n cached = client;\n cachedBase = base;\n return client;\n}\n\nexport async function initRnAuthClient(authApiBase: string): Promise<BaseApiClient> {\n const client = createRnAuthClient(authApiBase);\n await client.init();\n return client;\n}\n\n/** 切换认证根地址时清空单例缓存 */\nexport function resetRnAuthClientCache(): void {\n cached = null;\n cachedBase = '';\n}\n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { validatePhoneNumber } from '../utils/authUtils';\nimport { ReactNativeRequestAdapter } from '../../../request/adapters/react-native-adapter';\n\nexport type LegacyPhoneLoginResult = {\n success: boolean;\n token?: string;\n message?: string;\n};\n\ntype LegacyLoginBody = {\n success?: boolean;\n message?: string;\n sessionToken?: string;\n data?: { sessionToken?: string };\n};\n\n/** profile-v1 等 legacy:POST {authApiBase}/auth/login { phone, password } */\nexport async function loginWithLegacyPhone(\n authApiBase: string,\n phone: string,\n password: string,\n): Promise<LegacyPhoneLoginResult> {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone || !password) {\n return { success: false, message: '请填写手机号和密码' };\n }\n if (!validatePhoneNumber(trimmedPhone)) {\n return { success: false, message: '请输入正确的手机号' };\n }\n\n const base = authApiBase.replace(/\\/+$/, '');\n const adapter = new ReactNativeRequestAdapter();\n const data = await adapter.request<LegacyLoginBody>({\n url: `${base}/auth/login`,\n method: 'POST',\n body: { phone: trimmedPhone, password },\n });\n\n if (!data.success) {\n return {\n success: false,\n message: data.message ?? '登录失败',\n };\n }\n\n const token = data.sessionToken ?? data.data?.sessionToken;\n if (!token || token.length < 8) {\n return { success: false, message: '登录成功但未返回有效会话令牌' };\n }\n\n return { success: true, token };\n}\n\nexport function isPhoneAccount(account: string): boolean {\n return validatePhoneNumber(account.trim());\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { User, IAuthClient as BaseApiClient, AuthResult, UseAuthReturn } from '../types';\n\nexport type { User, BaseApiClient, AuthResult, UseAuthReturn };\n\nexport function useAuth(apiClient: BaseApiClient): UseAuthReturn {\n const [user, setUser] = useState<User | null>(null);\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [loading, setLoading] = useState(false);\n const [checkingAuth, setCheckingAuth] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * 检查认证状态\n */\n const checkAuthStatus = useCallback(async () => {\n try {\n setCheckingAuth(true);\n setError(null);\n\n const isAuth = await apiClient.isAuthenticated();\n\n if (isAuth) {\n // 验证 token 并获取用户信息\n const response = await apiClient.getCurrentUser();\n\n if (response.success && response.data) {\n setUser(response.data);\n setIsLoggedIn(true);\n } else {\n // Token 无效,清除登录状态\n await apiClient.clearUserData();\n setUser(null);\n setIsLoggedIn(false);\n }\n } else {\n setUser(null);\n setIsLoggedIn(false);\n }\n } catch (err) {\n console.error('检查登录状态失败:', err);\n setError(err instanceof Error ? err.message : '检查登录状态失败');\n setUser(null);\n setIsLoggedIn(false);\n } finally {\n setCheckingAuth(false);\n }\n }, [apiClient]);\n\n /**\n * 用户登录\n */\n const login = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.login(email, password);\n\n if (response.success && response.data) {\n setUser(response.data.user);\n setIsLoggedIn(true);\n return { success: true };\n } else {\n const errorMsg = response.error || '登录失败';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '登录失败,请重试';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n } finally {\n setLoading(false);\n }\n },\n [apiClient]\n );\n\n /**\n * 用户注册\n */\n const register = useCallback(\n async (email: string, password: string, username: string): Promise<AuthResult> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.register(email, password, username);\n\n if (response.success && response.data) {\n setUser(response.data.user);\n setIsLoggedIn(true);\n return { success: true };\n } else {\n const errorMsg = response.error || '注册失败';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '注册失败,请重试';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n } finally {\n setLoading(false);\n }\n },\n [apiClient]\n );\n\n /**\n * 用户登出\n */\n const logout = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n await apiClient.logout();\n setUser(null);\n setIsLoggedIn(false);\n } catch (err) {\n console.error('登出失败:', err);\n setError(err instanceof Error ? err.message : '登出失败');\n // 即使登出失败,也清除本地状态\n setUser(null);\n setIsLoggedIn(false);\n } finally {\n setLoading(false);\n }\n }, [apiClient]);\n\n /**\n * 清除错误信息\n */\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n // 组件挂载时检查认证状态\n useEffect(() => {\n checkAuthStatus();\n }, [checkAuthStatus]);\n\n return {\n // 状态\n user,\n isLoggedIn,\n loading,\n checkingAuth,\n error,\n\n // 操作方法\n login,\n register,\n logout,\n refresh: checkAuthStatus,\n clearError,\n };\n}\n\n/**\n * 表单验证 Hook\n *\n * @example\n * ```typescript\n * const { values, errors, handleChange, handleBlur, validate } = useAuthForm({\n * email: '',\n * password: ''\n * })\n * ```\n */\nexport function useAuthForm<T extends Record<string, any>>(initialValues: T) {\n const [values, setValues] = useState<T>(initialValues);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});\n\n const handleChange = useCallback(\n (field: keyof T, value: any) => {\n setValues((prev: T) => ({ ...prev, [field]: value }));\n // 清除该字段的错误\n if (errors[field]) {\n setErrors((prev: Partial<Record<keyof T, string>>) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n },\n [errors]\n );\n\n const handleBlur = useCallback((field: keyof T) => {\n setTouched((prev: Partial<Record<keyof T, boolean>>) => ({ ...prev, [field]: true }));\n }, []);\n\n const validate = useCallback(\n (validationRules: Partial<Record<keyof T, (value: any) => string | undefined>>) => {\n const newErrors: Partial<Record<keyof T, string>> = {};\n\n Object.keys(validationRules).forEach((key) => {\n const field = key as keyof T;\n const rule = validationRules[field];\n if (rule) {\n const error = rule(values[field]);\n if (error) {\n newErrors[field] = error;\n }\n }\n });\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n },\n [values]\n );\n\n const reset = useCallback(() => {\n setValues(initialValues);\n setErrors({});\n setTouched({});\n }, [initialValues]);\n\n return {\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n validate,\n reset,\n setValues,\n setErrors,\n };\n}\n\n","/**\n * Auth Components - LoginForm (Headless)\n * 无样式的登录表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessLoginFormProps, LoginFormState } from './types';\n\n/**\n * Headless 登录表单组件\n *\n * 提供登录逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <LoginForm apiClient={apiClient}>\n * {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * type=\"password\"\n * value={password}\n * onChange={(e) => handlePasswordChange(e.target.value)}\n * />\n * {error && <div>{error}</div>}\n * <button disabled={loading}>\n * {loading ? '登录中...' : '登录'}\n * </button>\n * </form>\n * )}\n * </LoginForm>\n * ```\n */\nexport function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps) {\n const { login, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n const result = await login(email, password);\n\n if (result.success) {\n // 登录成功后 user 会自动更新到 state\n const currentUser = apiClient.getUser();\n if (currentUser) {\n onSuccess?.(currentUser);\n }\n } else {\n onError?.(result.error || '登录失败');\n }\n };\n\n const state: LoginFormState = {\n email,\n password,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n","/**\n * RN 账密登录表单:手机号 → legacy /auth/login;邮箱 → sa2kit LoginForm + BaseApiClient\n */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { LoginForm } from '../../../../common/auth/components/LoginForm';\nimport { initRnAuthClient, resetRnAuthClientCache } from '../../../../common/auth/rn/client';\nimport { isPhoneAccount, loginWithLegacyPhone } from '../legacy-login';\nimport type { RnAccountLoginFormProps } from '../types';\n\n// @ts-expect-error react-native 由宿主在运行时提供\nconst ReactNative = require('react-native') as typeof import('react-native');\nconst { ActivityIndicator, Pressable, Text, TextInput, View, StyleSheet } = ReactNative;\n\nconst defaultStyles = StyleSheet.create({\n label: { fontSize: 12, color: '#8b98a5', marginBottom: 6, marginTop: 12 },\n input: {\n borderWidth: 1,\n borderColor: 'rgba(255,255,255,0.12)',\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n color: '#e8edf2',\n backgroundColor: 'rgba(0,0,0,0.2)',\n fontSize: 15,\n },\n err: { color: '#f87171', marginTop: 10, fontSize: 14 },\n btn: {\n marginTop: 14,\n paddingVertical: 12,\n borderRadius: 10,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: 'rgba(255,255,255,0.12)',\n backgroundColor: 'rgba(255,255,255,0.08)',\n },\n primary: { backgroundColor: '#3d9eff', borderColor: 'transparent' },\n disabled: { opacity: 0.6 },\n btnTextPrimary: { color: '#fff', fontSize: 15, fontWeight: '600' },\n centerInline: { paddingVertical: 24, alignItems: 'center' },\n});\n\nconst DEFAULT_LABELS = {\n authApiBase: '认证 API 根地址(含 /api)',\n phone: '手机号',\n email: '邮箱',\n password: '密码',\n submit: '登录',\n} as const;\n\nexport function RnAccountLoginForm({\n authApiBase,\n defaultAuthApiBase = '',\n onAuthApiBaseChange,\n submitting = false,\n error = '',\n onError,\n onSuccess,\n theme,\n labels: labelsProp,\n placeholders,\n}: RnAccountLoginFormProps) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n const [apiClient, setApiClient] = useState<\n Awaited<ReturnType<typeof initRnAuthClient>> | null\n >(null);\n const [account, setAccount] = useState('');\n const [password, setPassword] = useState('');\n const [useLegacyPhone, setUseLegacyPhone] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n const base = authApiBase.trim() || defaultAuthApiBase;\n if (!base) {\n setApiClient(null);\n return;\n }\n resetRnAuthClientCache();\n initRnAuthClient(base).then(c => {\n if (!cancelled) {\n setApiClient(c);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [authApiBase, defaultAuthApiBase]);\n\n useEffect(() => {\n const trimmed = account.trim();\n if (!trimmed) {\n setUseLegacyPhone(true);\n return;\n }\n setUseLegacyPhone(isPhoneAccount(trimmed));\n }, [account]);\n\n const handleLegacySubmit = useCallback(async () => {\n const base = authApiBase.trim() || defaultAuthApiBase;\n onError?.('');\n const result = await loginWithLegacyPhone(base, account, password);\n if (!result.success || !result.token) {\n onError?.(result.message ?? '登录失败');\n return;\n }\n await onSuccess(result.token);\n }, [account, authApiBase, defaultAuthApiBase, onError, onSuccess, password]);\n\n const authApiField = onAuthApiBaseChange ? (\n <>\n <Text style={[defaultStyles.label, theme?.label]}>{labels.authApiBase}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={authApiBase}\n onChangeText={onAuthApiBaseChange}\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.authApiBase ?? defaultAuthApiBase}\n placeholderTextColor=\"#6b7a8a\"\n />\n </>\n ) : null;\n\n if (!apiClient) {\n return (\n <View style={[defaultStyles.centerInline, theme?.loadingContainer]}>\n <ActivityIndicator />\n </View>\n );\n }\n\n if (useLegacyPhone) {\n return (\n <>\n {authApiField}\n <Text style={[defaultStyles.label, theme?.label]}>{labels.phone}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={account}\n onChangeText={setAccount}\n keyboardType=\"phone-pad\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.phone ?? '13800138000'}\n placeholderTextColor=\"#6b7a8a\"\n />\n <Text style={[defaultStyles.label, theme?.label]}>{labels.password}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.password ?? '密码'}\n placeholderTextColor=\"#6b7a8a\"\n />\n {error ? <Text style={[defaultStyles.err, theme?.error]}>{error}</Text> : null}\n <Pressable\n style={[\n defaultStyles.btn,\n defaultStyles.primary,\n theme?.button,\n theme?.buttonPrimary,\n submitting && (theme?.buttonDisabled ?? defaultStyles.disabled),\n ]}\n onPress={handleLegacySubmit}\n disabled={submitting}>\n {submitting ? (\n <ActivityIndicator color=\"#fff\" />\n ) : (\n <Text style={[defaultStyles.btnTextPrimary, theme?.buttonTextPrimary]}>\n {labels.submit}\n </Text>\n )}\n </Pressable>\n </>\n );\n }\n\n return (\n <>\n {authApiField}\n <LoginForm\n apiClient={apiClient}\n onSuccess={() => {\n const tok = apiClient.getToken();\n if (tok) {\n void onSuccess(tok);\n } else {\n onError?.('登录成功但未获取到令牌');\n }\n }}\n onError={msg => onError?.(msg)}>\n {({\n email,\n password: pwd,\n loading,\n error: formErr,\n handleEmailChange,\n handlePasswordChange,\n handleSubmit,\n }) => (\n <>\n <Text style={[defaultStyles.label, theme?.label]}>{labels.email}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={email}\n onChangeText={handleEmailChange}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.email ?? 'user@example.com'}\n placeholderTextColor=\"#6b7a8a\"\n />\n <Text style={[defaultStyles.label, theme?.label]}>{labels.password}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={pwd}\n onChangeText={handlePasswordChange}\n secureTextEntry\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.password ?? '密码'}\n placeholderTextColor=\"#6b7a8a\"\n />\n {(formErr || error) ? (\n <Text style={[defaultStyles.err, theme?.error]}>{formErr ?? error}</Text>\n ) : null}\n <Pressable\n style={[\n defaultStyles.btn,\n defaultStyles.primary,\n theme?.button,\n theme?.buttonPrimary,\n (loading || submitting) &&\n (theme?.buttonDisabled ?? defaultStyles.disabled),\n ]}\n onPress={() => handleSubmit()}\n disabled={loading || submitting}>\n {loading || submitting ? (\n <ActivityIndicator color=\"#fff\" />\n ) : (\n <Text style={[defaultStyles.btnTextPrimary, theme?.buttonTextPrimary]}>\n {labels.submit}\n </Text>\n )}\n </Pressable>\n </>\n )}\n </LoginForm>\n </>\n );\n}\n"]}
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { D as DrizzleAuthService } from '../../drizzle-auth-service-D-pljzCD.mjs';
|
|
2
|
-
import '../../enums-Dume-V5Y.mjs';
|
|
3
|
-
import 'drizzle-orm/pg-core';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Auth Routes - Types
|
|
7
|
-
* 路由处理器类型定义
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 基础路由配置
|
|
12
|
-
*/
|
|
13
|
-
interface BaseRouteConfig {
|
|
14
|
-
/**
|
|
15
|
-
* 认证服务实例
|
|
16
|
-
*/
|
|
17
|
-
authService: DrizzleAuthService;
|
|
18
|
-
/**
|
|
19
|
-
* 可选的 Analytics 服务
|
|
20
|
-
*/
|
|
21
|
-
analytics?: {
|
|
22
|
-
track: (eventName: string, properties: any) => Promise<void>;
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* CORS 配置
|
|
26
|
-
*/
|
|
27
|
-
cors?: {
|
|
28
|
-
enabled?: boolean;
|
|
29
|
-
origin?: string | string[];
|
|
30
|
-
methods?: string[];
|
|
31
|
-
allowedHeaders?: string[];
|
|
32
|
-
credentials?: boolean;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* 登录路由配置
|
|
37
|
-
*/
|
|
38
|
-
interface LoginRouteConfig extends BaseRouteConfig {
|
|
39
|
-
/**
|
|
40
|
-
* Cookie 配置
|
|
41
|
-
*/
|
|
42
|
-
cookieOptions?: {
|
|
43
|
-
name?: string;
|
|
44
|
-
httpOnly?: boolean;
|
|
45
|
-
secure?: boolean;
|
|
46
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
47
|
-
maxAge?: number;
|
|
48
|
-
path?: string;
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 注册路由配置
|
|
53
|
-
*/
|
|
54
|
-
interface RegisterRouteConfig extends BaseRouteConfig {
|
|
55
|
-
/**
|
|
56
|
-
* 默认角色
|
|
57
|
-
*/
|
|
58
|
-
defaultRole?: 'USER' | 'ADMIN' | 'SUPER_ADMIN';
|
|
59
|
-
/**
|
|
60
|
-
* 是否需要邮箱验证
|
|
61
|
-
*/
|
|
62
|
-
emailVerificationRequired?: boolean;
|
|
63
|
-
/**
|
|
64
|
-
* Cookie 配置
|
|
65
|
-
*/
|
|
66
|
-
cookieOptions?: {
|
|
67
|
-
name?: string;
|
|
68
|
-
httpOnly?: boolean;
|
|
69
|
-
secure?: boolean;
|
|
70
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
71
|
-
maxAge?: number;
|
|
72
|
-
path?: string;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 标准 API 响应
|
|
77
|
-
*/
|
|
78
|
-
interface ApiResponse<T = any> {
|
|
79
|
-
success: boolean;
|
|
80
|
-
data?: T;
|
|
81
|
-
error?: string;
|
|
82
|
-
message?: string;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Auth Routes - Login
|
|
87
|
-
* 登录路由处理器
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* 创建登录路由处理器
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```typescript
|
|
95
|
-
* import { createLoginHandler } from 'sa2kit/auth/routes';
|
|
96
|
-
*
|
|
97
|
-
* export const POST = createLoginHandler({
|
|
98
|
-
* authService: myAuthService,
|
|
99
|
-
* analytics: myAnalytics,
|
|
100
|
-
* cors: { enabled: true },
|
|
101
|
-
* });
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
declare function createLoginHandler(config: LoginRouteConfig): (request: Request) => Promise<Response>;
|
|
105
|
-
/**
|
|
106
|
-
* 创建 CORS 预检请求处理器
|
|
107
|
-
*/
|
|
108
|
-
declare function createLoginOptionsHandler(config: LoginRouteConfig): (request: Request) => Promise<Response>;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Auth Routes - Register
|
|
112
|
-
* 注册路由处理器
|
|
113
|
-
*/
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* 创建注册路由处理器
|
|
117
|
-
*
|
|
118
|
-
* @example
|
|
119
|
-
* ```typescript
|
|
120
|
-
* import { createRegisterHandler } from 'sa2kit/auth/routes';
|
|
121
|
-
*
|
|
122
|
-
* export const POST = createRegisterHandler({
|
|
123
|
-
* authService: myAuthService,
|
|
124
|
-
* defaultRole: 'USER',
|
|
125
|
-
* cors: { enabled: true },
|
|
126
|
-
* });
|
|
127
|
-
* ```
|
|
128
|
-
*/
|
|
129
|
-
declare function createRegisterHandler(config: RegisterRouteConfig): (request: Request) => Promise<Response>;
|
|
130
|
-
/**
|
|
131
|
-
* 创建 CORS 预检请求处理器
|
|
132
|
-
*/
|
|
133
|
-
declare function createRegisterOptionsHandler(config: RegisterRouteConfig): (request: Request) => Promise<Response>;
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Auth Routes - Me
|
|
137
|
-
* 获取当前用户信息路由处理器
|
|
138
|
-
*/
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* 创建获取当前用户信息路由处理器
|
|
142
|
-
*
|
|
143
|
-
* @example
|
|
144
|
-
* ```typescript
|
|
145
|
-
* import { createMeHandler } from 'sa2kit/auth/routes';
|
|
146
|
-
*
|
|
147
|
-
* export const GET = createMeHandler({
|
|
148
|
-
* authService: myAuthService,
|
|
149
|
-
* cors: { enabled: true },
|
|
150
|
-
* });
|
|
151
|
-
* ```
|
|
152
|
-
*/
|
|
153
|
-
declare function createMeHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
154
|
-
/**
|
|
155
|
-
* 创建 CORS 预检请求处理器
|
|
156
|
-
*/
|
|
157
|
-
declare function createMeOptionsHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Auth Routes - Logout
|
|
161
|
-
* 登出路由处理器
|
|
162
|
-
*/
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 创建登出路由处理器
|
|
166
|
-
*
|
|
167
|
-
* @example
|
|
168
|
-
* ```typescript
|
|
169
|
-
* import { createLogoutHandler } from 'sa2kit/auth/routes';
|
|
170
|
-
*
|
|
171
|
-
* export const POST = createLogoutHandler({
|
|
172
|
-
* authService: myAuthService,
|
|
173
|
-
* cors: { enabled: true },
|
|
174
|
-
* });
|
|
175
|
-
* ```
|
|
176
|
-
*/
|
|
177
|
-
declare function createLogoutHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
178
|
-
/**
|
|
179
|
-
* 创建 CORS 预检请求处理器
|
|
180
|
-
*/
|
|
181
|
-
declare function createLogoutOptionsHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Auth Routes - Default Configurations
|
|
185
|
-
* 默认路由配置
|
|
186
|
-
*/
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* 创建默认的基础路由配置
|
|
190
|
-
*/
|
|
191
|
-
declare function createDefaultBaseConfig(authService: DrizzleAuthService, overrides?: Partial<BaseRouteConfig>): BaseRouteConfig;
|
|
192
|
-
/**
|
|
193
|
-
* 创建默认的登录路由配置
|
|
194
|
-
*/
|
|
195
|
-
declare function createDefaultLoginConfig(authService: DrizzleAuthService, overrides?: Partial<LoginRouteConfig>): LoginRouteConfig;
|
|
196
|
-
/**
|
|
197
|
-
* 创建默认的注册路由配置
|
|
198
|
-
*/
|
|
199
|
-
declare function createDefaultRegisterConfig(authService: DrizzleAuthService, overrides?: Partial<RegisterRouteConfig>): RegisterRouteConfig;
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Auth Routes - Analytics Adapter
|
|
203
|
-
* 埋点适配器,用于适配不同的埋点服务
|
|
204
|
-
*/
|
|
205
|
-
/**
|
|
206
|
-
* 埋点事件接口
|
|
207
|
-
*/
|
|
208
|
-
interface AnalyticsEvent {
|
|
209
|
-
id: string;
|
|
210
|
-
eventType: string;
|
|
211
|
-
eventName: string;
|
|
212
|
-
timestamp: string;
|
|
213
|
-
priority: number;
|
|
214
|
-
userId: string;
|
|
215
|
-
sessionId: string;
|
|
216
|
-
deviceId: string;
|
|
217
|
-
platform: string;
|
|
218
|
-
appVersion: string;
|
|
219
|
-
sdkVersion: string;
|
|
220
|
-
properties: Record<string, any>;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* 埋点服务接口
|
|
224
|
-
*/
|
|
225
|
-
interface AnalyticsService {
|
|
226
|
-
insertAnalyticsEvents(events: AnalyticsEvent[]): Promise<void>;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* 创建埋点适配器
|
|
230
|
-
*
|
|
231
|
-
* @param analyticsService 埋点服务实例
|
|
232
|
-
* @param options 可选配置
|
|
233
|
-
* @returns 符合 sa2kit 格式的埋点函数
|
|
234
|
-
*
|
|
235
|
-
* @example
|
|
236
|
-
* ```typescript
|
|
237
|
-
* import { createAnalyticsAdapter } from 'sa2kit/auth/routes';
|
|
238
|
-
* import { analyticsService } from '@/lib/analytics';
|
|
239
|
-
*
|
|
240
|
-
* const analytics = createAnalyticsAdapter(analyticsService, {
|
|
241
|
-
* platform: 'backend',
|
|
242
|
-
* appVersion: '1.0.0',
|
|
243
|
-
* });
|
|
244
|
-
*
|
|
245
|
-
* // 在路由配置中使用
|
|
246
|
-
* const config = createDefaultLoginConfig(authService, {
|
|
247
|
-
* analytics,
|
|
248
|
-
* });
|
|
249
|
-
* ```
|
|
250
|
-
*/
|
|
251
|
-
declare function createAnalyticsAdapter(analyticsService: AnalyticsService, options?: {
|
|
252
|
-
platform?: string;
|
|
253
|
-
appVersion?: string;
|
|
254
|
-
sdkVersion?: string;
|
|
255
|
-
deviceId?: string;
|
|
256
|
-
generateId?: () => string;
|
|
257
|
-
}): {
|
|
258
|
-
track: (eventName: string, properties: any) => Promise<void>;
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
export { type AnalyticsEvent, type AnalyticsService, type ApiResponse, type BaseRouteConfig, type LoginRouteConfig, type RegisterRouteConfig, createAnalyticsAdapter, createDefaultBaseConfig, createDefaultLoginConfig, createDefaultRegisterConfig, createLoginHandler, createLoginOptionsHandler, createLogoutHandler, createLogoutOptionsHandler, createMeHandler, createMeOptionsHandler, createRegisterHandler, createRegisterOptionsHandler };
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { D as DrizzleAuthService } from '../../drizzle-auth-service-D3qryE_I.js';
|
|
2
|
-
import '../../enums-Dume-V5Y.js';
|
|
3
|
-
import 'drizzle-orm/pg-core';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Auth Routes - Types
|
|
7
|
-
* 路由处理器类型定义
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 基础路由配置
|
|
12
|
-
*/
|
|
13
|
-
interface BaseRouteConfig {
|
|
14
|
-
/**
|
|
15
|
-
* 认证服务实例
|
|
16
|
-
*/
|
|
17
|
-
authService: DrizzleAuthService;
|
|
18
|
-
/**
|
|
19
|
-
* 可选的 Analytics 服务
|
|
20
|
-
*/
|
|
21
|
-
analytics?: {
|
|
22
|
-
track: (eventName: string, properties: any) => Promise<void>;
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* CORS 配置
|
|
26
|
-
*/
|
|
27
|
-
cors?: {
|
|
28
|
-
enabled?: boolean;
|
|
29
|
-
origin?: string | string[];
|
|
30
|
-
methods?: string[];
|
|
31
|
-
allowedHeaders?: string[];
|
|
32
|
-
credentials?: boolean;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* 登录路由配置
|
|
37
|
-
*/
|
|
38
|
-
interface LoginRouteConfig extends BaseRouteConfig {
|
|
39
|
-
/**
|
|
40
|
-
* Cookie 配置
|
|
41
|
-
*/
|
|
42
|
-
cookieOptions?: {
|
|
43
|
-
name?: string;
|
|
44
|
-
httpOnly?: boolean;
|
|
45
|
-
secure?: boolean;
|
|
46
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
47
|
-
maxAge?: number;
|
|
48
|
-
path?: string;
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 注册路由配置
|
|
53
|
-
*/
|
|
54
|
-
interface RegisterRouteConfig extends BaseRouteConfig {
|
|
55
|
-
/**
|
|
56
|
-
* 默认角色
|
|
57
|
-
*/
|
|
58
|
-
defaultRole?: 'USER' | 'ADMIN' | 'SUPER_ADMIN';
|
|
59
|
-
/**
|
|
60
|
-
* 是否需要邮箱验证
|
|
61
|
-
*/
|
|
62
|
-
emailVerificationRequired?: boolean;
|
|
63
|
-
/**
|
|
64
|
-
* Cookie 配置
|
|
65
|
-
*/
|
|
66
|
-
cookieOptions?: {
|
|
67
|
-
name?: string;
|
|
68
|
-
httpOnly?: boolean;
|
|
69
|
-
secure?: boolean;
|
|
70
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
71
|
-
maxAge?: number;
|
|
72
|
-
path?: string;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 标准 API 响应
|
|
77
|
-
*/
|
|
78
|
-
interface ApiResponse<T = any> {
|
|
79
|
-
success: boolean;
|
|
80
|
-
data?: T;
|
|
81
|
-
error?: string;
|
|
82
|
-
message?: string;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Auth Routes - Login
|
|
87
|
-
* 登录路由处理器
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* 创建登录路由处理器
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```typescript
|
|
95
|
-
* import { createLoginHandler } from 'sa2kit/auth/routes';
|
|
96
|
-
*
|
|
97
|
-
* export const POST = createLoginHandler({
|
|
98
|
-
* authService: myAuthService,
|
|
99
|
-
* analytics: myAnalytics,
|
|
100
|
-
* cors: { enabled: true },
|
|
101
|
-
* });
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
declare function createLoginHandler(config: LoginRouteConfig): (request: Request) => Promise<Response>;
|
|
105
|
-
/**
|
|
106
|
-
* 创建 CORS 预检请求处理器
|
|
107
|
-
*/
|
|
108
|
-
declare function createLoginOptionsHandler(config: LoginRouteConfig): (request: Request) => Promise<Response>;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Auth Routes - Register
|
|
112
|
-
* 注册路由处理器
|
|
113
|
-
*/
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* 创建注册路由处理器
|
|
117
|
-
*
|
|
118
|
-
* @example
|
|
119
|
-
* ```typescript
|
|
120
|
-
* import { createRegisterHandler } from 'sa2kit/auth/routes';
|
|
121
|
-
*
|
|
122
|
-
* export const POST = createRegisterHandler({
|
|
123
|
-
* authService: myAuthService,
|
|
124
|
-
* defaultRole: 'USER',
|
|
125
|
-
* cors: { enabled: true },
|
|
126
|
-
* });
|
|
127
|
-
* ```
|
|
128
|
-
*/
|
|
129
|
-
declare function createRegisterHandler(config: RegisterRouteConfig): (request: Request) => Promise<Response>;
|
|
130
|
-
/**
|
|
131
|
-
* 创建 CORS 预检请求处理器
|
|
132
|
-
*/
|
|
133
|
-
declare function createRegisterOptionsHandler(config: RegisterRouteConfig): (request: Request) => Promise<Response>;
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Auth Routes - Me
|
|
137
|
-
* 获取当前用户信息路由处理器
|
|
138
|
-
*/
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* 创建获取当前用户信息路由处理器
|
|
142
|
-
*
|
|
143
|
-
* @example
|
|
144
|
-
* ```typescript
|
|
145
|
-
* import { createMeHandler } from 'sa2kit/auth/routes';
|
|
146
|
-
*
|
|
147
|
-
* export const GET = createMeHandler({
|
|
148
|
-
* authService: myAuthService,
|
|
149
|
-
* cors: { enabled: true },
|
|
150
|
-
* });
|
|
151
|
-
* ```
|
|
152
|
-
*/
|
|
153
|
-
declare function createMeHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
154
|
-
/**
|
|
155
|
-
* 创建 CORS 预检请求处理器
|
|
156
|
-
*/
|
|
157
|
-
declare function createMeOptionsHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Auth Routes - Logout
|
|
161
|
-
* 登出路由处理器
|
|
162
|
-
*/
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 创建登出路由处理器
|
|
166
|
-
*
|
|
167
|
-
* @example
|
|
168
|
-
* ```typescript
|
|
169
|
-
* import { createLogoutHandler } from 'sa2kit/auth/routes';
|
|
170
|
-
*
|
|
171
|
-
* export const POST = createLogoutHandler({
|
|
172
|
-
* authService: myAuthService,
|
|
173
|
-
* cors: { enabled: true },
|
|
174
|
-
* });
|
|
175
|
-
* ```
|
|
176
|
-
*/
|
|
177
|
-
declare function createLogoutHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
178
|
-
/**
|
|
179
|
-
* 创建 CORS 预检请求处理器
|
|
180
|
-
*/
|
|
181
|
-
declare function createLogoutOptionsHandler(config: BaseRouteConfig): (request: Request) => Promise<Response>;
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Auth Routes - Default Configurations
|
|
185
|
-
* 默认路由配置
|
|
186
|
-
*/
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* 创建默认的基础路由配置
|
|
190
|
-
*/
|
|
191
|
-
declare function createDefaultBaseConfig(authService: DrizzleAuthService, overrides?: Partial<BaseRouteConfig>): BaseRouteConfig;
|
|
192
|
-
/**
|
|
193
|
-
* 创建默认的登录路由配置
|
|
194
|
-
*/
|
|
195
|
-
declare function createDefaultLoginConfig(authService: DrizzleAuthService, overrides?: Partial<LoginRouteConfig>): LoginRouteConfig;
|
|
196
|
-
/**
|
|
197
|
-
* 创建默认的注册路由配置
|
|
198
|
-
*/
|
|
199
|
-
declare function createDefaultRegisterConfig(authService: DrizzleAuthService, overrides?: Partial<RegisterRouteConfig>): RegisterRouteConfig;
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Auth Routes - Analytics Adapter
|
|
203
|
-
* 埋点适配器,用于适配不同的埋点服务
|
|
204
|
-
*/
|
|
205
|
-
/**
|
|
206
|
-
* 埋点事件接口
|
|
207
|
-
*/
|
|
208
|
-
interface AnalyticsEvent {
|
|
209
|
-
id: string;
|
|
210
|
-
eventType: string;
|
|
211
|
-
eventName: string;
|
|
212
|
-
timestamp: string;
|
|
213
|
-
priority: number;
|
|
214
|
-
userId: string;
|
|
215
|
-
sessionId: string;
|
|
216
|
-
deviceId: string;
|
|
217
|
-
platform: string;
|
|
218
|
-
appVersion: string;
|
|
219
|
-
sdkVersion: string;
|
|
220
|
-
properties: Record<string, any>;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* 埋点服务接口
|
|
224
|
-
*/
|
|
225
|
-
interface AnalyticsService {
|
|
226
|
-
insertAnalyticsEvents(events: AnalyticsEvent[]): Promise<void>;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* 创建埋点适配器
|
|
230
|
-
*
|
|
231
|
-
* @param analyticsService 埋点服务实例
|
|
232
|
-
* @param options 可选配置
|
|
233
|
-
* @returns 符合 sa2kit 格式的埋点函数
|
|
234
|
-
*
|
|
235
|
-
* @example
|
|
236
|
-
* ```typescript
|
|
237
|
-
* import { createAnalyticsAdapter } from 'sa2kit/auth/routes';
|
|
238
|
-
* import { analyticsService } from '@/lib/analytics';
|
|
239
|
-
*
|
|
240
|
-
* const analytics = createAnalyticsAdapter(analyticsService, {
|
|
241
|
-
* platform: 'backend',
|
|
242
|
-
* appVersion: '1.0.0',
|
|
243
|
-
* });
|
|
244
|
-
*
|
|
245
|
-
* // 在路由配置中使用
|
|
246
|
-
* const config = createDefaultLoginConfig(authService, {
|
|
247
|
-
* analytics,
|
|
248
|
-
* });
|
|
249
|
-
* ```
|
|
250
|
-
*/
|
|
251
|
-
declare function createAnalyticsAdapter(analyticsService: AnalyticsService, options?: {
|
|
252
|
-
platform?: string;
|
|
253
|
-
appVersion?: string;
|
|
254
|
-
sdkVersion?: string;
|
|
255
|
-
deviceId?: string;
|
|
256
|
-
generateId?: () => string;
|
|
257
|
-
}): {
|
|
258
|
-
track: (eventName: string, properties: any) => Promise<void>;
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
export { type AnalyticsEvent, type AnalyticsService, type ApiResponse, type BaseRouteConfig, type LoginRouteConfig, type RegisterRouteConfig, createAnalyticsAdapter, createDefaultBaseConfig, createDefaultLoginConfig, createDefaultRegisterConfig, createLoginHandler, createLoginOptionsHandler, createLogoutHandler, createLogoutOptionsHandler, createMeHandler, createMeOptionsHandler, createRegisterHandler, createRegisterOptionsHandler };
|