@hexagramio/saga-ts 0.9.589-0 → 0.9.590-0
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/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/shared/permissions.d.ts +72 -0
- package/dist/cjs/shared/permissions.d.ts.map +1 -0
- package/dist/cjs/shared/permissions.js +139 -0
- package/dist/cjs/shared/permissions.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/shared/permissions.d.ts +72 -0
- package/dist/shared/permissions.d.ts.map +1 -0
- package/dist/shared/permissions.js +133 -0
- package/dist/shared/permissions.js.map +1 -0
- package/package.json +1 -1
package/dist/cjs/index.d.ts
CHANGED
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -24,4 +24,5 @@ __exportStar(require("./commands/test_data"), exports);
|
|
|
24
24
|
__exportStar(require("./commands/requests"), exports);
|
|
25
25
|
__exportStar(require("./commands/analytics"), exports);
|
|
26
26
|
__exportStar(require("./shared/types"), exports);
|
|
27
|
+
__exportStar(require("./shared/permissions"), exports);
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA8B;AAC9B,mDAAgC;AAChC,kDAA+B;AAC/B,mDAAgC;AAChC,qDAAkC;AAClC,oDAAiC;AACjC,uDAAoC;AACpC,sDAAmC;AACnC,uDAAoC;AACpC,iDAA8B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA8B;AAC9B,mDAAgC;AAChC,kDAA+B;AAC/B,mDAAgC;AAChC,qDAAkC;AAClC,oDAAiC;AACjC,uDAAoC;AACpC,sDAAmC;AACnC,uDAAoC;AACpC,iDAA8B;AAC9B,uDAAoC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Object
|
|
3
|
+
*/
|
|
4
|
+
export interface Permission {
|
|
5
|
+
path: string;
|
|
6
|
+
action: string;
|
|
7
|
+
allow: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Check if user has access to a resource
|
|
11
|
+
* Client-side version of the server's permit() function
|
|
12
|
+
*
|
|
13
|
+
* @param path - the path to resource (e.g., "/bots/123/properties")
|
|
14
|
+
* @param action - HTTP method or action (e.g., "GET", "POST", "DELETE")
|
|
15
|
+
* @param permissions - array of user permissions
|
|
16
|
+
* @returns true if permitted, false otherwise
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const permissions = authResponse.permissions;
|
|
21
|
+
*
|
|
22
|
+
* if (hasAccess('/bots/123', 'DELETE', permissions)) {
|
|
23
|
+
* // Show delete button
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const hasAccess: (path: string, action: string, permissions: Permission[]) => boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Helper to create permission checks for specific resources
|
|
30
|
+
* Useful for UI components that need to check multiple actions
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const botAccess = createAccessChecker('/bots/123', permissions);
|
|
35
|
+
*
|
|
36
|
+
* return (
|
|
37
|
+
* <div>
|
|
38
|
+
* {botAccess('GET') && <ViewButton />}
|
|
39
|
+
* {botAccess('PUT') && <EditButton />}
|
|
40
|
+
* {botAccess('DELETE') && <DeleteButton />}
|
|
41
|
+
* </div>
|
|
42
|
+
* );
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare const createAccessChecker: (path: string, permissions: Permission[]) => (action: string) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Hook-friendly permission checker factory
|
|
48
|
+
* Memoizes permission checks for a resource
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* function BotActions({ botId, permissions }) {
|
|
53
|
+
* const can = useAccessChecker(`/bots/${botId}`, permissions);
|
|
54
|
+
*
|
|
55
|
+
* return (
|
|
56
|
+
* <div>
|
|
57
|
+
* {can.read && <ViewButton />}
|
|
58
|
+
* {can.update && <EditButton />}
|
|
59
|
+
* {can.delete && <DeleteButton />}
|
|
60
|
+
* </div>
|
|
61
|
+
* );
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare const createRestAccessChecker: (path: string, permissions: Permission[]) => {
|
|
66
|
+
read: boolean;
|
|
67
|
+
create: boolean;
|
|
68
|
+
update: boolean;
|
|
69
|
+
delete: boolean;
|
|
70
|
+
patch: boolean;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/shared/permissions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,SACd,MAAM,UACJ,MAAM,eACD,UAAU,EAAE,KACxB,OAcF,CAAC;AAoEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,SACxB,MAAM,eACC,UAAU,EAAE,cAET,MAAM,YACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,uBAAuB,SAC5B,MAAM,eACC,UAAU,EAAE;;;;;;CAS1B,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRestAccessChecker = exports.createAccessChecker = exports.hasAccess = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Check if user has access to a resource
|
|
6
|
+
* Client-side version of the server's permit() function
|
|
7
|
+
*
|
|
8
|
+
* @param path - the path to resource (e.g., "/bots/123/properties")
|
|
9
|
+
* @param action - HTTP method or action (e.g., "GET", "POST", "DELETE")
|
|
10
|
+
* @param permissions - array of user permissions
|
|
11
|
+
* @returns true if permitted, false otherwise
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const permissions = authResponse.permissions;
|
|
16
|
+
*
|
|
17
|
+
* if (hasAccess('/bots/123', 'DELETE', permissions)) {
|
|
18
|
+
* // Show delete button
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
const hasAccess = (path, action, permissions) => {
|
|
23
|
+
let allowed = false;
|
|
24
|
+
for (const permission of permissions) {
|
|
25
|
+
const given = checkPermission(path, action.toLowerCase(), permission);
|
|
26
|
+
if (!permission.allow && given === false) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
else if (permission.allow && given === true) {
|
|
30
|
+
allowed = true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return allowed;
|
|
34
|
+
};
|
|
35
|
+
exports.hasAccess = hasAccess;
|
|
36
|
+
/**
|
|
37
|
+
* Check a single permission against a path and action
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
const checkPermission = (path, action, permission) => {
|
|
41
|
+
const pathElements = path.substring(1).split('/');
|
|
42
|
+
const permissionElements = permission.path.substring(1).split('/');
|
|
43
|
+
// Root wildcard match
|
|
44
|
+
if (permissionElements[0] === '*' &&
|
|
45
|
+
(action === permission.action || permission.action === '*')) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
// No overlap (e.g., testing /users for /bots permission)
|
|
49
|
+
else if (pathElements[0] !== permissionElements[0]) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
if (permission.allow) {
|
|
53
|
+
for (let i = 0; i < permissionElements.length; i++) {
|
|
54
|
+
const permissionElement = permissionElements[i];
|
|
55
|
+
const pathElement = pathElements.shift();
|
|
56
|
+
if (pathElement) {
|
|
57
|
+
// Permission path does not apply
|
|
58
|
+
if (permissionElement !== pathElement && permissionElement !== '*') {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
// Path matches but action is not permitted
|
|
62
|
+
else if (action !== permission.action && permission.action !== '*') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Permission only allows access at deeper level
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
let response = true;
|
|
75
|
+
for (let i = 0; i < permissionElements.length; i++) {
|
|
76
|
+
const permissionElement = permissionElements[i];
|
|
77
|
+
const pathElement = pathElements.shift();
|
|
78
|
+
if ((permissionElement === pathElement || permissionElement === '*') &&
|
|
79
|
+
(action === permission.action || permission.action === '*')) {
|
|
80
|
+
response = false;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
response = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return response;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Helper to create permission checks for specific resources
|
|
91
|
+
* Useful for UI components that need to check multiple actions
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const botAccess = createAccessChecker('/bots/123', permissions);
|
|
96
|
+
*
|
|
97
|
+
* return (
|
|
98
|
+
* <div>
|
|
99
|
+
* {botAccess('GET') && <ViewButton />}
|
|
100
|
+
* {botAccess('PUT') && <EditButton />}
|
|
101
|
+
* {botAccess('DELETE') && <DeleteButton />}
|
|
102
|
+
* </div>
|
|
103
|
+
* );
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
const createAccessChecker = (path, permissions) => {
|
|
107
|
+
return (action) => (0, exports.hasAccess)(path, action, permissions);
|
|
108
|
+
};
|
|
109
|
+
exports.createAccessChecker = createAccessChecker;
|
|
110
|
+
/**
|
|
111
|
+
* Hook-friendly permission checker factory
|
|
112
|
+
* Memoizes permission checks for a resource
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* function BotActions({ botId, permissions }) {
|
|
117
|
+
* const can = useAccessChecker(`/bots/${botId}`, permissions);
|
|
118
|
+
*
|
|
119
|
+
* return (
|
|
120
|
+
* <div>
|
|
121
|
+
* {can.read && <ViewButton />}
|
|
122
|
+
* {can.update && <EditButton />}
|
|
123
|
+
* {can.delete && <DeleteButton />}
|
|
124
|
+
* </div>
|
|
125
|
+
* );
|
|
126
|
+
* }
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
const createRestAccessChecker = (path, permissions) => {
|
|
130
|
+
return {
|
|
131
|
+
read: (0, exports.hasAccess)(path, 'GET', permissions),
|
|
132
|
+
create: (0, exports.hasAccess)(path, 'POST', permissions),
|
|
133
|
+
update: (0, exports.hasAccess)(path, 'PUT', permissions),
|
|
134
|
+
delete: (0, exports.hasAccess)(path, 'DELETE', permissions),
|
|
135
|
+
patch: (0, exports.hasAccess)(path, 'PATCH', permissions),
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
exports.createRestAccessChecker = createRestAccessChecker;
|
|
139
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/shared/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Object
|
|
3
|
+
*/
|
|
4
|
+
export interface Permission {
|
|
5
|
+
path: string;
|
|
6
|
+
action: string;
|
|
7
|
+
allow: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Check if user has access to a resource
|
|
11
|
+
* Client-side version of the server's permit() function
|
|
12
|
+
*
|
|
13
|
+
* @param path - the path to resource (e.g., "/bots/123/properties")
|
|
14
|
+
* @param action - HTTP method or action (e.g., "GET", "POST", "DELETE")
|
|
15
|
+
* @param permissions - array of user permissions
|
|
16
|
+
* @returns true if permitted, false otherwise
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const permissions = authResponse.permissions;
|
|
21
|
+
*
|
|
22
|
+
* if (hasAccess('/bots/123', 'DELETE', permissions)) {
|
|
23
|
+
* // Show delete button
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const hasAccess: (path: string, action: string, permissions: Permission[]) => boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Helper to create permission checks for specific resources
|
|
30
|
+
* Useful for UI components that need to check multiple actions
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const botAccess = createAccessChecker('/bots/123', permissions);
|
|
35
|
+
*
|
|
36
|
+
* return (
|
|
37
|
+
* <div>
|
|
38
|
+
* {botAccess('GET') && <ViewButton />}
|
|
39
|
+
* {botAccess('PUT') && <EditButton />}
|
|
40
|
+
* {botAccess('DELETE') && <DeleteButton />}
|
|
41
|
+
* </div>
|
|
42
|
+
* );
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare const createAccessChecker: (path: string, permissions: Permission[]) => (action: string) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Hook-friendly permission checker factory
|
|
48
|
+
* Memoizes permission checks for a resource
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* function BotActions({ botId, permissions }) {
|
|
53
|
+
* const can = useAccessChecker(`/bots/${botId}`, permissions);
|
|
54
|
+
*
|
|
55
|
+
* return (
|
|
56
|
+
* <div>
|
|
57
|
+
* {can.read && <ViewButton />}
|
|
58
|
+
* {can.update && <EditButton />}
|
|
59
|
+
* {can.delete && <DeleteButton />}
|
|
60
|
+
* </div>
|
|
61
|
+
* );
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare const createRestAccessChecker: (path: string, permissions: Permission[]) => {
|
|
66
|
+
read: boolean;
|
|
67
|
+
create: boolean;
|
|
68
|
+
update: boolean;
|
|
69
|
+
delete: boolean;
|
|
70
|
+
patch: boolean;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/shared/permissions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,SACd,MAAM,UACJ,MAAM,eACD,UAAU,EAAE,KACxB,OAcF,CAAC;AAoEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,SACxB,MAAM,eACC,UAAU,EAAE,cAET,MAAM,YACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,uBAAuB,SAC5B,MAAM,eACC,UAAU,EAAE;;;;;;CAS1B,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if user has access to a resource
|
|
3
|
+
* Client-side version of the server's permit() function
|
|
4
|
+
*
|
|
5
|
+
* @param path - the path to resource (e.g., "/bots/123/properties")
|
|
6
|
+
* @param action - HTTP method or action (e.g., "GET", "POST", "DELETE")
|
|
7
|
+
* @param permissions - array of user permissions
|
|
8
|
+
* @returns true if permitted, false otherwise
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const permissions = authResponse.permissions;
|
|
13
|
+
*
|
|
14
|
+
* if (hasAccess('/bots/123', 'DELETE', permissions)) {
|
|
15
|
+
* // Show delete button
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const hasAccess = (path, action, permissions) => {
|
|
20
|
+
let allowed = false;
|
|
21
|
+
for (const permission of permissions) {
|
|
22
|
+
const given = checkPermission(path, action.toLowerCase(), permission);
|
|
23
|
+
if (!permission.allow && given === false) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
else if (permission.allow && given === true) {
|
|
27
|
+
allowed = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return allowed;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Check a single permission against a path and action
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
const checkPermission = (path, action, permission) => {
|
|
37
|
+
const pathElements = path.substring(1).split('/');
|
|
38
|
+
const permissionElements = permission.path.substring(1).split('/');
|
|
39
|
+
// Root wildcard match
|
|
40
|
+
if (permissionElements[0] === '*' &&
|
|
41
|
+
(action === permission.action || permission.action === '*')) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
// No overlap (e.g., testing /users for /bots permission)
|
|
45
|
+
else if (pathElements[0] !== permissionElements[0]) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
if (permission.allow) {
|
|
49
|
+
for (let i = 0; i < permissionElements.length; i++) {
|
|
50
|
+
const permissionElement = permissionElements[i];
|
|
51
|
+
const pathElement = pathElements.shift();
|
|
52
|
+
if (pathElement) {
|
|
53
|
+
// Permission path does not apply
|
|
54
|
+
if (permissionElement !== pathElement && permissionElement !== '*') {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
// Path matches but action is not permitted
|
|
58
|
+
else if (action !== permission.action && permission.action !== '*') {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Permission only allows access at deeper level
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
let response = true;
|
|
71
|
+
for (let i = 0; i < permissionElements.length; i++) {
|
|
72
|
+
const permissionElement = permissionElements[i];
|
|
73
|
+
const pathElement = pathElements.shift();
|
|
74
|
+
if ((permissionElement === pathElement || permissionElement === '*') &&
|
|
75
|
+
(action === permission.action || permission.action === '*')) {
|
|
76
|
+
response = false;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
response = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return response;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Helper to create permission checks for specific resources
|
|
87
|
+
* Useful for UI components that need to check multiple actions
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const botAccess = createAccessChecker('/bots/123', permissions);
|
|
92
|
+
*
|
|
93
|
+
* return (
|
|
94
|
+
* <div>
|
|
95
|
+
* {botAccess('GET') && <ViewButton />}
|
|
96
|
+
* {botAccess('PUT') && <EditButton />}
|
|
97
|
+
* {botAccess('DELETE') && <DeleteButton />}
|
|
98
|
+
* </div>
|
|
99
|
+
* );
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export const createAccessChecker = (path, permissions) => {
|
|
103
|
+
return (action) => hasAccess(path, action, permissions);
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Hook-friendly permission checker factory
|
|
107
|
+
* Memoizes permission checks for a resource
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* function BotActions({ botId, permissions }) {
|
|
112
|
+
* const can = useAccessChecker(`/bots/${botId}`, permissions);
|
|
113
|
+
*
|
|
114
|
+
* return (
|
|
115
|
+
* <div>
|
|
116
|
+
* {can.read && <ViewButton />}
|
|
117
|
+
* {can.update && <EditButton />}
|
|
118
|
+
* {can.delete && <DeleteButton />}
|
|
119
|
+
* </div>
|
|
120
|
+
* );
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export const createRestAccessChecker = (path, permissions) => {
|
|
125
|
+
return {
|
|
126
|
+
read: hasAccess(path, 'GET', permissions),
|
|
127
|
+
create: hasAccess(path, 'POST', permissions),
|
|
128
|
+
update: hasAccess(path, 'PUT', permissions),
|
|
129
|
+
delete: hasAccess(path, 'DELETE', permissions),
|
|
130
|
+
patch: hasAccess(path, 'PATCH', permissions),
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/shared/permissions.ts"],"names":[],"mappings":"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"}
|