@iushev/react-rbac 1.0.14 → 1.0.17

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.
@@ -7,10 +7,10 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const useCheckAccess_1 = __importDefault(require("./useCheckAccess"));
8
8
  const NoAccess_1 = __importDefault(require("./NoAccess"));
9
9
  const CheckAccess = ({ roles, allow, params, match, busy: BusyComponent = () => null, noAccess: NoAccessComponent = NoAccess_1.default, children, }) => {
10
- const { checking, hasAccess } = useCheckAccess_1.default({ roles, allow, params, match });
10
+ const { checking, hasAccess } = (0, useCheckAccess_1.default)({ roles, allow, params, match });
11
11
  if (checking) {
12
- return jsx_runtime_1.jsx(BusyComponent, {}, void 0);
12
+ return (0, jsx_runtime_1.jsx)(BusyComponent, {});
13
13
  }
14
- return jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: hasAccess ? jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: children }, void 0) : jsx_runtime_1.jsx(NoAccessComponent, {}, void 0) }, void 0);
14
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: hasAccess ? (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children }) : (0, jsx_runtime_1.jsx)(NoAccessComponent, {}) });
15
15
  };
16
16
  exports.default = CheckAccess;
package/build/NoAccess.js CHANGED
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const NoAccess = () => {
5
- return (jsx_runtime_1.jsxs("div", { children: [jsx_runtime_1.jsx("h4", { children: "Access Denied" }, void 0),
6
- jsx_runtime_1.jsx("h5", { children: "You don't have permission to access." }, void 0)] }, void 0));
5
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { children: "Access Denied" }), (0, jsx_runtime_1.jsx)("h5", { children: "You don't have permission to access." })] }));
7
6
  };
8
7
  exports.default = NoAccess;
@@ -9,4 +9,8 @@ export default class RbacCheckAccess extends BaseCheckAccess {
9
9
  constructor(options: RbacCheckAccessOptions);
10
10
  checkAccess(username: string, itemName: string, params: RuleParams): Promise<boolean>;
11
11
  load(): Promise<void>;
12
+ private getRbacItems;
13
+ private getRbacParents;
14
+ private getRbacRules;
15
+ private getRbacAssignments;
12
16
  }
@@ -12,8 +12,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- const rbac_1 = require("@iushev/rbac");
16
15
  const axios_1 = __importDefault(require("axios"));
16
+ const http_status_codes_1 = __importDefault(require("http-status-codes"));
17
+ const rbac_1 = require("@iushev/rbac");
17
18
  class RbacCheckAccess extends rbac_1.BaseCheckAccess {
18
19
  constructor(options) {
19
20
  super(options);
@@ -22,12 +23,15 @@ class RbacCheckAccess extends rbac_1.BaseCheckAccess {
22
23
  baseURL: options.path,
23
24
  });
24
25
  this.axiosInstance.interceptors.request.use((config) => {
26
+ if (!config.headers) {
27
+ config.headers = {};
28
+ }
25
29
  if (options.authorization) {
26
30
  const token = options.authorization();
27
31
  config.headers.common["Authorization"] = "Bearer " + token;
28
32
  }
29
33
  else {
30
- config.headers.common["Authorization"] = null;
34
+ config.headers.common["Authorization"] = "";
31
35
  }
32
36
  return config;
33
37
  });
@@ -45,71 +49,97 @@ class RbacCheckAccess extends rbac_1.BaseCheckAccess {
45
49
  });
46
50
  }
47
51
  load() {
52
+ var _a;
48
53
  return __awaiter(this, void 0, void 0, function* () {
49
- console.log("Load RBAC");
50
- const response = yield this.axiosInstance.get("/rbac");
51
- const _rbac = response.data;
52
- this.items = Object.keys(_rbac.items).reduce((prevValue, name) => {
53
- var _a, _b;
54
- const item = _rbac.items[name];
55
- const ItemClass = item.type === rbac_1.ItemType.permission ? rbac_1.Permission : rbac_1.Role;
56
- prevValue.set(name, new ItemClass({
57
- name,
58
- type: item.type,
59
- description: (_a = item.description) !== null && _a !== void 0 ? _a : null,
60
- ruleName: (_b = item.ruleName) !== null && _b !== void 0 ? _b : null,
61
- }));
62
- return prevValue;
63
- }, new Map());
64
- this.parents = Object.keys(_rbac.items).reduce((prevValue, name) => {
65
- const item = _rbac.items[name];
66
- if (!item.children || item.children.length === 0) {
67
- return prevValue;
54
+ let _rbac;
55
+ try {
56
+ console.log("Load RBAC");
57
+ const response = yield this.axiosInstance.get("/rbac");
58
+ _rbac = response.data;
59
+ }
60
+ catch (err) {
61
+ if (axios_1.default.isAxiosError(err) && ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === http_status_codes_1.default.NOT_FOUND) {
62
+ _rbac = {
63
+ assignments: {},
64
+ items: {},
65
+ rules: {},
66
+ };
68
67
  }
69
- item.children.forEach((childName) => {
70
- if (!this.items.has(childName)) {
71
- return;
72
- }
73
- if (!prevValue.has(childName)) {
74
- prevValue.set(childName, new Map());
75
- }
76
- prevValue.get(childName).set(name, this.items.get(name));
77
- });
68
+ throw err;
69
+ }
70
+ this.items = this.getRbacItems(_rbac);
71
+ this.parents = this.getRbacParents(_rbac);
72
+ this.rules = this.getRbacRules(_rbac);
73
+ this.assignments = this.getRbacAssignments(_rbac);
74
+ });
75
+ }
76
+ getRbacItems({ items }) {
77
+ return Object.keys(items).reduce((prevValue, name) => {
78
+ var _a, _b;
79
+ const item = items[name];
80
+ const ItemClass = item.type === rbac_1.ItemType.permission ? rbac_1.Permission : rbac_1.Role;
81
+ prevValue.set(name, new ItemClass({
82
+ name,
83
+ type: item.type,
84
+ description: (_a = item.description) !== null && _a !== void 0 ? _a : null,
85
+ ruleName: (_b = item.ruleName) !== null && _b !== void 0 ? _b : null,
86
+ }));
87
+ return prevValue;
88
+ }, new Map());
89
+ }
90
+ getRbacParents({ items }) {
91
+ return Object.keys(items).reduce((prevValue, name) => {
92
+ const item = items[name];
93
+ if (!item.children || item.children.length === 0) {
78
94
  return prevValue;
79
- }, new Map());
80
- this.rules = Object.keys(_rbac.rules).reduce((prevValue, name) => {
95
+ }
96
+ item.children.forEach((childName) => {
97
+ if (!this.items.has(childName)) {
98
+ return;
99
+ }
100
+ if (!prevValue.has(childName)) {
101
+ prevValue.set(childName, new Map());
102
+ }
103
+ prevValue.get(childName).set(name, this.items.get(name));
104
+ });
105
+ return prevValue;
106
+ }, new Map());
107
+ }
108
+ getRbacRules({ rules }) {
109
+ return Object.keys(rules).reduce((prevValue, name) => {
110
+ var _a;
111
+ const ruleData = rules[name];
112
+ const RuleClass = (_a = this.ruleClasses.get(ruleData.data.typeName)) !== null && _a !== void 0 ? _a : rbac_1.Rule;
113
+ const rule = new RuleClass(name, JSON.parse(ruleData.data.rule));
114
+ prevValue.set(name, rule);
115
+ return prevValue;
116
+ }, new Map());
117
+ }
118
+ getRbacAssignments({ assignments }) {
119
+ return Object.keys(assignments).reduce((prevValue, username) => {
120
+ const _assignments = assignments[username];
121
+ _assignments.forEach((itemName) => {
81
122
  var _a;
82
- const ruleData = _rbac.rules[name];
83
- const RuleClass = (_a = this.ruleClasses.get(ruleData.data.typeName)) !== null && _a !== void 0 ? _a : rbac_1.Rule;
84
- const rule = new RuleClass(name, JSON.parse(ruleData.data.rule));
85
- prevValue.set(name, rule);
86
- return prevValue;
87
- }, new Map());
88
- this.assignments = Object.keys(_rbac.assignments).reduce((prevValue, username) => {
89
- const assignments = _rbac.assignments[username];
90
- assignments.forEach((itemName) => {
91
- var _a;
92
- if (prevValue.has(username)) {
93
- (_a = prevValue.get(username)) === null || _a === void 0 ? void 0 : _a.set(itemName, new rbac_1.Assignment({
123
+ if (prevValue.has(username)) {
124
+ (_a = prevValue.get(username)) === null || _a === void 0 ? void 0 : _a.set(itemName, new rbac_1.Assignment({
125
+ itemName,
126
+ username,
127
+ }));
128
+ }
129
+ else {
130
+ prevValue.set(username, new Map([
131
+ [
94
132
  itemName,
95
- username,
96
- }));
97
- }
98
- else {
99
- prevValue.set(username, new Map([
100
- [
133
+ new rbac_1.Assignment({
101
134
  itemName,
102
- new rbac_1.Assignment({
103
- itemName,
104
- username,
105
- }),
106
- ],
107
- ]));
108
- }
109
- });
110
- return prevValue;
111
- }, new Map());
112
- });
135
+ username,
136
+ }),
137
+ ],
138
+ ]));
139
+ }
140
+ });
141
+ return prevValue;
142
+ }, new Map());
113
143
  }
114
144
  }
115
145
  exports.default = RbacCheckAccess;
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -39,8 +43,8 @@ const RbacContext = react_1.default.createContext({
39
43
  checkAccess: (_options) => __awaiter(void 0, void 0, void 0, function* () { return true; }),
40
44
  });
41
45
  const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClasses, children, }) => {
42
- const [rbac, setRbac] = react_1.useState(null);
43
- react_1.useEffect(() => {
46
+ const [rbac, setRbac] = (0, react_1.useState)(null);
47
+ (0, react_1.useEffect)(() => {
44
48
  if (!token) {
45
49
  setRbac(null);
46
50
  }
@@ -54,7 +58,7 @@ const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClas
54
58
  _rbac.load().then(() => setRbac(_rbac));
55
59
  }
56
60
  }, [rbacUrl, token]);
57
- const value = react_1.useMemo(() => {
61
+ const value = (0, react_1.useMemo)(() => {
58
62
  const checkAccess = ({ roles, allow = true, match, params = {} }) => __awaiter(void 0, void 0, void 0, function* () {
59
63
  const matchRole = () => __awaiter(void 0, void 0, void 0, function* () {
60
64
  if (!roles || roles.length === 0) {
@@ -98,7 +102,7 @@ const RbacProvider = ({ username, rbacUrl, token, isSuperuser, isGuest, ruleClas
98
102
  checkAccess,
99
103
  };
100
104
  }, [rbac, username, isGuest, isSuperuser]);
101
- return jsx_runtime_1.jsx(RbacContext.Provider, Object.assign({ value: value }, { children: children }), void 0);
105
+ return (0, jsx_runtime_1.jsx)(RbacContext.Provider, Object.assign({ value: value }, { children: children }));
102
106
  };
103
107
  exports.RbacProvider = RbacProvider;
104
108
  exports.RbacConsumer = RbacContext.Consumer;
@@ -6,12 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = require("react");
7
7
  const RbacContext_1 = __importDefault(require("./RbacContext"));
8
8
  function useCheckAccess({ roles, allow, params, match }) {
9
- const rbac = react_1.useContext(RbacContext_1.default);
10
- const [state, setState] = react_1.useState({
9
+ const rbac = (0, react_1.useContext)(RbacContext_1.default);
10
+ const [state, setState] = (0, react_1.useState)({
11
11
  checking: true,
12
12
  hasAccess: false,
13
13
  });
14
- react_1.useEffect(() => {
14
+ (0, react_1.useEffect)(() => {
15
15
  let subscribed = true;
16
16
  setState({
17
17
  checking: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iushev/react-rbac",
3
- "version": "1.0.14",
3
+ "version": "1.0.17",
4
4
  "private": false,
5
5
  "author": "Ivaylo Ushev",
6
6
  "description": "",
@@ -12,17 +12,20 @@
12
12
  "test": "jest"
13
13
  },
14
14
  "devDependencies": {
15
- "typescript": "^4.2.4"
15
+ "typescript": "^4.6.2"
16
16
  },
17
17
  "peerDependencies": {
18
- "@iushev/rbac": "^1.0.19",
19
- "@types/react": "^16.14.5 || ^17.0.4",
20
- "@types/react-dom": "^16.9.12 || ^17.0.3",
21
- "axios": "^0.21.1",
18
+ "@iushev/rbac": "^1.0.22",
19
+ "@types/react": "^16.14.5 || ^17.0.40",
20
+ "@types/react-dom": "^17.0.13",
21
+ "axios": ">= 0.26.1",
22
22
  "react": "^16.14.0 || ^17.0.2",
23
23
  "react-dom": "^16.14.0 || ^17.0.2"
24
24
  },
25
25
  "publishConfig": {
26
26
  "access": "public"
27
+ },
28
+ "dependencies": {
29
+ "http-status-codes": "^2.2.0"
27
30
  }
28
31
  }
@@ -1,3 +1,6 @@
1
+ import axios, { AxiosInstance } from "axios";
2
+ import statusCodes from "http-status-codes";
3
+
1
4
  import {
2
5
  Assignment,
3
6
  BaseCheckAccess,
@@ -11,8 +14,6 @@ import {
11
14
  RuleParams,
12
15
  } from "@iushev/rbac";
13
16
 
14
- import axios, { AxiosInstance } from "axios";
15
-
16
17
  export type RbacCheckAccessOptions = BaseCheckAccessOptions & {
17
18
  path: string;
18
19
  authorization: () => string;
@@ -31,11 +32,15 @@ export default class RbacCheckAccess extends BaseCheckAccess {
31
32
  });
32
33
 
33
34
  this.axiosInstance.interceptors.request.use((config) => {
35
+ if (!config.headers) {
36
+ config.headers = {};
37
+ }
38
+
34
39
  if (options.authorization) {
35
40
  const token = options.authorization();
36
- config.headers.common["Authorization"] = "Bearer " + token;
41
+ (config.headers.common as any as Record<string, string>)["Authorization"] = "Bearer " + token;
37
42
  } else {
38
- config.headers.common["Authorization"] = null;
43
+ (config.headers.common as any as Record<string, string>)["Authorization"] = "";
39
44
  }
40
45
  return config;
41
46
  });
@@ -50,12 +55,31 @@ export default class RbacCheckAccess extends BaseCheckAccess {
50
55
  }
51
56
 
52
57
  public async load(): Promise<void> {
53
- console.log("Load RBAC");
54
- const response = await this.axiosInstance.get<RBACResponse>("/rbac");
55
- const _rbac = response.data;
58
+ let _rbac: RBACResponse;
59
+ try {
60
+ console.log("Load RBAC");
61
+ const response = await this.axiosInstance.get<RBACResponse>("/rbac");
62
+ _rbac = response.data;
63
+ } catch (err) {
64
+ if (axios.isAxiosError(err) && err.response?.status === statusCodes.NOT_FOUND) {
65
+ _rbac = {
66
+ assignments: {},
67
+ items: {},
68
+ rules: {},
69
+ };
70
+ }
71
+ throw err;
72
+ }
73
+
74
+ this.items = this.getRbacItems(_rbac);
75
+ this.parents = this.getRbacParents(_rbac);
76
+ this.rules = this.getRbacRules(_rbac);
77
+ this.assignments = this.getRbacAssignments(_rbac);
78
+ }
56
79
 
57
- this.items = Object.keys(_rbac.items).reduce<Map<string, Item>>((prevValue, name) => {
58
- const item = _rbac.items[name];
80
+ private getRbacItems({ items }: RBACResponse) {
81
+ return Object.keys(items).reduce<Map<string, Item>>((prevValue, name) => {
82
+ const item = items[name];
59
83
  const ItemClass = item.type === ItemType.permission ? Permission : Role;
60
84
  prevValue.set(
61
85
  name,
@@ -68,9 +92,11 @@ export default class RbacCheckAccess extends BaseCheckAccess {
68
92
  );
69
93
  return prevValue;
70
94
  }, new Map());
95
+ }
71
96
 
72
- this.parents = Object.keys(_rbac.items).reduce<Map<string, Map<string, Item>>>((prevValue, name) => {
73
- const item = _rbac.items[name];
97
+ private getRbacParents({ items }: RBACResponse) {
98
+ return Object.keys(items).reduce<Map<string, Map<string, Item>>>((prevValue, name) => {
99
+ const item = items[name];
74
100
  if (!item.children || item.children.length === 0) {
75
101
  return prevValue;
76
102
  }
@@ -88,45 +114,46 @@ export default class RbacCheckAccess extends BaseCheckAccess {
88
114
 
89
115
  return prevValue;
90
116
  }, new Map());
117
+ }
91
118
 
92
- this.rules = Object.keys(_rbac.rules).reduce<Map<string, Rule>>((prevValue, name) => {
93
- const ruleData = _rbac.rules[name];
119
+ private getRbacRules({ rules }: RBACResponse) {
120
+ return Object.keys(rules).reduce<Map<string, Rule>>((prevValue, name) => {
121
+ const ruleData = rules[name];
94
122
  const RuleClass = this.ruleClasses.get(ruleData.data.typeName) ?? Rule;
95
123
  const rule = new RuleClass(name, JSON.parse(ruleData.data.rule));
96
124
  prevValue.set(name, rule);
97
125
  return prevValue;
98
126
  }, new Map());
127
+ }
99
128
 
100
- this.assignments = Object.keys(_rbac.assignments).reduce<Map<string, Map<string, Assignment>>>(
101
- (prevValue, username) => {
102
- const assignments = _rbac.assignments[username];
103
- assignments.forEach((itemName) => {
104
- if (prevValue.has(username)) {
105
- prevValue.get(username)?.set(
129
+ private getRbacAssignments({ assignments }: RBACResponse) {
130
+ return Object.keys(assignments).reduce<Map<string, Map<string, Assignment>>>((prevValue, username) => {
131
+ const _assignments = assignments[username];
132
+ _assignments.forEach((itemName) => {
133
+ if (prevValue.has(username)) {
134
+ prevValue.get(username)?.set(
135
+ itemName,
136
+ new Assignment({
106
137
  itemName,
107
- new Assignment({
108
- itemName,
109
- username,
110
- })
111
- );
112
- } else {
113
- prevValue.set(
114
138
  username,
115
- new Map([
116
- [
139
+ })
140
+ );
141
+ } else {
142
+ prevValue.set(
143
+ username,
144
+ new Map([
145
+ [
146
+ itemName,
147
+ new Assignment({
117
148
  itemName,
118
- new Assignment({
119
- itemName,
120
- username,
121
- }),
122
- ],
123
- ])
124
- );
125
- }
126
- });
127
- return prevValue;
128
- },
129
- new Map()
130
- );
149
+ username,
150
+ }),
151
+ ],
152
+ ])
153
+ );
154
+ }
155
+ });
156
+ return prevValue;
157
+ }, new Map());
131
158
  }
132
159
  }