@mondaydotcomorg/monday-authorization 3.3.0-feature-bashanye-navigate-can-action-in-scope-to-graph-46d4fc5 → 3.3.0-feature-bashanye-navigate-can-action-in-scope-to-graph-9ad5fa5
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/authorization-service.d.ts +0 -8
- package/dist/authorization-service.d.ts.map +1 -1
- package/dist/authorization-service.js +30 -161
- package/dist/clients/graph-api.client.d.ts +24 -0
- package/dist/clients/graph-api.client.d.ts.map +1 -0
- package/dist/clients/graph-api.client.js +102 -0
- package/dist/clients/platform-api.client.d.ts +31 -0
- package/dist/clients/platform-api.client.d.ts.map +1 -0
- package/dist/clients/platform-api.client.js +86 -0
- package/dist/esm/authorization-service.d.ts +0 -8
- package/dist/esm/authorization-service.d.ts.map +1 -1
- package/dist/esm/authorization-service.mjs +31 -156
- package/dist/esm/clients/graph-api.client.d.ts +24 -0
- package/dist/esm/clients/graph-api.client.d.ts.map +1 -0
- package/dist/esm/clients/graph-api.client.mjs +100 -0
- package/dist/esm/clients/platform-api.client.d.ts +31 -0
- package/dist/esm/clients/platform-api.client.d.ts.map +1 -0
- package/dist/esm/clients/platform-api.client.mjs +84 -0
- package/dist/esm/prometheus-service.d.ts +3 -3
- package/dist/esm/prometheus-service.d.ts.map +1 -1
- package/dist/esm/prometheus-service.mjs +65 -3
- package/dist/esm/testKit/index.d.ts.map +1 -1
- package/dist/esm/testKit/index.mjs +9 -7
- package/dist/esm/types/graph-api.types.d.ts +11 -0
- package/dist/esm/types/graph-api.types.d.ts.map +1 -0
- package/dist/esm/types/graph-api.types.mjs +1 -0
- package/dist/esm/utils/authorization.utils.d.ts +22 -0
- package/dist/esm/utils/authorization.utils.d.ts.map +1 -0
- package/dist/esm/utils/authorization.utils.mjs +39 -0
- package/dist/prometheus-service.d.ts +3 -3
- package/dist/prometheus-service.d.ts.map +1 -1
- package/dist/prometheus-service.js +65 -3
- package/dist/testKit/index.d.ts.map +1 -1
- package/dist/testKit/index.js +9 -7
- package/dist/types/graph-api.types.d.ts +11 -0
- package/dist/types/graph-api.types.d.ts.map +1 -0
- package/dist/types/graph-api.types.js +1 -0
- package/dist/utils/authorization.utils.d.ts +22 -0
- package/dist/utils/authorization.utils.d.ts.map +1 -0
- package/dist/utils/authorization.utils.js +49 -0
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ScopeOptions } from '../types/scoped-actions-contracts';
|
|
2
|
+
import { ResourceType, ResourceId } from '../types/graph-api.types';
|
|
3
|
+
export type CamelCase<S extends string> = S extends `${infer F}_${infer R}` ? `${F}${Capitalize<CamelCase<R>>}` : S;
|
|
4
|
+
export type CamelCaseKeys<T> = T extends object ? {
|
|
5
|
+
[K in keyof T as K extends string ? CamelCase<K> : K]: CamelCaseKeys<T[K]>;
|
|
6
|
+
} : T;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a scope object to resource type and resource ID
|
|
9
|
+
*/
|
|
10
|
+
export declare function scopeToResource(scope: ScopeOptions): {
|
|
11
|
+
resourceType: ResourceType;
|
|
12
|
+
resourceId: ResourceId;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Converts object keys from snake_case to camelCase
|
|
16
|
+
*/
|
|
17
|
+
export declare function toCamelCase<T extends object>(obj: T): CamelCaseKeys<T>;
|
|
18
|
+
/**
|
|
19
|
+
* Converts object keys from camelCase to snake_case
|
|
20
|
+
*/
|
|
21
|
+
export declare function toSnakeCase<T extends object>(obj: T): Record<string, any>;
|
|
22
|
+
//# sourceMappingURL=authorization.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/authorization.utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC3C;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC9E,CAAC,CAAC;AAEN;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAiB3G;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEzE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import snakeCase from 'lodash/snakeCase.js';
|
|
2
|
+
import camelCase from 'lodash/camelCase.js';
|
|
3
|
+
import mapKeys from 'lodash/mapKeys.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Converts a scope object to resource type and resource ID
|
|
7
|
+
*/
|
|
8
|
+
function scopeToResource(scope) {
|
|
9
|
+
if ('workspaceId' in scope) {
|
|
10
|
+
return { resourceType: 'workspace', resourceId: scope.workspaceId };
|
|
11
|
+
}
|
|
12
|
+
if ('boardId' in scope) {
|
|
13
|
+
return { resourceType: 'board', resourceId: scope.boardId };
|
|
14
|
+
}
|
|
15
|
+
if ('pulseId' in scope) {
|
|
16
|
+
return { resourceType: 'pulse', resourceId: scope.pulseId };
|
|
17
|
+
}
|
|
18
|
+
if ('accountProductId' in scope) {
|
|
19
|
+
return { resourceType: 'account_product', resourceId: scope.accountProductId };
|
|
20
|
+
}
|
|
21
|
+
if ('accountId' in scope) {
|
|
22
|
+
return { resourceType: 'account', resourceId: scope.accountId };
|
|
23
|
+
}
|
|
24
|
+
throw new Error('Unsupported scope provided');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Converts object keys from snake_case to camelCase
|
|
28
|
+
*/
|
|
29
|
+
function toCamelCase(obj) {
|
|
30
|
+
return mapKeys(obj, (_, key) => camelCase(key));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Converts object keys from camelCase to snake_case
|
|
34
|
+
*/
|
|
35
|
+
function toSnakeCase(obj) {
|
|
36
|
+
return mapKeys(obj, (_, key) => snakeCase(key));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { scopeToResource, toCamelCase, toSnakeCase };
|
|
@@ -7,7 +7,7 @@ export declare const METRICS: {
|
|
|
7
7
|
export declare function setPrometheus(customPrometheus: any): void;
|
|
8
8
|
export declare function getMetricsManager(): any;
|
|
9
9
|
export declare function sendAuthorizationCheckResponseTimeMetric(resourceType: string, action: Action, isAuthorized: boolean, responseStatus: number, time: number, apiType?: 'platform' | 'graph'): void;
|
|
10
|
-
export declare function incrementAuthorizationSuccess(
|
|
11
|
-
export declare function incrementAuthorizationError(
|
|
12
|
-
export declare function setGraphAvailability(
|
|
10
|
+
export declare function incrementAuthorizationSuccess(resourceType: string, action: Action): void;
|
|
11
|
+
export declare function incrementAuthorizationError(resourceType: string, action: Action, statusCode: number): void;
|
|
12
|
+
export declare function setGraphAvailability(isAvailable: boolean): void;
|
|
13
13
|
//# sourceMappingURL=prometheus-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prometheus-service.d.ts","sourceRoot":"","sources":["../src/prometheus-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"prometheus-service.d.ts","sourceRoot":"","sources":["../src/prometheus-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAQzC,eAAO,MAAM,OAAO;;;;CAInB,CAAC;AAQF,wBAAgB,aAAa,CAAC,gBAAgB,KAAA,QAsB7C;AAED,wBAAgB,iBAAiB,QAEhC;AAED,wBAAgB,wCAAwC,CACtD,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,UAAU,GAAG,OAAoB,QAW3C;AAoBD,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAQjF;AAED,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAQnG;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,OAAO,QAQxD"}
|
|
@@ -2,6 +2,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2
2
|
|
|
3
3
|
let prometheus = null;
|
|
4
4
|
let authorizationCheckResponseTimeMetric = null;
|
|
5
|
+
let authorizationSuccessMetric = null;
|
|
6
|
+
let authorizationErrorMetric = null;
|
|
7
|
+
let graphAvailabilityMetric = null;
|
|
5
8
|
const METRICS = {
|
|
6
9
|
AUTHORIZATION_CHECK: 'authorization_check',
|
|
7
10
|
AUTHORIZATION_CHECKS_PER_REQUEST: 'authorization_checks_per_request',
|
|
@@ -16,12 +19,16 @@ function setPrometheus(customPrometheus) {
|
|
|
16
19
|
prometheus = customPrometheus;
|
|
17
20
|
if (!prometheus) {
|
|
18
21
|
authorizationCheckResponseTimeMetric = null;
|
|
22
|
+
authorizationSuccessMetric = null;
|
|
23
|
+
authorizationErrorMetric = null;
|
|
24
|
+
graphAvailabilityMetric = null;
|
|
19
25
|
return;
|
|
20
26
|
}
|
|
21
27
|
const { METRICS_TYPES } = prometheus;
|
|
22
28
|
const metricsManager = getMetricsManager();
|
|
23
29
|
if (metricsManager) {
|
|
24
30
|
authorizationCheckResponseTimeMetric = metricsManager.addMetric(METRICS_TYPES.SUMMARY, authorizationCheckResponseTimeMetricConfig.name, authorizationCheckResponseTimeMetricConfig.labels, authorizationCheckResponseTimeMetricConfig.description);
|
|
31
|
+
initializeAdditionalMetrics();
|
|
25
32
|
}
|
|
26
33
|
}
|
|
27
34
|
function getMetricsManager() {
|
|
@@ -39,9 +46,64 @@ function sendAuthorizationCheckResponseTimeMetric(resourceType, action, isAuthor
|
|
|
39
46
|
// ignore
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
49
|
+
const authorizationSuccessMetricConfig = {
|
|
50
|
+
name: 'authorization_success_total',
|
|
51
|
+
labels: ['resourceType', 'action'],
|
|
52
|
+
description: 'Total number of successful authorization checks',
|
|
53
|
+
};
|
|
54
|
+
const authorizationErrorMetricConfig = {
|
|
55
|
+
name: 'authorization_error_total',
|
|
56
|
+
labels: ['resourceType', 'action', 'statusCode'],
|
|
57
|
+
description: 'Total number of authorization errors',
|
|
58
|
+
};
|
|
59
|
+
const graphAvailabilityMetricConfig = {
|
|
60
|
+
name: 'graph_api_availability',
|
|
61
|
+
labels: ['available'],
|
|
62
|
+
description: 'Graph API availability status',
|
|
63
|
+
};
|
|
64
|
+
function incrementAuthorizationSuccess(resourceType, action) {
|
|
65
|
+
try {
|
|
66
|
+
if (authorizationSuccessMetric) {
|
|
67
|
+
authorizationSuccessMetric.labels(resourceType, action).inc();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
// ignore
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function incrementAuthorizationError(resourceType, action, statusCode) {
|
|
75
|
+
try {
|
|
76
|
+
if (authorizationErrorMetric) {
|
|
77
|
+
authorizationErrorMetric.labels(resourceType, action, statusCode).inc();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
// ignore
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function setGraphAvailability(isAvailable) {
|
|
85
|
+
try {
|
|
86
|
+
if (graphAvailabilityMetric) {
|
|
87
|
+
graphAvailabilityMetric.labels(isAvailable ? 'true' : 'false').set(isAvailable ? 1 : 0);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
// ignore
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Initialize additional metrics when prometheus is set
|
|
95
|
+
function initializeAdditionalMetrics() {
|
|
96
|
+
if (!prometheus) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const { METRICS_TYPES } = prometheus;
|
|
100
|
+
const metricsManager = getMetricsManager();
|
|
101
|
+
if (metricsManager) {
|
|
102
|
+
authorizationSuccessMetric = metricsManager.addMetric(METRICS_TYPES.COUNTER, authorizationSuccessMetricConfig.name, authorizationSuccessMetricConfig.labels, authorizationSuccessMetricConfig.description);
|
|
103
|
+
authorizationErrorMetric = metricsManager.addMetric(METRICS_TYPES.COUNTER, authorizationErrorMetricConfig.name, authorizationErrorMetricConfig.labels, authorizationErrorMetricConfig.description);
|
|
104
|
+
graphAvailabilityMetric = metricsManager.addMetric(METRICS_TYPES.GAUGE, graphAvailabilityMetricConfig.name, graphAvailabilityMetricConfig.labels, graphAvailabilityMetricConfig.description);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
45
107
|
|
|
46
108
|
exports.METRICS = METRICS;
|
|
47
109
|
exports.getMetricsManager = getMetricsManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testKit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG9G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,EAAE,QAAQ,MAAM,EAAE,WAAW,QAAQ,EAAE,EAAE,QAAQ,MAAM,SAE9G,CAAC;AAEF,eAAO,MAAM,yBAAyB,YAErC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testKit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG9G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,EAAE,QAAQ,MAAM,EAAE,WAAW,QAAQ,EAAE,EAAE,QAAQ,MAAM,SAE9G,CAAC;AAEF,eAAO,MAAM,yBAAyB,YAErC,CAAC;AA4BF,eAAO,MAAM,8BAA8B,GACzC,QAAQ,MAAM,EACd,gBAAgB,cAAc,EAC9B,gBAAgB,aAAa,MAG3B,SAAS,WAAW,EACpB,UAAU,YAAY,EACtB,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAYhB,CAAC"}
|
package/dist/testKit/index.js
CHANGED
|
@@ -11,18 +11,20 @@ const clearTestPermittedActions = () => {
|
|
|
11
11
|
testPermittedActions = [];
|
|
12
12
|
};
|
|
13
13
|
const isActionAuthorized = (accountId, userId, resources, action) => {
|
|
14
|
+
// If no resources to check, deny access
|
|
15
|
+
if (resources.length === 0) {
|
|
16
|
+
return { isAuthorized: false };
|
|
17
|
+
}
|
|
14
18
|
return {
|
|
15
|
-
isAuthorized: resources.every(
|
|
19
|
+
isAuthorized: resources.every(resource => {
|
|
16
20
|
return testPermittedActions.some(combination => {
|
|
17
21
|
return (combination.accountId === accountId &&
|
|
18
22
|
combination.userId === userId &&
|
|
19
23
|
combination.action === action &&
|
|
20
24
|
combination.resources.some(combinationResource => {
|
|
21
|
-
return
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
JSON.stringify(combinationResource.wrapperData) === JSON.stringify(resource.wrapperData));
|
|
25
|
-
});
|
|
25
|
+
return (combinationResource.id === resource.id &&
|
|
26
|
+
combinationResource.type === resource.type &&
|
|
27
|
+
JSON.stringify(combinationResource.wrapperData) === JSON.stringify(resource.wrapperData));
|
|
26
28
|
}));
|
|
27
29
|
});
|
|
28
30
|
}),
|
|
@@ -34,11 +36,11 @@ const getTestAuthorizationMiddleware = (action, resourceGetter, contextGetter) =
|
|
|
34
36
|
const { userId, accountId } = contextGetter(request);
|
|
35
37
|
const resources = resourceGetter(request);
|
|
36
38
|
const { isAuthorized } = isActionAuthorized(accountId, userId, resources, action);
|
|
37
|
-
authorizationInternalService.AuthorizationInternalService.markAuthorized(request);
|
|
38
39
|
if (!isAuthorized) {
|
|
39
40
|
response.status(403).json({ message: 'Access denied' });
|
|
40
41
|
return;
|
|
41
42
|
}
|
|
43
|
+
authorizationInternalService.AuthorizationInternalService.markAuthorized(request);
|
|
42
44
|
next();
|
|
43
45
|
};
|
|
44
46
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ResourceType = string;
|
|
2
|
+
export type ResourceId = number;
|
|
3
|
+
export type ActionName = string;
|
|
4
|
+
export type GraphIsAllowedDto = Record<ResourceType, Record<ResourceId, ActionName[]>>;
|
|
5
|
+
export type GraphPermissionResult = {
|
|
6
|
+
can: boolean;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
export type GraphPermissionResults = Record<ActionName, GraphPermissionResult>;
|
|
10
|
+
export type GraphIsAllowedResponse = Record<ResourceType, Record<string, GraphPermissionResults>>;
|
|
11
|
+
//# sourceMappingURL=graph-api.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-api.types.d.ts","sourceRoot":"","sources":["../../src/types/graph-api.types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAClC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAChC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAEvF,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;AAI/E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ScopeOptions } from '../types/scoped-actions-contracts';
|
|
2
|
+
import { ResourceType, ResourceId } from '../types/graph-api.types';
|
|
3
|
+
export type CamelCase<S extends string> = S extends `${infer F}_${infer R}` ? `${F}${Capitalize<CamelCase<R>>}` : S;
|
|
4
|
+
export type CamelCaseKeys<T> = T extends object ? {
|
|
5
|
+
[K in keyof T as K extends string ? CamelCase<K> : K]: CamelCaseKeys<T[K]>;
|
|
6
|
+
} : T;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a scope object to resource type and resource ID
|
|
9
|
+
*/
|
|
10
|
+
export declare function scopeToResource(scope: ScopeOptions): {
|
|
11
|
+
resourceType: ResourceType;
|
|
12
|
+
resourceId: ResourceId;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Converts object keys from snake_case to camelCase
|
|
16
|
+
*/
|
|
17
|
+
export declare function toCamelCase<T extends object>(obj: T): CamelCaseKeys<T>;
|
|
18
|
+
/**
|
|
19
|
+
* Converts object keys from camelCase to snake_case
|
|
20
|
+
*/
|
|
21
|
+
export declare function toSnakeCase<T extends object>(obj: T): Record<string, any>;
|
|
22
|
+
//# sourceMappingURL=authorization.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.utils.d.ts","sourceRoot":"","sources":["../../src/utils/authorization.utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC3C;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC9E,CAAC,CAAC;AAEN;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAiB3G;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEzE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const snakeCase = require('lodash/snakeCase.js');
|
|
4
|
+
const camelCase = require('lodash/camelCase.js');
|
|
5
|
+
const mapKeys = require('lodash/mapKeys.js');
|
|
6
|
+
|
|
7
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
8
|
+
|
|
9
|
+
const snakeCase__default = /*#__PURE__*/_interopDefault(snakeCase);
|
|
10
|
+
const camelCase__default = /*#__PURE__*/_interopDefault(camelCase);
|
|
11
|
+
const mapKeys__default = /*#__PURE__*/_interopDefault(mapKeys);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Converts a scope object to resource type and resource ID
|
|
15
|
+
*/
|
|
16
|
+
function scopeToResource(scope) {
|
|
17
|
+
if ('workspaceId' in scope) {
|
|
18
|
+
return { resourceType: 'workspace', resourceId: scope.workspaceId };
|
|
19
|
+
}
|
|
20
|
+
if ('boardId' in scope) {
|
|
21
|
+
return { resourceType: 'board', resourceId: scope.boardId };
|
|
22
|
+
}
|
|
23
|
+
if ('pulseId' in scope) {
|
|
24
|
+
return { resourceType: 'pulse', resourceId: scope.pulseId };
|
|
25
|
+
}
|
|
26
|
+
if ('accountProductId' in scope) {
|
|
27
|
+
return { resourceType: 'account_product', resourceId: scope.accountProductId };
|
|
28
|
+
}
|
|
29
|
+
if ('accountId' in scope) {
|
|
30
|
+
return { resourceType: 'account', resourceId: scope.accountId };
|
|
31
|
+
}
|
|
32
|
+
throw new Error('Unsupported scope provided');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Converts object keys from snake_case to camelCase
|
|
36
|
+
*/
|
|
37
|
+
function toCamelCase(obj) {
|
|
38
|
+
return mapKeys__default.default(obj, (_, key) => camelCase__default.default(key));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Converts object keys from camelCase to snake_case
|
|
42
|
+
*/
|
|
43
|
+
function toSnakeCase(obj) {
|
|
44
|
+
return mapKeys__default.default(obj, (_, key) => snakeCase__default.default(key));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
exports.scopeToResource = scopeToResource;
|
|
48
|
+
exports.toCamelCase = toCamelCase;
|
|
49
|
+
exports.toSnakeCase = toSnakeCase;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondaydotcomorg/monday-authorization",
|
|
3
|
-
"version": "3.3.0-feature-bashanye-navigate-can-action-in-scope-to-graph-
|
|
3
|
+
"version": "3.3.0-feature-bashanye-navigate-can-action-in-scope-to-graph-9ad5fa5",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "BSD-3-Clause",
|