@iushev/react-rbac 1.0.20 → 1.0.23

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.
@@ -8,6 +8,7 @@ export default class RbacCheckAccess extends BaseCheckAccess {
8
8
  protected assignments: Map<string, Map<string, Assignment>>;
9
9
  constructor(options: RbacCheckAccessOptions);
10
10
  checkAccess(username: string, itemName: string, params: RuleParams): Promise<boolean>;
11
+ getAssignmentsByUser(username: string): Promise<Map<string, Assignment>>;
11
12
  load(): Promise<void>;
12
13
  private getRbacItems;
13
14
  private getRbacParents;
@@ -1 +1 @@
1
- {"version":3,"file":"RbacCheckAccess.d.ts","sourceRoot":"","sources":["../src/RbacCheckAccess.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EACV,eAAe,EACf,sBAAsB,EAOtB,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,oBAAY,sBAAsB,GAAG,sBAAsB,GAAG;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,eAAe;IAC1D,OAAO,CAAC,aAAa,CAAgB;IAErC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAa;gBAE5D,OAAO,EAAE,sBAAsB;IAsB9B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBlC,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,kBAAkB;CAa3B"}
1
+ {"version":3,"file":"RbacCheckAccess.d.ts","sourceRoot":"","sources":["../src/RbacCheckAccess.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EACV,eAAe,EACf,sBAAsB,EAOtB,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,oBAAY,sBAAsB,GAAG,sBAAsB,GAAG;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,eAAe;IAC1D,OAAO,CAAC,aAAa,CAAgB;IAErC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAa;gBAE5D,OAAO,EAAE,sBAAsB;IAsB9B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAQxE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBlC,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,kBAAkB;CAa3B"}
@@ -48,6 +48,15 @@ class RbacCheckAccess extends rbac_1.BaseCheckAccess {
48
48
  return _super.checkAccess.call(this, username, itemName, params, (_a = this.assignments.get(username)) !== null && _a !== void 0 ? _a : new Map());
49
49
  });
50
50
  }
51
+ getAssignmentsByUser(username) {
52
+ var _a;
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ if (this.items.size === 0) {
55
+ yield this.load();
56
+ }
57
+ return (_a = this.assignments.get(username)) !== null && _a !== void 0 ? _a : new Map();
58
+ });
59
+ }
51
60
  load() {
52
61
  var _a;
53
62
  return __awaiter(this, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"RbacContext.d.ts","sourceRoot":"","sources":["../src/RbacContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgE,MAAM,OAAO,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG1D,oBAAY,kBAAkB,GAAG,MAAM,UAAU,CAAC;AAClD,oBAAY,aAAa,GAAG,MAAM,OAAO,CAAC;AAC1C,oBAAY,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACzC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,oBAAY,gBAAgB,GAAG;IAC7B,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE,CAAC;AAEF,QAAA,MAAM,WAAW,iCAEf,CAAC;AAEH,oBAAY,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkEpD,CAAC;AAEF,eAAO,MAAM,YAAY,kCAAuB,CAAC;AAEjD,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"RbacContext.d.ts","sourceRoot":"","sources":["../src/RbacContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgE,MAAM,OAAO,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG1D,oBAAY,kBAAkB,GAAG,MAAM,UAAU,CAAC;AAClD,oBAAY,aAAa,GAAG,MAAM,OAAO,CAAC;AAC1C,oBAAY,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACzC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,oBAAY,gBAAgB,GAAG;IAC7B,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE,CAAC;AAEF,QAAA,MAAM,WAAW,iCAEf,CAAC;AAEH,oBAAY,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA4EpD,CAAC;AAEF,eAAO,MAAM,YAAY,kCAAuB,CAAC;AAEjD,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -62,6 +62,9 @@ const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClas
62
62
  if (!roles || roles.length === 0) {
63
63
  return true;
64
64
  }
65
+ if (!rbac) {
66
+ return false;
67
+ }
65
68
  for (const role of roles) {
66
69
  if (role === "?" && isGuest) {
67
70
  // only guest users
@@ -71,7 +74,7 @@ const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClas
71
74
  // only authenticated users
72
75
  return true;
73
76
  }
74
- else if (yield (rbac === null || rbac === void 0 ? void 0 : rbac.checkAccess(username, role, typeof params === "function" ? params() : params))) {
77
+ else if (yield rbac.checkAccess(username, role, typeof params === "function" ? params() : params)) {
75
78
  // only authenticated users that has permission
76
79
  return true;
77
80
  }
@@ -80,7 +83,7 @@ const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClas
80
83
  }
81
84
  }
82
85
  return false;
83
- }), []);
86
+ }), [isGuest, rbac, username]);
84
87
  const matchCustom = (0, react_1.useCallback)((match) => {
85
88
  if (!match) {
86
89
  return true;
@@ -89,12 +92,12 @@ const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClas
89
92
  }, []);
90
93
  const checkAccess = (0, react_1.useCallback)(({ roles, allow = true, match, params = {} }) => __awaiter(void 0, void 0, void 0, function* () {
91
94
  return isSuperuser || ((yield matchRole(roles, params)) && matchCustom(match) && allow);
92
- }), []);
95
+ }), [isSuperuser, matchCustom, matchRole]);
93
96
  const value = (0, react_1.useMemo)(() => {
94
97
  return {
95
98
  checkAccess,
96
99
  };
97
- }, [rbac, username, isGuest, isSuperuser]);
100
+ }, [checkAccess]);
98
101
  return (0, jsx_runtime_1.jsx)(RbacContext.Provider, Object.assign({ value: value }, { children: children }));
99
102
  };
100
103
  exports.RbacProvider = RbacProvider;
package/package.json CHANGED
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "name": "@iushev/react-rbac",
3
- "version": "1.0.20",
3
+ "version": "1.0.23",
4
4
  "private": false,
5
5
  "author": "Ivaylo Ushev",
6
6
  "description": "",
7
7
  "license": "ISC",
8
- "main": "./build",
8
+ "keywords": [],
9
+ "main": "./lib/index",
10
+ "types": "./lib/index",
9
11
  "scripts": {
10
12
  "build": "tsc",
11
13
  "watch": "tsc -w --preserveWatchOutput",
12
14
  "test": "jest --runInBand",
13
- "test:watch": "jest ----watchAll --runInBand",
15
+ "test:watch": "jest --watchAll --runInBand",
14
16
  "coverage": "jest --coverage --runInBand",
15
17
  "lint": "eslint --ext .js,.jsx,.ts,.tsx src",
16
18
  "preversion": "rimraf ./lib && npm run build"
@@ -26,6 +28,8 @@
26
28
  "eslint": "^8.14.0",
27
29
  "eslint-config-prettier": "^8.5.0",
28
30
  "eslint-plugin-prettier": "^4.0.0",
31
+ "eslint-plugin-react": "^7.29.4",
32
+ "eslint-plugin-react-hooks": "^4.5.0",
29
33
  "jest": "^27.5.1",
30
34
  "prettier": "^2.6.2",
31
35
  "rimraf": "^3.0.2",
package/src/NoAccess.tsx CHANGED
@@ -4,7 +4,7 @@ const NoAccess: React.FC = () => {
4
4
  return (
5
5
  <div>
6
6
  <h4>Access Denied</h4>
7
- <h5>You don't have permission to access.</h5>
7
+ <h5>You don&apos;t have permission to access.</h5>
8
8
  </div>
9
9
  );
10
10
  };
@@ -54,6 +54,14 @@ export default class RbacCheckAccess extends BaseCheckAccess {
54
54
  return super.checkAccess(username, itemName, params, this.assignments.get(username) ?? new Map());
55
55
  }
56
56
 
57
+ public async getAssignmentsByUser(username: string): Promise<Map<string, Assignment>> {
58
+ if (this.items.size === 0) {
59
+ await this.load();
60
+ }
61
+
62
+ return this.assignments.get(username) ?? new Map();
63
+ }
64
+
57
65
  public async load(): Promise<void> {
58
66
  let _rbac: RBACResponse;
59
67
  try {
@@ -54,28 +54,35 @@ export const RbacProvider: React.FC<RbacProviderProps> = ({
54
54
  }
55
55
  }, [rbacUrl, token]);
56
56
 
57
- const matchRole = useCallback(async (roles, params) => {
58
- if (!roles || roles.length === 0) {
59
- return true;
60
- }
61
-
62
- for (const role of roles) {
63
- if (role === "?" && isGuest) {
64
- // only guest users
57
+ const matchRole = useCallback(
58
+ async (roles, params) => {
59
+ if (!roles || roles.length === 0) {
65
60
  return true;
66
- } else if (role === "@" && !isGuest) {
67
- // only authenticated users
68
- return true;
69
- } else if (await rbac?.checkAccess(username, role, typeof params === "function" ? params() : params)) {
70
- // only authenticated users that has permission
71
- return true;
72
- } else {
73
- continue;
74
61
  }
75
- }
76
62
 
77
- return false;
78
- }, []);
63
+ if (!rbac) {
64
+ return false;
65
+ }
66
+
67
+ for (const role of roles) {
68
+ if (role === "?" && isGuest) {
69
+ // only guest users
70
+ return true;
71
+ } else if (role === "@" && !isGuest) {
72
+ // only authenticated users
73
+ return true;
74
+ } else if (await rbac.checkAccess(username, role, typeof params === "function" ? params() : params)) {
75
+ // only authenticated users that has permission
76
+ return true;
77
+ } else {
78
+ continue;
79
+ }
80
+ }
81
+
82
+ return false;
83
+ },
84
+ [isGuest, rbac, username]
85
+ );
79
86
 
80
87
  const matchCustom = useCallback((match) => {
81
88
  if (!match) {
@@ -84,15 +91,18 @@ export const RbacProvider: React.FC<RbacProviderProps> = ({
84
91
  return match();
85
92
  }, []);
86
93
 
87
- const checkAccess = useCallback(async ({ roles, allow = true, match, params = {} }: CheckAccessOptions) => {
88
- return isSuperuser || ((await matchRole(roles, params)) && matchCustom(match) && allow);
89
- }, []);
94
+ const checkAccess = useCallback(
95
+ async ({ roles, allow = true, match, params = {} }: CheckAccessOptions) => {
96
+ return isSuperuser || ((await matchRole(roles, params)) && matchCustom(match) && allow);
97
+ },
98
+ [isSuperuser, matchCustom, matchRole]
99
+ );
90
100
 
91
101
  const value = useMemo(() => {
92
102
  return {
93
103
  checkAccess,
94
104
  };
95
- }, [rbac, username, isGuest, isSuperuser]);
105
+ }, [checkAccess]);
96
106
 
97
107
  return <RbacContext.Provider value={value}>{children}</RbacContext.Provider>;
98
108
  };
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { default as RbacContext, RbacConsumer, RbacProvider } from "./RbacContext";
2
2
  export { default as CheckAccess, CheckAccessProps } from "./CheckAccess";
3
3
  export { default as NoAccess } from "./NoAccess";
4
- export { default as useCheckAccess } from "./useCheckAccess";
4
+ export { default as useCheckAccess } from "./useCheckAccess";