@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 +1 -1
- package/lib/AuthProvider.d.ts +8 -26
- package/lib/AuthProvider.d.ts.map +1 -1
- package/lib/AuthProvider.js +15 -11
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/permission-client.d.ts.map +1 -1
- package/lib/permission-client.js +12 -1
- package/package.json +3 -2
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,
|
|
19
|
+
import { AuthProvider, CanRole, useAuth } from '@lark-apaas/auth-sdk';
|
|
20
20
|
|
|
21
21
|
export default function App() {
|
|
22
22
|
return (
|
package/lib/AuthProvider.d.ts
CHANGED
|
@@ -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 -
|
|
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={['
|
|
126
|
-
* <
|
|
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,
|
|
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"}
|
package/lib/AuthProvider.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
|
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
|
package/lib/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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;
|
|
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"}
|
package/lib/permission-client.js
CHANGED
|
@@ -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)
|
|
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.
|
|
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",
|