@frontegg/entitlements-javascript-commons 1.0.0-alpha.14 → 1.0.0-alpha.16
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/index.d.ts +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/operations/date/sanitizers.js +7 -3
- package/dist/operations/date/sanitizers.js.map +1 -1
- package/dist/user-entitlements/index.d.ts +1 -0
- package/dist/user-entitlements/index.js +1 -0
- package/dist/user-entitlements/index.js.map +1 -1
- package/dist/user-entitlements/is-entitled.evaluator.js +3 -2
- package/dist/user-entitlements/is-entitled.evaluator.js.map +1 -1
- package/dist/user-entitlements/permissions.utils.d.ts +2 -0
- package/dist/user-entitlements/permissions.utils.js +11 -0
- package/dist/user-entitlements/permissions.utils.js.map +1 -0
- package/dist/user-entitlements/types.d.ts +2 -1
- package/docs/CHANGELOG.md +14 -0
- package/package.json +1 -1
- package/src/index.ts +2 -0
- package/src/operations/date/sanitizers.ts +8 -3
- package/src/user-entitlements/index.ts +1 -0
- package/src/user-entitlements/is-entitled.evaluator.ts +3 -3
- package/src/user-entitlements/permissions.utils.ts +10 -0
- package/src/user-entitlements/tests/permissions.utils.spec.ts +21 -0
- package/src/user-entitlements/types.ts +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,4 @@ export { FeatureFlagEvaluationResult, FeatureFlag, evaluateFeatureFlag } from '.
|
|
|
2
2
|
export { TreatmentEnum, Rule } from './rules';
|
|
3
3
|
export { Condition } from './conditions';
|
|
4
4
|
export { OperationEnum, ConditionValue } from './operations/types';
|
|
5
|
-
export { evaluateIsEntitledToFeature, evaluateIsEntitledToPermissions, prepareAttributes, JwtAttributes, CustomAttributes, FronteggAttributes, NotEntitledJustification, UserEntitlementsContext, EntitlementResult, Attributes, } from './user-entitlements';
|
|
5
|
+
export { evaluateIsEntitledToFeature, evaluateIsEntitledToPermissions, prepareAttributes, checkPermission, Permissions, JwtAttributes, CustomAttributes, FronteggAttributes, NotEntitledJustification, UserEntitlementsContext, EntitlementResult, Attributes, } from './user-entitlements';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NotEntitledJustification = exports.prepareAttributes = exports.evaluateIsEntitledToPermissions = exports.evaluateIsEntitledToFeature = exports.OperationEnum = exports.TreatmentEnum = exports.evaluateFeatureFlag = void 0;
|
|
3
|
+
exports.NotEntitledJustification = exports.checkPermission = exports.prepareAttributes = exports.evaluateIsEntitledToPermissions = exports.evaluateIsEntitledToFeature = exports.OperationEnum = exports.TreatmentEnum = exports.evaluateFeatureFlag = void 0;
|
|
4
4
|
var feature_flags_1 = require("./feature-flags");
|
|
5
5
|
Object.defineProperty(exports, "evaluateFeatureFlag", { enumerable: true, get: function () { return feature_flags_1.evaluateFeatureFlag; } });
|
|
6
6
|
var rules_1 = require("./rules");
|
|
@@ -11,5 +11,6 @@ var user_entitlements_1 = require("./user-entitlements");
|
|
|
11
11
|
Object.defineProperty(exports, "evaluateIsEntitledToFeature", { enumerable: true, get: function () { return user_entitlements_1.evaluateIsEntitledToFeature; } });
|
|
12
12
|
Object.defineProperty(exports, "evaluateIsEntitledToPermissions", { enumerable: true, get: function () { return user_entitlements_1.evaluateIsEntitledToPermissions; } });
|
|
13
13
|
Object.defineProperty(exports, "prepareAttributes", { enumerable: true, get: function () { return user_entitlements_1.prepareAttributes; } });
|
|
14
|
+
Object.defineProperty(exports, "checkPermission", { enumerable: true, get: function () { return user_entitlements_1.checkPermission; } });
|
|
14
15
|
Object.defineProperty(exports, "NotEntitledJustification", { enumerable: true, get: function () { return user_entitlements_1.NotEntitledJustification; } });
|
|
15
16
|
//# 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,iDAAgG;AAA7C,oHAAA,mBAAmB,OAAA;AACtE,iCAA8C;AAArC,sGAAA,aAAa,OAAA;AAEtB,4CAAmE;AAA1D,sGAAA,aAAa,OAAA;AACtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgG;AAA7C,oHAAA,mBAAmB,OAAA;AACtE,iCAA8C;AAArC,sGAAA,aAAa,OAAA;AAEtB,4CAAmE;AAA1D,sGAAA,aAAa,OAAA;AACtB,yDAa6B;AAZ3B,gIAAA,2BAA2B,OAAA;AAC3B,oIAAA,+BAA+B,OAAA;AAC/B,sHAAA,iBAAiB,OAAA;AACjB,oHAAA,eAAe,OAAA;AAKf,6HAAA,wBAAwB,OAAA"}
|
|
@@ -18,7 +18,11 @@ const sanitizeSingleDate = (value) => {
|
|
|
18
18
|
};
|
|
19
19
|
exports.sanitizeSingleDate = sanitizeSingleDate;
|
|
20
20
|
const sanitizeDateRange = (value) => {
|
|
21
|
-
const
|
|
21
|
+
const sanitizedStartValue = value.start ? (0, exports.sanitizeDateValue)(value.start) : undefined;
|
|
22
|
+
const sanitizedEndValue = value.end ? (0, exports.sanitizeDateValue)(value.end) : undefined;
|
|
23
|
+
const sanitizedValue = sanitizedStartValue && sanitizedEndValue && (0, exports.isValidDate)(sanitizedStartValue) && (0, exports.isValidDate)(sanitizedEndValue)
|
|
24
|
+
? { start: sanitizedStartValue, end: sanitizedEndValue }
|
|
25
|
+
: undefined;
|
|
22
26
|
return {
|
|
23
27
|
isSanitized: !!sanitizedValue,
|
|
24
28
|
sanitizedValue,
|
|
@@ -27,8 +31,8 @@ const sanitizeDateRange = (value) => {
|
|
|
27
31
|
exports.sanitizeDateRange = sanitizeDateRange;
|
|
28
32
|
exports.DateSanitizersMapper = {
|
|
29
33
|
[types_1.OperationEnum.On]: exports.sanitizeSingleDate,
|
|
30
|
-
[types_1.OperationEnum.OnOrAfter]: exports.
|
|
34
|
+
[types_1.OperationEnum.OnOrAfter]: exports.sanitizeSingleDate,
|
|
31
35
|
[types_1.OperationEnum.OnOrBefore]: exports.sanitizeSingleDate,
|
|
32
|
-
[types_1.OperationEnum.BetweenDate]: exports.
|
|
36
|
+
[types_1.OperationEnum.BetweenDate]: exports.sanitizeDateRange,
|
|
33
37
|
};
|
|
34
38
|
//# sourceMappingURL=sanitizers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizers.js","sourceRoot":"","sources":["../../../src/operations/date/sanitizers.ts"],"names":[],"mappings":";;;AAAA,oCAAsE;AAK/D,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAQ,EAAE;IACvE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAEK,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,KAA0B,CAAC,CAAC;AAAvG,QAAA,WAAW,eAA4F;AAE7G,MAAM,kBAAkB,GAA0C,CAAC,KAAK,EAAE,EAAE;IACjF,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,IAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,MAAM,cAAc,GAClB,kBAAkB,IAAI,IAAA,mBAAW,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnG,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,cAAc;QAC7B,cAAc;KACf,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,kBAAkB,sBAS7B;AAEK,MAAM,iBAAiB,GAA2C,CAAC,KAAK,EAAE,EAAE;IACjF,MAAM,
|
|
1
|
+
{"version":3,"file":"sanitizers.js","sourceRoot":"","sources":["../../../src/operations/date/sanitizers.ts"],"names":[],"mappings":";;;AAAA,oCAAsE;AAK/D,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAQ,EAAE;IACvE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAEK,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,KAA0B,CAAC,CAAC;AAAvG,QAAA,WAAW,eAA4F;AAE7G,MAAM,kBAAkB,GAA0C,CAAC,KAAK,EAAE,EAAE;IACjF,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,IAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,MAAM,cAAc,GAClB,kBAAkB,IAAI,IAAA,mBAAW,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnG,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,cAAc;QAC7B,cAAc;KACf,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,kBAAkB,sBAS7B;AAEK,MAAM,iBAAiB,GAA2C,CAAC,KAAK,EAAE,EAAE;IACjF,MAAM,mBAAmB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,KAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,MAAM,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,GAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,cAAc,GAClB,mBAAmB,IAAI,iBAAiB,IAAI,IAAA,mBAAW,EAAC,mBAAmB,CAAC,IAAI,IAAA,mBAAW,EAAC,iBAAiB,CAAC;QAC5G,CAAC,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,iBAAiB,EAAE;QACxD,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,cAAc;QAC7B,cAAc;KACf,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,iBAAiB,qBAY5B;AAEW,QAAA,oBAAoB,GAA2C;IAC1E,CAAC,qBAAa,CAAC,EAAE,CAAC,EAAE,0BAAkB;IACtC,CAAC,qBAAa,CAAC,SAAS,CAAC,EAAE,0BAAkB;IAC7C,CAAC,qBAAa,CAAC,UAAU,CAAC,EAAE,0BAAkB;IAC9C,CAAC,qBAAa,CAAC,WAAW,CAAC,EAAE,yBAAiB;CAC/C,CAAC"}
|
|
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./is-entitled.evaluator"), exports);
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
__exportStar(require("./attributes.utils"), exports);
|
|
20
|
+
__exportStar(require("./permissions.utils"), exports);
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-entitlements/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,0CAAwB;AACxB,qDAAmC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-entitlements/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,0CAAwB;AACxB,qDAAmC;AACnC,sDAAoC"}
|
|
@@ -5,6 +5,7 @@ const types_1 = require("./types");
|
|
|
5
5
|
const feature_flags_1 = require("../feature-flags");
|
|
6
6
|
const attributes_utils_1 = require("./attributes.utils");
|
|
7
7
|
const rules_1 = require("../rules");
|
|
8
|
+
const permissions_utils_1 = require("./permissions.utils");
|
|
8
9
|
function evaluateIsEntitledToFeature(featureKey, userEntitlementsContext, attributes = {}) {
|
|
9
10
|
const feature = userEntitlementsContext.features[featureKey];
|
|
10
11
|
let hasExpired = false;
|
|
@@ -28,8 +29,8 @@ function evaluateIsEntitledToFeature(featureKey, userEntitlementsContext, attrib
|
|
|
28
29
|
}
|
|
29
30
|
exports.evaluateIsEntitledToFeature = evaluateIsEntitledToFeature;
|
|
30
31
|
function evaluateIsEntitledToPermissions(permissionKey, userEntitlementsContext, attributes) {
|
|
31
|
-
const
|
|
32
|
-
if (!
|
|
32
|
+
const hasPermission = (0, permissions_utils_1.checkPermission)(userEntitlementsContext.permissions, permissionKey);
|
|
33
|
+
if (!hasPermission) {
|
|
33
34
|
return { isEntitled: false, justification: types_1.NotEntitledJustification.MISSING_PERMISSION };
|
|
34
35
|
}
|
|
35
36
|
const linkedFeatures = getLinkedFeatures(permissionKey, userEntitlementsContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-entitled.evaluator.js","sourceRoot":"","sources":["../../src/user-entitlements/is-entitled.evaluator.ts"],"names":[],"mappings":";;;AAAA,mCAMiB;AAEjB,oDAAuD;AACvD,yDAAuD;AACvD,oCAAyC;AACzC,SAAgB,2BAA2B,CACzC,UAAkB,EAClB,uBAAgD,EAChD,aAAyB,EAAE;IAE3B,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE;QAC1C,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,0BAAkB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE1F,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;KACF;IAED,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE;QAClC,MAAM,kBAAkB,GAAG,IAAA,oCAAiB,EAAC,UAAU,CAAC,CAAC;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,mCAAmB,EAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACnF,IAAI,SAAS,KAAK,qBAAa,CAAC,IAAI,EAAE;YACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;KACF;IAED,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,gCAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,gCAAwB,CAAC,eAAe;KAC/G,CAAC;AACJ,CAAC;AA3BD,kEA2BC;AAED,SAAgB,+BAA+B,CAC7C,aAAqB,EACrB,uBAAgD,EAChD,UAAuB;IAEvB,MAAM,
|
|
1
|
+
{"version":3,"file":"is-entitled.evaluator.js","sourceRoot":"","sources":["../../src/user-entitlements/is-entitled.evaluator.ts"],"names":[],"mappings":";;;AAAA,mCAMiB;AAEjB,oDAAuD;AACvD,yDAAuD;AACvD,oCAAyC;AACzC,2DAAsD;AACtD,SAAgB,2BAA2B,CACzC,UAAkB,EAClB,uBAAgD,EAChD,aAAyB,EAAE;IAE3B,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE;QAC1C,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,0BAAkB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE1F,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;KACF;IAED,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE;QAClC,MAAM,kBAAkB,GAAG,IAAA,oCAAiB,EAAC,UAAU,CAAC,CAAC;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,mCAAmB,EAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACnF,IAAI,SAAS,KAAK,qBAAa,CAAC,IAAI,EAAE;YACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;KACF;IAED,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,gCAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,gCAAwB,CAAC,eAAe;KAC/G,CAAC;AACJ,CAAC;AA3BD,kEA2BC;AAED,SAAgB,+BAA+B,CAC7C,aAAqB,EACrB,uBAAgD,EAChD,UAAuB;IAEvB,MAAM,aAAa,GAAG,IAAA,mCAAe,EAAC,uBAAuB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1F,IAAI,CAAC,aAAa,EAAE;QAClB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,gCAAwB,CAAC,kBAAkB,EAAE,CAAC;KAC1F;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;IAEjF,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QAC1B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;KAC7B;IAED,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE;QACvC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,2BAA2B,CAAC,UAAU,EAAE,uBAAuB,EAAE,UAAU,CAAC,CAAC;QAEnH,IAAI,UAAU,EAAE;YACd,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;QAED,IAAI,aAAa,KAAK,gCAAwB,CAAC,cAAc,EAAE;YAC7D,UAAU,GAAG,IAAI,CAAC;SACnB;KACF;IAED,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,gCAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,gCAAwB,CAAC,eAAe;KAC/G,CAAC;AACJ,CAAC;AAlCD,0EAkCC;AAED,SAAS,iBAAiB,CAAC,aAAqB,EAAE,uBAAgD;IAChG,OAAO,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CACzE,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CACvF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkPermission = void 0;
|
|
4
|
+
function checkPermission(permissions, requiredPermission) {
|
|
5
|
+
return Object.keys(permissions).some((permissionKey) => createPermissionCheckRegex(permissionKey).test(requiredPermission));
|
|
6
|
+
}
|
|
7
|
+
exports.checkPermission = checkPermission;
|
|
8
|
+
function createPermissionCheckRegex(permissionKey) {
|
|
9
|
+
return new RegExp('^' + permissionKey.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$', 'gs');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=permissions.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.utils.js","sourceRoot":"","sources":["../../src/user-entitlements/permissions.utils.ts"],"names":[],"mappings":";;;AACA,SAAgB,eAAe,CAAC,WAAwB,EAAE,kBAA0B;IAClF,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CACrD,0BAA0B,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CACnE,CAAC;AACJ,CAAC;AAJD,0CAIC;AAED,SAAS,0BAA0B,CAAC,aAAqB;IACvD,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AAChG,CAAC"}
|
|
@@ -5,7 +5,7 @@ export type UserEntitlementsContext = {
|
|
|
5
5
|
linkedPermissions: string[];
|
|
6
6
|
featureFlag?: FeatureFlag;
|
|
7
7
|
}>;
|
|
8
|
-
permissions:
|
|
8
|
+
permissions: Permissions;
|
|
9
9
|
};
|
|
10
10
|
export type EntitlementResult = {
|
|
11
11
|
isEntitled: boolean;
|
|
@@ -23,6 +23,7 @@ export type FronteggAttributes = {
|
|
|
23
23
|
email?: string;
|
|
24
24
|
emailVerified?: boolean;
|
|
25
25
|
};
|
|
26
|
+
export type Permissions = Record<string, true>;
|
|
26
27
|
export type Attributes = {
|
|
27
28
|
custom?: CustomAttributes;
|
|
28
29
|
jwt?: JwtAttributes;
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [1.0.0-alpha.16](https://github.com/frontegg/entitlements-javascript-commons/compare/v-1.0.0-alpha.15...v-1.0.0-alpha.16) (2023-10-30)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **user-entitlements:** introduce wildcard to permission check ([986ba21](https://github.com/frontegg/entitlements-javascript-commons/commit/986ba213cbf88aef99495e3fd6fc2bf1203ec7e6))
|
|
7
|
+
|
|
8
|
+
# [1.0.0-alpha.15](https://github.com/frontegg/entitlements-javascript-commons/compare/v-1.0.0-alpha.14...v-1.0.0-alpha.15) (2023-10-25)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **date:** fix incorrect sanitizers mapping ([#25](https://github.com/frontegg/entitlements-javascript-commons/issues/25)) ([da08f16](https://github.com/frontegg/entitlements-javascript-commons/commit/da08f1628753b1794422c83327670ae09242ec11))
|
|
14
|
+
|
|
1
15
|
# [1.0.0-alpha.14](https://github.com/frontegg/entitlements-javascript-commons/compare/v-1.0.0-alpha.13...v-1.0.0-alpha.14) (2023-10-24)
|
|
2
16
|
|
|
3
17
|
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -21,7 +21,12 @@ export const sanitizeSingleDate: Sanitizer<SingleDateOperationPayload> = (value)
|
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
export const sanitizeDateRange: Sanitizer<BetweenDateOperationPayload> = (value) => {
|
|
24
|
-
const
|
|
24
|
+
const sanitizedStartValue = value.start ? sanitizeDateValue(value.start as RawDateValue) : undefined;
|
|
25
|
+
const sanitizedEndValue = value.end ? sanitizeDateValue(value.end as RawDateValue) : undefined;
|
|
26
|
+
const sanitizedValue =
|
|
27
|
+
sanitizedStartValue && sanitizedEndValue && isValidDate(sanitizedStartValue) && isValidDate(sanitizedEndValue)
|
|
28
|
+
? { start: sanitizedStartValue, end: sanitizedEndValue }
|
|
29
|
+
: undefined;
|
|
25
30
|
|
|
26
31
|
return {
|
|
27
32
|
isSanitized: !!sanitizedValue,
|
|
@@ -31,7 +36,7 @@ export const sanitizeDateRange: Sanitizer<BetweenDateOperationPayload> = (value)
|
|
|
31
36
|
|
|
32
37
|
export const DateSanitizersMapper: SanitizersMapper<DateOperationPayload> = {
|
|
33
38
|
[OperationEnum.On]: sanitizeSingleDate,
|
|
34
|
-
[OperationEnum.OnOrAfter]:
|
|
39
|
+
[OperationEnum.OnOrAfter]: sanitizeSingleDate,
|
|
35
40
|
[OperationEnum.OnOrBefore]: sanitizeSingleDate,
|
|
36
|
-
[OperationEnum.BetweenDate]:
|
|
41
|
+
[OperationEnum.BetweenDate]: sanitizeDateRange,
|
|
37
42
|
};
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import { evaluateFeatureFlag } from '../feature-flags';
|
|
10
10
|
import { prepareAttributes } from './attributes.utils';
|
|
11
11
|
import { TreatmentEnum } from '../rules';
|
|
12
|
+
import { checkPermission } from './permissions.utils';
|
|
12
13
|
export function evaluateIsEntitledToFeature(
|
|
13
14
|
featureKey: string,
|
|
14
15
|
userEntitlementsContext: UserEntitlementsContext,
|
|
@@ -43,9 +44,8 @@ export function evaluateIsEntitledToPermissions(
|
|
|
43
44
|
userEntitlementsContext: UserEntitlementsContext,
|
|
44
45
|
attributes?: Attributes,
|
|
45
46
|
): EntitlementResult {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
if (!permission) {
|
|
47
|
+
const hasPermission = checkPermission(userEntitlementsContext.permissions, permissionKey);
|
|
48
|
+
if (!hasPermission) {
|
|
49
49
|
return { isEntitled: false, justification: NotEntitledJustification.MISSING_PERMISSION };
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Permissions } from './types';
|
|
2
|
+
export function checkPermission(permissions: Permissions, requiredPermission: string): boolean {
|
|
3
|
+
return Object.keys(permissions).some((permissionKey) =>
|
|
4
|
+
createPermissionCheckRegex(permissionKey).test(requiredPermission),
|
|
5
|
+
);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function createPermissionCheckRegex(permissionKey: string): RegExp {
|
|
9
|
+
return new RegExp('^' + permissionKey.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$', 'gs');
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Permissions } from '../types';
|
|
2
|
+
import { checkPermission } from '../permissions.utils';
|
|
3
|
+
describe('checkPermission', () => {
|
|
4
|
+
test.each([[{ 'test.permission': true }], [{ 'test.*': true }], [{ '*': true }]])(
|
|
5
|
+
'expected truthy result',
|
|
6
|
+
(permissions) => {
|
|
7
|
+
const requiredPermission = 'test.permission';
|
|
8
|
+
const result = checkPermission(permissions as Permissions, requiredPermission);
|
|
9
|
+
expect(result).toBeTruthy();
|
|
10
|
+
},
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
test.each([[{}], [{ 'test.permission.read': true }], [{ 'test.permission.write.*': true }]])(
|
|
14
|
+
'expected falsy result',
|
|
15
|
+
(permissions) => {
|
|
16
|
+
const requiredPermission = 'test.permission';
|
|
17
|
+
const result = checkPermission(permissions as Permissions, requiredPermission);
|
|
18
|
+
expect(result).toBeFalsy();
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
});
|
|
@@ -8,7 +8,7 @@ export type UserEntitlementsContext = {
|
|
|
8
8
|
featureFlag?: FeatureFlag;
|
|
9
9
|
}
|
|
10
10
|
>;
|
|
11
|
-
permissions:
|
|
11
|
+
permissions: Permissions;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
export type EntitlementResult = {
|
|
@@ -30,7 +30,7 @@ export type FronteggAttributes = {
|
|
|
30
30
|
email?: string;
|
|
31
31
|
emailVerified?: boolean;
|
|
32
32
|
};
|
|
33
|
-
|
|
33
|
+
export type Permissions = Record<string, true>;
|
|
34
34
|
export type Attributes = { custom?: CustomAttributes; jwt?: JwtAttributes };
|
|
35
35
|
export type JwtAttributes = Record<string, unknown>;
|
|
36
36
|
export const NO_EXPIRATION_TIME = -1;
|