@via-profit/ability 3.5.0 → 3.5.1

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 CHANGED
@@ -338,6 +338,13 @@ declare class AbilityTypeGenerator {
338
338
  private formatNestedObject;
339
339
  }
340
340
 
341
+ type AbilityResultStateCodeType = 'allow' | 'deny' | 'neutral';
342
+ declare class AbilityResultState extends AbilityCode<AbilityResultStateCodeType> {
343
+ static allow: AbilityResultState;
344
+ static deny: AbilityResultState;
345
+ static neutral: AbilityResultState;
346
+ }
347
+
341
348
  declare class AbilityResult<Resource extends ResourceObject = Record<string, unknown>> {
342
349
  /**
343
350
  * Already checked policies (after call the policy.check())
@@ -352,14 +359,9 @@ declare class AbilityResult<Resource extends ResourceObject = Record<string, unk
352
359
  */
353
360
  explain(): readonly AbilityExplain[];
354
361
  getLastMatchedPolicy(): AbilityPolicy<Resource> | null;
362
+ getFinalState(): AbilityResultState;
355
363
  isAllowed(): boolean;
356
364
  isDenied(): boolean;
357
- /**
358
- * Get the last effect of the policy
359
- *
360
- * @returns {AbilityPolicyEffect | null}
361
- */
362
- getLastEffectOfMatchedPolicy(): AbilityPolicyEffect | null;
363
365
  }
364
366
 
365
367
  declare class AbilityResolver<Resources extends ResourcesMap, Environment = unknown> {
@@ -570,5 +572,5 @@ declare class AbilityDSLLexer {
570
572
  private isAtEnd;
571
573
  }
572
574
 
573
- export { AbilityCode, AbilityCompare, AbilityCondition, AbilityDSLLexer, AbilityDSLParser, AbilityDSLToken, AbilityError, AbilityExplain, AbilityExplainPolicy, AbilityExplainRule, AbilityExplainRuleSet, AbilityJSONParser, AbilityMatch, AbilityParserError, AbilityPolicy, AbilityPolicyEffect, AbilityResolver, AbilityResult, AbilityRule, AbilityRuleSet, AbilityTypeGenerator };
574
- export type { AbilityCompareCodeType, AbilityConditionCodeType, AbilityConditionLiteralType, AbilityExplainConfig, AbilityExplainType, AbilityMatchCodeType, AbilityPolicyConfig, AbilityPolicyConstructorProps, AbilityPolicyEffectCodeType, AbilityRuleConfig, AbilityRuleConstructorProps, AbilityRuleSetConfig, AbilityRuleSetConstructorProps, NestedDict, Primitive, ResourceObject, ResourcesMap, TokenType };
575
+ export { AbilityCode, AbilityCompare, AbilityCondition, AbilityDSLLexer, AbilityDSLParser, AbilityDSLToken, AbilityError, AbilityExplain, AbilityExplainPolicy, AbilityExplainRule, AbilityExplainRuleSet, AbilityJSONParser, AbilityMatch, AbilityParserError, AbilityPolicy, AbilityPolicyEffect, AbilityResolver, AbilityResult, AbilityResultState, AbilityRule, AbilityRuleSet, AbilityTypeGenerator };
576
+ export type { AbilityCompareCodeType, AbilityConditionCodeType, AbilityConditionLiteralType, AbilityExplainConfig, AbilityExplainType, AbilityMatchCodeType, AbilityPolicyConfig, AbilityPolicyConstructorProps, AbilityPolicyEffectCodeType, AbilityResultStateCodeType, AbilityRuleConfig, AbilityRuleConstructorProps, AbilityRuleSetConfig, AbilityRuleSetConstructorProps, NestedDict, Primitive, ResourceObject, ResourcesMap, TokenType };
package/dist/index.js CHANGED
@@ -364,7 +364,11 @@ class AbilityExplain {
364
364
  toString(indent = 0) {
365
365
  const pad = ' '.repeat(indent);
366
366
  const mark = this.match.code === AbilityMatch.match.code ? '✓' : '✗';
367
- let out = `${pad}${mark} ${this.type} «${this.name}» is ${this.match.code}`;
367
+ let out = '';
368
+ if (this.type === 'policy') {
369
+ out += '\n';
370
+ }
371
+ out += `${pad}${mark} ${this.type} «${this.name}» is ${this.match.code}`;
368
372
  this.children.forEach(child => {
369
373
  out += '\n' + child.toString(indent + 1);
370
374
  });
@@ -518,6 +522,12 @@ class AbilityPolicyEffect extends AbilityCode {
518
522
  static permit = new AbilityPolicyEffect('permit');
519
523
  }
520
524
 
525
+ class AbilityResultState extends AbilityCode {
526
+ static allow = new AbilityResultState('allow');
527
+ static deny = new AbilityResultState('deny');
528
+ static neutral = new AbilityResultState('neutral');
529
+ }
530
+
521
531
  class AbilityResult {
522
532
  /**
523
533
  * Already checked policies (after call the policy.check())
@@ -545,27 +555,28 @@ class AbilityResult {
545
555
  }
546
556
  return null;
547
557
  }
548
- isAllowed() {
549
- const effect = this.getLastEffectOfMatchedPolicy();
550
- return effect?.isEqual(AbilityPolicyEffect.permit) ?? false;
551
- }
552
- isDenied() {
553
- const effect = this.getLastEffectOfMatchedPolicy();
554
- return effect?.isEqual(AbilityPolicyEffect.deny) ?? true;
555
- }
556
- /**
557
- * Get the last effect of the policy
558
- *
559
- * @returns {AbilityPolicyEffect | null}
560
- */
561
- getLastEffectOfMatchedPolicy() {
562
- for (let i = this.policies.length - 1; i >= 0; i--) {
563
- const p = this.policies[i];
558
+ getFinalState() {
559
+ let state = AbilityResultState.neutral;
560
+ for (const p of this.policies) {
564
561
  if (p.matchState.isEqual(AbilityMatch.match)) {
565
- return p.effect;
562
+ if (p.effect.isEqual(AbilityPolicyEffect.permit)) {
563
+ state = AbilityResultState.allow;
564
+ }
565
+ else if (p.effect.isEqual(AbilityPolicyEffect.deny)) {
566
+ state = AbilityResultState.deny;
567
+ }
568
+ }
569
+ else if (p.matchState.isEqual(AbilityMatch.mismatch)) {
570
+ state = AbilityResultState.neutral;
566
571
  }
567
572
  }
568
- return null;
573
+ return state;
574
+ }
575
+ isAllowed() {
576
+ return this.getFinalState().isEqual(AbilityResultState.allow);
577
+ }
578
+ isDenied() {
579
+ return this.getFinalState().isNotEqual(AbilityResultState.allow);
569
580
  }
570
581
  }
571
582
 
@@ -2185,6 +2196,7 @@ exports.AbilityPolicy = AbilityPolicy;
2185
2196
  exports.AbilityPolicyEffect = AbilityPolicyEffect;
2186
2197
  exports.AbilityResolver = AbilityResolver;
2187
2198
  exports.AbilityResult = AbilityResult;
2199
+ exports.AbilityResultState = AbilityResultState;
2188
2200
  exports.AbilityRule = AbilityRule;
2189
2201
  exports.AbilityRuleSet = AbilityRuleSet;
2190
2202
  exports.AbilityTypeGenerator = AbilityTypeGenerator;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@via-profit/ability",
3
3
  "support": "https://via-profit.ru",
4
- "version": "3.5.0",
4
+ "version": "3.5.1",
5
5
  "description": "Via-Profit Ability service",
6
6
  "keywords": [
7
7
  "ability",