@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.
@@ -8,4 +8,5 @@ export * from './commands/test_data';
8
8
  export * from './commands/requests';
9
9
  export * from './commands/analytics';
10
10
  export * from './shared/types';
11
+ export * from './shared/permissions';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -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
@@ -8,4 +8,5 @@ export * from './commands/test_data';
8
8
  export * from './commands/requests';
9
9
  export * from './commands/analytics';
10
10
  export * from './shared/types';
11
+ export * from './shared/permissions';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -8,4 +8,5 @@ export * from './commands/test_data';
8
8
  export * from './commands/requests';
9
9
  export * from './commands/analytics';
10
10
  export * from './shared/types';
11
+ export * from './shared/permissions';
11
12
  //# sourceMappingURL=index.js.map
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hexagramio/saga-ts",
3
- "version": "0.9.589-0",
3
+ "version": "0.9.590-0",
4
4
  "description": "Saga SDK",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",