sa2kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +298 -0
  3. package/dist/AliyunOSSProvider-7JLMJDXK.js +15 -0
  4. package/dist/AliyunOSSProvider-7JLMJDXK.js.map +1 -0
  5. package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +6 -0
  6. package/dist/AliyunOSSProvider-GQMSDJGZ.mjs.map +1 -0
  7. package/dist/LocalStorageProvider-FVLLHBHO.mjs +6 -0
  8. package/dist/LocalStorageProvider-FVLLHBHO.mjs.map +1 -0
  9. package/dist/LocalStorageProvider-NBNHHWLY.js +15 -0
  10. package/dist/LocalStorageProvider-NBNHHWLY.js.map +1 -0
  11. package/dist/analytics/index.d.mts +1084 -0
  12. package/dist/analytics/index.d.ts +1084 -0
  13. package/dist/analytics/index.js +2595 -0
  14. package/dist/analytics/index.js.map +1 -0
  15. package/dist/analytics/index.mjs +2518 -0
  16. package/dist/analytics/index.mjs.map +1 -0
  17. package/dist/analytics/server/index.d.mts +499 -0
  18. package/dist/analytics/server/index.d.ts +499 -0
  19. package/dist/analytics/server/index.js +529 -0
  20. package/dist/analytics/server/index.js.map +1 -0
  21. package/dist/analytics/server/index.mjs +525 -0
  22. package/dist/analytics/server/index.mjs.map +1 -0
  23. package/dist/auth/client/index.d.mts +104 -0
  24. package/dist/auth/client/index.d.ts +104 -0
  25. package/dist/auth/client/index.js +21 -0
  26. package/dist/auth/client/index.js.map +1 -0
  27. package/dist/auth/client/index.mjs +4 -0
  28. package/dist/auth/client/index.mjs.map +1 -0
  29. package/dist/auth/components/index.d.mts +82 -0
  30. package/dist/auth/components/index.d.ts +82 -0
  31. package/dist/auth/components/index.js +93 -0
  32. package/dist/auth/components/index.js.map +1 -0
  33. package/dist/auth/components/index.mjs +86 -0
  34. package/dist/auth/components/index.mjs.map +1 -0
  35. package/dist/auth/hooks/index.d.mts +2 -0
  36. package/dist/auth/hooks/index.d.ts +2 -0
  37. package/dist/auth/hooks/index.js +17 -0
  38. package/dist/auth/hooks/index.js.map +1 -0
  39. package/dist/auth/hooks/index.mjs +4 -0
  40. package/dist/auth/hooks/index.mjs.map +1 -0
  41. package/dist/auth/index.d.mts +15 -0
  42. package/dist/auth/index.d.ts +15 -0
  43. package/dist/auth/index.js +110 -0
  44. package/dist/auth/index.js.map +1 -0
  45. package/dist/auth/index.mjs +9 -0
  46. package/dist/auth/index.mjs.map +1 -0
  47. package/dist/auth/middleware/index.d.mts +75 -0
  48. package/dist/auth/middleware/index.d.ts +75 -0
  49. package/dist/auth/middleware/index.js +15 -0
  50. package/dist/auth/middleware/index.js.map +1 -0
  51. package/dist/auth/middleware/index.mjs +6 -0
  52. package/dist/auth/middleware/index.mjs.map +1 -0
  53. package/dist/auth/routes/index.d.mts +163 -0
  54. package/dist/auth/routes/index.d.ts +163 -0
  55. package/dist/auth/routes/index.js +27 -0
  56. package/dist/auth/routes/index.js.map +1 -0
  57. package/dist/auth/routes/index.mjs +6 -0
  58. package/dist/auth/routes/index.mjs.map +1 -0
  59. package/dist/auth/schema/index.d.mts +789 -0
  60. package/dist/auth/schema/index.d.ts +789 -0
  61. package/dist/auth/schema/index.js +41 -0
  62. package/dist/auth/schema/index.js.map +1 -0
  63. package/dist/auth/schema/index.mjs +4 -0
  64. package/dist/auth/schema/index.mjs.map +1 -0
  65. package/dist/auth/services/index.d.mts +47 -0
  66. package/dist/auth/services/index.d.ts +47 -0
  67. package/dist/auth/services/index.js +34 -0
  68. package/dist/auth/services/index.js.map +1 -0
  69. package/dist/auth/services/index.mjs +5 -0
  70. package/dist/auth/services/index.mjs.map +1 -0
  71. package/dist/chunk-3RFBUDRA.js +507 -0
  72. package/dist/chunk-3RFBUDRA.js.map +1 -0
  73. package/dist/chunk-3XG5OHFD.mjs +37 -0
  74. package/dist/chunk-3XG5OHFD.mjs.map +1 -0
  75. package/dist/chunk-6BL3AZGD.js +285 -0
  76. package/dist/chunk-6BL3AZGD.js.map +1 -0
  77. package/dist/chunk-6FNUWAIV.js +394 -0
  78. package/dist/chunk-6FNUWAIV.js.map +1 -0
  79. package/dist/chunk-6PRFP5EG.js +171 -0
  80. package/dist/chunk-6PRFP5EG.js.map +1 -0
  81. package/dist/chunk-6VHWOPRR.mjs +90 -0
  82. package/dist/chunk-6VHWOPRR.mjs.map +1 -0
  83. package/dist/chunk-AIKEVVDR.mjs +122 -0
  84. package/dist/chunk-AIKEVVDR.mjs.map +1 -0
  85. package/dist/chunk-APY57REU.js +300 -0
  86. package/dist/chunk-APY57REU.js.map +1 -0
  87. package/dist/chunk-BJTO5JO5.mjs +10 -0
  88. package/dist/chunk-BJTO5JO5.mjs.map +1 -0
  89. package/dist/chunk-C64RY2OW.mjs +295 -0
  90. package/dist/chunk-C64RY2OW.mjs.map +1 -0
  91. package/dist/chunk-DGUM43GV.js +12 -0
  92. package/dist/chunk-DGUM43GV.js.map +1 -0
  93. package/dist/chunk-FV3FNHQY.js +92 -0
  94. package/dist/chunk-FV3FNHQY.js.map +1 -0
  95. package/dist/chunk-GSTLV3MB.mjs +316 -0
  96. package/dist/chunk-GSTLV3MB.mjs.map +1 -0
  97. package/dist/chunk-HEMA7SWK.mjs +212 -0
  98. package/dist/chunk-HEMA7SWK.mjs.map +1 -0
  99. package/dist/chunk-HWJ34NL6.js +43 -0
  100. package/dist/chunk-HWJ34NL6.js.map +1 -0
  101. package/dist/chunk-HXFFYNIF.mjs +385 -0
  102. package/dist/chunk-HXFFYNIF.mjs.map +1 -0
  103. package/dist/chunk-KGRQNEIR.mjs +183 -0
  104. package/dist/chunk-KGRQNEIR.mjs.map +1 -0
  105. package/dist/chunk-KH6RQ4J5.js +28 -0
  106. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  107. package/dist/chunk-KQGP6BTS.mjs +165 -0
  108. package/dist/chunk-KQGP6BTS.mjs.map +1 -0
  109. package/dist/chunk-NMF4ANIC.js +365 -0
  110. package/dist/chunk-NMF4ANIC.js.map +1 -0
  111. package/dist/chunk-O26VCNS3.js +216 -0
  112. package/dist/chunk-O26VCNS3.js.map +1 -0
  113. package/dist/chunk-OLHGZXN3.mjs +86 -0
  114. package/dist/chunk-OLHGZXN3.mjs.map +1 -0
  115. package/dist/chunk-QU5OT4DF.js +88 -0
  116. package/dist/chunk-QU5OT4DF.js.map +1 -0
  117. package/dist/chunk-RCNNVNLT.mjs +356 -0
  118. package/dist/chunk-RCNNVNLT.mjs.map +1 -0
  119. package/dist/chunk-ROEYW4A7.js +186 -0
  120. package/dist/chunk-ROEYW4A7.js.map +1 -0
  121. package/dist/chunk-SVWQN2LR.js +131 -0
  122. package/dist/chunk-SVWQN2LR.js.map +1 -0
  123. package/dist/chunk-TKCYPDWU.js +338 -0
  124. package/dist/chunk-TKCYPDWU.js.map +1 -0
  125. package/dist/chunk-U2L6V7KD.mjs +273 -0
  126. package/dist/chunk-U2L6V7KD.mjs.map +1 -0
  127. package/dist/chunk-YVBU7QDJ.mjs +505 -0
  128. package/dist/chunk-YVBU7QDJ.mjs.map +1 -0
  129. package/dist/chunk-ZGVB35L2.mjs +25 -0
  130. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  131. package/dist/config/index.d.mts +64 -0
  132. package/dist/config/index.d.ts +64 -0
  133. package/dist/config/index.js +136 -0
  134. package/dist/config/index.js.map +1 -0
  135. package/dist/config/index.mjs +128 -0
  136. package/dist/config/index.mjs.map +1 -0
  137. package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
  138. package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
  139. package/dist/enums-Dume-V5Y.d.mts +16 -0
  140. package/dist/enums-Dume-V5Y.d.ts +16 -0
  141. package/dist/i18n/index.d.mts +416 -0
  142. package/dist/i18n/index.d.ts +416 -0
  143. package/dist/i18n/index.js +671 -0
  144. package/dist/i18n/index.js.map +1 -0
  145. package/dist/i18n/index.mjs +650 -0
  146. package/dist/i18n/index.mjs.map +1 -0
  147. package/dist/index-8VoHap_4.d.mts +105 -0
  148. package/dist/index-8VoHap_4.d.ts +105 -0
  149. package/dist/index.d.mts +4 -0
  150. package/dist/index.d.ts +4 -0
  151. package/dist/index.js +84 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/index.mjs +7 -0
  154. package/dist/index.mjs.map +1 -0
  155. package/dist/logger/index.d.mts +125 -0
  156. package/dist/logger/index.d.ts +125 -0
  157. package/dist/logger/index.js +29 -0
  158. package/dist/logger/index.js.map +1 -0
  159. package/dist/logger/index.mjs +4 -0
  160. package/dist/logger/index.mjs.map +1 -0
  161. package/dist/request/index.d.mts +51 -0
  162. package/dist/request/index.d.ts +51 -0
  163. package/dist/request/index.js +85 -0
  164. package/dist/request/index.js.map +1 -0
  165. package/dist/request/index.mjs +82 -0
  166. package/dist/request/index.mjs.map +1 -0
  167. package/dist/storage/index.d.mts +74 -0
  168. package/dist/storage/index.d.ts +74 -0
  169. package/dist/storage/index.js +46 -0
  170. package/dist/storage/index.js.map +1 -0
  171. package/dist/storage/index.mjs +5 -0
  172. package/dist/storage/index.mjs.map +1 -0
  173. package/dist/types-BINlP9MK.d.mts +286 -0
  174. package/dist/types-BINlP9MK.d.ts +286 -0
  175. package/dist/types-BaZccpvk.d.mts +48 -0
  176. package/dist/types-BaZccpvk.d.ts +48 -0
  177. package/dist/types-CbTsi9CZ.d.mts +31 -0
  178. package/dist/types-CbTsi9CZ.d.ts +31 -0
  179. package/dist/types-CoGG1rNV.d.mts +258 -0
  180. package/dist/types-CoGG1rNV.d.ts +258 -0
  181. package/dist/types-DAxQ1MeY.d.ts +70 -0
  182. package/dist/types-DT8LVCvE.d.mts +70 -0
  183. package/dist/types-DW9qar-w.d.mts +52 -0
  184. package/dist/types-DW9qar-w.d.ts +52 -0
  185. package/dist/universalExport/index.d.mts +235 -0
  186. package/dist/universalExport/index.d.ts +235 -0
  187. package/dist/universalExport/index.js +621 -0
  188. package/dist/universalExport/index.js.map +1 -0
  189. package/dist/universalExport/index.mjs +580 -0
  190. package/dist/universalExport/index.mjs.map +1 -0
  191. package/dist/universalExport/server/index.d.mts +429 -0
  192. package/dist/universalExport/server/index.d.ts +429 -0
  193. package/dist/universalExport/server/index.js +263 -0
  194. package/dist/universalExport/server/index.js.map +1 -0
  195. package/dist/universalExport/server/index.mjs +242 -0
  196. package/dist/universalExport/server/index.mjs.map +1 -0
  197. package/dist/universalFile/index.d.mts +310 -0
  198. package/dist/universalFile/index.d.ts +310 -0
  199. package/dist/universalFile/index.js +811 -0
  200. package/dist/universalFile/index.js.map +1 -0
  201. package/dist/universalFile/index.mjs +736 -0
  202. package/dist/universalFile/index.mjs.map +1 -0
  203. package/dist/universalFile/server/index.d.mts +2428 -0
  204. package/dist/universalFile/server/index.d.ts +2428 -0
  205. package/dist/universalFile/server/index.js +4578 -0
  206. package/dist/universalFile/server/index.js.map +1 -0
  207. package/dist/universalFile/server/index.mjs +4518 -0
  208. package/dist/universalFile/server/index.mjs.map +1 -0
  209. package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
  210. package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
  211. package/dist/utils/index.d.mts +188 -0
  212. package/dist/utils/index.d.ts +188 -0
  213. package/dist/utils/index.js +42 -0
  214. package/dist/utils/index.js.map +1 -0
  215. package/dist/utils/index.mjs +5 -0
  216. package/dist/utils/index.mjs.map +1 -0
  217. package/package.json +220 -0
  218. package/tailwind.animations.js +34 -0
@@ -0,0 +1,104 @@
1
+ import { S as StorageAdapter } from '../../types-BaZccpvk.mjs';
2
+ import { R as RequestAdapter } from '../../types-CbTsi9CZ.mjs';
3
+ import { U as User, a as ApiResponse, b as AuthResponse } from '../../types-DW9qar-w.mjs';
4
+ export { A as API_ROUTES, S as STORAGE_KEYS } from '../../types-DW9qar-w.mjs';
5
+
6
+ /**
7
+ * Auth Client - Base API Client
8
+ * 基础 API 客户端
9
+ */
10
+
11
+ /**
12
+ * 基础 API 客户端
13
+ * 提供统一的 API 调用逻辑,通过适配器模式支持多平台
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';
18
+ * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';
19
+ * import { WebRequestAdapter } from '@qhr123/sa2kit/request';
20
+ *
21
+ * const apiClient = new BaseApiClient(
22
+ * new WebStorageAdapter(),
23
+ * new WebRequestAdapter(),
24
+ * '/api'
25
+ * );
26
+ *
27
+ * await apiClient.init();
28
+ * const result = await apiClient.login('user@example.com', 'password');
29
+ * ```
30
+ */
31
+ declare class BaseApiClient {
32
+ private storage;
33
+ private request;
34
+ private baseUrl;
35
+ private token;
36
+ private user;
37
+ constructor(storage: StorageAdapter, request: RequestAdapter, baseUrl: string);
38
+ /**
39
+ * 初始化 - 从存储中加载 token 和用户信息
40
+ */
41
+ init(): Promise<void>;
42
+ /**
43
+ * 设置认证 token
44
+ */
45
+ setToken(token: string | null): Promise<void>;
46
+ /**
47
+ * 设置用户信息
48
+ */
49
+ setUser(user: User | null): Promise<void>;
50
+ /**
51
+ * 获取当前 token
52
+ */
53
+ getToken(): string | null;
54
+ /**
55
+ * 获取当前用户
56
+ */
57
+ getUser(): User | null;
58
+ /**
59
+ * 检查是否已登录
60
+ */
61
+ isAuthenticated(): Promise<boolean>;
62
+ /**
63
+ * 清除用户数据
64
+ */
65
+ clearUserData(): Promise<void>;
66
+ /**
67
+ * 发送请求的通用方法
68
+ */
69
+ private sendRequest;
70
+ /**
71
+ * 用户注册
72
+ */
73
+ register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
74
+ /**
75
+ * 用户登录
76
+ */
77
+ login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
78
+ /**
79
+ * 用户退出登录
80
+ */
81
+ logout(): Promise<void>;
82
+ /**
83
+ * 获取当前用户信息
84
+ */
85
+ getCurrentUser(): Promise<ApiResponse<User>>;
86
+ /**
87
+ * 发送 GET 请求
88
+ */
89
+ get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>>;
90
+ /**
91
+ * 发送 POST 请求
92
+ */
93
+ post<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
94
+ /**
95
+ * 发送 PUT 请求
96
+ */
97
+ put<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
98
+ /**
99
+ * 发送 DELETE 请求
100
+ */
101
+ delete<T = any>(url: string): Promise<ApiResponse<T>>;
102
+ }
103
+
104
+ export { ApiResponse, AuthResponse, BaseApiClient, User };
@@ -0,0 +1,104 @@
1
+ import { S as StorageAdapter } from '../../types-BaZccpvk.js';
2
+ import { R as RequestAdapter } from '../../types-CbTsi9CZ.js';
3
+ import { U as User, a as ApiResponse, b as AuthResponse } from '../../types-DW9qar-w.js';
4
+ export { A as API_ROUTES, S as STORAGE_KEYS } from '../../types-DW9qar-w.js';
5
+
6
+ /**
7
+ * Auth Client - Base API Client
8
+ * 基础 API 客户端
9
+ */
10
+
11
+ /**
12
+ * 基础 API 客户端
13
+ * 提供统一的 API 调用逻辑,通过适配器模式支持多平台
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';
18
+ * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';
19
+ * import { WebRequestAdapter } from '@qhr123/sa2kit/request';
20
+ *
21
+ * const apiClient = new BaseApiClient(
22
+ * new WebStorageAdapter(),
23
+ * new WebRequestAdapter(),
24
+ * '/api'
25
+ * );
26
+ *
27
+ * await apiClient.init();
28
+ * const result = await apiClient.login('user@example.com', 'password');
29
+ * ```
30
+ */
31
+ declare class BaseApiClient {
32
+ private storage;
33
+ private request;
34
+ private baseUrl;
35
+ private token;
36
+ private user;
37
+ constructor(storage: StorageAdapter, request: RequestAdapter, baseUrl: string);
38
+ /**
39
+ * 初始化 - 从存储中加载 token 和用户信息
40
+ */
41
+ init(): Promise<void>;
42
+ /**
43
+ * 设置认证 token
44
+ */
45
+ setToken(token: string | null): Promise<void>;
46
+ /**
47
+ * 设置用户信息
48
+ */
49
+ setUser(user: User | null): Promise<void>;
50
+ /**
51
+ * 获取当前 token
52
+ */
53
+ getToken(): string | null;
54
+ /**
55
+ * 获取当前用户
56
+ */
57
+ getUser(): User | null;
58
+ /**
59
+ * 检查是否已登录
60
+ */
61
+ isAuthenticated(): Promise<boolean>;
62
+ /**
63
+ * 清除用户数据
64
+ */
65
+ clearUserData(): Promise<void>;
66
+ /**
67
+ * 发送请求的通用方法
68
+ */
69
+ private sendRequest;
70
+ /**
71
+ * 用户注册
72
+ */
73
+ register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
74
+ /**
75
+ * 用户登录
76
+ */
77
+ login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
78
+ /**
79
+ * 用户退出登录
80
+ */
81
+ logout(): Promise<void>;
82
+ /**
83
+ * 获取当前用户信息
84
+ */
85
+ getCurrentUser(): Promise<ApiResponse<User>>;
86
+ /**
87
+ * 发送 GET 请求
88
+ */
89
+ get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>>;
90
+ /**
91
+ * 发送 POST 请求
92
+ */
93
+ post<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
94
+ /**
95
+ * 发送 PUT 请求
96
+ */
97
+ put<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
98
+ /**
99
+ * 发送 DELETE 请求
100
+ */
101
+ delete<T = any>(url: string): Promise<ApiResponse<T>>;
102
+ }
103
+
104
+ export { ApiResponse, AuthResponse, BaseApiClient, User };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var chunkO26VCNS3_js = require('../../chunk-O26VCNS3.js');
4
+ require('../../chunk-DGUM43GV.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "API_ROUTES", {
9
+ enumerable: true,
10
+ get: function () { return chunkO26VCNS3_js.API_ROUTES; }
11
+ });
12
+ Object.defineProperty(exports, "BaseApiClient", {
13
+ enumerable: true,
14
+ get: function () { return chunkO26VCNS3_js.BaseApiClient; }
15
+ });
16
+ Object.defineProperty(exports, "STORAGE_KEYS", {
17
+ enumerable: true,
18
+ get: function () { return chunkO26VCNS3_js.STORAGE_KEYS; }
19
+ });
20
+ //# sourceMappingURL=index.js.map
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { API_ROUTES, BaseApiClient, STORAGE_KEYS } from '../../chunk-HEMA7SWK.mjs';
2
+ import '../../chunk-BJTO5JO5.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,82 @@
1
+ import React__default from 'react';
2
+ import { H as HeadlessLoginFormProps, a as HeadlessRegisterFormProps } from '../../types-DT8LVCvE.mjs';
3
+ export { B as BaseFormProps, L as LoginFormState, R as RegisterFormState } from '../../types-DT8LVCvE.mjs';
4
+ import '../../types-DW9qar-w.mjs';
5
+
6
+ /**
7
+ * Auth Components - LoginForm (Headless)
8
+ * 无样式的登录表单组件
9
+ */
10
+
11
+ /**
12
+ * Headless 登录表单组件
13
+ *
14
+ * 提供登录逻辑但不包含任何 UI 样式,
15
+ * 使用 render props 模式让用户完全控制 UI
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * <LoginForm apiClient={apiClient}>
20
+ * {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (
21
+ * <form onSubmit={handleSubmit}>
22
+ * <input
23
+ * value={email}
24
+ * onChange={(e) => handleEmailChange(e.target.value)}
25
+ * />
26
+ * <input
27
+ * type="password"
28
+ * value={password}
29
+ * onChange={(e) => handlePasswordChange(e.target.value)}
30
+ * />
31
+ * {error && <div>{error}</div>}
32
+ * <button disabled={loading}>
33
+ * {loading ? '登录中...' : '登录'}
34
+ * </button>
35
+ * </form>
36
+ * )}
37
+ * </LoginForm>
38
+ * ```
39
+ */
40
+ declare function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps): React__default.JSX.Element;
41
+
42
+ /**
43
+ * Auth Components - RegisterForm (Headless)
44
+ * 无样式的注册表单组件
45
+ */
46
+
47
+ /**
48
+ * Headless 注册表单组件
49
+ *
50
+ * 提供注册逻辑但不包含任何 UI 样式,
51
+ * 使用 render props 模式让用户完全控制 UI
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * <RegisterForm apiClient={apiClient}>
56
+ * {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (
57
+ * <form onSubmit={handleSubmit}>
58
+ * <input
59
+ * value={email}
60
+ * onChange={(e) => handleEmailChange(e.target.value)}
61
+ * />
62
+ * <input
63
+ * value={username}
64
+ * onChange={(e) => handleUsernameChange(e.target.value)}
65
+ * />
66
+ * <input
67
+ * type="password"
68
+ * value={password}
69
+ * onChange={(e) => handlePasswordChange(e.target.value)}
70
+ * />
71
+ * {error && <div>{error}</div>}
72
+ * <button disabled={loading}>
73
+ * {loading ? '注册中...' : '注册'}
74
+ * </button>
75
+ * </form>
76
+ * )}
77
+ * </RegisterForm>
78
+ * ```
79
+ */
80
+ declare function RegisterForm({ apiClient, onSuccess, onError, children, }: HeadlessRegisterFormProps): React__default.JSX.Element;
81
+
82
+ export { HeadlessLoginFormProps, HeadlessRegisterFormProps, LoginForm, RegisterForm };
@@ -0,0 +1,82 @@
1
+ import React__default from 'react';
2
+ import { H as HeadlessLoginFormProps, a as HeadlessRegisterFormProps } from '../../types-DAxQ1MeY.js';
3
+ export { B as BaseFormProps, L as LoginFormState, R as RegisterFormState } from '../../types-DAxQ1MeY.js';
4
+ import '../../types-DW9qar-w.js';
5
+
6
+ /**
7
+ * Auth Components - LoginForm (Headless)
8
+ * 无样式的登录表单组件
9
+ */
10
+
11
+ /**
12
+ * Headless 登录表单组件
13
+ *
14
+ * 提供登录逻辑但不包含任何 UI 样式,
15
+ * 使用 render props 模式让用户完全控制 UI
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * <LoginForm apiClient={apiClient}>
20
+ * {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (
21
+ * <form onSubmit={handleSubmit}>
22
+ * <input
23
+ * value={email}
24
+ * onChange={(e) => handleEmailChange(e.target.value)}
25
+ * />
26
+ * <input
27
+ * type="password"
28
+ * value={password}
29
+ * onChange={(e) => handlePasswordChange(e.target.value)}
30
+ * />
31
+ * {error && <div>{error}</div>}
32
+ * <button disabled={loading}>
33
+ * {loading ? '登录中...' : '登录'}
34
+ * </button>
35
+ * </form>
36
+ * )}
37
+ * </LoginForm>
38
+ * ```
39
+ */
40
+ declare function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps): React__default.JSX.Element;
41
+
42
+ /**
43
+ * Auth Components - RegisterForm (Headless)
44
+ * 无样式的注册表单组件
45
+ */
46
+
47
+ /**
48
+ * Headless 注册表单组件
49
+ *
50
+ * 提供注册逻辑但不包含任何 UI 样式,
51
+ * 使用 render props 模式让用户完全控制 UI
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * <RegisterForm apiClient={apiClient}>
56
+ * {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (
57
+ * <form onSubmit={handleSubmit}>
58
+ * <input
59
+ * value={email}
60
+ * onChange={(e) => handleEmailChange(e.target.value)}
61
+ * />
62
+ * <input
63
+ * value={username}
64
+ * onChange={(e) => handleUsernameChange(e.target.value)}
65
+ * />
66
+ * <input
67
+ * type="password"
68
+ * value={password}
69
+ * onChange={(e) => handlePasswordChange(e.target.value)}
70
+ * />
71
+ * {error && <div>{error}</div>}
72
+ * <button disabled={loading}>
73
+ * {loading ? '注册中...' : '注册'}
74
+ * </button>
75
+ * </form>
76
+ * )}
77
+ * </RegisterForm>
78
+ * ```
79
+ */
80
+ declare function RegisterForm({ apiClient, onSuccess, onError, children, }: HeadlessRegisterFormProps): React__default.JSX.Element;
81
+
82
+ export { HeadlessLoginFormProps, HeadlessRegisterFormProps, LoginForm, RegisterForm };
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ var chunkROEYW4A7_js = require('../../chunk-ROEYW4A7.js');
4
+ require('../../chunk-DGUM43GV.js');
5
+ var React = require('react');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var React__default = /*#__PURE__*/_interopDefault(React);
10
+
11
+ function LoginForm({ apiClient, onSuccess, onError, children }) {
12
+ const { login, loading, error: authError, clearError } = chunkROEYW4A7_js.useAuth(apiClient);
13
+ const [email, setEmail] = React.useState("");
14
+ const [password, setPassword] = React.useState("");
15
+ const handleSubmit = async (e) => {
16
+ if (e) {
17
+ e.preventDefault();
18
+ }
19
+ clearError();
20
+ const result = await login(email, password);
21
+ if (result.success) {
22
+ const currentUser = apiClient.getUser();
23
+ if (currentUser) {
24
+ onSuccess?.(currentUser);
25
+ }
26
+ } else {
27
+ onError?.(result.error || "\u767B\u5F55\u5931\u8D25");
28
+ }
29
+ };
30
+ const state = {
31
+ email,
32
+ password,
33
+ loading,
34
+ error: authError,
35
+ handleEmailChange: setEmail,
36
+ handlePasswordChange: setPassword,
37
+ handleSubmit
38
+ };
39
+ return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, children(state));
40
+ }
41
+ function RegisterForm({
42
+ apiClient,
43
+ onSuccess,
44
+ onError,
45
+ children
46
+ }) {
47
+ const { register, loading, error: authError, clearError } = chunkROEYW4A7_js.useAuth(apiClient);
48
+ const [email, setEmail] = React.useState("");
49
+ const [password, setPassword] = React.useState("");
50
+ const [username, setUsername] = React.useState("");
51
+ const handleSubmit = async (e) => {
52
+ if (e) {
53
+ e.preventDefault();
54
+ }
55
+ clearError();
56
+ if (!email || !password || !username) {
57
+ const errorMsg = "\u8BF7\u586B\u5199\u6240\u6709\u5B57\u6BB5";
58
+ onError?.(errorMsg);
59
+ return;
60
+ }
61
+ if (password.length < 6) {
62
+ const errorMsg = "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D";
63
+ onError?.(errorMsg);
64
+ return;
65
+ }
66
+ const result = await register(email, password, username);
67
+ if (result.success) {
68
+ const currentUser = apiClient.getUser();
69
+ if (currentUser) {
70
+ onSuccess?.(currentUser);
71
+ }
72
+ } else {
73
+ onError?.(result.error || "\u6CE8\u518C\u5931\u8D25");
74
+ }
75
+ };
76
+ const state = {
77
+ email,
78
+ password,
79
+ username,
80
+ loading,
81
+ error: authError,
82
+ handleEmailChange: setEmail,
83
+ handlePasswordChange: setPassword,
84
+ handleUsernameChange: setUsername,
85
+ handleSubmit
86
+ };
87
+ return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, children(state));
88
+ }
89
+
90
+ exports.LoginForm = LoginForm;
91
+ exports.RegisterForm = RegisterForm;
92
+ //# sourceMappingURL=index.js.map
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/components/LoginForm.tsx","../../../src/auth/components/RegisterForm.tsx"],"names":["useAuth","useState","React"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 * Auth Components - RegisterForm (Headless)\n * 无样式的注册表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessRegisterFormProps, RegisterFormState } from './types';\n\n/**\n * Headless 注册表单组件\n *\n * 提供注册逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <RegisterForm apiClient={apiClient}>\n * {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * value={username}\n * onChange={(e) => handleUsernameChange(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 * </RegisterForm>\n * ```\n */\nexport function RegisterForm({\n apiClient,\n onSuccess,\n onError,\n children,\n}: HeadlessRegisterFormProps) {\n const { register, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [username, setUsername] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n // 基础验证\n if (!email || !password || !username) {\n const errorMsg = '请填写所有字段';\n onError?.(errorMsg);\n return;\n }\n\n if (password.length < 6) {\n const errorMsg = '密码长度至少为 6 位';\n onError?.(errorMsg);\n return;\n }\n\n const result = await register(email, password, username);\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: RegisterFormState = {\n email,\n password,\n username,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleUsernameChange: setUsername,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n"]}
@@ -0,0 +1,86 @@
1
+ import { useAuth } from '../../chunk-KGRQNEIR.mjs';
2
+ import '../../chunk-BJTO5JO5.mjs';
3
+ import React, { useState } from 'react';
4
+
5
+ function LoginForm({ apiClient, onSuccess, onError, children }) {
6
+ const { login, loading, error: authError, clearError } = useAuth(apiClient);
7
+ const [email, setEmail] = useState("");
8
+ const [password, setPassword] = useState("");
9
+ const handleSubmit = async (e) => {
10
+ if (e) {
11
+ e.preventDefault();
12
+ }
13
+ clearError();
14
+ const result = await login(email, password);
15
+ if (result.success) {
16
+ const currentUser = apiClient.getUser();
17
+ if (currentUser) {
18
+ onSuccess?.(currentUser);
19
+ }
20
+ } else {
21
+ onError?.(result.error || "\u767B\u5F55\u5931\u8D25");
22
+ }
23
+ };
24
+ const state = {
25
+ email,
26
+ password,
27
+ loading,
28
+ error: authError,
29
+ handleEmailChange: setEmail,
30
+ handlePasswordChange: setPassword,
31
+ handleSubmit
32
+ };
33
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children(state));
34
+ }
35
+ function RegisterForm({
36
+ apiClient,
37
+ onSuccess,
38
+ onError,
39
+ children
40
+ }) {
41
+ const { register, loading, error: authError, clearError } = useAuth(apiClient);
42
+ const [email, setEmail] = useState("");
43
+ const [password, setPassword] = useState("");
44
+ const [username, setUsername] = useState("");
45
+ const handleSubmit = async (e) => {
46
+ if (e) {
47
+ e.preventDefault();
48
+ }
49
+ clearError();
50
+ if (!email || !password || !username) {
51
+ const errorMsg = "\u8BF7\u586B\u5199\u6240\u6709\u5B57\u6BB5";
52
+ onError?.(errorMsg);
53
+ return;
54
+ }
55
+ if (password.length < 6) {
56
+ const errorMsg = "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D";
57
+ onError?.(errorMsg);
58
+ return;
59
+ }
60
+ const result = await register(email, password, username);
61
+ if (result.success) {
62
+ const currentUser = apiClient.getUser();
63
+ if (currentUser) {
64
+ onSuccess?.(currentUser);
65
+ }
66
+ } else {
67
+ onError?.(result.error || "\u6CE8\u518C\u5931\u8D25");
68
+ }
69
+ };
70
+ const state = {
71
+ email,
72
+ password,
73
+ username,
74
+ loading,
75
+ error: authError,
76
+ handleEmailChange: setEmail,
77
+ handlePasswordChange: setPassword,
78
+ handleUsernameChange: setUsername,
79
+ handleSubmit
80
+ };
81
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children(state));
82
+ }
83
+
84
+ export { LoginForm, RegisterForm };
85
+ //# sourceMappingURL=index.mjs.map
86
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/components/LoginForm.tsx","../../../src/auth/components/RegisterForm.tsx"],"names":["useState","React"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 * Auth Components - RegisterForm (Headless)\n * 无样式的注册表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessRegisterFormProps, RegisterFormState } from './types';\n\n/**\n * Headless 注册表单组件\n *\n * 提供注册逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <RegisterForm apiClient={apiClient}>\n * {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * value={username}\n * onChange={(e) => handleUsernameChange(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 * </RegisterForm>\n * ```\n */\nexport function RegisterForm({\n apiClient,\n onSuccess,\n onError,\n children,\n}: HeadlessRegisterFormProps) {\n const { register, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [username, setUsername] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n // 基础验证\n if (!email || !password || !username) {\n const errorMsg = '请填写所有字段';\n onError?.(errorMsg);\n return;\n }\n\n if (password.length < 6) {\n const errorMsg = '密码长度至少为 6 位';\n onError?.(errorMsg);\n return;\n }\n\n const result = await register(email, password, username);\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: RegisterFormState = {\n email,\n password,\n username,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleUsernameChange: setUsername,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n"]}
@@ -0,0 +1,2 @@
1
+ export { A as AuthResult, B as BaseApiClient, U as UseAuthReturn, b as User, u as useAuth, a as useAuthForm } from '../../index-8VoHap_4.mjs';
2
+ import 'react';
@@ -0,0 +1,2 @@
1
+ export { A as AuthResult, B as BaseApiClient, U as UseAuthReturn, b as User, u as useAuth, a as useAuthForm } from '../../index-8VoHap_4.js';
2
+ import 'react';
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var chunkROEYW4A7_js = require('../../chunk-ROEYW4A7.js');
4
+ require('../../chunk-DGUM43GV.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "useAuth", {
9
+ enumerable: true,
10
+ get: function () { return chunkROEYW4A7_js.useAuth; }
11
+ });
12
+ Object.defineProperty(exports, "useAuthForm", {
13
+ enumerable: true,
14
+ get: function () { return chunkROEYW4A7_js.useAuthForm; }
15
+ });
16
+ //# sourceMappingURL=index.js.map
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { useAuth, useAuthForm } from '../../chunk-KGRQNEIR.mjs';
2
+ import '../../chunk-BJTO5JO5.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}