@choiceform/shared-auth 0.1.13 → 0.1.15

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 (92) hide show
  1. package/README.md +106 -450
  2. package/dist/api/auth-api.d.ts +28 -0
  3. package/dist/api/auth-api.d.ts.map +1 -0
  4. package/dist/api/auth-api.js +133 -0
  5. package/dist/api/client.d.ts +34 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +104 -0
  8. package/dist/api/index.d.ts +12 -0
  9. package/dist/api/index.d.ts.map +1 -0
  10. package/dist/api/index.js +7 -0
  11. package/dist/api/organization-api.d.ts +96 -0
  12. package/dist/api/organization-api.d.ts.map +1 -0
  13. package/dist/api/organization-api.js +228 -0
  14. package/dist/api/team-api.d.ts +57 -0
  15. package/dist/api/team-api.d.ts.map +1 -0
  16. package/dist/api/team-api.js +118 -0
  17. package/dist/config.d.ts +4 -50
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +5 -6
  20. package/dist/core.d.ts +307 -1717
  21. package/dist/core.d.ts.map +1 -1
  22. package/dist/core.js +35 -17
  23. package/dist/index.d.ts +11 -14
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +25 -12
  26. package/dist/init.d.ts +326 -1732
  27. package/dist/init.d.ts.map +1 -1
  28. package/dist/init.js +13 -14
  29. package/dist/lib/auth-client.d.ts +232 -1689
  30. package/dist/lib/auth-client.d.ts.map +1 -1
  31. package/dist/lib/auth-client.js +10 -16
  32. package/dist/services/companion-team.d.ts +16 -0
  33. package/dist/services/companion-team.d.ts.map +1 -0
  34. package/dist/services/companion-team.js +73 -0
  35. package/dist/services/index.d.ts +5 -0
  36. package/dist/services/index.d.ts.map +1 -0
  37. package/dist/services/index.js +4 -0
  38. package/dist/store/actions.d.ts +45 -30
  39. package/dist/store/actions.d.ts.map +1 -1
  40. package/dist/store/actions.js +139 -103
  41. package/dist/store/index.d.ts +8 -0
  42. package/dist/store/index.d.ts.map +1 -0
  43. package/dist/store/index.js +7 -0
  44. package/dist/store/state.d.ts +10 -7
  45. package/dist/store/state.d.ts.map +1 -1
  46. package/dist/store/state.js +31 -23
  47. package/dist/store/utils.d.ts +22 -71
  48. package/dist/store/utils.d.ts.map +1 -1
  49. package/dist/store/utils.js +28 -146
  50. package/dist/types/auth.d.ts +107 -0
  51. package/dist/types/auth.d.ts.map +1 -0
  52. package/dist/types/auth.js +4 -0
  53. package/dist/types/index.d.ts +8 -0
  54. package/dist/types/index.d.ts.map +1 -0
  55. package/dist/types/index.js +4 -0
  56. package/dist/types/organization.d.ts +111 -0
  57. package/dist/types/organization.d.ts.map +1 -0
  58. package/dist/types/organization.js +4 -0
  59. package/dist/types/team.d.ts +52 -0
  60. package/dist/types/team.d.ts.map +1 -0
  61. package/dist/types/team.js +4 -0
  62. package/dist/types/user.d.ts +44 -0
  63. package/dist/types/user.d.ts.map +1 -0
  64. package/dist/types/user.js +4 -0
  65. package/dist/utils/date.d.ts +10 -0
  66. package/dist/utils/date.d.ts.map +1 -0
  67. package/dist/utils/date.js +13 -0
  68. package/dist/utils/env.d.ts +20 -0
  69. package/dist/utils/env.d.ts.map +1 -0
  70. package/dist/utils/env.js +23 -0
  71. package/dist/utils/index.d.ts +7 -0
  72. package/dist/utils/index.d.ts.map +1 -0
  73. package/dist/utils/index.js +6 -0
  74. package/dist/utils/user-mapper.d.ts +21 -0
  75. package/dist/utils/user-mapper.d.ts.map +1 -0
  76. package/dist/utils/user-mapper.js +55 -0
  77. package/package.json +3 -4
  78. package/dist/components/auth-sync.d.ts +0 -25
  79. package/dist/components/auth-sync.d.ts.map +0 -1
  80. package/dist/components/auth-sync.js +0 -346
  81. package/dist/components/protected-route.d.ts +0 -18
  82. package/dist/components/protected-route.d.ts.map +0 -1
  83. package/dist/components/protected-route.js +0 -34
  84. package/dist/components/sign-in-page.d.ts +0 -21
  85. package/dist/components/sign-in-page.d.ts.map +0 -1
  86. package/dist/components/sign-in-page.js +0 -31
  87. package/dist/core/init-auth-sync.d.ts +0 -7
  88. package/dist/core/init-auth-sync.d.ts.map +0 -1
  89. package/dist/core/init-auth-sync.js +0 -34
  90. package/dist/types.d.ts +0 -87
  91. package/dist/types.d.ts.map +0 -1
  92. package/dist/types.js +0 -4
@@ -1,16 +1,19 @@
1
+ /**
2
+ * 认证状态 Store
3
+ */
1
4
  import type { AuthState } from "../types";
5
+ import type { TokenStorage } from "../api";
6
+ /**
7
+ * 创建 Token 存储工具
8
+ */
9
+ export declare function createTokenStorage(tokenStorageKey: string): TokenStorage;
2
10
  /**
3
- * 创建认证状态 store
11
+ * 创建认证状态 Store
4
12
  */
5
13
  export declare function createAuthStore(config: {
6
14
  tokenStorageKey: string;
7
15
  }): {
8
16
  authStore: import("@legendapp/state").Observable<AuthState>;
9
- tokenStorage: {
10
- save(token: string | null): void;
11
- get(): string | null;
12
- clear(): void;
13
- };
17
+ tokenStorage: TokenStorage;
14
18
  };
15
- export type TokenStorage = ReturnType<typeof createAuthStore>["tokenStorage"];
16
19
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/store/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE;;;oBAyBnD,MAAM,GAAG,IAAI;eAclB,MAAM,GAAG,IAAI;;;EAavB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,cAAc,CAAC,CAAA"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/store/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAE1C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,CA4BxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE;;;EA2BlE"}
@@ -1,53 +1,61 @@
1
+ /**
2
+ * 认证状态 Store
3
+ */
1
4
  import { observable } from "@legendapp/state";
2
5
  /**
3
- * 创建认证状态 store
6
+ * 创建 Token 存储工具
4
7
  */
5
- export function createAuthStore(config) {
6
- const { tokenStorageKey } = config;
7
- // 从 localStorage 读取初始 token
8
+ export function createTokenStorage(tokenStorageKey) {
8
9
  const getStoredToken = () => {
9
10
  try {
10
- const stored = localStorage.getItem(tokenStorageKey);
11
- if (!stored)
12
- return null;
13
- return stored;
11
+ return localStorage.getItem(tokenStorageKey);
14
12
  }
15
13
  catch {
16
14
  return null;
17
15
  }
18
16
  };
19
- const authStore = observable({
20
- user: null,
21
- isAuthenticated: false,
22
- isLoaded: false,
23
- loading: true,
24
- error: null,
25
- token: getStoredToken(),
26
- });
27
- // 手动管理 token 的 localStorage 存储
28
- const tokenStorage = {
17
+ return {
18
+ get: getStoredToken,
29
19
  save(token) {
30
20
  try {
31
21
  if (token) {
32
22
  localStorage.setItem(tokenStorageKey, token);
33
- authStore.token.set(token);
34
23
  }
35
24
  else {
36
25
  localStorage.removeItem(tokenStorageKey);
37
- authStore.token.set(null);
38
26
  }
39
27
  }
40
28
  catch (error) {
41
29
  console.error("Failed to save token to localStorage:", error);
42
30
  }
43
31
  },
44
- get() {
45
- return getStoredToken();
46
- },
47
32
  clear() {
48
33
  this.save(null);
49
34
  },
50
35
  };
36
+ }
37
+ /**
38
+ * 创建认证状态 Store
39
+ */
40
+ export function createAuthStore(config) {
41
+ const { tokenStorageKey } = config;
42
+ // 创建 token 存储工具
43
+ const tokenStorage = createTokenStorage(tokenStorageKey);
44
+ // 创建 observable store
45
+ const authStore = observable({
46
+ user: null,
47
+ isAuthenticated: false,
48
+ isLoaded: false,
49
+ loading: true,
50
+ error: null,
51
+ token: tokenStorage.get(),
52
+ });
53
+ // 同步 token 到 store
54
+ const originalSave = tokenStorage.save.bind(tokenStorage);
55
+ tokenStorage.save = (token) => {
56
+ originalSave(token);
57
+ authStore.token.set(token);
58
+ };
51
59
  return {
52
60
  authStore,
53
61
  tokenStorage,
@@ -1,103 +1,54 @@
1
+ /**
2
+ * Store 工具函数
3
+ */
1
4
  import type { Observable } from "@legendapp/state";
2
5
  import type { AuthState, SessionUser } from "../types";
3
- import type { TokenStorage } from "./state";
6
+ import type { ApiClient, TokenStorage } from "../api";
4
7
  import type { AuthActions } from "./actions";
5
- /**
6
- * 获取当前用户
7
- */
8
8
  export declare function getCurrentUser(authStore: Observable<AuthState>): SessionUser | null;
9
- /**
10
- * 获取当前用户ID
11
- */
12
9
  export declare function getCurrentUserId(authStore: Observable<AuthState>): string | null;
13
- /**
14
- * 安全获取当前用户ID
15
- */
16
- export declare function getCurrentUserIdSafe(authStore: Observable<AuthState>): string | null;
17
- /**
18
- * 检查是否已认证
19
- */
20
10
  export declare function isAuthenticated(authStore: Observable<AuthState>): boolean;
21
- /**
22
- * 检查是否正在加载
23
- */
24
11
  export declare function isLoading(authStore: Observable<AuthState>): boolean;
25
- /**
26
- * 检查是否已加载
27
- */
28
12
  export declare function isLoaded(authStore: Observable<AuthState>): boolean;
29
- /**
30
- * 等待认证完成
31
- * 使用轮询方式检查认证状态(简单但有效)
32
- *
33
- * 注意:如果长时间未加载,Promise 不会自动 reject
34
- * 建议在外层添加超时处理
35
- */
36
13
  export declare function waitForAuth(authStore: Observable<AuthState>): Promise<void>;
37
- /**
38
- * 获取认证令牌
39
- */
40
- export declare function getAuthToken(authStore: Observable<AuthState>, tokenStorage: TokenStorage, authActions: AuthActions, authClient: {
41
- getSession: () => Promise<unknown>;
42
- }): Promise<string | null>;
43
- /**
44
- * 获取认证头
45
- */
46
- export declare function getAuthHeaders(authStore: Observable<AuthState>, tokenStorage: TokenStorage, authActions: AuthActions, authClient: {
47
- getSession: () => Promise<unknown>;
48
- }): Promise<Record<string, string>>;
49
- /**
50
- * 处理 401 响应
51
- */
14
+ export declare function getAuthTokenSync(tokenStorage: TokenStorage): string | null;
15
+ export declare function getAuthToken(tokenStorage: TokenStorage): Promise<string | null>;
16
+ export declare function getAuthHeadersSync(tokenStorage: TokenStorage): Record<string, string>;
17
+ export declare function getAuthHeaders(tokenStorage: TokenStorage): Promise<Record<string, string>>;
52
18
  export declare function handle401Response(response: Response, authActions: AuthActions): Response;
53
- /**
54
- * API 客户端工具
55
- */
56
- export declare function createApiClient(authStore: Observable<AuthState>, tokenStorage: TokenStorage, authActions: AuthActions, authClient: {
57
- getSession: () => Promise<unknown>;
58
- }): {
59
- get(url: string, options?: RequestInit): Promise<Response>;
60
- post(url: string, body?: unknown, options?: RequestInit): Promise<Response>;
61
- put(url: string, body?: unknown, options?: RequestInit): Promise<Response>;
62
- delete(url: string, options?: RequestInit): Promise<Response>;
63
- };
64
- /**
65
- * 用户管理器
66
- */
67
19
  export declare function createUserManager(authStore: Observable<AuthState>): {
68
- getUser(): SessionUser | null;
69
- getUserId(): string | null;
20
+ getUser: () => SessionUser | null;
21
+ getUserId: () => string | null;
70
22
  };
71
23
  /**
72
- * 从 AuthInstance 创建绑定好的工具函数集合
73
- * 这样就不需要在每个项目中重复包装工具函数
24
+ * 创建绑定好的工具函数集合
74
25
  */
75
26
  export declare function createBoundAuthUtils(instance: {
27
+ apiClient: ApiClient;
28
+ authActions: AuthActions;
76
29
  authStore: Observable<AuthState>;
77
30
  tokenStorage: TokenStorage;
78
- authActions: AuthActions;
79
- authClient: {
80
- getSession: () => Promise<unknown>;
81
- };
82
31
  }): {
83
32
  getCurrentUser: () => SessionUser | null;
84
33
  getCurrentUserId: () => string | null;
85
- getCurrentUserIdSafe: () => string | null;
86
34
  isAuthenticated: () => boolean;
87
35
  isLoading: () => boolean;
88
36
  isLoaded: () => boolean;
89
37
  waitForAuth: () => Promise<void>;
90
38
  getAuthToken: () => Promise<string | null>;
39
+ getAuthTokenSync: () => string | null;
91
40
  getAuthHeaders: () => Promise<Record<string, string>>;
41
+ getAuthHeadersSync: () => Record<string, string>;
92
42
  apiClient: {
93
- get(url: string, options?: RequestInit): Promise<Response>;
94
- post(url: string, body?: unknown, options?: RequestInit): Promise<Response>;
95
- put(url: string, body?: unknown, options?: RequestInit): Promise<Response>;
96
- delete(url: string, options?: RequestInit): Promise<Response>;
43
+ get<T = unknown>(path: string, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
44
+ post<T = unknown>(path: string, body?: unknown, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
45
+ put<T = unknown>(path: string, body?: unknown, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
46
+ delete<T = unknown>(path: string, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
47
+ fetch(path: string, options?: RequestInit): Promise<Response>;
97
48
  };
98
49
  userManager: {
99
- getUser(): SessionUser | null;
100
- getUserId(): string | null;
50
+ getUser: () => SessionUser | null;
51
+ getUserId: () => string | null;
101
52
  };
102
53
  };
103
54
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/store/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/store/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,WAAW,GAAG,IAAI,CAEnF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAEhF;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAEzE;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAEnE;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAElE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAErF;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIrF;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEhG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAKxF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC;;;EAKjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE;IAC7C,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAChC,YAAY,EAAE,YAAY,CAAA;CAC3B;;;;;;;;;;;;;;;;;;;;;;EAiBA"}
@@ -1,198 +1,80 @@
1
1
  /**
2
- * 获取当前用户
2
+ * Store 工具函数
3
3
  */
4
4
  export function getCurrentUser(authStore) {
5
5
  return authStore.user.get();
6
6
  }
7
- /**
8
- * 获取当前用户ID
9
- */
10
7
  export function getCurrentUserId(authStore) {
11
- return authStore.user.get()?.id || null;
12
- }
13
- /**
14
- * 安全获取当前用户ID
15
- */
16
- export function getCurrentUserIdSafe(authStore) {
17
- return getCurrentUserId(authStore);
8
+ return authStore.user.get()?.id ?? null;
18
9
  }
19
- /**
20
- * 检查是否已认证
21
- */
22
10
  export function isAuthenticated(authStore) {
23
11
  return authStore.isAuthenticated.get();
24
12
  }
25
- /**
26
- * 检查是否正在加载
27
- */
28
13
  export function isLoading(authStore) {
29
14
  return authStore.loading.get();
30
15
  }
31
- /**
32
- * 检查是否已加载
33
- */
34
16
  export function isLoaded(authStore) {
35
17
  return authStore.isLoaded.get();
36
18
  }
37
- /**
38
- * 等待认证完成
39
- * 使用轮询方式检查认证状态(简单但有效)
40
- *
41
- * 注意:如果长时间未加载,Promise 不会自动 reject
42
- * 建议在外层添加超时处理
43
- */
44
19
  export async function waitForAuth(authStore) {
20
+ if (authStore.isLoaded.get())
21
+ return;
45
22
  return new Promise((resolve) => {
46
- // 如果已经加载,立即 resolve
47
- if (authStore.isLoaded.get()) {
48
- resolve();
49
- return;
50
- }
51
- const checkAuth = () => {
23
+ const check = () => {
52
24
  if (authStore.isLoaded.get()) {
53
25
  resolve();
54
26
  }
55
27
  else {
56
- setTimeout(checkAuth, 100);
28
+ setTimeout(check, 100);
57
29
  }
58
30
  };
59
- checkAuth();
31
+ check();
60
32
  });
61
33
  }
62
- /**
63
- * 获取认证令牌
64
- */
65
- export async function getAuthToken(authStore, tokenStorage, authActions, authClient) {
66
- // 首先从存储中获取 token
67
- const storedToken = tokenStorage.get();
68
- if (storedToken) {
69
- // 如果有 token 但没有用户信息,尝试获取 session
70
- if (!authStore.user.get()) {
71
- await authActions.fetchSessionWithToken(storedToken);
72
- }
73
- return storedToken;
74
- }
75
- // 如果没有存储的 token,尝试从 session 获取
76
- const sessionData = await authClient.getSession();
77
- const sessionToken = sessionData?.data?.session?.token || null;
78
- if (sessionToken) {
79
- tokenStorage.save(sessionToken);
80
- }
81
- return sessionToken;
34
+ export function getAuthTokenSync(tokenStorage) {
35
+ return tokenStorage.get();
82
36
  }
83
- /**
84
- * 获取认证头
85
- */
86
- export async function getAuthHeaders(authStore, tokenStorage, authActions, authClient) {
87
- const token = await getAuthToken(authStore, tokenStorage, authActions, authClient);
88
- if (!token) {
37
+ export async function getAuthToken(tokenStorage) {
38
+ return tokenStorage.get();
39
+ }
40
+ export function getAuthHeadersSync(tokenStorage) {
41
+ const token = tokenStorage.get();
42
+ if (!token)
89
43
  return {};
90
- }
91
- return {
92
- Authorization: `Bearer ${encodeURIComponent(token)}`,
93
- };
44
+ return { Authorization: `Bearer ${encodeURIComponent(token)}` };
45
+ }
46
+ export async function getAuthHeaders(tokenStorage) {
47
+ return getAuthHeadersSync(tokenStorage);
94
48
  }
95
- /**
96
- * 处理 401 响应
97
- */
98
49
  export function handle401Response(response, authActions) {
99
50
  if (response.status === 401) {
100
51
  authActions.handleUnauthorized();
101
52
  }
102
53
  return response;
103
54
  }
104
- /**
105
- * API 客户端工具
106
- */
107
- export function createApiClient(authStore, tokenStorage, authActions, authClient) {
108
- return {
109
- async get(url, options) {
110
- const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
111
- const response = await fetch(url, {
112
- ...options,
113
- method: "GET",
114
- headers: {
115
- ...headers,
116
- ...options?.headers,
117
- },
118
- });
119
- return handle401Response(response, authActions);
120
- },
121
- async post(url, body, options) {
122
- const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
123
- const response = await fetch(url, {
124
- ...options,
125
- method: "POST",
126
- headers: {
127
- "Content-Type": "application/json",
128
- ...headers,
129
- ...options?.headers,
130
- },
131
- body: body ? JSON.stringify(body) : undefined,
132
- });
133
- return handle401Response(response, authActions);
134
- },
135
- async put(url, body, options) {
136
- const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
137
- const response = await fetch(url, {
138
- ...options,
139
- method: "PUT",
140
- headers: {
141
- "Content-Type": "application/json",
142
- ...headers,
143
- ...options?.headers,
144
- },
145
- body: body ? JSON.stringify(body) : undefined,
146
- });
147
- return handle401Response(response, authActions);
148
- },
149
- async delete(url, options) {
150
- const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
151
- const response = await fetch(url, {
152
- ...options,
153
- method: "DELETE",
154
- headers: {
155
- ...headers,
156
- ...options?.headers,
157
- },
158
- });
159
- return handle401Response(response, authActions);
160
- },
161
- };
162
- }
163
- /**
164
- * 用户管理器
165
- */
166
55
  export function createUserManager(authStore) {
167
56
  return {
168
- getUser() {
169
- return getCurrentUser(authStore);
170
- },
171
- getUserId() {
172
- return getCurrentUserId(authStore);
173
- },
57
+ getUser: () => getCurrentUser(authStore),
58
+ getUserId: () => getCurrentUserId(authStore),
174
59
  };
175
60
  }
176
61
  /**
177
- * 从 AuthInstance 创建绑定好的工具函数集合
178
- * 这样就不需要在每个项目中重复包装工具函数
62
+ * 创建绑定好的工具函数集合
179
63
  */
180
64
  export function createBoundAuthUtils(instance) {
181
- const { authStore, tokenStorage, authActions, authClient } = instance;
65
+ const { authStore, tokenStorage, apiClient } = instance;
182
66
  return {
183
- // Store 访问
184
67
  getCurrentUser: () => getCurrentUser(authStore),
185
68
  getCurrentUserId: () => getCurrentUserId(authStore),
186
- getCurrentUserIdSafe: () => getCurrentUserIdSafe(authStore),
187
69
  isAuthenticated: () => isAuthenticated(authStore),
188
70
  isLoading: () => isLoading(authStore),
189
71
  isLoaded: () => isLoaded(authStore),
190
72
  waitForAuth: () => waitForAuth(authStore),
191
- // 需要多个参数的函数
192
- getAuthToken: () => getAuthToken(authStore, tokenStorage, authActions, authClient),
193
- getAuthHeaders: () => getAuthHeaders(authStore, tokenStorage, authActions, authClient),
194
- // 已创建的实例
195
- apiClient: createApiClient(authStore, tokenStorage, authActions, authClient),
73
+ getAuthToken: () => getAuthToken(tokenStorage),
74
+ getAuthTokenSync: () => getAuthTokenSync(tokenStorage),
75
+ getAuthHeaders: () => getAuthHeaders(tokenStorage),
76
+ getAuthHeadersSync: () => getAuthHeadersSync(tokenStorage),
77
+ apiClient,
196
78
  userManager: createUserManager(authStore),
197
79
  };
198
80
  }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * 认证状态和配置类型
3
+ */
4
+ import type { SessionUser } from "./user";
5
+ /** 更新用户请求 */
6
+ export interface UpdateUserRequest {
7
+ color?: string;
8
+ image?: string;
9
+ name?: string;
10
+ }
11
+ /** Magic Link 登录请求 */
12
+ export interface MagicLinkRequest {
13
+ callbackURL?: string;
14
+ email: string;
15
+ errorCallbackURL?: string;
16
+ name?: string;
17
+ newUserCallbackURL?: string;
18
+ }
19
+ /** Magic Link 登录方法签名 */
20
+ export type SignInWithMagicLink = (options: {
21
+ callbackURL: string;
22
+ email: string;
23
+ name?: string;
24
+ newUserCallbackURL?: string;
25
+ }) => Promise<unknown>;
26
+ /** Email/Password 登录方法签名 */
27
+ export type SignInWithEmail = (credentials: {
28
+ email: string;
29
+ password: string;
30
+ }, options?: {
31
+ onError?: (context: {
32
+ error: Error;
33
+ }) => void;
34
+ onSuccess?: (context: {
35
+ response: Response;
36
+ }) => void;
37
+ }) => Promise<unknown>;
38
+ /** Email/Password 注册方法签名 */
39
+ export type SignUpWithEmail = (credentials: {
40
+ email: string;
41
+ name: string;
42
+ password: string;
43
+ }, options?: {
44
+ onError?: (context: {
45
+ error: Error;
46
+ }) => void;
47
+ onSuccess?: (context: {
48
+ response: Response;
49
+ }) => void;
50
+ }) => Promise<unknown>;
51
+ /** 伴生团队设置选项 */
52
+ export interface CompanionTeamOptions {
53
+ isNewUser?: boolean;
54
+ onComplete?: () => void;
55
+ onError?: (error: Error) => void;
56
+ }
57
+ /** Better Auth signIn 方法接口 */
58
+ export interface AuthClientSignIn {
59
+ email?: SignInWithEmail;
60
+ magicLink?: SignInWithMagicLink;
61
+ social: (options: {
62
+ callbackURL: string;
63
+ errorCallbackURL?: string;
64
+ newUserCallbackURL?: string;
65
+ provider: string;
66
+ }) => Promise<unknown>;
67
+ }
68
+ /** Better Auth signUp 方法接口 */
69
+ export interface AuthClientSignUp {
70
+ email?: SignUpWithEmail;
71
+ }
72
+ /** Better Auth 客户端接口 */
73
+ export interface AuthClientMethods {
74
+ signIn: AuthClientSignIn;
75
+ signOut: () => Promise<unknown>;
76
+ signUp?: AuthClientSignUp;
77
+ }
78
+ /** 认证状态(Legend State store) */
79
+ export interface AuthState {
80
+ error: string | null;
81
+ isAuthenticated: boolean;
82
+ isLoaded: boolean;
83
+ loading: boolean;
84
+ token: string | null;
85
+ user: SessionUser | null;
86
+ }
87
+ /** Better Auth 插件类型 */
88
+ export type BetterAuthPlugin = ReturnType<typeof import("better-auth/client/plugins").adminClient>;
89
+ /** 认证配置 */
90
+ export interface AuthConfig {
91
+ /** OneAuth API 基础 URL */
92
+ baseURL: string;
93
+ /** 获取 session 的端点路径 @default '/v1/auth/get-session' */
94
+ getSessionEndpoint?: string;
95
+ /** Better Auth 插件列表 */
96
+ plugins?: BetterAuthPlugin[];
97
+ /** 跳过错误时的 token 清除 @default false */
98
+ skipTokenCleanupOnError?: boolean;
99
+ /** Token 存储 key @default 'auth-token' */
100
+ tokenStorageKey?: string;
101
+ }
102
+ /** 默认配置类型 */
103
+ export type DefaultAuthConfig = Required<Pick<AuthConfig, "baseURL" | "getSessionEndpoint" | "tokenStorageKey">> & {
104
+ plugins: BetterAuthPlugin[];
105
+ skipTokenCleanupOnError: false;
106
+ };
107
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 认证状态和配置类型
3
+ */
4
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 类型定义导出
3
+ */
4
+ export type { SessionUser, SessionUserMetadata, Session } from "./user";
5
+ export type { AuthClientMethods, AuthClientSignIn, AuthClientSignUp, AuthConfig, AuthState, BetterAuthPlugin, CompanionTeamOptions, DefaultAuthConfig, MagicLinkRequest, SignInWithEmail, SignInWithMagicLink, SignUpWithEmail, UpdateUserRequest, } from "./auth";
6
+ export type { Organization, FullOrganization, CreateOrganizationRequest, UpdateOrganizationRequest, DeleteOrganizationRequest, SetActiveOrganizationRequest, CheckSlugRequest, MemberRole, Member, MemberUser, MemberWithUser, RemoveMemberRequest, UpdateMemberRoleRequest, InvitationStatus, Invitation, InvitationDetail, InviteMemberRequest, CancelInvitationRequest, AcceptInvitationRequest, RejectInvitationRequest, InvitationResponse, } from "./organization";
7
+ export type { Team, CreateTeamRequest, UpdateTeamRequest, DeleteTeamRequest, SetActiveTeamRequest, TeamMember, AddTeamMemberRequest, RemoveTeamMemberRequest, ListTeamMembersRequest, } from "./team";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACvE,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,QAAQ,CAAA;AAGf,YAAY,EAEV,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAEhB,UAAU,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EAEvB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AAGvB,YAAY,EAEV,IAAI,EACJ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EAEpB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 类型定义导出
3
+ */
4
+ export {};