@via-profit/ability 2.0.0-rc.5 → 2.0.0-rc.8

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.
@@ -55,8 +55,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
55
55
  exports.AbilityCompare = void 0;
56
56
  const AbilityCode_1 = __importDefault(__webpack_require__(/*! ./AbilityCode */ "./src/AbilityCode.ts"));
57
57
  class AbilityCompare extends AbilityCode_1.default {
58
- static and = new AbilityCompare(0);
59
- static or = new AbilityCompare(1);
58
+ static and = new AbilityCompare('and');
59
+ static or = new AbilityCompare('or');
60
60
  }
61
61
  exports.AbilityCompare = AbilityCompare;
62
62
  exports["default"] = AbilityCompare;
@@ -330,7 +330,7 @@ class AbilityResolver {
330
330
  const resolver = this.resolve(action, resource);
331
331
  if (resolver) {
332
332
  if (resolver.isDeny()) {
333
- throw new AbilityError_1.PermissionError(resolver.getPolicy()?.name?.toString() || 'Unknown permission error');
333
+ throw new AbilityError_1.PermissionError(resolver.getMatchedPolicy()?.name?.toString() || 'Unknown permission error');
334
334
  }
335
335
  }
336
336
  }
@@ -359,9 +359,10 @@ class AbilityResolver {
359
359
  const effect = this.getEffect();
360
360
  return effect !== null && effect.isEqual(AbilityPolicyEffect_1.default.deny);
361
361
  }
362
- getPolicy() {
363
- const lastPolicy = this.policies.length ? this.policies[this.policies.length - 1] : null;
364
- return lastPolicy && lastPolicy.matchState.isEqual(AbilityMatch_1.default.match) ? lastPolicy : null;
362
+ getMatchedPolicy() {
363
+ const matchedPolicies = this.policies.filter(policy => policy.matchState.isEqual(AbilityMatch_1.default.match));
364
+ const lastPolicy = matchedPolicies.length ? matchedPolicies[matchedPolicies.length - 1] : null;
365
+ return lastPolicy || null;
365
366
  }
366
367
  /**
367
368
  * Check if the action is contained in another action
@@ -372,13 +373,13 @@ class AbilityResolver {
372
373
  const actionAArray = String(actionA).split('.');
373
374
  const actionBArray = String(actionB).split('.');
374
375
  const a = actionAArray.length >= actionBArray.length ? actionAArray : actionBArray;
375
- const b = actionBArray.length >= actionAArray.length ? actionBArray : actionAArray;
376
- return a
376
+ const b = actionBArray.length <= actionAArray.length ? actionBArray : actionAArray;
377
+ const c = a
377
378
  .reduce((acc, chunk, index) => {
378
379
  const iterationRes = chunk === b[index] || b[index] === '*' || chunk === '*';
379
380
  return acc.concat(iterationRes);
380
- }, [])
381
- .every(Boolean);
381
+ }, []);
382
+ return c.every(Boolean);
382
383
  }
383
384
  }
384
385
  exports.AbilityResolver = AbilityResolver;
@@ -757,7 +758,7 @@ server.on('request', (_req, res) => {
757
758
  }));
758
759
  res.end();
759
760
  });
760
- server.listen(8080, 'localhost', () => {
761
+ server.listen(8081, 'localhost', () => {
761
762
  console.debug('server started at http://localhost:8080');
762
763
  });
763
764
 
@@ -1 +1 @@
1
- {"version":3,"file":"playground.js","mappings":";;;;;;;;;;;;;AAAA,MAAa,WAAW;IACf,IAAI,CAAI;IAEf,YAAY,IAAO;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,OAAO,CAAC,WAAkC;QAC/C,OAAO,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;IAChE,CAAC;IAEM,UAAU,CAAC,WAAkC;QAClD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,OAAwB;QAChD,IAAI,IAAI,GAAuB,IAAI,CAAC;QAEpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACjC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,MAA2B,CAAgB,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,4CAA4C,CACnF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,IAAI,CAAE,IAAoB,CAAC,IAAI,CAAgB,CAAC;IAC7D,CAAC;CACF;AAhCD,kCAgCC;AAED,qBAAe,WAAW,CAAC;;;;;;;;;;;;;;;;;AClC3B,wGAAwC;AAIxC,MAAa,cAAe,SAAQ,qBAAW;IACtC,MAAM,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;;AAF3C,wCAGC;AAED,qBAAe,cAAc,CAAC;;;;;;;;;;;;;;;;;ACT9B,wGAAwC;AAIxC,MAAa,gBAAiB,SAAQ,qBAAwC;IACrE,MAAM,CAAC,KAAK,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,CAAC,aAAa,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,aAAa,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;;AARxD,4CASC;AAED,qBAAe,gBAAgB,CAAC;;;;;;;;;;;;;;ACfhC,MAAa,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAJD,oCAIC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAJD,gDAIC;AAED,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAJD,0CAIC;;;;;;;;;;;;;;;;;AChBD,wGAAwC;AAIxC,MAAa,YAAa,SAAQ,qBAAoC;IAC7D,MAAM,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;;AAHxD,oCAIC;AAED,qBAAe,YAAY,CAAC;;;;;;;;;;;;;;;;;ACV5B,iHAAwE;AACxE,2GAA0C;AAC1C,iHAA6E;AAC7E,gIAA4F;AAW5F,MAAa,aAAa;IACjB,UAAU,GAAiB,sBAAY,CAAC,OAAO,CAAC;IACvD;;OAEG;IACI,OAAO,GAAqB,EAAE,CAAC;IAEtC;;OAEG;IACI,MAAM,CAAsB;IAEnC;;;;;OAKG;IACI,aAAa,GAAmB,wBAAc,CAAC,GAAG,CAAC;IAE1D;;OAEG;IACI,IAAI,CAAS;IAEpB;;OAEG;IACI,EAAE,CAAS;IAElB;;OAEG;IACI,MAAM,CAAS;IAEtB,YAAmB,MAKlB;QACC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAuB;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAoB;QAC/B,IAAI,CAAC,UAAU,GAAG,sBAAY,CAAC,QAAQ,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YAClF,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,wBAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACnD,IAAI,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAY,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBACjF,IAAI,CAAC,UAAU,GAAG,sBAAY,CAAC,KAAK,CAAC;YACvC,CAAC;QACH,CAAC;QAED,IAAI,wBAAc,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAY,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBAChF,IAAI,CAAC,UAAU,GAAG,sBAAY,CAAC,KAAK,CAAC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CACjB,MAA2B;QAE3B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAEpE,0BAA0B;QAC1B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAY;YAC1C,IAAI;YACJ,EAAE;YACF,MAAM;YACN,MAAM,EAAE,IAAI,6BAAmB,CAAC,MAAM,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,GAAG,wBAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAEjE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;YAC9B,MAAM,CAAC,UAAU,CAAC,wBAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM;QACX,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC1B,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAA0C;YACzF,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;SACzB,CAAC;IACJ,CAAC;CACF;AA3HD,sCA2HC;AAED,qBAAe,aAAa,CAAC;;;;;;;;;;;;;;;;;AC3I7B,wGAAwC;AAIxC,MAAa,mBAAoB,SAAQ,qBAA2C;IAC3E,MAAM,CAAC,IAAI,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;;AAF3D,kDAGC;AAED,qBAAe,mBAAmB,CAAC;;;;;;;;;;;;;;;;;ACRnC,gIAAwD;AACxD,2GAA0C;AAC1C,0FAAiD;AAEjD,MAAa,eAAe;IAC1B,QAAQ,CAAsC;IAE9C,YACE,sBAAsF;QAEtF,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACnD,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,OAAO,CACZ,MAAc,EACd,QAA2B;QAE3B,MAAM,gBAAgB,GAAoB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACtE,OAAO,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAkB,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CACZ,MAAc,EACd,QAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,8BAAe,CACvB,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,0BAA0B,CACrE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,SAAS;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtF,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,sBAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,QAAQ;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAmB,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC;IAEM,MAAM;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAmB,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAEM,SAAS;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEzF,OAAO,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,sBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAe,EAAE,OAAe;QAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhD,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QACnF,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QAEnF,OAAO,CAAC;aACL,MAAM,CAAY,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvC,MAAM,YAAY,GAAG,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;YAE7E,OAAO,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC,EAAE,EAAE,CAAC;aACL,KAAK,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;CACF;AAxGD,0CAwGC;AAED,qBAAe,eAAe,CAAC;;;;;;;;;;;;;;;;;AC/G/B,2GAA0C;AAC1C,uHAAmF;AAkBnF,MAAa,WAAW;IACtB;;OAEG;IACI,OAAO,CAAS;IACvB;;OAEG;IACI,QAAQ,CAAkD;IAE1D,SAAS,CAAmB;IAC5B,IAAI,CAAS;IACb,EAAE,CAAS;IACX,KAAK,GAAiB,sBAAY,CAAC,OAAO,CAAC;IAElD,YAAmB,MAAyB;QAC1C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAC1D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,0BAAgB,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,QAA0B;QACrC,IAAI,EAAE,GAAY,KAAK,CAAC;QAExB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,0BAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,0BAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,0BAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,0BAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,0BAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,EAAE,GAAG,MAAM,KAAK,MAAM,CAAC;QACzB,CAAC;QAED,IAAI,0BAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,EAAE,GAAG,MAAM,KAAK,MAAM,CAAC;QACzB,CAAC;QAED,IAAI,0BAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,wBAAwB;YACxB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,sBAAsB;YACtB,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YACD,sBAAsB;YACtB,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,0BAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,wBAAwB;YACxB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,sBAAsB;YACtB,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,sBAAsB;YACtB,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,sBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,sBAAY,CAAC,QAAQ,CAAC;QAE7D,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACI,aAAa,CAClB,YAA8B;QAK9B,IAAI,aAAa,CAAC;QAClB,IAAI,cAAc,CAAC;QAEnB,IAAI,YAAY,KAAK,IAAI,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACjE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAY,EAAiB,EAAE;YAC7C,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;QAC9D,CAAC,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,aAAa,GAAG,IAAI,CAAC,mBAAmB,CACtC,YAAY,EACZ,IAAI,CAAC,OAAO,CACb,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,cAAc,GAAG,IAAI,CAAC,mBAAmB,CACvC,YAAY,EACZ,IAAI,CAAC,QAAQ,CACd,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,IAAI,CAAC,QAA2D,CAAC;QACpF,CAAC;QAED,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CAAc,QAAiB,EAAE,IAAY;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE5B,OAAO,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG;oBAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBACjB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;iBACnB,CAAC;gBAEF,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAgC,CAAC,KAAK,SAAS,EAAE,CAAC;oBACvE,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAgC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,QAAQ,CAAC,IAA6B,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,OAAO,QAAa,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,KAAK,CACjB,MAAyB;QAEzB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAE1D,OAAO,IAAI,WAAW,CAAY;YAChC,EAAE;YACF,IAAI;YACJ,OAAO;YACP,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,MAAM;QACX,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;SAC/B,CAAC;IACJ,CAAC;CACF;AA9LD,kCA8LC;AAED,qBAAe,WAAW,CAAC;;;;;;;;;;;;;;;;;ACnN3B,wGAA+D;AAC/D,iHAA6E;AAC7E,2GAA0C;AAS1C,MAAa,cAAc;IAClB,KAAK,GAAiB,sBAAY,CAAC,OAAO,CAAC;IAClD;;OAEG;IACI,KAAK,GAAkB,EAAE,CAAC;IAEjC;;;;;OAKG;IACI,aAAa,GAAmB,wBAAc,CAAC,GAAG,CAAC;IAE1D;;OAEG;IACI,IAAI,CAAS;IAEpB;;OAEG;IACI,EAAE,CAAS;IAElB,YAAmB,MAAmE;QACpF,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;QAE3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,wBAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC/D,0DAA0D;IAC5D,CAAC;IAEM,OAAO,CAAC,IAAiB,EAAE,aAA6B;QAC7D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,QAAQ,CAAC,KAAoB,EAAE,aAA6B;QACjE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;QAEzD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,SAA2B;QACtC,IAAI,CAAC,KAAK,GAAG,sBAAY,CAAC,QAAQ,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;YAC1E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,wBAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACnD,IAAI,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAY,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,KAAK,GAAG,sBAAY,CAAC,KAAK,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,wBAAc,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAY,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBAC7E,IAAI,CAAC,KAAK,GAAG,sBAAY,CAAC,KAAK,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CACjB,MAA4B;QAE5B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;QAElD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAW;YAC3C,aAAa;YACb,IAAI;YACJ,EAAE;SACH,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,qBAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAE5E,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM;QACX,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC1B,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAA2C;YAC1F,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF;AAzGD,wCAyGC;AAED,qBAAe,cAAc,CAAC;;;;;;;;;;;;;;;;ACtH9B,uFAA6B;AAC7B,8GAAqE;AACrE,oHAAgD;AAEhD,MAAM,MAAM,GAAG,mBAAI,CAAC,YAAY,EAAE,CAAC;AAEnC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAejC,MAAM,MAAM,GAA0B;QACpC;YACE,EAAE,EAAE,sCAAsC;YAC1C,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,sCAAsC;oBAC1C,IAAI,EAAE,kBAAkB;oBACxB,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE;wBACL;4BACE,EAAE,EAAE,sCAAsC;4BAC1C,IAAI,EAAE,yBAAyB;4BAC/B,OAAO,EAAE,eAAe;4BACxB,QAAQ,EAAE,eAAe;4BACzB,SAAS,EAAE,IAAI;yBAChB;qBACF;iBACF;aACF;SACF;QACD;YACE,EAAE,EAAE,sCAAsC;YAC1C,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,sCAAsC;oBAC1C,IAAI,EAAE,UAAU;oBAChB,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE;wBACL;4BACE,EAAE,EAAE,sCAAsC;4BAC1C,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,cAAc;4BACvB,QAAQ,EAAE,cAAc;4BACxB,SAAS,EAAE,GAAG;yBACf;wBACD;4BACE,EAAE,EAAE,sCAAsC;4BAC1C,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,gBAAgB;4BACzB,QAAQ,EAAE,SAAS;4BACnB,SAAS,EAAE,GAAG;yBACf;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,uBAAa,CAAC,KAAK,CAAY,GAAG,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,yBAAe,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE;QACnE,OAAO,EAAE;YACP,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SACzB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,cAAc;SACvB;QACD,OAAO,EAAE;YACP,MAAM,EAAE,SAAS;YACjB,qBAAqB;SACtB;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAElD,GAAG,CAAC,KAAK,CACP,IAAI,CAAC,SAAS,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;KAC5C,CAAC,CACH,CAAC;IACF,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;;;;;;;;;;;ACxGH;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;UEtBA;UACA;UACA;UACA","sources":["webpack://@via-profit/ability/./src/AbilityCode.ts","webpack://@via-profit/ability/./src/AbilityCompare.ts","webpack://@via-profit/ability/./src/AbilityCondition.ts","webpack://@via-profit/ability/./src/AbilityError.ts","webpack://@via-profit/ability/./src/AbilityMatch.ts","webpack://@via-profit/ability/./src/AbilityPolicy.ts","webpack://@via-profit/ability/./src/AbilityPolicyEffect.ts","webpack://@via-profit/ability/./src/AbilityResolver.ts","webpack://@via-profit/ability/./src/AbilityRule.ts","webpack://@via-profit/ability/./src/AbilityRuleSet.ts","webpack://@via-profit/ability/./src/playground.ts","webpack://@via-profit/ability/external node-commonjs \"node:http\"","webpack://@via-profit/ability/webpack/bootstrap","webpack://@via-profit/ability/webpack/before-startup","webpack://@via-profit/ability/webpack/startup","webpack://@via-profit/ability/webpack/after-startup"],"sourcesContent":["export class AbilityCode<T extends string | number | undefined = number> {\n public code: T;\n\n constructor(code: T) {\n this.code = code;\n }\n\n public isEqual(compareWith: AbilityCode<T> | null): boolean {\n return compareWith !== null && this.code === compareWith.code;\n }\n\n public isNotEqual(compareWith: AbilityCode<T> | null): boolean {\n return !this.isEqual(compareWith);\n }\n\n public static fromLiteral(literal: string | number): AbilityCode {\n let Code: AbilityCode | null = null;\n\n Object.keys(this).forEach(member => {\n if (member === literal) {\n Code = this[member as keyof typeof this] as AbilityCode;\n }\n });\n\n if (!Code) {\n throw new Error(\n `Mismatch error. The literal ${literal} can not be find as a member of this class`,\n );\n }\n\n return new this((Code as AbilityCode).code) as AbilityCode;\n }\n}\n\nexport default AbilityCode;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityCompareVariantType = 'and' | 'or'\n\nexport class AbilityCompare extends AbilityCode {\n public static and = new AbilityCompare(0);\n public static or = new AbilityCompare(1);\n}\n\nexport default AbilityCompare;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityConditionVariantType = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'in' | 'not in';\n\nexport class AbilityCondition extends AbilityCode<AbilityConditionVariantType> {\n public static EQUAL = new AbilityCondition('=');\n public static NOT_EQUAL = new AbilityCondition('<>');\n public static MORE_THAN = new AbilityCondition('>');\n public static LESS_THAN = new AbilityCondition('<');\n public static LESS_OR_EQUAL = new AbilityCondition('<=');\n public static MORE_OR_EQUAL = new AbilityCondition('>=');\n public static IN = new AbilityCondition('in');\n public static NOT_IN = new AbilityCondition('not in');\n}\n\nexport default AbilityCondition;\n","export class AbilityError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class AbilityParserError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class PermissionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityMatchVariantType = 'pending' | 'match' | 'mismatch';\n\nexport class AbilityMatch extends AbilityCode<AbilityMatchVariantType>{\n public static pending = new AbilityMatch('pending');\n public static match = new AbilityMatch('match');\n public static mismatch = new AbilityMatch('mismatch');\n}\n\nexport default AbilityMatch;","import AbilityRuleSet, { AbilityRuleSetConfig } from './AbilityRuleSet';\nimport AbilityMatch from './AbilityMatch';\nimport AbilityCompare, { AbilityCompareVariantType } from './AbilityCompare';\nimport AbilityPolicyEffect, { AbilityPolicyEffectVariantType } from './AbilityPolicyEffect';\n\nexport type AbilityPolicyConfig = {\n readonly action: string;\n readonly effect: AbilityPolicyEffectVariantType;\n readonly compareMethod: AbilityCompareVariantType;\n readonly ruleSet: AbilityRuleSetConfig[];\n readonly id: string;\n readonly name: string;\n};\n\nexport class AbilityPolicy<Resources extends object = object> {\n public matchState: AbilityMatch = AbilityMatch.pending;\n /**\n * List of rules\n */\n public ruleSet: AbilityRuleSet[] = [];\n\n /**\n * Policy effect\n */\n public effect: AbilityPolicyEffect;\n\n /**\n * Rules compare method.\\\n * For the «and» method the rule will be permitted if all\\\n * rules will be returns «permit» status and for the «or» - if\\\n * one of the rules returns as «permit»\n */\n public compareMethod: AbilityCompare = AbilityCompare.and;\n\n /**\n * Policy name\n */\n public name: string;\n\n /**\n * Policy ID\n */\n public id: string;\n\n /**\n * Soon\n */\n public action: string;\n\n public constructor(params: {\n id: string;\n name: string;\n action: string;\n effect: AbilityPolicyEffect;\n }) {\n const { name, id, action, effect } = params;\n this.name = name;\n this.id = id;\n this.action = action;\n this.effect = effect;\n }\n\n /**\n * Add rule set to the policy\n * @param ruleSet - The rule set to add\n */\n public addRuleSet(ruleSet: AbilityRuleSet): this {\n this.ruleSet.push(ruleSet);\n\n return this;\n }\n\n /**\n * Check if the policy is matched\n * @param resources - The resource to check\n */\n public check(resources: Resources): AbilityMatch {\n this.matchState = AbilityMatch.mismatch;\n\n if (!this.ruleSet.length) {\n return this.matchState;\n }\n\n const rulesetCheckStates = this.ruleSet.reduce<AbilityMatch[]>((collect, ruleSet) => {\n return collect.concat(ruleSet.check(resources));\n }, []);\n\n if (AbilityCompare.and.isEqual(this.compareMethod)) {\n if (rulesetCheckStates.every(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.matchState = AbilityMatch.match;\n }\n }\n\n if (AbilityCompare.or.isEqual(this.compareMethod)) {\n if (rulesetCheckStates.some(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.matchState = AbilityMatch.match;\n }\n }\n\n return this.matchState;\n }\n\n /**\n * Parse the config JSON format to Policy class instance\n */\n public static parse<Resources extends object = object>(\n config: AbilityPolicyConfig,\n ): AbilityPolicy<Resources> {\n const { id, name, ruleSet, compareMethod, action, effect } = config;\n\n // Create the empty policy\n const policy = new AbilityPolicy<Resources>({\n name,\n id,\n action,\n effect: new AbilityPolicyEffect(effect),\n });\n\n policy.compareMethod = AbilityCompare.fromLiteral(compareMethod);\n\n ruleSet.forEach(ruleSetConfig => {\n policy.addRuleSet(AbilityRuleSet.parse(ruleSetConfig));\n });\n\n return policy;\n }\n\n public export(): AbilityPolicyConfig {\n return {\n id: this.id.toString(),\n name: this.name.toString(),\n compareMethod: this.compareMethod.code.toString() as AbilityPolicyConfig['compareMethod'],\n ruleSet: this.ruleSet.map(rule => rule.export()),\n action: this.action,\n effect: this.effect.code,\n };\n }\n}\n\nexport default AbilityPolicy;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityPolicyEffectVariantType = 'deny' | 'permit';\n\nexport class AbilityPolicyEffect extends AbilityCode<AbilityPolicyEffectVariantType> {\n public static deny = new AbilityPolicyEffect('deny');\n public static permit = new AbilityPolicyEffect('permit');\n}\n\nexport default AbilityPolicyEffect;\n","import AbilityPolicy from './AbilityPolicy';\nimport AbilityPolicyEffect from './AbilityPolicyEffect';\nimport AbilityMatch from './AbilityMatch';\nimport { PermissionError } from './AbilityError';\n\nexport class AbilityResolver<Resources extends object = object> {\n policies: readonly AbilityPolicy<Resources>[];\n\n public constructor(\n policyOrListOfPolicies: readonly AbilityPolicy<Resources>[] | AbilityPolicy<Resources>,\n ) {\n this.policies = Array.isArray(policyOrListOfPolicies)\n ? policyOrListOfPolicies\n : [policyOrListOfPolicies];\n }\n\n /**\n * Resolve policy for the resource and action\n *\n @param action - Action\n * @param resource - Resource\n */\n public resolve<Action extends keyof Resources>(\n action: Action,\n resource: Resources[Action],\n ): this {\n const filteredPolicies: AbilityPolicy[] = this.policies.filter(policy => {\n return AbilityResolver.isInActionContain(policy.action, String(action));\n });\n\n filteredPolicies.map(policy => policy.check(resource as object));\n\n this.policies = filteredPolicies;\n\n return this;\n }\n\n public enforce<Action extends keyof Resources>(\n action: Action,\n resource: Resources[Action],\n ): void | never {\n const resolver = this.resolve(action, resource);\n if (resolver) {\n if (resolver.isDeny()) {\n throw new PermissionError(\n resolver.getPolicy()?.name?.toString() || 'Unknown permission error',\n );\n }\n }\n }\n\n /**\n * Get the last effect of the policy\n *\n * @returns {AbilityPolicyEffect | null}\n */\n public getEffect(): AbilityPolicyEffect | null {\n const effects = this.policies.reduce<AbilityPolicyEffect[]>((collect, policy, _index) => {\n if (policy.matchState.isEqual(AbilityMatch.match)) {\n return collect.concat(policy.effect);\n }\n return collect;\n }, []);\n\n if (effects.length) {\n return effects[effects.length - 1];\n }\n\n return null;\n }\n\n public isPermit() {\n const effect = this.getEffect();\n\n return effect !== null && effect.isEqual(AbilityPolicyEffect.permit);\n }\n\n public isDeny() {\n const effect = this.getEffect();\n\n return effect !== null && effect.isEqual(AbilityPolicyEffect.deny);\n }\n\n public getPolicy(): AbilityPolicy<Resources> | null {\n const lastPolicy = this.policies.length ? this.policies[this.policies.length - 1] : null;\n\n return lastPolicy && lastPolicy.matchState.isEqual(AbilityMatch.match) ? lastPolicy : null;\n }\n\n /**\n * Check if the action is contained in another action\n * @param actionA - The first action to check\n * @param actionB - The second action to check\n */\n public static isInActionContain(actionA: string, actionB: string) {\n const actionAArray = String(actionA).split('.');\n const actionBArray = String(actionB).split('.');\n\n const a = actionAArray.length >= actionBArray.length ? actionAArray : actionBArray;\n const b = actionBArray.length >= actionAArray.length ? actionBArray : actionAArray;\n\n return a\n .reduce<boolean[]>((acc, chunk, index) => {\n const iterationRes = chunk === b[index] || b[index] === '*' || chunk === '*';\n\n return acc.concat(iterationRes);\n }, [])\n .every(Boolean);\n }\n}\n\nexport default AbilityResolver;\n","import AbilityMatch from './AbilityMatch';\nimport AbilityCondition, { AbilityConditionVariantType } from './AbilityCondition';\n\nexport type AbilityRuleConfig = {\n readonly id: string;\n readonly name: string;\n\n /**\n * Subject key path like a 'user.name'\n */\n readonly subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n readonly resource: string | number | boolean | (string | number)[];\n\n readonly condition: AbilityConditionVariantType;\n};\n\nexport class AbilityRule<Resources extends object = object> {\n /**\n * Subject key path like a 'user.name'\n */\n public subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n public resource: string | number | boolean | (string | number)[];\n\n public condition: AbilityCondition;\n public name: string;\n public id: string;\n public state: AbilityMatch = AbilityMatch.pending;\n\n public constructor(params: AbilityRuleConfig) {\n const { id, name, subject, resource, condition } = params;\n this.id = id;\n this.name = name;\n this.subject = subject;\n this.resource = resource;\n this.condition = new AbilityCondition(condition);\n }\n\n /**\n * Check if the rule is matched\n * @param resource - The resource to check\n */\n public check(resource: Resources | null): AbilityMatch {\n let is: boolean = false;\n\n const [valueS, valueO] = this.extractValues(resource);\n\n if (AbilityCondition.LESS_THAN.isEqual(this.condition)) {\n is = Number(valueS) < Number(valueO);\n }\n\n if (AbilityCondition.LESS_OR_EQUAL.isEqual(this.condition)) {\n is = Number(valueS) <= Number(valueO);\n }\n\n if (AbilityCondition.MORE_THAN.isEqual(this.condition)) {\n is = Number(valueS) > Number(valueO);\n }\n\n if (AbilityCondition.MORE_OR_EQUAL.isEqual(this.condition)) {\n is = Number(valueS) >= Number(valueO);\n }\n\n if (AbilityCondition.EQUAL.isEqual(this.condition)) {\n is = valueS === valueO;\n }\n\n if (AbilityCondition.NOT_EQUAL.isEqual(this.condition)) {\n is = valueS !== valueO;\n }\n\n if (AbilityCondition.IN.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = valueS.includes(valueO);\n }\n }\n\n if (AbilityCondition.NOT_IN.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = !valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = !valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = !valueS.includes(valueO);\n }\n }\n\n this.state = is ? AbilityMatch.match : AbilityMatch.mismatch;\n\n return this.state;\n }\n\n /**\n * Extract values from the resourceData\n * @param resourceData - The resourceData to extract values from\n */\n public extractValues(\n resourceData: Resources | null,\n ): [\n string | number | boolean | (string | number)[] | null | undefined,\n string | number | boolean | (string | number)[] | null | undefined,\n ] {\n let leftSideValue;\n let rightSideValue;\n\n if (resourceData === null || typeof resourceData === 'undefined') {\n return [NaN, NaN];\n }\n\n const isPath = (str: unknown): str is string => {\n return typeof str === 'string' && str.match(/\\./g) !== null;\n };\n\n if (isPath(this.subject)) {\n leftSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.subject,\n );\n } else {\n leftSideValue = this.subject;\n }\n if (isPath(this.resource)) {\n rightSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.resource,\n );\n } else {\n rightSideValue = this.resource as number | boolean | string | (string | number)[];\n }\n\n return [leftSideValue, rightSideValue];\n }\n\n /**\n * Get the value of the object by dot notation\n * @param resource - The object to get the value from\n * @param desc - The dot notation string\n */\n public getDotNotationValue<T = unknown>(resource: unknown, desc: string): T | undefined {\n const arr = desc.split('.');\n\n while (arr.length && resource) {\n const comp = arr.shift() || '';\n const match = new RegExp('(.+)\\\\[([0-9]*)\\\\]').exec(comp);\n\n if (match !== null && match.length == 3) {\n const arrayData = {\n arrName: match[1],\n arrIndex: match[2],\n };\n\n if (resource[arrayData.arrName as keyof typeof resource] !== undefined) {\n resource = resource[arrayData.arrName as keyof typeof resource][arrayData.arrIndex];\n } else {\n resource = undefined;\n }\n } else {\n resource = resource[comp as keyof typeof resource];\n }\n }\n\n return resource as T;\n }\n\n public static parse<Resources extends object>(\n config: AbilityRuleConfig,\n ): AbilityRule<Resources> {\n const { id, name, subject, resource, condition } = config;\n\n return new AbilityRule<Resources>({\n id,\n name,\n subject,\n resource,\n condition,\n });\n }\n\n /**\n * Export the rule to config object\n */\n public export(): AbilityRuleConfig {\n return {\n id: this.id,\n name: this.name,\n subject: this.subject,\n resource: this.resource,\n condition: this.condition.code,\n };\n }\n}\n\nexport default AbilityRule;\n","import AbilityRule, { AbilityRuleConfig } from './AbilityRule';\nimport AbilityCompare, { AbilityCompareVariantType } from './AbilityCompare';\nimport AbilityMatch from './AbilityMatch';\n\nexport type AbilityRuleSetConfig = {\n readonly id: string;\n readonly name: string;\n readonly compareMethod: AbilityCompareVariantType;\n readonly rules: AbilityRuleConfig[];\n};\n\nexport class AbilityRuleSet<Resources extends object = object> {\n public state: AbilityMatch = AbilityMatch.pending;\n /**\n * List of rules\n */\n public rules: AbilityRule[] = [];\n\n /**\n * Rules compare method.\\\n * For the «and» method the rule will be permitted if all\\\n * rules will be returns «permit» status and for the «or» - if\\\n * one of the rules returns as «permit»\n */\n public compareMethod: AbilityCompare = AbilityCompare.and;\n\n /**\n * Group name\n */\n public name: string;\n\n /**\n * Group ID\n */\n public id: string;\n\n public constructor(params: Pick<AbilityRuleSetConfig, 'id' | 'name' | 'compareMethod'>) {\n const { name, id, compareMethod } = params;\n\n this.name = name;\n this.id = id;\n this.compareMethod = AbilityCompare.fromLiteral(compareMethod);\n // this.compareMethod = new AbilityCompare(compareMethod);\n }\n\n public addRule(rule: AbilityRule, compareMethod: AbilityCompare): this {\n this.rules.push(rule);\n this.compareMethod = compareMethod;\n\n return this;\n }\n\n public addRules(rules: AbilityRule[], compareMethod: AbilityCompare): this {\n rules.forEach(rule => this.addRule(rule, compareMethod));\n\n return this;\n }\n\n public check(resources: Resources | null): AbilityMatch {\n this.state = AbilityMatch.mismatch;\n\n if (!this.rules.length) {\n return this.state;\n }\n\n const ruleCheckStates = this.rules.reduce<AbilityMatch[]>((collect, rule) => {\n return collect.concat(rule.check(resources));\n }, []);\n\n if (AbilityCompare.and.isEqual(this.compareMethod)) {\n if (ruleCheckStates.every(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.state = AbilityMatch.match;\n }\n }\n\n if (AbilityCompare.or.isEqual(this.compareMethod)) {\n if (ruleCheckStates.some(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.state = AbilityMatch.match;\n }\n }\n\n return this.state;\n }\n\n /**\n * Parse the config JSON format to Group class instance\n */\n public static parse<Resource extends object = object>(\n config: AbilityRuleSetConfig,\n ): AbilityRuleSet<Resource> {\n const { id, name, rules, compareMethod } = config;\n\n const ruleSet = new AbilityRuleSet<Resource>({\n compareMethod,\n name,\n id,\n });\n\n // Adding rules if exists\n if (rules && rules.length > 0) {\n const abilityRules = rules.map(ruleConfig => AbilityRule.parse(ruleConfig));\n\n ruleSet.addRules(abilityRules, ruleSet.compareMethod);\n }\n\n return ruleSet;\n }\n\n public export(): AbilityRuleSetConfig {\n return {\n id: this.id.toString(),\n name: this.name.toString(),\n compareMethod: this.compareMethod.code.toString() as AbilityRuleSetConfig['compareMethod'],\n rules: this.rules.map(rule => rule.export()),\n };\n }\n}\n\nexport default AbilityRuleSet;\n","import http from 'node:http';\nimport AbilityPolicy, { AbilityPolicyConfig } from './AbilityPolicy';\nimport AbilityResolver from '~/AbilityResolver';\n\nconst server = http.createServer();\n\nserver.on('request', (_req, res) => {\n type Resources = {\n ['order.status']: {\n readonly account: {\n readonly roles: readonly string[];\n };\n readonly order: {\n readonly status: string;\n };\n readonly feature: {\n readonly status: string;\n };\n };\n };\n\n const config: AbilityPolicyConfig[] = [\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui',\n action: 'order.status',\n effect: 'deny',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '9cc009e5-0aa9-453a-a668-cb3f418ced92',\n name: 'Не администратор',\n compareMethod: 'and',\n rules: [\n {\n id: '4093cd50-e54f-4062-8053-2d3b5966fad3',\n name: 'Нет роли администраторв',\n subject: 'account.roles',\n resource: 'administrator',\n condition: '<>',\n },\n ],\n },\n ]\n },\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui 1',\n action: 'order.status',\n effect: 'permit',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '2f8f9d71-860b-4fa6-b395-9331f1f0848e',\n name: 'Rule set',\n compareMethod: 'and',\n rules: [\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 1',\n subject: 'order.status',\n resource: 'не обработан',\n condition: '=',\n },\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 2',\n subject: 'feature.status',\n resource: 'отменен',\n condition: '=',\n },\n ],\n },\n ],\n },\n ];\n\n const policies = config.map(cfg => AbilityPolicy.parse<Resources>(cfg));\n const result = new AbilityResolver(policies).resolve('order.status', {\n account: {\n roles: ['user', 'couch'],\n },\n order: {\n status: 'не обработан',\n },\n feature: {\n status: 'отменен',\n // status: 'завершен'\n },\n });\n\n res.statusCode = 200;\n res.setHeader('content-type', 'application/json');\n\n res.write(\n JSON.stringify({\n status: result.isDeny() ? 'deny' : 'permit',\n }),\n );\n res.end();\n});\n\nserver.listen(8080, 'localhost', () => {\n console.debug('server started at http://localhost:8080');\n});\n\nexport type Resources = {\n readonly ['account.read']: {\n readonly account: {\n readonly id: string;\n readonly roles: readonly string[];\n } | null;\n readonly resource: {\n readonly id: string;\n };\n };\n readonly ['access.auth']: {\n readonly token: {\n readonly type: string;\n readonly id: string;\n } | null;\n };\n readonly ['order.update']: {\n readonly account: {\n readonly roles: readonly string[];\n readonly department: string;\n } | null;\n readonly order: {\n readonly status: string;\n } | null;\n };\n};\n","module.exports = require(\"node:http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/playground.ts\");\n",""],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"playground.js","mappings":"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","sources":["webpack://@via-profit/ability/./src/AbilityCode.ts","webpack://@via-profit/ability/./src/AbilityCompare.ts","webpack://@via-profit/ability/./src/AbilityCondition.ts","webpack://@via-profit/ability/./src/AbilityError.ts","webpack://@via-profit/ability/./src/AbilityMatch.ts","webpack://@via-profit/ability/./src/AbilityPolicy.ts","webpack://@via-profit/ability/./src/AbilityPolicyEffect.ts","webpack://@via-profit/ability/./src/AbilityResolver.ts","webpack://@via-profit/ability/./src/AbilityRule.ts","webpack://@via-profit/ability/./src/AbilityRuleSet.ts","webpack://@via-profit/ability/./src/playground.ts","webpack://@via-profit/ability/external node-commonjs \"node:http\"","webpack://@via-profit/ability/webpack/bootstrap","webpack://@via-profit/ability/webpack/before-startup","webpack://@via-profit/ability/webpack/startup","webpack://@via-profit/ability/webpack/after-startup"],"sourcesContent":["export class AbilityCode<T extends string | number | undefined = number> {\n public code: T;\n\n constructor(code: T) {\n this.code = code;\n }\n\n public isEqual(compareWith: AbilityCode<T> | null): boolean {\n return compareWith !== null && this.code === compareWith.code;\n }\n\n public isNotEqual(compareWith: AbilityCode<T> | null): boolean {\n return !this.isEqual(compareWith);\n }\n\n public static fromLiteral<T extends string | number>(literal: string | number): AbilityCode<T> {\n let Code: AbilityCode | null = null;\n\n Object.keys(this).forEach(member => {\n if (member === literal) {\n Code = this[member as keyof typeof this] as AbilityCode;\n }\n });\n\n if (!Code) {\n throw new Error(\n `Mismatch error. The literal ${literal} can not be find as a member of this class`,\n );\n }\n\n return new this((Code as AbilityCode).code) as AbilityCode<T>;\n }\n}\n\nexport default AbilityCode;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityCompareVariantType = 'and' | 'or'\n\nexport class AbilityCompare extends AbilityCode<AbilityCompareVariantType> {\n public static and = new AbilityCompare('and');\n public static or = new AbilityCompare('or');\n}\n\nexport default AbilityCompare;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityConditionVariantType = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'in' | 'not in';\n\nexport class AbilityCondition extends AbilityCode<AbilityConditionVariantType> {\n public static EQUAL = new AbilityCondition('=');\n public static NOT_EQUAL = new AbilityCondition('<>');\n public static MORE_THAN = new AbilityCondition('>');\n public static LESS_THAN = new AbilityCondition('<');\n public static LESS_OR_EQUAL = new AbilityCondition('<=');\n public static MORE_OR_EQUAL = new AbilityCondition('>=');\n public static IN = new AbilityCondition('in');\n public static NOT_IN = new AbilityCondition('not in');\n}\n\nexport default AbilityCondition;\n","export class AbilityError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class AbilityParserError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class PermissionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityMatchVariantType = 'pending' | 'match' | 'mismatch';\n\nexport class AbilityMatch extends AbilityCode<AbilityMatchVariantType>{\n public static pending = new AbilityMatch('pending');\n public static match = new AbilityMatch('match');\n public static mismatch = new AbilityMatch('mismatch');\n}\n\nexport default AbilityMatch;","import AbilityRuleSet, { AbilityRuleSetConfig } from './AbilityRuleSet';\nimport AbilityMatch from './AbilityMatch';\nimport AbilityCompare, { AbilityCompareVariantType } from './AbilityCompare';\nimport AbilityPolicyEffect, { AbilityPolicyEffectVariantType } from './AbilityPolicyEffect';\n\nexport type AbilityPolicyConfig = {\n readonly action: string;\n readonly effect: AbilityPolicyEffectVariantType;\n readonly compareMethod: AbilityCompareVariantType;\n readonly ruleSet: AbilityRuleSetConfig[];\n readonly id: string;\n readonly name: string;\n};\n\nexport class AbilityPolicy<Resources extends object = object> {\n public matchState: AbilityMatch = AbilityMatch.pending;\n /**\n * List of rules\n */\n public ruleSet: AbilityRuleSet[] = [];\n\n /**\n * Policy effect\n */\n public effect: AbilityPolicyEffect;\n\n /**\n * Rules compare method.\\\n * For the «and» method the rule will be permitted if all\\\n * rules will be returns «permit» status and for the «or» - if\\\n * one of the rules returns as «permit»\n */\n public compareMethod: AbilityCompare = AbilityCompare.and;\n\n /**\n * Policy name\n */\n public name: string;\n\n /**\n * Policy ID\n */\n public id: string;\n\n /**\n * Soon\n */\n public action: string;\n\n public constructor(params: {\n id: string;\n name: string;\n action: string;\n effect: AbilityPolicyEffect;\n }) {\n const { name, id, action, effect } = params;\n this.name = name;\n this.id = id;\n this.action = action;\n this.effect = effect;\n }\n\n /**\n * Add rule set to the policy\n * @param ruleSet - The rule set to add\n */\n public addRuleSet(ruleSet: AbilityRuleSet): this {\n this.ruleSet.push(ruleSet);\n\n return this;\n }\n\n /**\n * Check if the policy is matched\n * @param resources - The resource to check\n */\n public check(resources: Resources): AbilityMatch {\n this.matchState = AbilityMatch.mismatch;\n\n if (!this.ruleSet.length) {\n return this.matchState;\n }\n\n const rulesetCheckStates = this.ruleSet.reduce<AbilityMatch[]>((collect, ruleSet) => {\n return collect.concat(ruleSet.check(resources));\n }, []);\n\n if (AbilityCompare.and.isEqual(this.compareMethod)) {\n if (rulesetCheckStates.every(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.matchState = AbilityMatch.match;\n }\n }\n\n if (AbilityCompare.or.isEqual(this.compareMethod)) {\n if (rulesetCheckStates.some(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.matchState = AbilityMatch.match;\n }\n }\n\n return this.matchState;\n }\n\n /**\n * Parse the config JSON format to Policy class instance\n */\n public static parse<Resources extends object = object>(\n config: AbilityPolicyConfig,\n ): AbilityPolicy<Resources> {\n const { id, name, ruleSet, compareMethod, action, effect } = config;\n\n // Create the empty policy\n const policy = new AbilityPolicy<Resources>({\n name,\n id,\n action,\n effect: new AbilityPolicyEffect(effect),\n });\n\n policy.compareMethod = AbilityCompare.fromLiteral(compareMethod);\n\n ruleSet.forEach(ruleSetConfig => {\n policy.addRuleSet(AbilityRuleSet.parse(ruleSetConfig));\n });\n\n return policy;\n }\n\n public export(): AbilityPolicyConfig {\n return {\n id: this.id.toString(),\n name: this.name.toString(),\n compareMethod: this.compareMethod.code.toString() as AbilityPolicyConfig['compareMethod'],\n ruleSet: this.ruleSet.map(rule => rule.export()),\n action: this.action,\n effect: this.effect.code,\n };\n }\n}\n\nexport default AbilityPolicy;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityPolicyEffectVariantType = 'deny' | 'permit';\n\nexport class AbilityPolicyEffect extends AbilityCode<AbilityPolicyEffectVariantType> {\n public static deny = new AbilityPolicyEffect('deny');\n public static permit = new AbilityPolicyEffect('permit');\n}\n\nexport default AbilityPolicyEffect;\n","import AbilityPolicy from './AbilityPolicy';\nimport AbilityPolicyEffect from './AbilityPolicyEffect';\nimport AbilityMatch from './AbilityMatch';\nimport { PermissionError } from './AbilityError';\n\nexport class AbilityResolver<Resources extends object = object> {\n policies: readonly AbilityPolicy<Resources>[];\n\n public constructor(\n policyOrListOfPolicies: readonly AbilityPolicy<Resources>[] | AbilityPolicy<Resources>,\n ) {\n this.policies = Array.isArray(policyOrListOfPolicies)\n ? policyOrListOfPolicies\n : [policyOrListOfPolicies];\n }\n\n /**\n * Resolve policy for the resource and action\n *\n @param action - Action\n * @param resource - Resource\n */\n public resolve<Action extends keyof Resources>(\n action: Action,\n resource: Resources[Action],\n ): this {\n const filteredPolicies: AbilityPolicy[] = this.policies.filter(policy => {\n return AbilityResolver.isInActionContain(policy.action, String(action));\n });\n\n filteredPolicies.map(policy => policy.check(resource as object));\n\n this.policies = filteredPolicies;\n\n return this;\n }\n\n public enforce<Action extends keyof Resources>(\n action: Action,\n resource: Resources[Action],\n ): void | never {\n const resolver = this.resolve(action, resource);\n if (resolver) {\n if (resolver.isDeny()) {\n throw new PermissionError(\n resolver.getMatchedPolicy()?.name?.toString() || 'Unknown permission error',\n );\n }\n }\n }\n\n /**\n * Get the last effect of the policy\n *\n * @returns {AbilityPolicyEffect | null}\n */\n public getEffect(): AbilityPolicyEffect | null {\n const effects = this.policies.reduce<AbilityPolicyEffect[]>((collect, policy, _index) => {\n if (policy.matchState.isEqual(AbilityMatch.match)) {\n return collect.concat(policy.effect);\n }\n return collect;\n }, []);\n\n if (effects.length) {\n return effects[effects.length - 1];\n }\n\n return null;\n }\n\n public isPermit() {\n const effect = this.getEffect();\n\n return effect !== null && effect.isEqual(AbilityPolicyEffect.permit);\n }\n\n public isDeny() {\n const effect = this.getEffect();\n\n return effect !== null && effect.isEqual(AbilityPolicyEffect.deny);\n }\n\n public getMatchedPolicy(): AbilityPolicy<Resources> | null {\n const matchedPolicies = this.policies.filter(policy => policy.matchState.isEqual(AbilityMatch.match));\n\n const lastPolicy = matchedPolicies.length ? matchedPolicies[matchedPolicies.length - 1] : null;\n\n return lastPolicy || null;\n }\n\n /**\n * Check if the action is contained in another action\n * @param actionA - The first action to check\n * @param actionB - The second action to check\n */\n public static isInActionContain(actionA: string, actionB: string) {\n const actionAArray = String(actionA).split('.');\n const actionBArray = String(actionB).split('.');\n\n const a = actionAArray.length >= actionBArray.length ? actionAArray : actionBArray;\n const b = actionBArray.length <= actionAArray.length ? actionBArray : actionAArray;\n\n const c = a\n .reduce<boolean[]>((acc, chunk, index) => {\n const iterationRes = chunk === b[index] || b[index] === '*' || chunk === '*';\n\n return acc.concat(iterationRes);\n }, [])\n\n return c.every(Boolean);\n }\n}\n\nexport default AbilityResolver;\n","import AbilityMatch from './AbilityMatch';\nimport AbilityCondition, { AbilityConditionVariantType } from './AbilityCondition';\n\nexport type AbilityRuleConfig = {\n readonly id: string;\n readonly name: string;\n\n /**\n * Subject key path like a 'user.name'\n */\n readonly subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n readonly resource: string | number | boolean | (string | number)[];\n\n readonly condition: AbilityConditionVariantType;\n};\n\nexport class AbilityRule<Resources extends object = object> {\n /**\n * Subject key path like a 'user.name'\n */\n public subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n public resource: string | number | boolean | (string | number)[];\n\n public condition: AbilityCondition;\n public name: string;\n public id: string;\n public state: AbilityMatch = AbilityMatch.pending;\n\n public constructor(params: AbilityRuleConfig) {\n const { id, name, subject, resource, condition } = params;\n this.id = id;\n this.name = name;\n this.subject = subject;\n this.resource = resource;\n this.condition = new AbilityCondition(condition);\n }\n\n /**\n * Check if the rule is matched\n * @param resource - The resource to check\n */\n public check(resource: Resources | null): AbilityMatch {\n let is: boolean = false;\n\n const [valueS, valueO] = this.extractValues(resource);\n\n if (AbilityCondition.LESS_THAN.isEqual(this.condition)) {\n is = Number(valueS) < Number(valueO);\n }\n\n if (AbilityCondition.LESS_OR_EQUAL.isEqual(this.condition)) {\n is = Number(valueS) <= Number(valueO);\n }\n\n if (AbilityCondition.MORE_THAN.isEqual(this.condition)) {\n is = Number(valueS) > Number(valueO);\n }\n\n if (AbilityCondition.MORE_OR_EQUAL.isEqual(this.condition)) {\n is = Number(valueS) >= Number(valueO);\n }\n\n if (AbilityCondition.EQUAL.isEqual(this.condition)) {\n is = valueS === valueO;\n }\n\n if (AbilityCondition.NOT_EQUAL.isEqual(this.condition)) {\n is = valueS !== valueO;\n }\n\n if (AbilityCondition.IN.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = valueS.includes(valueO);\n }\n }\n\n if (AbilityCondition.NOT_IN.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = !valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = !valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = !valueS.includes(valueO);\n }\n }\n\n this.state = is ? AbilityMatch.match : AbilityMatch.mismatch;\n\n return this.state;\n }\n\n /**\n * Extract values from the resourceData\n * @param resourceData - The resourceData to extract values from\n */\n public extractValues(\n resourceData: Resources | null,\n ): [\n string | number | boolean | (string | number)[] | null | undefined,\n string | number | boolean | (string | number)[] | null | undefined,\n ] {\n let leftSideValue;\n let rightSideValue;\n\n if (resourceData === null || typeof resourceData === 'undefined') {\n return [NaN, NaN];\n }\n\n const isPath = (str: unknown): str is string => {\n return typeof str === 'string' && str.match(/\\./g) !== null;\n };\n\n if (isPath(this.subject)) {\n leftSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.subject,\n );\n } else {\n leftSideValue = this.subject;\n }\n if (isPath(this.resource)) {\n rightSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.resource,\n );\n } else {\n rightSideValue = this.resource as number | boolean | string | (string | number)[];\n }\n\n return [leftSideValue, rightSideValue];\n }\n\n /**\n * Get the value of the object by dot notation\n * @param resource - The object to get the value from\n * @param desc - The dot notation string\n */\n public getDotNotationValue<T = unknown>(resource: unknown, desc: string): T | undefined {\n const arr = desc.split('.');\n\n while (arr.length && resource) {\n const comp = arr.shift() || '';\n const match = new RegExp('(.+)\\\\[([0-9]*)\\\\]').exec(comp);\n\n if (match !== null && match.length == 3) {\n const arrayData = {\n arrName: match[1],\n arrIndex: match[2],\n };\n\n if (resource[arrayData.arrName as keyof typeof resource] !== undefined) {\n resource = resource[arrayData.arrName as keyof typeof resource][arrayData.arrIndex];\n } else {\n resource = undefined;\n }\n } else {\n resource = resource[comp as keyof typeof resource];\n }\n }\n\n return resource as T;\n }\n\n public static parse<Resources extends object>(\n config: AbilityRuleConfig,\n ): AbilityRule<Resources> {\n const { id, name, subject, resource, condition } = config;\n\n return new AbilityRule<Resources>({\n id,\n name,\n subject,\n resource,\n condition,\n });\n }\n\n /**\n * Export the rule to config object\n */\n public export(): AbilityRuleConfig {\n return {\n id: this.id,\n name: this.name,\n subject: this.subject,\n resource: this.resource,\n condition: this.condition.code,\n };\n }\n}\n\nexport default AbilityRule;\n","import AbilityRule, { AbilityRuleConfig } from './AbilityRule';\nimport AbilityCompare, { AbilityCompareVariantType } from './AbilityCompare';\nimport AbilityMatch from './AbilityMatch';\n\nexport type AbilityRuleSetConfig = {\n readonly id: string;\n readonly name: string;\n readonly compareMethod: AbilityCompareVariantType;\n readonly rules: AbilityRuleConfig[];\n};\n\nexport class AbilityRuleSet<Resources extends object = object> {\n public state: AbilityMatch = AbilityMatch.pending;\n /**\n * List of rules\n */\n public rules: AbilityRule[] = [];\n\n /**\n * Rules compare method.\\\n * For the «and» method the rule will be permitted if all\\\n * rules will be returns «permit» status and for the «or» - if\\\n * one of the rules returns as «permit»\n */\n public compareMethod: AbilityCompare = AbilityCompare.and;\n\n /**\n * Group name\n */\n public name: string;\n\n /**\n * Group ID\n */\n public id: string;\n\n public constructor(params: Pick<AbilityRuleSetConfig, 'id' | 'name' | 'compareMethod'>) {\n const { name, id, compareMethod } = params;\n\n this.name = name;\n this.id = id;\n this.compareMethod = AbilityCompare.fromLiteral<AbilityCompareVariantType>(compareMethod);\n // this.compareMethod = new AbilityCompare(compareMethod);\n }\n\n public addRule(rule: AbilityRule, compareMethod: AbilityCompare): this {\n this.rules.push(rule);\n this.compareMethod = compareMethod;\n\n return this;\n }\n\n public addRules(rules: AbilityRule[], compareMethod: AbilityCompare): this {\n rules.forEach(rule => this.addRule(rule, compareMethod));\n\n return this;\n }\n\n public check(resources: Resources | null): AbilityMatch {\n this.state = AbilityMatch.mismatch;\n\n if (!this.rules.length) {\n return this.state;\n }\n\n const ruleCheckStates = this.rules.reduce<AbilityMatch[]>((collect, rule) => {\n return collect.concat(rule.check(resources));\n }, []);\n\n if (AbilityCompare.and.isEqual(this.compareMethod)) {\n if (ruleCheckStates.every(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.state = AbilityMatch.match;\n }\n }\n\n if (AbilityCompare.or.isEqual(this.compareMethod)) {\n if (ruleCheckStates.some(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.state = AbilityMatch.match;\n }\n }\n\n return this.state;\n }\n\n /**\n * Parse the config JSON format to Group class instance\n */\n public static parse<Resource extends object = object>(\n config: AbilityRuleSetConfig,\n ): AbilityRuleSet<Resource> {\n const { id, name, rules, compareMethod } = config;\n\n const ruleSet = new AbilityRuleSet<Resource>({\n compareMethod,\n name,\n id,\n });\n\n // Adding rules if exists\n if (rules && rules.length > 0) {\n const abilityRules = rules.map(ruleConfig => AbilityRule.parse(ruleConfig));\n\n ruleSet.addRules(abilityRules, ruleSet.compareMethod);\n }\n\n return ruleSet;\n }\n\n public export(): AbilityRuleSetConfig {\n return {\n id: this.id.toString(),\n name: this.name.toString(),\n compareMethod: this.compareMethod.code.toString() as AbilityRuleSetConfig['compareMethod'],\n rules: this.rules.map(rule => rule.export()),\n };\n }\n}\n\nexport default AbilityRuleSet;\n","import http from 'node:http';\nimport AbilityPolicy, { AbilityPolicyConfig } from './AbilityPolicy';\nimport AbilityResolver from '~/AbilityResolver';\n\nconst server = http.createServer();\n\nserver.on('request', (_req, res) => {\n type Resources = {\n ['order.status']: {\n readonly account: {\n readonly roles: readonly string[];\n };\n readonly order: {\n readonly status: string;\n };\n readonly feature: {\n readonly status: string;\n };\n };\n };\n\n\n const config: AbilityPolicyConfig[] = [\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui',\n action: 'order.status',\n effect: 'deny',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '9cc009e5-0aa9-453a-a668-cb3f418ced92',\n name: 'Не администратор',\n compareMethod: 'and',\n rules: [\n {\n id: '4093cd50-e54f-4062-8053-2d3b5966fad3',\n name: 'Нет роли администраторв',\n subject: 'account.roles',\n resource: 'administrator',\n condition: '<>',\n },\n ],\n },\n ]\n },\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui 1',\n action: 'order.status',\n effect: 'permit',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '2f8f9d71-860b-4fa6-b395-9331f1f0848e',\n name: 'Rule set',\n compareMethod: 'and',\n rules: [\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 1',\n subject: 'order.status',\n resource: 'не обработан',\n condition: '=',\n },\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 2',\n subject: 'feature.status',\n resource: 'отменен',\n condition: '=',\n },\n ],\n },\n ],\n },\n ];\n\n const policies = config.map(cfg => AbilityPolicy.parse<Resources>(cfg));\n const result = new AbilityResolver(policies).resolve('order.status', {\n account: {\n roles: ['user', 'couch'],\n },\n order: {\n status: 'не обработан',\n },\n feature: {\n status: 'отменен',\n // status: 'завершен'\n },\n });\n\n res.statusCode = 200;\n res.setHeader('content-type', 'application/json');\n\n res.write(\n JSON.stringify({\n status: result.isDeny() ? 'deny' : 'permit',\n }),\n );\n res.end();\n});\n\nserver.listen(8081, 'localhost', () => {\n console.debug('server started at http://localhost:8080');\n});\n\nexport type Resources = {\n readonly ['account.read']: {\n readonly account: {\n readonly id: string;\n readonly roles: readonly string[];\n } | null;\n readonly resource: {\n readonly id: string;\n };\n };\n readonly ['access.auth']: {\n readonly token: {\n readonly type: string;\n readonly id: string;\n } | null;\n };\n readonly ['order.update']: {\n readonly account: {\n readonly roles: readonly string[];\n readonly department: string;\n } | null;\n readonly order: {\n readonly status: string;\n } | null;\n };\n};\n","module.exports = require(\"node:http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/playground.ts\");\n",""],"names":[],"sourceRoot":""}
@@ -3,6 +3,6 @@ export declare class AbilityCode<T extends string | number | undefined = number>
3
3
  constructor(code: T);
4
4
  isEqual(compareWith: AbilityCode<T> | null): boolean;
5
5
  isNotEqual(compareWith: AbilityCode<T> | null): boolean;
6
- static fromLiteral(literal: string | number): AbilityCode;
6
+ static fromLiteral<T extends string | number>(literal: string | number): AbilityCode<T>;
7
7
  }
8
8
  export default AbilityCode;
@@ -1,6 +1,6 @@
1
1
  import AbilityCode from './AbilityCode';
2
2
  export type AbilityCompareVariantType = 'and' | 'or';
3
- export declare class AbilityCompare extends AbilityCode {
3
+ export declare class AbilityCompare extends AbilityCode<AbilityCompareVariantType> {
4
4
  static and: AbilityCompare;
5
5
  static or: AbilityCompare;
6
6
  }
@@ -19,7 +19,7 @@ export declare class AbilityResolver<Resources extends object = object> {
19
19
  getEffect(): AbilityPolicyEffect | null;
20
20
  isPermit(): boolean;
21
21
  isDeny(): boolean;
22
- getPolicy(): AbilityPolicy<Resources> | null;
22
+ getMatchedPolicy(): AbilityPolicy<Resources> | null;
23
23
  /**
24
24
  * Check if the action is contained in another action
25
25
  * @param actionA - The first action to check
package/dist/index.js CHANGED
@@ -49,8 +49,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
49
49
  exports.AbilityCompare = void 0;
50
50
  const AbilityCode_1 = __importDefault(__webpack_require__(19));
51
51
  class AbilityCompare extends AbilityCode_1.default {
52
- static and = new AbilityCompare(0);
53
- static or = new AbilityCompare(1);
52
+ static and = new AbilityCompare('and');
53
+ static or = new AbilityCompare('or');
54
54
  }
55
55
  exports.AbilityCompare = AbilityCompare;
56
56
  exports["default"] = AbilityCompare;
@@ -393,7 +393,7 @@ class AbilityResolver {
393
393
  const resolver = this.resolve(action, resource);
394
394
  if (resolver) {
395
395
  if (resolver.isDeny()) {
396
- throw new AbilityError_1.PermissionError(resolver.getPolicy()?.name?.toString() || 'Unknown permission error');
396
+ throw new AbilityError_1.PermissionError(resolver.getMatchedPolicy()?.name?.toString() || 'Unknown permission error');
397
397
  }
398
398
  }
399
399
  }
@@ -422,9 +422,10 @@ class AbilityResolver {
422
422
  const effect = this.getEffect();
423
423
  return effect !== null && effect.isEqual(AbilityPolicyEffect_1.default.deny);
424
424
  }
425
- getPolicy() {
426
- const lastPolicy = this.policies.length ? this.policies[this.policies.length - 1] : null;
427
- return lastPolicy && lastPolicy.matchState.isEqual(AbilityMatch_1.default.match) ? lastPolicy : null;
425
+ getMatchedPolicy() {
426
+ const matchedPolicies = this.policies.filter(policy => policy.matchState.isEqual(AbilityMatch_1.default.match));
427
+ const lastPolicy = matchedPolicies.length ? matchedPolicies[matchedPolicies.length - 1] : null;
428
+ return lastPolicy || null;
428
429
  }
429
430
  /**
430
431
  * Check if the action is contained in another action
@@ -435,13 +436,13 @@ class AbilityResolver {
435
436
  const actionAArray = String(actionA).split('.');
436
437
  const actionBArray = String(actionB).split('.');
437
438
  const a = actionAArray.length >= actionBArray.length ? actionAArray : actionBArray;
438
- const b = actionBArray.length >= actionAArray.length ? actionBArray : actionAArray;
439
- return a
439
+ const b = actionBArray.length <= actionAArray.length ? actionBArray : actionAArray;
440
+ const c = a
440
441
  .reduce((acc, chunk, index) => {
441
442
  const iterationRes = chunk === b[index] || b[index] === '*' || chunk === '*';
442
443
  return acc.concat(iterationRes);
443
- }, [])
444
- .every(Boolean);
444
+ }, []);
445
+ return c.every(Boolean);
445
446
  }
446
447
  }
447
448
  exports.AbilityResolver = AbilityResolver;
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": "2.0.0-rc.5",
4
+ "version": "2.0.0-rc.8",
5
5
  "description": "Via-Profit Ability service",
6
6
  "keywords": [
7
7
  "ability",