@lark-apaas/auth-sdk 0.1.0-alpha.60 → 0.1.0-alpha.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,7 +16,7 @@ yarn add @lark-apaas/auth-sdk
16
16
 
17
17
  ```tsx
18
18
  import React from 'react';
19
- import { AuthProvider, CanRole, useAuthAbility } from '@lark-apaas/auth-sdk';
19
+ import { AuthProvider, CanRole, useAuth } from '@lark-apaas/auth-sdk';
20
20
 
21
21
  export default function App() {
22
22
  return (
@@ -74,25 +74,6 @@ export declare function getAbility(permissionApiConfig: AuthSdkConfig['permissio
74
74
  * ```
75
75
  */
76
76
  export declare function useAuth(): AuthStateContextValue;
77
- /**
78
- * useAuthAbility Hook - 获取 Ability 实例
79
- *
80
- * @example
81
- * ```tsx
82
- * import { useAuthAbility } from '@lark-apaas/auth-sdk';
83
- *
84
- * function MyComponent() {
85
- * const ability = useAuthAbility();
86
- *
87
- * return (
88
- * <button disabled={ability.cannot('create', 'Task')}>
89
- * Create Task
90
- * </button>
91
- * );
92
- * }
93
- * ```
94
- */
95
- export declare function useAuthAbility(): MongoAbility;
96
77
  /**
97
78
  * Can Component - 基于 Ability 实例的条件渲染组件
98
79
  *
@@ -110,11 +91,11 @@ export declare function useAuthAbility(): MongoAbility;
110
91
  * ```
111
92
  */
112
93
  export declare const Can: React.FunctionComponent<import("@casl/react").BoundCanProps<MongoAbility<import("@casl/ability").AbilityTuple, import("@casl/ability").MongoQuery>>>;
113
- export declare const useCanRole: ({ roles }: {
114
- roles: string[];
115
- }) => boolean;
116
94
  /**
117
- * CanRole Component - 基于 Ability 实例的角色条件渲染组件
95
+ * CanRole Component - 基于角色的条件渲染组件
96
+ *
97
+ * 支持 fallback prop,用于在权限加载期间显示自定义内容(如 Loading),
98
+ * 避免加载期间因 can() 返回 false 而误判为无权限。
118
99
  *
119
100
  * @example
120
101
  * ```tsx
@@ -122,16 +103,17 @@ export declare const useCanRole: ({ roles }: {
122
103
  *
123
104
  * function MyComponent() {
124
105
  * return (
125
- * <CanRole roles={['role_admin', 'role_editor']}>
126
- * <TaskList />
106
+ * <CanRole roles={['admin']} fallback={<Loading />}>
107
+ * <AdminPanel />
127
108
  * </CanRole>
128
109
  * );
129
110
  * }
130
111
  * ```
131
112
  */
132
- export declare function CanRole({ children, roles, }: {
113
+ export declare function CanRole({ children, roles, fallback, }: {
133
114
  children: React.ReactNode;
134
115
  roles: string[];
116
+ fallback?: React.ReactNode;
135
117
  }): import("react/jsx-runtime").JSX.Element | null;
136
118
  export {};
137
119
  //# sourceMappingURL=AuthProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7C;;GAEG;AACH,eAAO,MAAM,cAAc,uGAE1B,CAAC;AAEF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAOD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CA8DnE;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,mBAAmB,EAAE,aAAa,CAAC,eAAe,CAAC,2GAmBpD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,IAAI,qBAAqB,CAQ/C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,GAAG,sJAA+C,CAAC;AAEhE,eAAO,MAAM,UAAU,GAAa,WAAW;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,OASpE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,kDAIA"}
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7C;;GAEG;AACH,eAAO,MAAM,cAAc,uGAE1B,CAAC;AAEF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAOD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAiEnE;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,mBAAmB,EAAE,aAAa,CAAC,eAAe,CAAC,2GAmBpD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,IAAI,qBAAqB,CAQ/C;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,GAAG,sJAA+C,CAAC;AAoBhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,QAAe,GAChB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,kDAKA"}
@@ -10,9 +10,9 @@ const AbilityContext = /*#__PURE__*/ createContext(createAbility({
10
10
  const AuthStateContext = /*#__PURE__*/ createContext(null);
11
11
  function AuthProvider({ children, config }) {
12
12
  const [ability, setAbility] = useState(()=>createAbility({}));
13
- const [isLoading, setIsLoading] = useState(false);
14
- const [error, setError] = useState(null);
15
13
  const [client] = useState(()=>config?.permissionApi ? new PermissionClient(config.permissionApi) : null);
14
+ const [isLoading, setIsLoading] = useState(()=>config?.enable !== false && null !== client);
15
+ const [error, setError] = useState(null);
16
16
  const fetchPermissions = useCallback(async ()=>{
17
17
  if (!client) return;
18
18
  setIsLoading(true);
@@ -74,21 +74,25 @@ function useAuth() {
74
74
  if (!context) throw new Error('useAuth must be used within an AuthProvider');
75
75
  return context;
76
76
  }
77
- function useAuthAbility() {
78
- return useContext(AbilityContext);
79
- }
80
77
  const Can = createContextualCan(AbilityContext.Consumer);
81
- const useCanRole = function({ roles }) {
78
+ function useCanRole({ roles }) {
82
79
  const ability = useContext(AbilityContext);
80
+ const authState = useContext(AuthStateContext);
83
81
  const allowed = !roles || 0 === roles.length || roles.length > 0 && roles.some((role)=>ability.can(role, ROLE_SUBJECT));
84
- return !!allowed;
85
- };
86
- function CanRole({ children, roles }) {
87
- const allowed = useCanRole({
82
+ return {
83
+ allowed: !!allowed,
84
+ isLoading: authState?.isLoading ?? false
85
+ };
86
+ }
87
+ function CanRole({ children, roles, fallback = null }) {
88
+ const { allowed, isLoading } = useCanRole({
88
89
  roles
89
90
  });
91
+ if (isLoading) return /*#__PURE__*/ jsx(Fragment, {
92
+ children: fallback
93
+ });
90
94
  return allowed ? /*#__PURE__*/ jsx(Fragment, {
91
95
  children: children
92
96
  }) : null;
93
97
  }
94
- export { AbilityContext, AuthProvider, Can, CanRole, getAbility, useAuth, useAuthAbility, useCanRole };
98
+ export { AbilityContext, AuthProvider, Can, CanRole, getAbility, useAuth };
package/lib/index.d.ts CHANGED
@@ -7,6 +7,6 @@
7
7
  export type { PermissionApiResponse, PermissionApiConfig, AuthSdkConfig, } from './types';
8
8
  export { ROLE_SUBJECT } from './ability-factory';
9
9
  export { PermissionClient } from './permission-client';
10
- export { AuthProvider, useAuth, CanRole, AbilityContext } from './AuthProvider';
10
+ export { AuthProvider, useAuth, CanRole, AbilityContext, } from './AuthProvider';
11
11
  export type { AuthProviderProps } from './AuthProvider';
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhF,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"permission-client.d.ts","sourceRoot":"","sources":["../src/permission-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAkDxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAOxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;CAGjC"}
1
+ {"version":3,"file":"permission-client.d.ts","sourceRoot":"","sources":["../src/permission-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAoDxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAOxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;CAGjC"}
@@ -1,3 +1,4 @@
1
+ import { slardar } from "@lark-apaas/internal-slardar";
1
2
  class PermissionClient {
2
3
  constructor(config){
3
4
  this.config = config;
@@ -27,7 +28,17 @@ class PermissionClient {
27
28
  };
28
29
  } catch (error) {
29
30
  clearTimeout(timeoutId);
30
- if (error instanceof Error && 'AbortError' === error.name) throw new Error(`Permission API request timeout after ${timeout}ms`);
31
+ if (error instanceof Error && 'AbortError' === error.name) {
32
+ slardar.captureException(error, {
33
+ source: 'auth-sdk',
34
+ type: 'timeout'
35
+ });
36
+ throw new Error(`Permission API request timeout after ${timeout}ms`);
37
+ }
38
+ slardar.captureException(error, {
39
+ source: 'auth-sdk',
40
+ type: 'fetch'
41
+ });
31
42
  throw error;
32
43
  }
33
44
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/auth-sdk",
3
- "version": "0.1.0-alpha.60",
3
+ "version": "0.1.0-alpha.61",
4
4
  "description": "基于 CASL 的前端鉴权 SDK",
5
5
  "types": "./lib/index.d.ts",
6
6
  "main": "./lib/index.js",
@@ -20,7 +20,8 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@casl/ability": "^6.7.5",
23
- "@casl/react": "^5.0.0"
23
+ "@casl/react": "^5.0.0",
24
+ "@lark-apaas/internal-slardar": "^0.0.3"
24
25
  },
25
26
  "devDependencies": {
26
27
  "@rsbuild/core": "~1.4.13",