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,64 @@
1
+ /**
2
+ * Config 模块类型定义
3
+ */
4
+ interface ConfigItem {
5
+ key: string;
6
+ value: any;
7
+ type: string;
8
+ isRequired: boolean;
9
+ isSensitive: boolean;
10
+ description?: string;
11
+ defaultValue?: any;
12
+ readonly?: boolean;
13
+ }
14
+ interface AllConfigs {
15
+ [category: string]: {
16
+ [key: string]: ConfigItem;
17
+ };
18
+ }
19
+ interface UseConfigsOptions {
20
+ /**
21
+ * API 基础 URL
22
+ */
23
+ apiBaseUrl?: string;
24
+ /**
25
+ * 获取认证 token 的函数
26
+ */
27
+ getAuthToken: () => string | null | Promise<string | null>;
28
+ /**
29
+ * 未认证时的回调(可选)
30
+ */
31
+ onUnauthorized?: () => void;
32
+ /**
33
+ * 缓存去重时间(毫秒)
34
+ */
35
+ dedupingInterval?: number;
36
+ /**
37
+ * 是否在窗口聚焦时重新验证
38
+ */
39
+ revalidateOnFocus?: boolean;
40
+ }
41
+
42
+ /**
43
+ * 创建 useConfigs Hook
44
+ */
45
+ declare function createUseConfigs(options: UseConfigsOptions): () => {
46
+ configs: AllConfigs | undefined;
47
+ isLoading: boolean;
48
+ isError: boolean;
49
+ error: any;
50
+ updateConfigs: (category: string, updates: Record<string, any>) => Promise<{
51
+ success: boolean;
52
+ }>;
53
+ refresh: () => void;
54
+ };
55
+ /**
56
+ * 预加载配置
57
+ */
58
+ declare function prefetchConfigs(apiBaseUrl?: string): void;
59
+ /**
60
+ * 全局缓存失效
61
+ */
62
+ declare function invalidateAllConfigs(apiBaseUrl?: string): void;
63
+
64
+ export { type AllConfigs, type ConfigItem, type UseConfigsOptions, createUseConfigs, invalidateAllConfigs, prefetchConfigs };
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Config 模块类型定义
3
+ */
4
+ interface ConfigItem {
5
+ key: string;
6
+ value: any;
7
+ type: string;
8
+ isRequired: boolean;
9
+ isSensitive: boolean;
10
+ description?: string;
11
+ defaultValue?: any;
12
+ readonly?: boolean;
13
+ }
14
+ interface AllConfigs {
15
+ [category: string]: {
16
+ [key: string]: ConfigItem;
17
+ };
18
+ }
19
+ interface UseConfigsOptions {
20
+ /**
21
+ * API 基础 URL
22
+ */
23
+ apiBaseUrl?: string;
24
+ /**
25
+ * 获取认证 token 的函数
26
+ */
27
+ getAuthToken: () => string | null | Promise<string | null>;
28
+ /**
29
+ * 未认证时的回调(可选)
30
+ */
31
+ onUnauthorized?: () => void;
32
+ /**
33
+ * 缓存去重时间(毫秒)
34
+ */
35
+ dedupingInterval?: number;
36
+ /**
37
+ * 是否在窗口聚焦时重新验证
38
+ */
39
+ revalidateOnFocus?: boolean;
40
+ }
41
+
42
+ /**
43
+ * 创建 useConfigs Hook
44
+ */
45
+ declare function createUseConfigs(options: UseConfigsOptions): () => {
46
+ configs: AllConfigs | undefined;
47
+ isLoading: boolean;
48
+ isError: boolean;
49
+ error: any;
50
+ updateConfigs: (category: string, updates: Record<string, any>) => Promise<{
51
+ success: boolean;
52
+ }>;
53
+ refresh: () => void;
54
+ };
55
+ /**
56
+ * 预加载配置
57
+ */
58
+ declare function prefetchConfigs(apiBaseUrl?: string): void;
59
+ /**
60
+ * 全局缓存失效
61
+ */
62
+ declare function invalidateAllConfigs(apiBaseUrl?: string): void;
63
+
64
+ export { type AllConfigs, type ConfigItem, type UseConfigsOptions, createUseConfigs, invalidateAllConfigs, prefetchConfigs };
@@ -0,0 +1,136 @@
1
+ 'use strict';
2
+
3
+ require('../chunk-DGUM43GV.js');
4
+ var useSWR = require('swr');
5
+ var react = require('react');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var useSWR__default = /*#__PURE__*/_interopDefault(useSWR);
10
+
11
+ function createUseConfigs(options) {
12
+ const {
13
+ apiBaseUrl = "",
14
+ getAuthToken,
15
+ onUnauthorized,
16
+ dedupingInterval = 6e4,
17
+ revalidateOnFocus = false
18
+ } = options;
19
+ const fetcher = async (url) => {
20
+ const token = await getAuthToken();
21
+ const res = await fetch(`${apiBaseUrl}${url}`, {
22
+ headers: {
23
+ Authorization: `Bearer ${token}`,
24
+ "Content-Type": "application/json"
25
+ },
26
+ credentials: "include"
27
+ });
28
+ if (!res.ok) {
29
+ if (res.status === 401) {
30
+ onUnauthorized?.();
31
+ throw new Error("Unauthorized");
32
+ }
33
+ throw new Error("Failed to fetch configs");
34
+ }
35
+ const data = await res.json();
36
+ return data.data;
37
+ };
38
+ return function useConfigs() {
39
+ const {
40
+ data,
41
+ error,
42
+ mutate: mutateConfigs
43
+ } = useSWR__default.default("/api/admin/config", fetcher, {
44
+ // 配置选项
45
+ revalidateOnFocus,
46
+ revalidateOnReconnect: true,
47
+ // 网络重连时重新验证
48
+ dedupingInterval,
49
+ // 缓存去重时间
50
+ errorRetryCount: 3,
51
+ // 错误重试3次
52
+ errorRetryInterval: 5e3,
53
+ // 重试间隔5秒
54
+ shouldRetryOnError: true,
55
+ // 启用错误重试
56
+ // 成功时的回调
57
+ onSuccess: (_data) => {
58
+ console.log("\u2705 Configs loaded from cache or network");
59
+ },
60
+ // 错误时的回调
61
+ onError: (err) => {
62
+ console.error("\u274C Failed to load configs:", err);
63
+ }
64
+ });
65
+ const updateConfigs = react.useCallback(
66
+ async (category, updates) => {
67
+ const token = await getAuthToken();
68
+ mutateConfigs(
69
+ (current) => {
70
+ if (!current) return current;
71
+ return {
72
+ ...current,
73
+ [category]: {
74
+ ...current[category],
75
+ ...Object.entries(updates).reduce((acc, [key, value]) => {
76
+ acc[key] = {
77
+ ...current[category]?.[key],
78
+ value
79
+ };
80
+ return acc;
81
+ }, {})
82
+ }
83
+ };
84
+ },
85
+ false
86
+ // 不立即重新验证
87
+ );
88
+ try {
89
+ const res = await fetch(`${apiBaseUrl}/api/admin/config/${category}`, {
90
+ method: "POST",
91
+ headers: {
92
+ Authorization: `Bearer ${token}`,
93
+ "Content-Type": "application/json"
94
+ },
95
+ credentials: "include",
96
+ body: JSON.stringify({ configs: updates })
97
+ });
98
+ if (!res.ok) throw new Error("Update failed");
99
+ mutateConfigs();
100
+ return { success: true };
101
+ } catch (error2) {
102
+ mutateConfigs();
103
+ throw error2;
104
+ }
105
+ },
106
+ [mutateConfigs, getAuthToken, apiBaseUrl]
107
+ );
108
+ const refresh = react.useCallback(() => {
109
+ mutateConfigs();
110
+ }, [mutateConfigs]);
111
+ return {
112
+ configs: data,
113
+ isLoading: !error && !data,
114
+ isError: !!error,
115
+ error,
116
+ updateConfigs,
117
+ refresh
118
+ };
119
+ };
120
+ }
121
+ function prefetchConfigs(apiBaseUrl = "") {
122
+ useSWR.mutate(`${apiBaseUrl}/api/admin/config`);
123
+ }
124
+ function invalidateAllConfigs(apiBaseUrl = "") {
125
+ useSWR.mutate(
126
+ (key) => typeof key === "string" && key.startsWith(`${apiBaseUrl}/api/admin/config`),
127
+ void 0,
128
+ { revalidate: true }
129
+ );
130
+ }
131
+
132
+ exports.createUseConfigs = createUseConfigs;
133
+ exports.invalidateAllConfigs = invalidateAllConfigs;
134
+ exports.prefetchConfigs = prefetchConfigs;
135
+ //# sourceMappingURL=index.js.map
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/hooks/useConfigs.ts"],"names":["useSWR","useCallback","error","mutate"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\n/**\n * 配置缓存优化 Hook\n *\n * 使用 SWR 实现智能缓存和自动重新验证\n * 支持多平台:Web、React Native、小程序\n *\n * 优点:\n * 1. 自动缓存,减少网络请求\n * 2. 自动重新验证(可配置)\n * 3. 乐观更新\n * 4. 错误重试\n * 5. 防抖和去重\n */\n\nimport { default as useSWR, mutate } from 'swr';\nimport { useCallback } from 'react';\nimport type { AllConfigs, UseConfigsOptions, ConfigItem } from '../types';\n\nexport type { AllConfigs, UseConfigsOptions, ConfigItem };\n\n/**\n * 创建 useConfigs Hook\n */\nexport function createUseConfigs(options: UseConfigsOptions) {\n const {\n apiBaseUrl = '',\n getAuthToken,\n onUnauthorized,\n dedupingInterval = 60000,\n revalidateOnFocus = false,\n } = options;\n\n // Fetcher 函数\n const fetcher = async (url: string) => {\n const token = await getAuthToken();\n\n const res = await fetch(`${apiBaseUrl}${url}`, {\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!res.ok) {\n if (res.status === 401) {\n onUnauthorized?.();\n throw new Error('Unauthorized');\n }\n throw new Error('Failed to fetch configs');\n }\n\n const data = await res.json();\n return data.data as AllConfigs;\n };\n\n // 返回 Hook 函数\n return function useConfigs() {\n const {\n data,\n error,\n mutate: mutateConfigs,\n } = useSWR<AllConfigs>('/api/admin/config', fetcher, {\n // 配置选项\n revalidateOnFocus,\n revalidateOnReconnect: true, // 网络重连时重新验证\n dedupingInterval, // 缓存去重时间\n errorRetryCount: 3, // 错误重试3次\n errorRetryInterval: 5000, // 重试间隔5秒\n shouldRetryOnError: true, // 启用错误重试\n\n // 成功时的回调\n onSuccess: (_data: AllConfigs) => {\n console.log('✅ Configs loaded from cache or network');\n },\n\n // 错误时的回调\n onError: (err: Error) => {\n console.error('❌ Failed to load configs:', err);\n },\n });\n\n // 更新配置(乐观更新)\n const updateConfigs = useCallback(\n async (category: string, updates: Record<string, any>) => {\n const token = await getAuthToken();\n\n // 乐观更新:立即更新本地缓存\n mutateConfigs(\n (current: AllConfigs | undefined) => {\n if (!current) return current;\n return {\n ...current,\n [category]: {\n ...current[category],\n ...Object.entries(updates).reduce((acc, [key, value]) => {\n acc[key] = {\n ...current[category]?.[key],\n value,\n };\n return acc;\n }, {} as any),\n },\n };\n },\n false // 不立即重新验证\n );\n\n try {\n // 发送到服务器\n const res = await fetch(`${apiBaseUrl}/api/admin/config/${category}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({ configs: updates }),\n });\n\n if (!res.ok) throw new Error('Update failed');\n\n // 更新成功,重新验证缓存\n mutateConfigs();\n\n return { success: true };\n } catch (error) {\n // 更新失败,回滚\n mutateConfigs(); // 从服务器重新获取\n throw error;\n }\n },\n [mutateConfigs, getAuthToken, apiBaseUrl]\n );\n\n // 手动刷新\n const refresh = useCallback(() => {\n mutateConfigs();\n }, [mutateConfigs]);\n\n return {\n configs: data,\n isLoading: !error && !data,\n isError: !!error,\n error,\n updateConfigs,\n refresh,\n };\n };\n}\n\n/**\n * 预加载配置\n */\nexport function prefetchConfigs(apiBaseUrl: string = '') {\n mutate(`${apiBaseUrl}/api/admin/config`);\n}\n\n/**\n * 全局缓存失效\n */\nexport function invalidateAllConfigs(apiBaseUrl: string = '') {\n mutate(\n (key: any) => typeof key === 'string' && key.startsWith(`${apiBaseUrl}/api/admin/config`),\n undefined,\n { revalidate: true }\n );\n}\n\n"]}
@@ -0,0 +1,128 @@
1
+ import '../chunk-BJTO5JO5.mjs';
2
+ import useSWR, { mutate } from 'swr';
3
+ import { useCallback } from 'react';
4
+
5
+ function createUseConfigs(options) {
6
+ const {
7
+ apiBaseUrl = "",
8
+ getAuthToken,
9
+ onUnauthorized,
10
+ dedupingInterval = 6e4,
11
+ revalidateOnFocus = false
12
+ } = options;
13
+ const fetcher = async (url) => {
14
+ const token = await getAuthToken();
15
+ const res = await fetch(`${apiBaseUrl}${url}`, {
16
+ headers: {
17
+ Authorization: `Bearer ${token}`,
18
+ "Content-Type": "application/json"
19
+ },
20
+ credentials: "include"
21
+ });
22
+ if (!res.ok) {
23
+ if (res.status === 401) {
24
+ onUnauthorized?.();
25
+ throw new Error("Unauthorized");
26
+ }
27
+ throw new Error("Failed to fetch configs");
28
+ }
29
+ const data = await res.json();
30
+ return data.data;
31
+ };
32
+ return function useConfigs() {
33
+ const {
34
+ data,
35
+ error,
36
+ mutate: mutateConfigs
37
+ } = useSWR("/api/admin/config", fetcher, {
38
+ // 配置选项
39
+ revalidateOnFocus,
40
+ revalidateOnReconnect: true,
41
+ // 网络重连时重新验证
42
+ dedupingInterval,
43
+ // 缓存去重时间
44
+ errorRetryCount: 3,
45
+ // 错误重试3次
46
+ errorRetryInterval: 5e3,
47
+ // 重试间隔5秒
48
+ shouldRetryOnError: true,
49
+ // 启用错误重试
50
+ // 成功时的回调
51
+ onSuccess: (_data) => {
52
+ console.log("\u2705 Configs loaded from cache or network");
53
+ },
54
+ // 错误时的回调
55
+ onError: (err) => {
56
+ console.error("\u274C Failed to load configs:", err);
57
+ }
58
+ });
59
+ const updateConfigs = useCallback(
60
+ async (category, updates) => {
61
+ const token = await getAuthToken();
62
+ mutateConfigs(
63
+ (current) => {
64
+ if (!current) return current;
65
+ return {
66
+ ...current,
67
+ [category]: {
68
+ ...current[category],
69
+ ...Object.entries(updates).reduce((acc, [key, value]) => {
70
+ acc[key] = {
71
+ ...current[category]?.[key],
72
+ value
73
+ };
74
+ return acc;
75
+ }, {})
76
+ }
77
+ };
78
+ },
79
+ false
80
+ // 不立即重新验证
81
+ );
82
+ try {
83
+ const res = await fetch(`${apiBaseUrl}/api/admin/config/${category}`, {
84
+ method: "POST",
85
+ headers: {
86
+ Authorization: `Bearer ${token}`,
87
+ "Content-Type": "application/json"
88
+ },
89
+ credentials: "include",
90
+ body: JSON.stringify({ configs: updates })
91
+ });
92
+ if (!res.ok) throw new Error("Update failed");
93
+ mutateConfigs();
94
+ return { success: true };
95
+ } catch (error2) {
96
+ mutateConfigs();
97
+ throw error2;
98
+ }
99
+ },
100
+ [mutateConfigs, getAuthToken, apiBaseUrl]
101
+ );
102
+ const refresh = useCallback(() => {
103
+ mutateConfigs();
104
+ }, [mutateConfigs]);
105
+ return {
106
+ configs: data,
107
+ isLoading: !error && !data,
108
+ isError: !!error,
109
+ error,
110
+ updateConfigs,
111
+ refresh
112
+ };
113
+ };
114
+ }
115
+ function prefetchConfigs(apiBaseUrl = "") {
116
+ mutate(`${apiBaseUrl}/api/admin/config`);
117
+ }
118
+ function invalidateAllConfigs(apiBaseUrl = "") {
119
+ mutate(
120
+ (key) => typeof key === "string" && key.startsWith(`${apiBaseUrl}/api/admin/config`),
121
+ void 0,
122
+ { revalidate: true }
123
+ );
124
+ }
125
+
126
+ export { createUseConfigs, invalidateAllConfigs, prefetchConfigs };
127
+ //# sourceMappingURL=index.mjs.map
128
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/hooks/useConfigs.ts"],"names":["error"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\n/**\n * 配置缓存优化 Hook\n *\n * 使用 SWR 实现智能缓存和自动重新验证\n * 支持多平台:Web、React Native、小程序\n *\n * 优点:\n * 1. 自动缓存,减少网络请求\n * 2. 自动重新验证(可配置)\n * 3. 乐观更新\n * 4. 错误重试\n * 5. 防抖和去重\n */\n\nimport { default as useSWR, mutate } from 'swr';\nimport { useCallback } from 'react';\nimport type { AllConfigs, UseConfigsOptions, ConfigItem } from '../types';\n\nexport type { AllConfigs, UseConfigsOptions, ConfigItem };\n\n/**\n * 创建 useConfigs Hook\n */\nexport function createUseConfigs(options: UseConfigsOptions) {\n const {\n apiBaseUrl = '',\n getAuthToken,\n onUnauthorized,\n dedupingInterval = 60000,\n revalidateOnFocus = false,\n } = options;\n\n // Fetcher 函数\n const fetcher = async (url: string) => {\n const token = await getAuthToken();\n\n const res = await fetch(`${apiBaseUrl}${url}`, {\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!res.ok) {\n if (res.status === 401) {\n onUnauthorized?.();\n throw new Error('Unauthorized');\n }\n throw new Error('Failed to fetch configs');\n }\n\n const data = await res.json();\n return data.data as AllConfigs;\n };\n\n // 返回 Hook 函数\n return function useConfigs() {\n const {\n data,\n error,\n mutate: mutateConfigs,\n } = useSWR<AllConfigs>('/api/admin/config', fetcher, {\n // 配置选项\n revalidateOnFocus,\n revalidateOnReconnect: true, // 网络重连时重新验证\n dedupingInterval, // 缓存去重时间\n errorRetryCount: 3, // 错误重试3次\n errorRetryInterval: 5000, // 重试间隔5秒\n shouldRetryOnError: true, // 启用错误重试\n\n // 成功时的回调\n onSuccess: (_data: AllConfigs) => {\n console.log('✅ Configs loaded from cache or network');\n },\n\n // 错误时的回调\n onError: (err: Error) => {\n console.error('❌ Failed to load configs:', err);\n },\n });\n\n // 更新配置(乐观更新)\n const updateConfigs = useCallback(\n async (category: string, updates: Record<string, any>) => {\n const token = await getAuthToken();\n\n // 乐观更新:立即更新本地缓存\n mutateConfigs(\n (current: AllConfigs | undefined) => {\n if (!current) return current;\n return {\n ...current,\n [category]: {\n ...current[category],\n ...Object.entries(updates).reduce((acc, [key, value]) => {\n acc[key] = {\n ...current[category]?.[key],\n value,\n };\n return acc;\n }, {} as any),\n },\n };\n },\n false // 不立即重新验证\n );\n\n try {\n // 发送到服务器\n const res = await fetch(`${apiBaseUrl}/api/admin/config/${category}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({ configs: updates }),\n });\n\n if (!res.ok) throw new Error('Update failed');\n\n // 更新成功,重新验证缓存\n mutateConfigs();\n\n return { success: true };\n } catch (error) {\n // 更新失败,回滚\n mutateConfigs(); // 从服务器重新获取\n throw error;\n }\n },\n [mutateConfigs, getAuthToken, apiBaseUrl]\n );\n\n // 手动刷新\n const refresh = useCallback(() => {\n mutateConfigs();\n }, [mutateConfigs]);\n\n return {\n configs: data,\n isLoading: !error && !data,\n isError: !!error,\n error,\n updateConfigs,\n refresh,\n };\n };\n}\n\n/**\n * 预加载配置\n */\nexport function prefetchConfigs(apiBaseUrl: string = '') {\n mutate(`${apiBaseUrl}/api/admin/config`);\n}\n\n/**\n * 全局缓存失效\n */\nexport function invalidateAllConfigs(apiBaseUrl: string = '') {\n mutate(\n (key: any) => typeof key === 'string' && key.startsWith(`${apiBaseUrl}/api/admin/config`),\n undefined,\n { revalidate: true }\n );\n}\n\n"]}
@@ -0,0 +1,145 @@
1
+ import { U as UserRole } from './enums-Dume-V5Y.js';
2
+
3
+ /**
4
+ * Auth Services - Types
5
+ * 认证服务类型定义
6
+ */
7
+
8
+ /**
9
+ * 认证服务配置
10
+ */
11
+ interface AuthServiceConfig {
12
+ /**
13
+ * Drizzle 数据库实例
14
+ */
15
+ db: any;
16
+ /**
17
+ * JWT 密钥
18
+ */
19
+ jwtSecret: string;
20
+ /**
21
+ * JWT 过期时间 (默认: '7d')
22
+ */
23
+ jwtExpiresIn?: string;
24
+ /**
25
+ * bcrypt 加密轮数 (默认: 12)
26
+ */
27
+ saltRounds?: number;
28
+ /**
29
+ * 是否在生产环境检查密钥强度 (默认: true)
30
+ */
31
+ checkSecretStrength?: boolean;
32
+ }
33
+ /**
34
+ * 用户信息(返回给客户端的精简版)
35
+ */
36
+ interface UserInfo {
37
+ id: string;
38
+ email: string;
39
+ username: string;
40
+ role: UserRole;
41
+ }
42
+ /**
43
+ * 认证结果
44
+ */
45
+ interface AuthResult {
46
+ user: UserInfo;
47
+ token: string;
48
+ }
49
+ /**
50
+ * 会话信息
51
+ */
52
+ interface SessionInfo {
53
+ id: string;
54
+ userId: string;
55
+ token: string;
56
+ expiresAt: string;
57
+ ipAddress?: string | null;
58
+ userAgent?: string | null;
59
+ }
60
+ /**
61
+ * 验证结果
62
+ */
63
+ interface VerifyResult {
64
+ user: UserInfo;
65
+ session: SessionInfo;
66
+ }
67
+
68
+ /**
69
+ * Auth Services - Drizzle Auth Service
70
+ * 基于 Drizzle ORM 的认证服务
71
+ */
72
+
73
+ /**
74
+ * Drizzle 认证服务类
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * import { DrizzleAuthService } from '@qhr123/sa2kit/auth/services';
79
+ * import { db } from './db';
80
+ *
81
+ * const authService = new DrizzleAuthService({
82
+ * db,
83
+ * jwtSecret: process.env.JWT_SECRET!,
84
+ * jwtExpiresIn: '7d',
85
+ * });
86
+ *
87
+ * // 用户注册
88
+ * const result = await authService.signUp('user@example.com', 'password123', 'username');
89
+ *
90
+ * // 用户登录
91
+ * const loginResult = await authService.signIn('user@example.com', 'password123');
92
+ * ```
93
+ */
94
+ declare class DrizzleAuthService {
95
+ private config;
96
+ constructor(config: AuthServiceConfig);
97
+ /**
98
+ * 验证配置
99
+ */
100
+ private validateConfig;
101
+ /**
102
+ * 用户注册
103
+ */
104
+ signUp(email: string, password: string, username?: string, role?: UserRole): Promise<AuthResult>;
105
+ /**
106
+ * 用户登录
107
+ */
108
+ signIn(email: string, password: string): Promise<AuthResult>;
109
+ /**
110
+ * 验证 Token
111
+ */
112
+ verifyToken(token: string): Promise<VerifyResult>;
113
+ /**
114
+ * 创建会话
115
+ */
116
+ createSession(userId: string, token: string, ipAddress?: string, userAgent?: string): Promise<void>;
117
+ /**
118
+ * 删除会话(登出)
119
+ */
120
+ signOut(token: string): Promise<{
121
+ success: boolean;
122
+ }>;
123
+ /**
124
+ * 获取会话
125
+ */
126
+ getSession(token: string): Promise<VerifyResult | null>;
127
+ /**
128
+ * 检查管理员权限
129
+ */
130
+ requireAdmin(token: string): Promise<VerifyResult>;
131
+ /**
132
+ * 检查超级管理员权限
133
+ */
134
+ requireSuperAdmin(token: string): Promise<VerifyResult>;
135
+ /**
136
+ * 通过用户 ID 获取用户信息
137
+ */
138
+ getUserById(userId: string): Promise<UserInfo | null>;
139
+ /**
140
+ * 通过邮箱获取用户信息
141
+ */
142
+ getUserByEmail(email: string): Promise<UserInfo | null>;
143
+ }
144
+
145
+ export { type AuthResult as A, DrizzleAuthService as D, type SessionInfo as S, type UserInfo as U, type VerifyResult as V, type AuthServiceConfig as a };