@choiceform/shared-auth 0.1.14 → 0.1.16

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 (95) 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 -57
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +4 -6
  20. package/dist/core.d.ts +114 -72
  21. package/dist/core.d.ts.map +1 -1
  22. package/dist/core.js +35 -17
  23. package/dist/hooks/use-auth-init.d.ts +10 -0
  24. package/dist/hooks/use-auth-init.d.ts.map +1 -1
  25. package/dist/hooks/use-auth-init.js +59 -31
  26. package/dist/index.d.ts +12 -15
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +26 -13
  29. package/dist/init.d.ts +133 -92
  30. package/dist/init.d.ts.map +1 -1
  31. package/dist/init.js +12 -14
  32. package/dist/lib/auth-client.d.ts +49 -54
  33. package/dist/lib/auth-client.d.ts.map +1 -1
  34. package/dist/lib/auth-client.js +10 -16
  35. package/dist/services/companion-team.d.ts +16 -0
  36. package/dist/services/companion-team.d.ts.map +1 -0
  37. package/dist/services/companion-team.js +73 -0
  38. package/dist/services/index.d.ts +5 -0
  39. package/dist/services/index.d.ts.map +1 -0
  40. package/dist/services/index.js +4 -0
  41. package/dist/store/actions.d.ts +45 -33
  42. package/dist/store/actions.d.ts.map +1 -1
  43. package/dist/store/actions.js +135 -106
  44. package/dist/store/index.d.ts +8 -0
  45. package/dist/store/index.d.ts.map +1 -0
  46. package/dist/store/index.js +7 -0
  47. package/dist/store/state.d.ts +10 -7
  48. package/dist/store/state.d.ts.map +1 -1
  49. package/dist/store/state.js +31 -23
  50. package/dist/store/utils.d.ts +22 -71
  51. package/dist/store/utils.d.ts.map +1 -1
  52. package/dist/store/utils.js +28 -146
  53. package/dist/types/auth.d.ts +107 -0
  54. package/dist/types/auth.d.ts.map +1 -0
  55. package/dist/types/auth.js +4 -0
  56. package/dist/types/index.d.ts +8 -0
  57. package/dist/types/index.d.ts.map +1 -0
  58. package/dist/types/index.js +4 -0
  59. package/dist/types/organization.d.ts +111 -0
  60. package/dist/types/organization.d.ts.map +1 -0
  61. package/dist/types/organization.js +4 -0
  62. package/dist/types/team.d.ts +52 -0
  63. package/dist/types/team.d.ts.map +1 -0
  64. package/dist/types/team.js +4 -0
  65. package/dist/types/user.d.ts +44 -0
  66. package/dist/types/user.d.ts.map +1 -0
  67. package/dist/types/user.js +4 -0
  68. package/dist/utils/date.d.ts +10 -0
  69. package/dist/utils/date.d.ts.map +1 -0
  70. package/dist/utils/date.js +13 -0
  71. package/dist/utils/env.d.ts +20 -0
  72. package/dist/utils/env.d.ts.map +1 -0
  73. package/dist/utils/env.js +23 -0
  74. package/dist/utils/index.d.ts +7 -0
  75. package/dist/utils/index.d.ts.map +1 -0
  76. package/dist/utils/index.js +6 -0
  77. package/dist/utils/user-mapper.d.ts +21 -0
  78. package/dist/utils/user-mapper.d.ts.map +1 -0
  79. package/dist/utils/user-mapper.js +55 -0
  80. package/package.json +3 -4
  81. package/dist/components/auth-sync.d.ts +0 -25
  82. package/dist/components/auth-sync.d.ts.map +0 -1
  83. package/dist/components/auth-sync.js +0 -346
  84. package/dist/components/protected-route.d.ts +0 -18
  85. package/dist/components/protected-route.d.ts.map +0 -1
  86. package/dist/components/protected-route.js +0 -34
  87. package/dist/components/sign-in-page.d.ts +0 -21
  88. package/dist/components/sign-in-page.d.ts.map +0 -1
  89. package/dist/components/sign-in-page.js +0 -31
  90. package/dist/core/init-auth-sync.d.ts +0 -7
  91. package/dist/core/init-auth-sync.d.ts.map +0 -1
  92. package/dist/core/init-auth-sync.js +0 -34
  93. package/dist/types.d.ts +0 -87
  94. package/dist/types.d.ts.map +0 -1
  95. package/dist/types.js +0 -4
@@ -1,41 +1,69 @@
1
1
  import { useEffect } from "react";
2
+ /**
3
+ * 初始化认证状态(非 hook 版本)
4
+ * 可在 React Router 的 clientLoader 中调用
5
+ *
6
+ * @returns 是否已认证
7
+ */
8
+ export async function initializeAuth(auth) {
9
+ const { authActions, tokenStorage, authStore } = auth;
10
+ // 如果已经初始化,直接返回
11
+ if (authStore.isLoaded.get()) {
12
+ return authStore.isAuthenticated.get();
13
+ }
14
+ // 检查 URL 中的 token
15
+ const urlParams = new URLSearchParams(window.location.search);
16
+ let tokenFromUrl = urlParams.get("token");
17
+ if (tokenFromUrl) {
18
+ // URL 中的 token 可能被编码,尝试解码
19
+ try {
20
+ tokenFromUrl = decodeURIComponent(tokenFromUrl);
21
+ }
22
+ catch {
23
+ // 解码失败,使用原值
24
+ }
25
+ // 立即清理 URL 中的 token 参数(避免暴露)
26
+ urlParams.delete("token");
27
+ const newUrl = urlParams.toString()
28
+ ? `${window.location.pathname}?${urlParams.toString()}`
29
+ : window.location.pathname;
30
+ window.history.replaceState({}, "", newUrl);
31
+ // 使用 token 获取 session
32
+ try {
33
+ await authActions.fetchSessionWithToken(tokenFromUrl);
34
+ return authStore.isAuthenticated.get();
35
+ }
36
+ catch {
37
+ // Token 无效,继续检查 localStorage
38
+ }
39
+ }
40
+ // 检查 localStorage 中是否有存储的 token
41
+ const storedToken = tokenStorage.get();
42
+ if (storedToken) {
43
+ try {
44
+ await authActions.fetchSessionWithToken(storedToken);
45
+ return authStore.isAuthenticated.get();
46
+ }
47
+ catch {
48
+ // Token 无效,初始化为未认证状态
49
+ await authActions.initialize(null, true);
50
+ return false;
51
+ }
52
+ }
53
+ // 没有 token,标记为已加载
54
+ await authActions.initialize(null, true);
55
+ return false;
56
+ }
2
57
  /**
3
58
  * 认证初始化 hook
4
59
  * 在应用启动时检查 URL 中的 token 或 localStorage 中的 token
60
+ *
61
+ * 注意:在 React Router Framework 模式下,应使用 initializeAuth 函数
62
+ * 在 clientLoader 中调用,而不是使用此 hook
5
63
  */
6
64
  export function useAuthInit(auth) {
7
65
  useEffect(() => {
8
- async function initializeAuth() {
9
- const { authActions, tokenStorage } = auth;
10
- // 检查 URL 中的 token
11
- const urlParams = new URLSearchParams(window.location.search);
12
- let tokenFromUrl = urlParams.get("token");
13
- if (tokenFromUrl) {
14
- if (decodeURIComponent(tokenFromUrl) === tokenFromUrl) {
15
- tokenFromUrl = encodeURIComponent(tokenFromUrl);
16
- }
17
- // 立即清理 URL 中的 token 参数(避免暴露)
18
- urlParams.delete("token");
19
- const newUrl = urlParams.toString()
20
- ? `${window.location.pathname}?${urlParams.toString()}`
21
- : window.location.pathname;
22
- window.history.replaceState({}, "", newUrl);
23
- // 使用 token 获取 session
24
- await authActions.fetchSessionWithToken(tokenFromUrl);
25
- }
26
- else {
27
- // 检查 localStorage 中是否有存储的 token
28
- const storedToken = tokenStorage.get();
29
- if (storedToken) {
30
- await authActions.fetchSessionWithToken(storedToken);
31
- }
32
- else {
33
- // 没有 token,标记为已加载
34
- await authActions.initialize(null, true);
35
- }
36
- }
37
- }
38
- initializeAuth().catch((error) => {
66
+ initializeAuth(auth).catch((error) => {
39
67
  console.error("Failed to initialize auth:", error);
40
68
  // 即使认证初始化失败,也标记为已加载
41
69
  auth.authActions.initialize(null, true);
package/dist/index.d.ts CHANGED
@@ -1,22 +1,19 @@
1
1
  /**
2
2
  * @choiceform/shared-auth
3
- * 共享认证包 - 用于 Choiceform 项目的统一认证解决方案
3
+ * 共享认证包
4
4
  */
5
- export { createAuth } from "./core";
6
- export type { AuthInstance } from "./core";
5
+ export { createAuth, type AuthInstance } from "./core";
6
+ export { initAuth } from "./init";
7
7
  export { defaultAuthConfig } from "./config";
8
- export type { AuthConfig } from "./config";
9
- export type { SessionUser, Session, AuthState } from "./types";
10
- export { createAuthStore } from "./store/state";
11
- export { createAuthActions } from "./store/actions";
8
+ export type { SessionUser, SessionUserMetadata, Session, AuthState, AuthConfig, BetterAuthPlugin, DefaultAuthConfig, UpdateUserRequest, MagicLinkRequest, SignInWithMagicLink, CompanionTeamOptions, AuthClientMethods, AuthClientSignIn, Organization, FullOrganization, CreateOrganizationRequest, UpdateOrganizationRequest, DeleteOrganizationRequest, SetActiveOrganizationRequest, CheckSlugRequest, MemberRole, Member, MemberUser, MemberWithUser, RemoveMemberRequest, UpdateMemberRoleRequest, InvitationStatus, Invitation, InvitationDetail, InviteMemberRequest, CancelInvitationRequest, AcceptInvitationRequest, RejectInvitationRequest, InvitationResponse, Team, CreateTeamRequest, UpdateTeamRequest, DeleteTeamRequest, SetActiveTeamRequest, TeamMember, AddTeamMemberRequest, RemoveTeamMemberRequest, ListTeamMembersRequest, } from "./types";
9
+ export { createAuthStore, createTokenStorage } from "./store/state";
10
+ export { createAuthActions, type AuthActions } from "./store/actions";
12
11
  export { createAuthComputed } from "./store/computed";
13
- export type { TokenStorage } from "./store/state";
14
- export type { AuthActions } from "./store/actions";
15
- export { getCurrentUser, getCurrentUserId, getCurrentUserIdSafe, isAuthenticated, isLoading, isLoaded, waitForAuth, getAuthToken, getAuthHeaders, handle401Response, createApiClient, createUserManager, createBoundAuthUtils, } from "./store/utils";
16
- export { AuthSync } from "./components/auth-sync";
17
- export { ProtectedRoute } from "./components/protected-route";
18
- export { SignInPage } from "./components/sign-in-page";
19
- export { useAuthInit } from "./hooks/use-auth-init";
12
+ export { createBoundAuthUtils, createUserManager, getAuthHeaders, getAuthHeadersSync, getAuthToken, getAuthTokenSync, getCurrentUser, getCurrentUserId, handle401Response, isAuthenticated, isLoaded, isLoading, waitForAuth, } from "./store/utils";
13
+ export { createApiClient, createAuthApi, createOrganizationApi, createTeamApi, parseErrorResponse, } from "./api";
14
+ export type { ApiClient, ApiClientConfig, ApiResponse, TokenStorage, UnauthorizedHandler, AuthApi, OrganizationApi, TeamApi, } from "./api";
15
+ export { setupCompanionTeam } from "./services";
16
+ export { getEnvVar, getAuthBaseUrl, extractSessionUser } from "./utils";
17
+ export { useAuthInit, initializeAuth } from "./hooks/use-auth-init";
20
18
  export { createAuthClientFromConfig } from "./lib/auth-client";
21
- export { initAuth } from "./init";
22
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAG1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG1C,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGlD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAM5C,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAEhB,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAElB,IAAI,EACJ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,SAAS,CAAA;AAMhB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,MAAM,eAAe,CAAA;AAMtB,OAAO,EACL,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,OAAO,CAAA;AAEd,YAAY,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,OAAO,GACR,MAAM,OAAO,CAAA;AAMd,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAM/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAMvE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js CHANGED
@@ -1,24 +1,37 @@
1
1
  /**
2
2
  * @choiceform/shared-auth
3
- * 共享认证包 - 用于 Choiceform 项目的统一认证解决方案
3
+ * 共享认证包
4
4
  */
5
- // 核心功能
5
+ // ============================================================
6
+ // 核心
7
+ // ============================================================
6
8
  export { createAuth } from "./core";
7
- // 配置
9
+ export { initAuth } from "./init";
8
10
  export { defaultAuthConfig } from "./config";
11
+ // ============================================================
9
12
  // Store
10
- export { createAuthStore } from "./store/state";
13
+ // ============================================================
14
+ export { createAuthStore, createTokenStorage } from "./store/state";
11
15
  export { createAuthActions } from "./store/actions";
12
16
  export { createAuthComputed } from "./store/computed";
13
- // Utils
14
- export { getCurrentUser, getCurrentUserId, getCurrentUserIdSafe, isAuthenticated, isLoading, isLoaded, waitForAuth, getAuthToken, getAuthHeaders, handle401Response, createApiClient, createUserManager, createBoundAuthUtils, } from "./store/utils";
15
- // 组件
16
- export { AuthSync } from "./components/auth-sync";
17
- export { ProtectedRoute } from "./components/protected-route";
18
- export { SignInPage } from "./components/sign-in-page";
17
+ export { createBoundAuthUtils, createUserManager, getAuthHeaders, getAuthHeadersSync, getAuthToken, getAuthTokenSync, getCurrentUser, getCurrentUserId, handle401Response, isAuthenticated, isLoaded, isLoading, waitForAuth, } from "./store/utils";
18
+ // ============================================================
19
+ // API
20
+ // ============================================================
21
+ export { createApiClient, createAuthApi, createOrganizationApi, createTeamApi, parseErrorResponse, } from "./api";
22
+ // ============================================================
23
+ // 服务
24
+ // ============================================================
25
+ export { setupCompanionTeam } from "./services";
26
+ // ============================================================
27
+ // 工具
28
+ // ============================================================
29
+ export { getEnvVar, getAuthBaseUrl, extractSessionUser } from "./utils";
30
+ // ============================================================
19
31
  // Hooks
20
- export { useAuthInit } from "./hooks/use-auth-init";
32
+ // ============================================================
33
+ export { useAuthInit, initializeAuth } from "./hooks/use-auth-init";
34
+ // ============================================================
21
35
  // Better Auth Client
36
+ // ============================================================
22
37
  export { createAuthClientFromConfig } from "./lib/auth-client";
23
- // 快速初始化
24
- export { initAuth } from "./init";