You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@casl/ability

Package Overview
Dependencies
Maintainers
1
Versions
88
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@casl/ability - npm Package Compare versions

Comparing version
5.1.0-next.9
to
5.1.0-next.10
dist/es6c/extra.js.gz

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

+49
-0

@@ -5,2 +5,51 @@ # Change Log

# [5.1.0-next.10](https://github.com/stalniy/casl/compare/@casl/ability@5.1.0-next.9...@casl/ability@5.1.0-next.10) (2020-10-17)
### Code Refactoring
* **ruleIndex:** removes possibility to pass subject to `rulesFor` and `possibleRulesFor` [skip release] ([b8c324d](https://github.com/stalniy/casl/commit/b8c324d747f0a4fb8554931a85f1af211fe3c268))
### Performance Improvements
* **ruleIndex:** removes subject type detection from `_buildIndexFor` ([13fe934](https://github.com/stalniy/casl/commit/13fe93437fa3f9f5604a962eecaac02c663b39cb))
### BREAKING CHANGES
* **ruleIndex:** `rulesFor`, `possibleRulesFor`, `rulesToQuery`, `ruleToAST`, `rulesToFields` accepts only subject type now!
**Before**
```js
import { Ability } from '@casl/ability';
const ability = new Ability([
{ action: 'read', subject: 'Post' }
]);
class Post {}
console.log(ability.rulesFor('read', new Post())); // [Rule]
console.log(ability.rulesFor('read', 'Post')); // [Rule]
```
**After**
```js
import { Ability } from '@casl/ability';
const ability = new Ability([
{ action: 'read', subject: 'Post' }
]);
class Post {}
console.log(ability.rulesFor('read', new Post())); // throws exception
console.log(ability.rulesFor('read', 'Post')); // [Rule]
```
Other functions and methods have the same behavior
# [5.1.0-next.9](https://github.com/stalniy/casl/compare/@casl/ability@5.1.0-next.8...@casl/ability@5.1.0-next.9) (2020-09-28)

@@ -7,0 +56,0 @@

+1
-1

@@ -1,2 +0,2 @@

function r(r,n){r.prototype=Object.create(n.prototype);r.prototype.constructor=r;r.__proto__=n}var n=function r(n,t){this.operator=n,this.value=t};var t=function(n){r(t,n);function t(r,t){if(!Array.isArray(t))throw new Error('"'+r+'" operator expects to receive an array of conditions');return n.call(this,r,t)||this}return t}(n);var e="__itself__";var i=function r(n,t,e){this.operator=n,this.value=e,this.field=t};var o=new n("__null__",null);function u(r,n){var t=r[n];if("function"!=typeof t)throw new Error('Unable to interpret "'+n+'" condition. Did you forget to register interpreter for it?');return t}function a(r,n){var t=n;var e;switch(t?t.numberOfArguments:0){case 1:e=function n(t){return u(r,t.operator)(t,i)};break;case 3:e=function n(t,e,o){return u(r,t.operator)(t,e,o,i)};break;default:e=function n(t,e){return u(r,t.operator)(t,e,i)}}var i=Object.assign({},t,{interpret:e});return i.interpret}function f(r,n){return function(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),o=1;o<e;o++)i[o-1]=arguments[o];var u=r.apply(void 0,[t].concat(i)),a=n.bind(null,u);return a.ast=u,a}}function c(r,n){return n instanceof t&&n.operator===r}function v(r,n){return 1===n.length?n[0]:new t(r,function r(n,t,e){var i=e||[];for(var o=0,u=t.length;o<u;o++){var a=t[o];c(n,a)?r(n,a.value,i):i.push(a)}return i}(r,n))}var s=function r(n){return v("and",n)},l=function r(n){return v("or",n)};function p(r){if(!r||r&&r.constructor!==Object)return!1;for(var n in r)if(r.hasOwnProperty(n)&&"$"===n[0])return!0;return!1}function d(r,n){if(!Array.isArray(n))throw new Error('"'+r.name+'" expects value to be an array')}function h(r,n){if(d(r,n),!n.length)throw new Error('"'+r.name+'" expects to have at least one element in array')}var w=function r(n){return function(r,t){if(typeof t!==n)throw new Error('"'+r.name+'" expects value to be a "'+n+'"')}},y={type:"compound",validate:h,parse:function r(n,t,e){var i=e.parse;var o=t.map((function(r){return i(r)}));return v(n.name,o)}},b=y,$={type:"compound",validate:h},g={type:"field",validate:function r(n,t){if(!(t&&(t instanceof RegExp||t.constructor===Object)))throw new Error('"'+n.name+'" expects to receive either regular expression or object of field operators')},parse:function r(n,e,o){var u=e instanceof RegExp?new i("regex",o.field,e):o.parse(e,o);return new t(n.name,[u])}},j={type:"field",validate:function r(n,t){if(!t||t.constructor!==Object)throw new Error('"'+n.name+'" expects to receive an object with nested query or field level operators')},parse:function r(n,t,o){var u=o.parse,a=o.field;var f=p(t)?u(t,{field:e}):u(t);return new i(n.name,a,f)}},m={type:"field",validate:w("number")},x={type:"field",validate:d},E=x,O=x,A={type:"field",validate:function r(n,t){if(!Array.isArray(t)||2!==t.length)throw new Error('"'+n.name+'" expects an array with 2 numeric elements')}},_={type:"field",validate:w("boolean")},q={type:"field",validate:function r(n,t){if(!("string"==typeof t||"number"==typeof t||t instanceof Date))throw new Error('"'+n.name+'" expects value to be comparable (i.e., string, number or date)')}},U=q,S=U,k=U,R={type:"field"},D=R,N={type:"field",validate:function r(n,t){if(!(t instanceof RegExp)&&"string"!=typeof t)throw new Error('"'+n.name+'" expects value to be a regular expression or a string that represents regular expression')},parse:function r(n,t,e){var o="string"==typeof t?new RegExp(t,e.query.$options||""):t;return new i(n.name,e.field,o)}},z={type:"field",parse:function r(){return o}},M={type:"document",validate:w("function")};var F=Object.freeze({__proto__:null,$and:y,$or:b,$nor:$,$not:g,$elemMatch:j,$size:m,$in:x,$nin:E,$all:O,$mod:A,$exists:_,$gte:q,$gt:U,$lt:S,$lte:k,$eq:R,$ne:D,$regex:N,$options:z,$where:M});var J={compound:function r(n,e,i){var o=(Array.isArray(e)?e:[e]).map((function(r){return i.parse(r)}));return new t(n.name,o)},field:function r(n,t,e){return new i(n.name,e.field,t)},document:function r(t,e){return new n(t.name,e)}};function P(r,n,t){"function"==typeof r.validate&&r.validate(r,n);return(r.parse||J[r.type])(r,n,t)}var T=function(){function r(r){this.t=void 0,this.o=void 0,this.t=Object.keys(r).reduce((function(n,t){return n[t]=Object.assign({},r[t],{name:t.slice(1)}),n}),{}),this.parse=this.parse.bind(this),this.o={field:"",query:{},parse:this.parse}}var n=r.prototype;n.setParse=function r(n){this.parse=n,this.o.parse=n};n.i=function r(n,t,e,i){var o=this.t[t];if(!o)throw new Error('Unsupported operator "'+t+'"');if("field"!==o.type)throw new Error("Unexpected "+o.type+' operator "'+t+'" at field level');return this.o.field=n,this.o.query=i,P(o,e,this.o)};n.s=function r(n,t){var e=[],i=Object.keys(t);for(var u=0,a=i.length;u<a;u++){var f=i[u];if("$"!==f[0])throw new Error('Field query for "'+n+'" may contain only operators or a plain object as a value');var c=this.i(n,f,t[f],t);c!==o&&e.push(c)}return e};n.parse=function r(n,t){if(t&&t.field)return s(this.s(t.field,n));var e=n,i={query:e,parse:this.parse},o=[],u=Object.keys(e);for(var a=0,f=u.length;a<f;a++){var c=u[a],v=e[c],l="$"===c[0],d=this.t[c];if(l){if(!d)throw new Error('Unsupported operator "'+c+'"');if("document"!==d.type&&"compound"!==d.type)throw new Error('Unknown top level operator "'+c+'"');o.push(P(d,v,i))}else p(v)?o.push.apply(o,this.s(c,v)):o.push(this.i(c,"$eq",v,e))}return s(o)};return r}();var B=F;function C(r,n,t){for(var e=0,i=r.length;e<i;e++)if(t(r[e],n))return!0;return!1}function G(r,n){return Array.isArray(r)&&Number.isNaN(Number(n))}function H(r,n,t){return G(r,n)?r.reduce((function(r,e){var i=t(e,n);return void 0!==i?r.concat(i):r}),[]):t(r,n)}function I(r){return function(n,t,e){var i=e.get(t,n.field);return Array.isArray(i)?i.some((function(t){return r(n,t,e)})):r(n,i,e)}}var K=function r(n,t){return n[t]};function L(r,n,t){var e=n.lastIndexOf(".");return-1===e?[r,n]:[t(r,n.slice(0,e)),n.slice(e+1)]}function Q(r,n,t){if(void 0===t)t=K;if(n===e)return r;if(!r)throw new Error('Unable to get field "'+n+'" out of '+String(r)+".");return function(r,n,t){if(-1===n.indexOf("."))return H(r,n,t);var e=n.split(".");var i=r;for(var o=0,u=e.length;o<u;o++)if(i=H(i,e[o],t),!i||"object"!=typeof i)return i;return i}(r,n,t)}function V(r,n){return r===n?0:r>n?1:-1}function W(r,n){if(void 0===n)n={};var t=n.compare||V;return a(r,Object.assign({get:Q,compare:V,equal:function r(n,e){return 0===t(n,e)}},n))}var X=function r(n,t,e){var i=e.interpret;return n.value.some((function(r){return i(r,t)}))},Y=function r(n,t,e){return!X(n,t,e)},Z=function r(n,t,e){var i=e.interpret;return n.value.every((function(r){return i(r,t)}))},rr=function r(n,t,e){var i=e.interpret;return!i(n.value[0],t)},nr=function r(n,t,e){var i=e.equal,o=e.get;var u=o(t,n.field);return Array.isArray(u)&&!Array.isArray(n.value)?C(u,n.value,i):i(u,n.value)},tr=function r(n,t,e){return!nr(n,t,e)},er=I((function(r,n,t){var e=t.compare(n,r.value);return 0===e||-1===e})),ir=I((function(r,n,t){return-1===t.compare(n,r.value)})),or=I((function(r,n,t){return 1===t.compare(n,r.value)})),ur=I((function(r,n,t){var e=t.compare(n,r.value);return 0===e||1===e})),ar=function r(n,t,i){var o=i.get;if(n.field===e)return void 0!==t;var u=L(t,n.field,o),a=u[0],f=u[1],c=function r(t){return!!t&&t.hasOwnProperty(f)===n.value};return G(a,f)?a.some(c):c(a)},fr=I((function(r,n){return n%r.value[0]===r.value[1]})),cr=function r(n,t,i){var o=i.get;var u=L(t,n.field,o),a=u[0],f=u[1],c=function r(t){var e=o(t,f);return Array.isArray(e)&&e.length===n.value};return n.field!==e&&G(a,f)?a.some(c):c(a)},vr=I((function(r,n){return r.value.test(n)})),sr=I((function(r,n,t){var e=t.equal;return C(r.value,n,e)})),lr=function r(n,t,e){return!sr(n,t,e)},pr=function r(n,t,e){var i=e.equal,o=e.get;var u=o(t,n.field);return Array.isArray(u)&&n.value.every((function(r){return C(u,r,i)}))},dr=function r(n,t,e){var i=e.interpret,o=e.get;var u=o(t,n.field);return Array.isArray(u)&&u.some((function(r){return i(n.value,r)}))},hr=function r(n,t){return n.value.call(t)};var wr=Object.freeze({__proto__:null,or:X,nor:Y,and:Z,not:rr,eq:nr,ne:tr,lte:er,lt:ir,gt:or,gte:ur,exists:ar,mod:fr,size:cr,regex:vr,within:sr,nin:lr,all:pr,elemMatch:dr,where:hr});var yr=Object.assign({},wr,{in:sr}),br=W(yr);function $r(r){return r instanceof Date?r.getTime():r&&"function"==typeof r.toJSON?r.toJSON():r}var gr=function r(n,t){return V($r(n),$r(t))};function jr(r,n,t){var i=new T(r),o=W(n,Object.assign({compare:gr},t));if(t&&t.forPrimitives){var u={field:e},a=i.parse;i.setParse((function(r){return a(r,u)}))}return f(i.parse,o)}var mr=jr(B,yr),xr=jr(["$and","$or"].reduce((function(r,n){return r[n]=Object.assign({},r[n],{type:"field"}),r}),Object.assign({},B,{$nor:Object.assign({},B.$nor,{type:"field",parse:J.compound})})),yr,{forPrimitives:!0});function Er(r){return Array.isArray(r)?r:[r]}function Or(r,n,t){var e=r;var i=n;if(-1!==n.indexOf(".")){var o=n.split(".");i=o.pop();e=o.reduce((function(r,n){r[n]=r[n]||{};return r[n]}),r)}e[i]=t}function Ar(r,n,t,e){var i=Object.create(null);var o=r.rulesFor(n,t);for(var u=0;u<o.length;u++){var a=o[u];var f=a.inverted?"$and":"$or";if(!a.conditions)if(a.inverted)break;else{delete i[f];return i}else{i[f]=i[f]||[];i[f].push(e(a))}}return i.$or?i:null}function _r(r){if(!r.ast)throw new Error('Ability rule "'+JSON.stringify(r)+'" does not have "ast" property. So, cannot be used to generate AST');return r.ast}function qr(r,n,t){var e=Ar(r,n,t,_r);if(null===e)return null;if(!e.$and)return e.$or?l(e.$or):s([]);if(e.$or)e.$and.push(l(e.$or));return s(e.$and)}function Ur(r,n,t){return r.rulesFor(n,t).filter((function(r){return!r.inverted&&r.conditions})).reduce((function(r,n){var t=n.conditions;return Object.keys(t).reduce((function(r,n){var e=t[n];if(!e||e.constructor!==Object)Or(r,n,e);return r}),r)}),{})}var Sr=function r(n){return n.fields};function kr(r){this.delete(r)}function Rr(r){this.add(r)}function Dr(r,n,t,e){if(void 0===e)e={};var i=e.fieldsFrom||Sr;var o=r.possibleRulesFor(n,t).filter((function(r){return r.matchesConditions(t)})).reverse().reduce((function(r,n){var t=i(n);if(t){var e=n.inverted?kr:Rr;t.forEach(e,r)}return r}),new Set);return Array.from(o)}var Nr=function r(n){return Array.isArray(n)?n.join(","):n};function zr(r,n){return r.map((function(r){var t=[Nr(r.action||r.actions),"function"===typeof n?Er(r.subject).map(n).join(","):Nr(r.subject),r.conditions||0,r.inverted?1:0,r.fields?Nr(r.fields):0,r.reason||""];while(!t[t.length-1])t.pop();return t}))}function Mr(r,n){return r.map((function(r){var t=r[0],e=r[1],i=r[2],o=r[3],u=r[4],a=r[5];var f=e.split(",");var c={inverted:!!o,action:t.split(","),subject:"function"===typeof n?f.map(n):f};if(i)c.conditions=i;if(u)c.fields=u.split(",");if(a)c.reason=a;return c}))}export{zr as packRules,Dr as permittedFieldsOf,qr as rulesToAST,Ur as rulesToFields,Ar as rulesToQuery,Mr as unpackRules};
import{buildOr as r,buildAnd as n}from"@ucast/mongo2js";function t(r){return Array.isArray(r)?r:[r]}function e(r,n,t){var e=r;var u=n;if(-1!==n.indexOf(".")){var i=n.split(".");u=i.pop();e=i.reduce((function(r,n){r[n]=r[n]||{};return r[n]}),r)}e[u]=t}function u(r,n,t,e){var u=Object.create(null);var i=r.rulesFor(n,t);for(var f=0;f<i.length;f++){var o=i[f];var a=o.inverted?"$and":"$or";if(!o.conditions)if(o.inverted)break;else{delete u[a];return u}else{u[a]=u[a]||[];u[a].push(e(o))}}return u.$or?u:null}function i(r){if(!r.ast)throw new Error('Ability rule "'+JSON.stringify(r)+'" does not have "ast" property. So, cannot be used to generate AST');return r.ast}function f(t,e,f){var o=u(t,e,f,i);if(null===o)return null;if(!o.$and)return o.$or?r(o.$or):n([]);if(o.$or)o.$and.push(r(o.$or));return n(o.$and)}function o(r,n,t){return r.rulesFor(n,t).reduce((function(r,n){if(n.inverted||!n.conditions)return r;return Object.keys(n.conditions).reduce((function(r,t){var u=n.conditions[t];if(!u||u.constructor!==Object)e(r,t,u);return r}),r)}),{})}var a=function r(n){return n.fields};function c(r){this.delete(r)}function v(r){this.add(r)}function l(r,n,t,e){if(void 0===e)e={};var u=e.fieldsFrom||a;var i=r.detectSubjectType(t);var f=r.possibleRulesFor(n,i).reduceRight((function(r,n){if(!n.matchesConditions(t))return r;var e=u(n);if(e){var i=n.inverted?c:v;e.forEach(i,r)}return r}),new Set);return Array.from(f)}var s=function r(n){return Array.isArray(n)?n.join(","):n};function b(r,n){return r.map((function(r){var e=[s(r.action||r.actions),"function"===typeof n?t(r.subject).map(n).join(","):s(r.subject),r.conditions||0,r.inverted?1:0,r.fields?s(r.fields):0,r.reason||""];while(!e[e.length-1])e.pop();return e}))}function y(r,n){return r.map((function(r){var t=r[0],e=r[1],u=r[2],i=r[3],f=r[4],o=r[5];var a=e.split(",");var c={inverted:!!i,action:t.split(","),subject:"function"===typeof n?a.map(n):a};if(u)c.conditions=u;if(f)c.fields=f.split(",");if(o)c.reason=o;return c}))}export{b as packRules,l as permittedFieldsOf,f as rulesToAST,o as rulesToFields,u as rulesToQuery,y as unpackRules};
//# sourceMappingURL=extra.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"extra.js","sources":["../../../../node_modules/.pnpm/@ucast/core@1.5.0/node_modules/@ucast/core/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo@2.3.1/node_modules/@ucast/mongo/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/js@2.2.1/node_modules/@ucast/js/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo2js@1.3.0/node_modules/@ucast/mongo2js/dist/es6m/index.mjs","../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["class t{constructor(t,n){this.operator=t,this.value=n}}class n extends t{constructor(t,n){if(!Array.isArray(n))throw new Error(`\"${t}\" operator expects to receive an array of conditions`);super(t,n)}}const r=\"__itself__\";class o{constructor(t,n,r){this.operator=t,this.value=r,this.field=n}}const e=new t(\"__null__\",null);function c(t,n){const r=t[n];if(\"function\"!=typeof r)throw new Error(`Unable to interpret \"${n}\" condition. Did you forget to register interpreter for it?`);return r}function s(t,n){const r=n;let o;switch(r?r.numberOfArguments:0){case 1:o=n=>c(t,n.operator)(n,e);break;case 3:o=(n,r,o)=>c(t,n.operator)(n,r,o,e);break;default:o=(n,r)=>c(t,n.operator)(n,r,e)}const e=Object.assign({},r,{interpret:o});return e.interpret}function i(t,n){return(r,...o)=>{const e=t(r,...o),c=n.bind(null,e);return c.ast=e,c}}function u(t,r){return r instanceof n&&r.operator===t}function f(t,r){return 1===r.length?r[0]:new n(t,function t(n,r,o){const e=o||[];for(let o=0,c=r.length;o<c;o++){const c=r[o];u(n,c)?t(n,c.value,e):e.push(c)}return e}(t,r))}const a=t=>f(\"and\",t),l=t=>f(\"or\",t);export{n as CompoundCondition,t as DocumentCondition,o as FieldCondition,r as ITSELF,e as NULL_CONDITION,a as buildAnd,l as buildOr,s as createInterpreter,i as createTranslatorFactory,u as isCompound,f as optimizedCompoundCondition};\n//# sourceMappingURL=index.mjs.map\n","import{optimizedCompoundCondition as e,FieldCondition as t,CompoundCondition as r,ITSELF as o,NULL_CONDITION as n,DocumentCondition as i,buildAnd as a}from\"@ucast/core\";function s(e){if(!e||e&&e.constructor!==Object)return!1;for(const t in e)if(e.hasOwnProperty(t)&&\"$\"===t[0])return!0;return!1}function p(e,t){if(!Array.isArray(t))throw new Error(`\"${e.name}\" expects value to be an array`)}function c(e,t){if(p(e,t),!t.length)throw new Error(`\"${e.name}\" expects to have at least one element in array`)}const l=e=>(t,r)=>{if(typeof r!==e)throw new Error(`\"${t.name}\" expects value to be a \"${e}\"`)},f={type:\"compound\",validate:c,parse(t,r,{parse:o}){const n=r.map(e=>o(e));return e(t.name,n)}},d=f,u={type:\"compound\",validate:c},h={type:\"field\",validate(e,t){if(!(t&&(t instanceof RegExp||t.constructor===Object)))throw new Error(`\"${e.name}\" expects to receive either regular expression or object of field operators`)},parse(e,o,n){const i=o instanceof RegExp?new t(\"regex\",n.field,o):n.parse(o,n);return new r(e.name,[i])}},$={type:\"field\",validate(e,t){if(!t||t.constructor!==Object)throw new Error(`\"${e.name}\" expects to receive an object with nested query or field level operators`)},parse(e,r,{parse:n,field:i}){const a=s(r)?n(r,{field:o}):n(r);return new t(e.name,i,a)}},w={type:\"field\",validate:l(\"number\")},y={type:\"field\",validate:p},v=y,b=y,m={type:\"field\",validate(e,t){if(!Array.isArray(t)||2!==t.length)throw new Error(`\"${e.name}\" expects an array with 2 numeric elements`)}},x={type:\"field\",validate:l(\"boolean\")},E={type:\"field\",validate:function(e,t){if(!(\"string\"==typeof t||\"number\"==typeof t||t instanceof Date))throw new Error(`\"${e.name}\" expects value to be comparable (i.e., string, number or date)`)}},g=E,j=g,O=g,q={type:\"field\"},_=q,R={type:\"field\",validate(e,t){if(!(t instanceof RegExp)&&\"string\"!=typeof t)throw new Error(`\"${e.name}\" expects value to be a regular expression or a string that represents regular expression`)},parse(e,r,o){const n=\"string\"==typeof r?new RegExp(r,o.query.$options||\"\"):r;return new t(e.name,o.field,n)}},U={type:\"field\",parse:()=>n},A={type:\"document\",validate:l(\"function\")};var F=Object.freeze({__proto__:null,$and:f,$or:d,$nor:u,$not:h,$elemMatch:$,$size:w,$in:y,$nin:v,$all:b,$mod:m,$exists:x,$gte:E,$gt:g,$lt:j,$lte:O,$eq:q,$ne:_,$regex:R,$options:U,$where:A});const k={compound(e,t,o){const n=(Array.isArray(t)?t:[t]).map(e=>o.parse(e));return new r(e.name,n)},field:(e,r,o)=>new t(e.name,o.field,r),document:(e,t)=>new i(e.name,t)};function z(e,t,r){\"function\"==typeof e.validate&&e.validate(e,t);return(e.parse||k[e.type])(e,t,r)}class D{constructor(e){this.t=void 0,this.o=void 0,this.t=Object.keys(e).reduce((t,r)=>(t[r]=Object.assign({},e[r],{name:r.slice(1)}),t),{}),this.parse=this.parse.bind(this),this.o={field:\"\",query:{},parse:this.parse}}setParse(e){this.parse=e,this.o.parse=e}i(e,t,r,o){const n=this.t[t];if(!n)throw new Error(`Unsupported operator \"${t}\"`);if(\"field\"!==n.type)throw new Error(`Unexpected ${n.type} operator \"${t}\" at field level`);return this.o.field=e,this.o.query=o,z(n,r,this.o)}s(e,t){const r=[],o=Object.keys(t);for(let i=0,a=o.length;i<a;i++){const a=o[i];if(\"$\"!==a[0])throw new Error(`Field query for \"${e}\" may contain only operators or a plain object as a value`);const s=this.i(e,a,t[a],t);s!==n&&r.push(s)}return r}parse(e,t){if(t&&t.field)return a(this.s(t.field,e));const r=e,o={query:r,parse:this.parse},n=[],i=Object.keys(r);for(let e=0,t=i.length;e<t;e++){const t=i[e],a=r[t],p=\"$\"===t[0],c=this.t[t];if(p){if(!c)throw new Error(`Unsupported operator \"${t}\"`);if(\"document\"!==c.type&&\"compound\"!==c.type)throw new Error(`Unknown top level operator \"${t}\"`);n.push(z(c,a,o))}else s(a)?n.push(...this.s(t,a)):n.push(this.i(t,\"$eq\",a,r))}return a(n)}}const M=F;export{b as $all,f as $and,$ as $elemMatch,q as $eq,x as $exists,g as $gt,E as $gte,y as $in,j as $lt,O as $lte,m as $mod,_ as $ne,v as $nin,u as $nor,h as $not,U as $options,d as $or,R as $regex,w as $size,A as $where,D as MongoQueryParser,M as allParsingInstructions,k as defaultParsers};\n//# sourceMappingURL=index.mjs.map\n","import{ITSELF as r,createInterpreter as t}from\"@ucast/core\";function n(r,t,n){for(let e=0,o=r.length;e<o;e++)if(n(r[e],t))return!0;return!1}function e(r,t){return Array.isArray(r)&&Number.isNaN(Number(t))}function o(r,t,n){return e(r,t)?r.reduce((r,e)=>{const o=n(e,t);return void 0!==o?r.concat(o):r},[]):n(r,t)}function u(r){return(t,n,e)=>{const o=e.get(n,t.field);return Array.isArray(o)?o.some(n=>r(t,n,e)):r(t,o,e)}}const c=(r,t)=>r[t];function i(r,t,n){const e=t.lastIndexOf(\".\");return-1===e?[r,t]:[n(r,t.slice(0,e)),t.slice(e+1)]}function f(t,n,e=c){if(n===r)return t;if(!t)throw new Error(`Unable to get field \"${n}\" out of ${String(t)}.`);return function(r,t,n){if(-1===t.indexOf(\".\"))return o(r,t,n);const e=t.split(\".\");let u=r;for(let r=0,t=e.length;r<t;r++)if(u=o(u,e[r],n),!u||\"object\"!=typeof u)return u;return u}(t,n,e)}function s(r){return(t,n)=>f(t,n,r)}const a=(r,t)=>r===t;function l(r,t){return r===t?0:r>t?1:-1}function g(r,n={}){const e=n.compare||l;return t(r,Object.assign({get:f,compare:l,equal:(r,t)=>0===e(r,t)},n))}const p=(r,t,{interpret:n})=>r.value.some(r=>n(r,t)),y=(r,t,n)=>!p(r,t,n),b=(r,t,{interpret:n})=>r.value.every(r=>n(r,t)),m=(r,t,{interpret:n})=>!n(r.value[0],t),A=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&!Array.isArray(r.value)?n(u,r.value,e):e(u,r.value)},d=(r,t,n)=>!A(r,t,n),q=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||-1===e}),h=u((r,t,n)=>-1===n.compare(t,r.value)),j=u((r,t,n)=>1===n.compare(t,r.value)),w=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||1===e}),_=(t,n,{get:o})=>{if(t.field===r)return void 0!==n;const[u,c]=i(n,t.field,o),f=r=>!!r&&r.hasOwnProperty(c)===t.value;return e(u,c)?u.some(f):f(u)},v=u((r,t)=>t%r.value[0]===r.value[1]),x=(t,n,{get:o})=>{const[u,c]=i(n,t.field,o),f=r=>{const n=o(r,c);return Array.isArray(n)&&n.length===t.value};return t.field!==r&&e(u,c)?u.some(f):f(u)},O=u((r,t)=>r.value.test(t)),N=u((r,t,{equal:e})=>n(r.value,t,e)),$=(r,t,n)=>!N(r,t,n),z=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&r.value.every(r=>n(u,r,e))},E=(r,t,{interpret:n,get:e})=>{const o=e(t,r.field);return Array.isArray(o)&&o.some(t=>n(r.value,t))},M=(r,t)=>r.value.call(t);var S=Object.freeze({__proto__:null,or:p,nor:y,and:b,not:m,eq:A,ne:d,lte:q,lt:h,gt:j,gte:w,exists:_,mod:v,size:x,regex:O,within:N,nin:$,all:z,elemMatch:E,where:M});const U=Object.assign({},S,{in:N}),k=g(U);export{z as all,U as allInterpreters,b as and,l as compare,s as createGetter,g as createJsInterpreter,E as elemMatch,A as eq,a as equal,_ as exists,f as getObjectField,i as getObjectFieldCursor,j as gt,w as gte,k as interpret,h as lt,q as lte,v as mod,d as ne,$ as nin,y as nor,m as not,p as or,O as regex,x as size,M as where,N as within};\n//# sourceMappingURL=index.mjs.map\n","import{createTranslatorFactory as o,ITSELF as t}from\"@ucast/core\";export*from\"@ucast/core\";import{MongoQueryParser as r,allParsingInstructions as e,defaultParsers as c}from\"@ucast/mongo\";export*from\"@ucast/mongo\";import{createJsInterpreter as n,allInterpreters as f,compare as s}from\"@ucast/js\";export*from\"@ucast/js\";function i(o){return o instanceof Date?o.getTime():o&&\"function\"==typeof o.toJSON?o.toJSON():o}const m=(o,t)=>s(i(o),i(t));function p(e,c,f){const s=new r(e),i=n(c,Object.assign({compare:m},f));if(f&&f.forPrimitives){const o={field:t},r=s.parse;s.setParse(t=>r(t,o))}return o(s.parse,i)}const a=p(e,f),u=p([\"$and\",\"$or\"].reduce((o,t)=>(o[t]=Object.assign({},o[t],{type:\"field\"}),o),Object.assign({},e,{$nor:Object.assign({},e.$nor,{type:\"field\",parse:c.compound})})),f,{forPrimitives:!0}),j=a;export{p as createFactory,j as filter,a as guard,u as squire};\n//# sourceMappingURL=index.mjs.map\n","import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf, Generics } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, Normalize } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1],\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subject);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): Condition | null {\n const query = rulesToQuery(ability, action, subject, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): AnyObject {\n return ability.rulesFor(action, subject)\n .filter(rule => !rule.inverted && rule.conditions)\n .reduce((values, rule) => {\n const conditions = rule.conditions!;\n\n return Object.keys(conditions).reduce((fields, fieldName) => {\n const value = conditions[fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const uniqueFields = ability.possibleRulesFor(action, subject)\n .filter(rule => rule.matchesConditions(subject))\n .reverse()\n .reduce((fields, rule) => {\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["t","n","operator","this","value","Array","isArray","Error","_t2","r","o","field","e","c","s","numberOfArguments","Object","assign","interpret","i","bind","ast","u","f","length","push","a","l","constructor","hasOwnProperty","p","name","type","validate","parse","map","d","h","RegExp","$","w","y","v","b","m","x","E","Date","g","j","O","q","_","R","query","$options","U","A","F","freeze","__proto__","$and","$or","$nor","$not","$elemMatch","$size","$in","$nin","$all","$mod","$exists","$gte","$gt","$lt","$lte","$eq","$ne","$regex","$where","k","compound","document","z","D","keys","reduce","slice","setParse","M","Number","isNaN","concat","get","some","lastIndexOf","String","indexOf","split","compare","equal","every","test","N","call","S","or","nor","and","not","eq","ne","lte","lt","gt","gte","exists","mod","size","regex","within","nin","all","elemMatch","where","in","getTime","toJSON","forPrimitives","wrapArray","setByPath","object","path","ref","lastKey","pop","res","prop","rulesToQuery","ability","action","subject","convert","create","rules","rulesFor","rule","op","inverted","conditions","ruleToAST","JSON","stringify","rulesToAST","buildOr","buildAnd","rulesToFields","filter","values","fields","fieldName","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","options","fieldsFrom","uniqueFields","possibleRulesFor","matchesConditions","reverse","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}
{"version":3,"file":"extra.js","sources":["../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, ExtractSubjectType } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subjectType);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): Condition | null {\n const query = rulesToQuery(ability, action, subjectType, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): AnyObject {\n return ability.rulesFor(action, subjectType)\n .reduce((values, rule) => {\n if (rule.inverted || !rule.conditions) {\n return values;\n }\n\n return Object.keys(rule.conditions).reduce((fields, fieldName) => {\n const value = rule.conditions![fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const subjectType = ability.detectSubjectType(subject);\n const uniqueFields = ability.possibleRulesFor(action, subjectType)\n .reduceRight((fields, rule) => {\n if (!rule.matchesConditions(subject)) {\n return fields;\n }\n\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["wrapArray","value","Array","isArray","setByPath","object","path","ref","lastKey","indexOf","keys","split","pop","reduce","res","prop","rulesToQuery","ability","action","subjectType","convert","query","Object","create","rules","rulesFor","i","length","rule","op","inverted","conditions","push","$or","ruleToAST","ast","Error","JSON","stringify","rulesToAST","$and","buildOr","buildAnd","rulesToFields","values","fields","fieldName","constructor","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","subject","options","fieldsFrom","detectSubjectType","uniqueFields","possibleRulesFor","reduceRight","matchesConditions","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","map","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}

@@ -1,2 +0,2 @@

import{createFactory as t,$eq as r,$ne as n,$lt as i,$lte as e,$gt as u,$gte as o,$in as a,$nin as f,$all as s,$size as c,$regex as h,$options as v,$elemMatch as l,$exists as d,eq as p,ne as y,lt as w,lte as g,gt as b,gte as $,within as m,nin as E,all as M,size as j,regex as x,elemMatch as O,exists as A,and as _}from"@ucast/mongo2js";function k(t,r){for(var n=0;n<r.length;n++){var i=r[n];i.enumerable=i.enumerable||false;i.configurable=true;if("value"in i)i.writable=true;Object.defineProperty(t,i.key,i)}}function z(t,r,n){if(r)k(t.prototype,r);if(n)k(t,n);return t}function C(){C=Object.assign||function(t){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i))t[i]=n[i]}return t};return C.apply(this,arguments)}function R(t,r){t.prototype=Object.create(r.prototype);t.prototype.constructor=t;t.__proto__=r}function T(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function q(t){return Array.isArray(t)?t:[t]}var F="__caslSubjectType__";function S(t,r){if(r)if(!r.hasOwnProperty(F))Object.defineProperty(r,F,{value:t});else if(t!==r[F])throw new Error("Trying to cast object to subject type "+t+" but previously it was casted to "+r[F]);return r}function Y(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(F))return t[F];var r="function"===typeof t?t:t.constructor;return r.modelName||r.name}function L(t,r){var n=q(r);var i=0;while(i<n.length){var e=n[i++];if(t.hasOwnProperty(e))n=n.concat(t[e])}return n}function B(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach((function(r){var n=r===t[r]||Array.isArray(t[r])&&(-1!==t[r].indexOf(r)||-1!==t[r].indexOf("manage"));if(n)throw new Error("Attempt to alias action to itself: "+r+" -> "+t[r])}))}function D(t){if("production"!==process.env.NODE_ENV)B(t);return function(r){return L(t,r)}}function G(t,r,n){for(var i=n;i<r.length;i++)t.push(r[i])}function H(t,r){if(!t||!t.length)return r||[];if(!r||!r.length)return t||[];var n=0;var i=0;var e=[];while(n<t.length&&i<r.length)if(t[n].priority<r[i].priority){e.push(t[n]);n++}else{e.push(r[i]);i++}G(e,t,n);G(e,r,i);return e}function I(t,r,n){var i=t.get(r);if(!i){i=n();t.set(r,i)}return i}var J=function t(r){return r};function K(t,r){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!r.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!r.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var N=function(){function t(t,r,n){if(void 0===n)n=0;this.t=void 0;this.i=void 0;K(t,r);this.action=r.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?q(t.fields):void 0;this.priority=n;this.u=r}var r=t.prototype;r.matchesConditions=function t(r){if(!this.conditions)return true;if(!r||"string"===typeof r||"function"===typeof r)return!this.inverted;return this.o(r)};r.matchesField=function t(r){if(!this.fields)return true;if(!r)return!this.inverted;return this.s(r)};z(t,[{key:"_lazyMatchConditions",get:function t(){if(this.conditions&&!this.t)this.t=this.u.conditionsMatcher(this.conditions);return this.t}},{key:"_lazyMatchField",get:function t(){if(this.fields&&!this.i)this.i=this.u.fieldMatcher(this.fields);return this.i}},{key:"ast",get:function t(){return this.o?this.o.ast:void 0}}]);return t}();var P=function t(r,n){var i={value:r,prev:n,next:null};if(n)n.next=i;return i};var Q=function t(r){if(r.next)r.next.prev=r.prev;if(r.prev)r.prev.next=r.next;r.next=r.prev=null};var U=function t(){return{rules:[],merged:false}};var V=function t(){return new Map};var W=function t(r,n){if(!r.h&&n.fields)r.h=true};var X=function(){function t(t,r){if(void 0===t)t=[];if(void 0===r)r={};this.h=false;this.v=new Map;this.l={conditionsMatcher:r.conditionsMatcher,fieldMatcher:r.fieldMatcher,resolveAction:r.resolveAction||J};this.detectSubjectType=r.detectSubjectType||Y;this.p=t;this.g=this.$(t)}var r=t.prototype;r.update=function t(r){var n={rules:r,ability:this,target:this};this.m("update",n);this.p=r;this.g=this.$(r);this.m("updated",n);return this};r.$=function t(r){var n=new Map;for(var i=r.length-1;i>=0;i--){var e=r.length-i-1;var u=new N(r[i],this.l,e);var o=q(u.action);var a=q(u.subject);W(this,u);for(var f=0;f<a.length;f++){var s=this.detectSubjectType(a[f]);var c=I(n,s,V);for(var h=0;h<o.length;h++)I(c,o[h],U).rules.push(u)}}return n};r.possibleRulesFor=function t(r,n){var i=this.detectSubjectType(n);var e=I(this.g,i,V);var u=I(e,r,U);if(u.merged)return u.rules;var o="manage"!==r&&e.has("manage")?e.get("manage").rules:void 0;var a=H(u.rules,o);if("all"!==i)a=H(a,this.possibleRulesFor(r,"all"));u.rules=a;u.merged=true;return a};r.rulesFor=function t(r,n,i){var e=this.possibleRulesFor(r,n);if(i&&"string"!==typeof i)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return e;return e.filter((function(t){return t.matchesField(i)}))};r.on=function t(r,n){var i=this;var e=this.v.get(r)||null;var u=P(n,e);this.v.set(r,u);return function(){if(!u.next&&!u.prev&&i.v.get(r)===u)i.v.delete(r);else Q(u)}};r.m=function t(r,n){var i=this.v.get(r)||null;while(null!==i){var e=i.prev;i.value(n);i=e}};z(t,[{key:"rules",get:function t(){return this.p}}]);return t}();var Z=function(t){R(r,t);function r(){return t.apply(this,arguments)||this}var n=r.prototype;n.can=function t(){var r=this.relevantRuleFor.apply(this,arguments);return!!r&&!r.inverted};n.relevantRuleFor=function t(){var r=this.rulesFor.apply(this,arguments);var n=arguments.length<=1?void 0:arguments[1];for(var i=0,e=r.length;i<e;i++)if(r[i].matchesConditions(n))return r[i];return null};n.cannot=function t(){return!this.can.apply(this,arguments)};return r}(X);var tt={$eq:r,$ne:n,$lt:i,$lte:e,$gt:u,$gte:o,$in:a,$nin:f,$all:s,$size:c,$regex:h,$options:v,$elemMatch:l,$exists:d};var rt={eq:p,ne:y,lt:w,lte:g,gt:b,gte:$,in:m,nin:E,all:M,size:j,regex:x,elemMatch:O,exists:A,and:_};var nt=function r(n,i,e){return t(C({},tt,n),C({},rt,i),e)};var it=t(tt,rt);var et=/[-/\\^$+?.()|[\]{}]/g;var ut=/\.?\*+\.?/g;var ot=/\*+/;var at=/\./g;function ft(t,r,n){var i="*"===n[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";var e=-1===t.indexOf("**")?"[^.]":".";var u=t.replace(at,"\\$&").replace(ot,e+i);return r+t.length===n.length?"(?:"+u+")?":u}function st(t,r,n){if("."===t&&("*"===n[r-1]||"*"===n[r+1]))return t;return"\\"+t}function ct(t){var r=t.map((function(t){return t.replace(et,st).replace(ut,ft)}));var n=r.length>1?"(?:"+r.join("|")+")":r[0];return new RegExp("^"+n+"$")}var ht=function t(r){var n;return function(t){if("undefined"===typeof n)n=r.every((function(t){return-1===t.indexOf("*")}))?null:ct(r);return null===n?-1!==r.indexOf(t):n.test(t)}};var vt=function(t){R(r,t);function r(r,n){if(void 0===r)r=[];if(void 0===n)n={};return t.call(this,r,C({conditionsMatcher:it,fieldMatcher:ht},n))||this}return r}(Z);var lt=function(){function t(t){this.M=t}var r=t.prototype;r.because=function t(r){this.M.reason=r;return this};return t}();var dt=function(){function t(t){this.rules=[];this.j=t;var r=this;r.can=r.can.bind(r);r.cannot=r.cannot.bind(r);r.build=r.build.bind(r)}var r=t.prototype;r.can=function t(r,n,i,e){var u={action:r};if(n){u.subject=n;if(Array.isArray(i)||"string"===typeof i)u.fields=i;else if("undefined"!==typeof i)u.conditions=i;if("undefined"!==typeof e)u.conditions=e}this.rules.push(u);return new lt(u)};r.cannot=function t(r,n,i,e){var u=this.can(r,n,i,e);u.M.inverted=true;return u};r.build=function t(r){return new this.j(this.rules,r)};return t}();function pt(t,r){var n=new dt(vt);var i=t(n.can,n.cannot);if(i&&"function"===typeof i.then)return i.then((function(){return n.build(r)}));return n.build(r)}var yt=function t(r){return'Cannot execute "'+r.action+'" on "'+r.subjectType+'"'};var wt=function t(r){this.message=r};wt.prototype=Object.create(Error.prototype);var gt=function(t){R(r,t);r.setDefaultMessage=function t(r){this.O="string"===typeof r?function(){return r}:r};r.from=function t(r){return new this(r)};function r(r){var n;n=t.call(this,"")||this;n.field=void 0;n.ability=r;if("function"===typeof Error.captureStackTrace){n.name="ForbiddenError";Error.captureStackTrace(T(n),n.constructor)}return n}var n=r.prototype;n.setMessage=function t(r){this.message=r;return this};n.throwUnlessCan=function t(){var r;var n=(r=this.ability).relevantRuleFor.apply(r,arguments);if(n&&!n.inverted)return;this.action=arguments.length<=0?void 0:arguments[0];this.subject=arguments.length<=1?void 0:arguments[1];this.subjectType=this.ability.detectSubjectType(arguments.length<=1?void 0:arguments[1]);this.field=arguments.length<=2?void 0:arguments[2];var i=n?n.reason:"";this.message=this.message||i||this.constructor.O(this);throw this};return r}(wt);gt.O=yt;export{vt as Ability,dt as AbilityBuilder,gt as ForbiddenError,Z as PureAbility,nt as buildMongoQueryMatcher,D as createAliasResolver,pt as defineAbility,Y as detectSubjectType,ht as fieldPatternMatcher,yt as getDefaultErrorMessage,it as mongoQueryMatcher,S as subject,q as wrapArray};
import{createFactory as t,$eq as r,$ne as n,$lt as i,$lte as e,$gt as u,$gte as o,$in as a,$nin as f,$all as s,$size as c,$regex as h,$options as v,$elemMatch as l,$exists as d,eq as p,ne as y,lt as w,lte as g,gt as b,gte as $,within as m,nin as E,all as M,size as j,regex as x,elemMatch as O,exists as A,and as _}from"@ucast/mongo2js";function k(t,r){for(var n=0;n<r.length;n++){var i=r[n];i.enumerable=i.enumerable||false;i.configurable=true;if("value"in i)i.writable=true;Object.defineProperty(t,i.key,i)}}function z(t,r,n){if(r)k(t.prototype,r);if(n)k(t,n);return t}function C(){C=Object.assign||function(t){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i))t[i]=n[i]}return t};return C.apply(this,arguments)}function R(t,r){t.prototype=Object.create(r.prototype);t.prototype.constructor=t;t.__proto__=r}function T(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function q(t){return Array.isArray(t)?t:[t]}var F="__caslSubjectType__";function S(t,r){if(r)if(!r.hasOwnProperty(F))Object.defineProperty(r,F,{value:t});else if(t!==r[F])throw new Error("Trying to cast object to subject type "+t+" but previously it was casted to "+r[F]);return r}function Y(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(F))return t[F];var r="function"===typeof t?t:t.constructor;return r.modelName||r.name}function L(t,r){var n=q(r);var i=0;while(i<n.length){var e=n[i++];if(t.hasOwnProperty(e))n=n.concat(t[e])}return n}function B(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach((function(r){var n=r===t[r]||Array.isArray(t[r])&&(-1!==t[r].indexOf(r)||-1!==t[r].indexOf("manage"));if(n)throw new Error("Attempt to alias action to itself: "+r+" -> "+t[r])}))}function D(t){if("production"!==process.env.NODE_ENV)B(t);return function(r){return L(t,r)}}function G(t,r,n){for(var i=n;i<r.length;i++)t.push(r[i])}function H(t,r){if(!t||!t.length)return r||[];if(!r||!r.length)return t||[];var n=0;var i=0;var e=[];while(n<t.length&&i<r.length)if(t[n].priority<r[i].priority){e.push(t[n]);n++}else{e.push(r[i]);i++}G(e,t,n);G(e,r,i);return e}function I(t,r,n){var i=t.get(r);if(!i){i=n();t.set(r,i)}return i}var J=function t(r){return r};function K(t,r){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!r.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!r.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var N=function(){function t(t,r,n){if(void 0===n)n=0;this.t=void 0;this.i=void 0;K(t,r);this.action=r.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?q(t.fields):void 0;this.priority=n;this.u=r}var r=t.prototype;r.matchesConditions=function t(r){if(!this.conditions)return true;if(!r||"string"===typeof r||"function"===typeof r)return!this.inverted;return this.o(r)};r.matchesField=function t(r){if(!this.fields)return true;if(!r)return!this.inverted;return this.s(r)};z(t,[{key:"_lazyMatchConditions",get:function t(){if(this.conditions&&!this.t)this.t=this.u.conditionsMatcher(this.conditions);return this.t}},{key:"_lazyMatchField",get:function t(){if(this.fields&&!this.i)this.i=this.u.fieldMatcher(this.fields);return this.i}},{key:"ast",get:function t(){return this.o?this.o.ast:void 0}}]);return t}();var P=function t(r,n){var i={value:r,prev:n,next:null};if(n)n.next=i;return i};var Q=function t(r){if(r.next)r.next.prev=r.prev;if(r.prev)r.prev.next=r.next;r.next=r.prev=null};var U=function t(){return{rules:[],merged:false}};var V=function t(){return new Map};var W=function t(r,n){if(!r.h&&n.fields)r.h=true};var X=function(){function t(t,r){if(void 0===t)t=[];if(void 0===r)r={};this.h=false;this.v=new Map;this.l={conditionsMatcher:r.conditionsMatcher,fieldMatcher:r.fieldMatcher,resolveAction:r.resolveAction||J};this.detectSubjectType=r.detectSubjectType||Y;this.p=t;this.g=this.$(t)}var r=t.prototype;r.update=function t(r){var n={rules:r,ability:this,target:this};this.m("update",n);this.p=r;this.g=this.$(r);this.m("updated",n);return this};r.$=function t(r){var n=new Map;for(var i=r.length-1;i>=0;i--){var e=r.length-i-1;var u=new N(r[i],this.l,e);var o=q(u.action);var a=q(u.subject||"all");W(this,u);for(var f=0;f<a.length;f++){var s=I(n,a[f],V);for(var c=0;c<o.length;c++)I(s,o[c],U).rules.push(u)}}return n};r.possibleRulesFor=function t(r,n){var i=I(this.g,n,V);var e=I(i,r,U);if(e.merged)return e.rules;var u="manage"!==r&&i.has("manage")?i.get("manage").rules:void 0;var o=H(e.rules,u);if("all"!==n)o=H(o,this.possibleRulesFor(r,"all"));e.rules=o;e.merged=true;return o};r.rulesFor=function t(r,n,i){var e=this.possibleRulesFor(r,n);if(i&&"string"!==typeof i)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return e;return e.filter((function(t){return t.matchesField(i)}))};r.on=function t(r,n){var i=this;var e=this.v.get(r)||null;var u=P(n,e);this.v.set(r,u);return function(){if(!u.next&&!u.prev&&i.v.get(r)===u)i.v.delete(r);else Q(u)}};r.m=function t(r,n){var i=this.v.get(r)||null;while(null!==i){var e=i.prev;i.value(n);i=e}};z(t,[{key:"rules",get:function t(){return this.p}}]);return t}();var Z=function(t){R(r,t);function r(){return t.apply(this,arguments)||this}var n=r.prototype;n.can=function t(){var r=this.relevantRuleFor.apply(this,arguments);return!!r&&!r.inverted};n.relevantRuleFor=function t(r,n,i){var e=this.rulesFor(r,this.detectSubjectType(n),i);for(var u=0,o=e.length;u<o;u++)if(e[u].matchesConditions(n))return e[u];return null};n.cannot=function t(){return!this.can.apply(this,arguments)};return r}(X);var tt={$eq:r,$ne:n,$lt:i,$lte:e,$gt:u,$gte:o,$in:a,$nin:f,$all:s,$size:c,$regex:h,$options:v,$elemMatch:l,$exists:d};var rt={eq:p,ne:y,lt:w,lte:g,gt:b,gte:$,in:m,nin:E,all:M,size:j,regex:x,elemMatch:O,exists:A,and:_};var nt=function r(n,i,e){return t(C({},tt,n),C({},rt,i),e)};var it=t(tt,rt);var et=/[-/\\^$+?.()|[\]{}]/g;var ut=/\.?\*+\.?/g;var ot=/\*+/;var at=/\./g;function ft(t,r,n){var i="*"===n[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";var e=-1===t.indexOf("**")?"[^.]":".";var u=t.replace(at,"\\$&").replace(ot,e+i);return r+t.length===n.length?"(?:"+u+")?":u}function st(t,r,n){if("."===t&&("*"===n[r-1]||"*"===n[r+1]))return t;return"\\"+t}function ct(t){var r=t.map((function(t){return t.replace(et,st).replace(ut,ft)}));var n=r.length>1?"(?:"+r.join("|")+")":r[0];return new RegExp("^"+n+"$")}var ht=function t(r){var n;return function(t){if("undefined"===typeof n)n=r.every((function(t){return-1===t.indexOf("*")}))?null:ct(r);return null===n?-1!==r.indexOf(t):n.test(t)}};var vt=function(t){R(r,t);function r(r,n){if(void 0===r)r=[];if(void 0===n)n={};return t.call(this,r,C({conditionsMatcher:it,fieldMatcher:ht},n))||this}return r}(Z);var lt=function(){function t(t){this.M=t}var r=t.prototype;r.because=function t(r){this.M.reason=r;return this};return t}();var dt=function(){function t(t){this.rules=[];this.j=t;var r=this;r.can=r.can.bind(r);r.cannot=r.cannot.bind(r);r.build=r.build.bind(r)}var r=t.prototype;r.can=function t(r,n,i,e){var u={action:r};if(n){u.subject=n;if(Array.isArray(i)||"string"===typeof i)u.fields=i;else if("undefined"!==typeof i)u.conditions=i;if("undefined"!==typeof e)u.conditions=e}this.rules.push(u);return new lt(u)};r.cannot=function t(r,n,i,e){var u=this.can(r,n,i,e);u.M.inverted=true;return u};r.build=function t(r){return new this.j(this.rules,r)};return t}();function pt(t,r){var n=new dt(vt);var i=t(n.can,n.cannot);if(i&&"function"===typeof i.then)return i.then((function(){return n.build(r)}));return n.build(r)}var yt=function t(r){return'Cannot execute "'+r.action+'" on "'+r.subjectType+'"'};var wt=function t(r){this.message=r};wt.prototype=Object.create(Error.prototype);var gt=function(t){R(r,t);r.setDefaultMessage=function t(r){this.O="string"===typeof r?function(){return r}:r};r.from=function t(r){return new this(r)};function r(r){var n;n=t.call(this,"")||this;n.field=void 0;n.ability=r;if("function"===typeof Error.captureStackTrace){n.name="ForbiddenError";Error.captureStackTrace(T(n),n.constructor)}return n}var n=r.prototype;n.setMessage=function t(r){this.message=r;return this};n.throwUnlessCan=function t(){var r;var n=(r=this.ability).relevantRuleFor.apply(r,arguments);if(n&&!n.inverted)return;this.action=arguments.length<=0?void 0:arguments[0];this.subject=arguments.length<=1?void 0:arguments[1];this.subjectType=this.ability.detectSubjectType(arguments.length<=1?void 0:arguments[1]);this.field=arguments.length<=2?void 0:arguments[2];var i=n?n.reason:"";this.message=this.message||i||this.constructor.O(this);throw this};return r}(wt);gt.O=yt;export{vt as Ability,dt as AbilityBuilder,gt as ForbiddenError,Z as PureAbility,nt as buildMongoQueryMatcher,D as createAliasResolver,pt as defineAbility,Y as detectSubjectType,ht as fieldPatternMatcher,yt as getDefaultErrorMessage,it as mongoQueryMatcher,S as subject,q as wrapArray};
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport { CanParameters, Abilities, Normalize, Subject, SubjectType } from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject);\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectType = this.detectSubjectType(subjects[k]);\n const subjectRules = getOrDefault(indexedRules, subjectType, defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: CanParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subject?: Subject): Rule<A, Conditions>[] {\n const subjectType = this.detectSubjectType(subject);\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: CanParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subject);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters } from './types';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>) {\n const rules = this.rulesFor(...args);\n const subject = args[1];\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","matchesConditions","this","_lazyMatchConditions","matchesField","field","_lazyMatchField","ast","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectType","subjectRules","possibleRulesFor","actionRules","manageRules","has","rulesFor","filter","on","handler","head","_this","delete","payload","current","PureAbility","can","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","_PureAbility","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","setDefaultMessage","messageOrFn","_defaultErrorMessage","from","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport {\n Abilities,\n Normalize,\n SubjectType,\n AbilityParameters,\n AbilityTuple,\n ExtractSubjectType\n} from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\ntype AbilitySubjectTypeParameters<T extends Abilities, IncludeField extends boolean = true> =\n AbilityParameters<\n T,\n T extends AbilityTuple\n ? IncludeField extends true\n ? (action: T[0], subject: ExtractSubjectType<T[1]>, field?: string) => 0\n : (action: T[0], subject: ExtractSubjectType<T[1]>) => 0\n : never,\n (action: Extract<T, string>) => 0\n >;\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject || 'all');\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectRules = getOrDefault(indexedRules, subjects[k], defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: AbilitySubjectTypeParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subjectType?: SubjectType): Rule<A, Conditions>[] {\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: AbilitySubjectTypeParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subjectType?: SubjectType, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subjectType);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters, Subject } from './types';\nimport { Rule } from './Rule';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>): Rule<A, Conditions> | null\n relevantRuleFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions> | null {\n const rules = (this as any).rulesFor(action, this.detectSubjectType(subject), field);\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","matchesConditions","this","_lazyMatchConditions","matchesField","field","_lazyMatchField","ast","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectRules","possibleRulesFor","subjectType","actionRules","manageRules","has","rulesFor","filter","on","handler","head","_this","delete","payload","current","PureAbility","can","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","_PureAbility","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","setDefaultMessage","messageOrFn","_defaultErrorMessage","from","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}

@@ -1,2 +0,2 @@

"use strict";Object.defineProperty(exports,"__esModule",{value:true});class t{constructor(t,e){this.operator=t,this.value=e}}class e extends t{constructor(t,e){if(!Array.isArray(e))throw new Error(`"${t}" operator expects to receive an array of conditions`);super(t,e)}}const r="__itself__";class n{constructor(t,e,r){this.operator=t,this.value=r,this.field=e}}const o=new t("__null__",null);function i(t,e){const r=t[e];if("function"!=typeof r)throw new Error(`Unable to interpret "${e}" condition. Did you forget to register interpreter for it?`);return r}function s(t,e){const r=e;let n;switch(r?r.numberOfArguments:0){case 1:n=e=>i(t,e.operator)(e,o);break;case 3:n=(e,r,n)=>i(t,e.operator)(e,r,n,o);break;default:n=(e,r)=>i(t,e.operator)(e,r,o)}const o=Object.assign({},r,{interpret:n});return o.interpret}function c(t,e){return(r,...n)=>{const o=t(r,...n),i=e.bind(null,o);return i.ast=o,i}}function u(t,r){return r instanceof e&&r.operator===t}function a(t,r){return 1===r.length?r[0]:new e(t,function t(e,r,n){const o=n||[];for(let n=0,i=r.length;n<i;n++){const i=r[n];u(e,i)?t(e,i.value,o):o.push(i)}return o}(t,r))}const f=t=>a("and",t),l=t=>a("or",t);function p(t){if(!t||t&&t.constructor!==Object)return!1;for(const e in t)if(t.hasOwnProperty(e)&&"$"===e[0])return!0;return!1}function d(t,e){if(!Array.isArray(e))throw new Error(`"${t.name}" expects value to be an array`)}function h(t,e){if(d(t,e),!e.length)throw new Error(`"${t.name}" expects to have at least one element in array`)}const w=t=>(e,r)=>{if(typeof r!==t)throw new Error(`"${e.name}" expects value to be a "${t}"`)},y={type:"compound",validate:h,parse(t,e,{parse:r}){const n=e.map(t=>r(t));return a(t.name,n)}},$=y,b={type:"compound",validate:h},v={type:"field",validate(t,e){if(!(e&&(e instanceof RegExp||e.constructor===Object)))throw new Error(`"${t.name}" expects to receive either regular expression or object of field operators`)},parse(t,r,o){const i=r instanceof RegExp?new n("regex",o.field,r):o.parse(r,o);return new e(t.name,[i])}},g={type:"field",validate(t,e){if(!e||e.constructor!==Object)throw new Error(`"${t.name}" expects to receive an object with nested query or field level operators`)},parse(t,e,{parse:o,field:i}){const s=p(e)?o(e,{field:r}):o(e);return new n(t.name,i,s)}},x={type:"field",validate:w("number")},j={type:"field",validate:d},m=j,E=j,O={type:"field",validate(t,e){if(!Array.isArray(e)||2!==e.length)throw new Error(`"${t.name}" expects an array with 2 numeric elements`)}},_={type:"field",validate:w("boolean")},A={type:"field",validate:function(t,e){if(!("string"==typeof e||"number"==typeof e||e instanceof Date))throw new Error(`"${t.name}" expects value to be comparable (i.e., string, number or date)`)}},q=A,U=q,S=q,k={type:"field"},R=k,D={type:"field",validate(t,e){if(!(e instanceof RegExp)&&"string"!=typeof e)throw new Error(`"${t.name}" expects value to be a regular expression or a string that represents regular expression`)},parse(t,e,r){const o="string"==typeof e?new RegExp(e,r.query.$options||""):e;return new n(t.name,r.field,o)}},M={type:"field",parse:()=>o},N={type:"document",validate:w("function")};var z=Object.freeze({__proto__:null,$and:y,$or:$,$nor:b,$not:v,$elemMatch:g,$size:x,$in:j,$nin:m,$all:E,$mod:O,$exists:_,$gte:A,$gt:q,$lt:U,$lte:S,$eq:k,$ne:R,$regex:D,$options:M,$where:N});const P={compound(t,r,n){const o=(Array.isArray(r)?r:[r]).map(t=>n.parse(t));return new e(t.name,o)},field:(t,e,r)=>new n(t.name,r.field,e),document:(e,r)=>new t(e.name,r)};function F(t,e,r){"function"==typeof t.validate&&t.validate(t,e);return(t.parse||P[t.type])(t,e,r)}class J{constructor(t){this.t=void 0,this.o=void 0,this.t=Object.keys(t).reduce((e,r)=>(e[r]=Object.assign({},t[r],{name:r.slice(1)}),e),{}),this.parse=this.parse.bind(this),this.o={field:"",query:{},parse:this.parse}}setParse(t){this.parse=t,this.o.parse=t}i(t,e,r,n){const o=this.t[e];if(!o)throw new Error(`Unsupported operator "${e}"`);if("field"!==o.type)throw new Error(`Unexpected ${o.type} operator "${e}" at field level`);return this.o.field=t,this.o.query=n,F(o,r,this.o)}s(t,e){const r=[],n=Object.keys(e);for(let i=0,s=n.length;i<s;i++){const s=n[i];if("$"!==s[0])throw new Error(`Field query for "${t}" may contain only operators or a plain object as a value`);const c=this.i(t,s,e[s],e);c!==o&&r.push(c)}return r}parse(t,e){if(e&&e.field)return f(this.s(e.field,t));const r=t,n={query:r,parse:this.parse},o=[],i=Object.keys(r);for(let t=0,e=i.length;t<e;t++){const e=i[t],s=r[e],c="$"===e[0],u=this.t[e];if(c){if(!u)throw new Error(`Unsupported operator "${e}"`);if("document"!==u.type&&"compound"!==u.type)throw new Error(`Unknown top level operator "${e}"`);o.push(F(u,s,n))}else p(s)?o.push(...this.s(e,s)):o.push(this.i(e,"$eq",s,r))}return f(o)}}const T=z;function B(t,e,r){for(let n=0,o=t.length;n<o;n++)if(r(t[n],e))return!0;return!1}function C(t,e){return Array.isArray(t)&&Number.isNaN(Number(e))}function G(t,e,r){return C(t,e)?t.reduce((t,n)=>{const o=r(n,e);return void 0!==o?t.concat(o):t},[]):r(t,e)}function H(t){return(e,r,n)=>{const o=n.get(r,e.field);return Array.isArray(o)?o.some(r=>t(e,r,n)):t(e,o,n)}}const I=(t,e)=>t[e];function K(t,e,r){const n=e.lastIndexOf(".");return-1===n?[t,e]:[r(t,e.slice(0,n)),e.slice(n+1)]}function L(t,e,n=I){if(e===r)return t;if(!t)throw new Error(`Unable to get field "${e}" out of ${String(t)}.`);return function(t,e,r){if(-1===e.indexOf("."))return G(t,e,r);const n=e.split(".");let o=t;for(let t=0,e=n.length;t<e;t++)if(o=G(o,n[t],r),!o||"object"!=typeof o)return o;return o}(t,e,n)}function Q(t,e){return t===e?0:t>e?1:-1}function V(t,e={}){const r=e.compare||Q;return s(t,Object.assign({get:L,compare:Q,equal:(t,e)=>0===r(t,e)},e))}const W=(t,e,{interpret:r})=>t.value.some(t=>r(t,e)),X=(t,e,r)=>!W(t,e,r),Y=(t,e,{interpret:r})=>t.value.every(t=>r(t,e)),Z=(t,e,{interpret:r})=>!r(t.value[0],e),tt=(t,e,{equal:r,get:n})=>{const o=n(e,t.field);return Array.isArray(o)&&!Array.isArray(t.value)?B(o,t.value,r):r(o,t.value)},et=(t,e,r)=>!tt(t,e,r),rt=H((t,e,r)=>{const n=r.compare(e,t.value);return 0===n||-1===n}),nt=H((t,e,r)=>-1===r.compare(e,t.value)),ot=H((t,e,r)=>1===r.compare(e,t.value)),it=H((t,e,r)=>{const n=r.compare(e,t.value);return 0===n||1===n}),st=(t,e,{get:n})=>{if(t.field===r)return void 0!==e;const[o,i]=K(e,t.field,n),s=e=>!!e&&e.hasOwnProperty(i)===t.value;return C(o,i)?o.some(s):s(o)},ct=H((t,e)=>e%t.value[0]===t.value[1]),ut=(t,e,{get:n})=>{const[o,i]=K(e,t.field,n),s=e=>{const r=n(e,i);return Array.isArray(r)&&r.length===t.value};return t.field!==r&&C(o,i)?o.some(s):s(o)},at=H((t,e)=>t.value.test(e)),ft=H((t,e,{equal:r})=>B(t.value,e,r)),lt=(t,e,r)=>!ft(t,e,r),pt=(t,e,{equal:r,get:n})=>{const o=n(e,t.field);return Array.isArray(o)&&t.value.every(t=>B(o,t,r))},dt=(t,e,{interpret:r,get:n})=>{const o=n(e,t.field);return Array.isArray(o)&&o.some(e=>r(t.value,e))},ht=(t,e)=>t.value.call(e);var wt=Object.freeze({__proto__:null,or:W,nor:X,and:Y,not:Z,eq:tt,ne:et,lte:rt,lt:nt,gt:ot,gte:it,exists:st,mod:ct,size:ut,regex:at,within:ft,nin:lt,all:pt,elemMatch:dt,where:ht});const yt=Object.assign({},wt,{in:ft}),$t=V(yt);function bt(t){return t instanceof Date?t.getTime():t&&"function"==typeof t.toJSON?t.toJSON():t}const vt=(t,e)=>Q(bt(t),bt(e));function gt(t,e,n){const o=new J(t),i=V(e,Object.assign({compare:vt},n));if(n&&n.forPrimitives){const t={field:r},e=o.parse;o.setParse(r=>e(r,t))}return c(o.parse,i)}const xt=gt(T,yt),jt=gt(["$and","$or"].reduce((t,e)=>(t[e]=Object.assign({},t[e],{type:"field"}),t),Object.assign({},T,{$nor:Object.assign({},T.$nor,{type:"field",parse:P.compound})})),yt,{forPrimitives:!0});function mt(t){return Array.isArray(t)?t:[t]}function Et(t,e,r){let n=t;let o=e;if(-1!==e.indexOf(".")){const r=e.split(".");o=r.pop();n=r.reduce((t,e)=>{t[e]=t[e]||{};return t[e]},t)}n[o]=r}function Ot(t,e,r,n){const o=Object.create(null);const i=t.rulesFor(e,r);for(let t=0;t<i.length;t++){const e=i[t];const r=e.inverted?"$and":"$or";if(!e.conditions)if(e.inverted)break;else{delete o[r];return o}else{o[r]=o[r]||[];o[r].push(n(e))}}return o.$or?o:null}function _t(t){if(!t.ast)throw new Error(`Ability rule "${JSON.stringify(t)}" does not have "ast" property. So, cannot be used to generate AST`);return t.ast}function At(t,e,r){const n=Ot(t,e,r,_t);if(null===n)return null;if(!n.$and)return n.$or?l(n.$or):f([]);if(n.$or)n.$and.push(l(n.$or));return f(n.$and)}function qt(t,e,r){return t.rulesFor(e,r).filter(t=>!t.inverted&&t.conditions).reduce((t,e)=>{const r=e.conditions;return Object.keys(r).reduce((t,e)=>{const n=r[e];if(!n||n.constructor!==Object)Et(t,e,n);return t},t)},{})}const Ut=t=>t.fields;function St(t){this.delete(t)}function kt(t){this.add(t)}function Rt(t,e,r,n={}){const o=n.fieldsFrom||Ut;const i=t.possibleRulesFor(e,r).filter(t=>t.matchesConditions(r)).reverse().reduce((t,e)=>{const r=o(e);if(r){const n=e.inverted?St:kt;r.forEach(n,t)}return t},new Set);return Array.from(i)}const Dt=t=>Array.isArray(t)?t.join(","):t;function Mt(t,e){return t.map(t=>{const r=[Dt(t.action||t.actions),"function"===typeof e?mt(t.subject).map(e).join(","):Dt(t.subject),t.conditions||0,t.inverted?1:0,t.fields?Dt(t.fields):0,t.reason||""];while(!r[r.length-1])r.pop();return r})}function Nt(t,e){return t.map(([t,r,n,o,i,s])=>{const c=r.split(",");const u={inverted:!!o,action:t.split(","),subject:"function"===typeof e?c.map(e):c};if(n)u.conditions=n;if(i)u.fields=i.split(",");if(s)u.reason=s;return u})}exports.packRules=Mt;exports.permittedFieldsOf=Rt;exports.rulesToAST=At;exports.rulesToFields=qt;exports.rulesToQuery=Ot;exports.unpackRules=Nt;
"use strict";Object.defineProperty(exports,"__esModule",{value:true});var t=require("@ucast/mongo2js");function n(t){return Array.isArray(t)?t:[t]}function r(t,n,r){let e=t;let o=n;if(-1!==n.indexOf(".")){const r=n.split(".");o=r.pop();e=r.reduce((t,n)=>{t[n]=t[n]||{};return t[n]},t)}e[o]=r}function e(t,n,r,e){const o=Object.create(null);const u=t.rulesFor(n,r);for(let t=0;t<u.length;t++){const n=u[t];const r=n.inverted?"$and":"$or";if(!n.conditions)if(n.inverted)break;else{delete o[r];return o}else{o[r]=o[r]||[];o[r].push(e(n))}}return o.$or?o:null}function o(t){if(!t.ast)throw new Error(`Ability rule "${JSON.stringify(t)}" does not have "ast" property. So, cannot be used to generate AST`);return t.ast}function u(n,r,u){const c=e(n,r,u,o);if(null===c)return null;if(!c.$and)return c.$or?t.buildOr(c.$or):t.buildAnd([]);if(c.$or)c.$and.push(t.buildOr(c.$or));return t.buildAnd(c.$and)}function c(t,n,e){return t.rulesFor(n,e).reduce((t,n)=>{if(n.inverted||!n.conditions)return t;return Object.keys(n.conditions).reduce((t,e)=>{const o=n.conditions[e];if(!o||o.constructor!==Object)r(t,e,o);return t},t)},{})}const s=t=>t.fields;function i(t){this.delete(t)}function f(t){this.add(t)}function l(t,n,r,e={}){const o=e.fieldsFrom||s;const u=t.detectSubjectType(r);const c=t.possibleRulesFor(n,u).reduceRight((t,n)=>{if(!n.matchesConditions(r))return t;const e=o(n);if(e){const r=n.inverted?i:f;e.forEach(r,t)}return t},new Set);return Array.from(c)}const a=t=>Array.isArray(t)?t.join(","):t;function p(t,r){return t.map(t=>{const e=[a(t.action||t.actions),"function"===typeof r?n(t.subject).map(r).join(","):a(t.subject),t.conditions||0,t.inverted?1:0,t.fields?a(t.fields):0,t.reason||""];while(!e[e.length-1])e.pop();return e})}function b(t,n){return t.map(([t,r,e,o,u,c])=>{const s=r.split(",");const i={inverted:!!o,action:t.split(","),subject:"function"===typeof n?s.map(n):s};if(e)i.conditions=e;if(u)i.fields=u.split(",");if(c)i.reason=c;return i})}exports.packRules=p;exports.permittedFieldsOf=l;exports.rulesToAST=u;exports.rulesToFields=c;exports.rulesToQuery=e;exports.unpackRules=b;
//# sourceMappingURL=extra.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"extra.js","sources":["../../../../node_modules/.pnpm/@ucast/core@1.5.0/node_modules/@ucast/core/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo@2.3.1/node_modules/@ucast/mongo/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/js@2.2.1/node_modules/@ucast/js/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo2js@1.3.0/node_modules/@ucast/mongo2js/dist/es6m/index.mjs","../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["class t{constructor(t,n){this.operator=t,this.value=n}}class n extends t{constructor(t,n){if(!Array.isArray(n))throw new Error(`\"${t}\" operator expects to receive an array of conditions`);super(t,n)}}const r=\"__itself__\";class o{constructor(t,n,r){this.operator=t,this.value=r,this.field=n}}const e=new t(\"__null__\",null);function c(t,n){const r=t[n];if(\"function\"!=typeof r)throw new Error(`Unable to interpret \"${n}\" condition. Did you forget to register interpreter for it?`);return r}function s(t,n){const r=n;let o;switch(r?r.numberOfArguments:0){case 1:o=n=>c(t,n.operator)(n,e);break;case 3:o=(n,r,o)=>c(t,n.operator)(n,r,o,e);break;default:o=(n,r)=>c(t,n.operator)(n,r,e)}const e=Object.assign({},r,{interpret:o});return e.interpret}function i(t,n){return(r,...o)=>{const e=t(r,...o),c=n.bind(null,e);return c.ast=e,c}}function u(t,r){return r instanceof n&&r.operator===t}function f(t,r){return 1===r.length?r[0]:new n(t,function t(n,r,o){const e=o||[];for(let o=0,c=r.length;o<c;o++){const c=r[o];u(n,c)?t(n,c.value,e):e.push(c)}return e}(t,r))}const a=t=>f(\"and\",t),l=t=>f(\"or\",t);export{n as CompoundCondition,t as DocumentCondition,o as FieldCondition,r as ITSELF,e as NULL_CONDITION,a as buildAnd,l as buildOr,s as createInterpreter,i as createTranslatorFactory,u as isCompound,f as optimizedCompoundCondition};\n//# sourceMappingURL=index.mjs.map\n","import{optimizedCompoundCondition as e,FieldCondition as t,CompoundCondition as r,ITSELF as o,NULL_CONDITION as n,DocumentCondition as i,buildAnd as a}from\"@ucast/core\";function s(e){if(!e||e&&e.constructor!==Object)return!1;for(const t in e)if(e.hasOwnProperty(t)&&\"$\"===t[0])return!0;return!1}function p(e,t){if(!Array.isArray(t))throw new Error(`\"${e.name}\" expects value to be an array`)}function c(e,t){if(p(e,t),!t.length)throw new Error(`\"${e.name}\" expects to have at least one element in array`)}const l=e=>(t,r)=>{if(typeof r!==e)throw new Error(`\"${t.name}\" expects value to be a \"${e}\"`)},f={type:\"compound\",validate:c,parse(t,r,{parse:o}){const n=r.map(e=>o(e));return e(t.name,n)}},d=f,u={type:\"compound\",validate:c},h={type:\"field\",validate(e,t){if(!(t&&(t instanceof RegExp||t.constructor===Object)))throw new Error(`\"${e.name}\" expects to receive either regular expression or object of field operators`)},parse(e,o,n){const i=o instanceof RegExp?new t(\"regex\",n.field,o):n.parse(o,n);return new r(e.name,[i])}},$={type:\"field\",validate(e,t){if(!t||t.constructor!==Object)throw new Error(`\"${e.name}\" expects to receive an object with nested query or field level operators`)},parse(e,r,{parse:n,field:i}){const a=s(r)?n(r,{field:o}):n(r);return new t(e.name,i,a)}},w={type:\"field\",validate:l(\"number\")},y={type:\"field\",validate:p},v=y,b=y,m={type:\"field\",validate(e,t){if(!Array.isArray(t)||2!==t.length)throw new Error(`\"${e.name}\" expects an array with 2 numeric elements`)}},x={type:\"field\",validate:l(\"boolean\")},E={type:\"field\",validate:function(e,t){if(!(\"string\"==typeof t||\"number\"==typeof t||t instanceof Date))throw new Error(`\"${e.name}\" expects value to be comparable (i.e., string, number or date)`)}},g=E,j=g,O=g,q={type:\"field\"},_=q,R={type:\"field\",validate(e,t){if(!(t instanceof RegExp)&&\"string\"!=typeof t)throw new Error(`\"${e.name}\" expects value to be a regular expression or a string that represents regular expression`)},parse(e,r,o){const n=\"string\"==typeof r?new RegExp(r,o.query.$options||\"\"):r;return new t(e.name,o.field,n)}},U={type:\"field\",parse:()=>n},A={type:\"document\",validate:l(\"function\")};var F=Object.freeze({__proto__:null,$and:f,$or:d,$nor:u,$not:h,$elemMatch:$,$size:w,$in:y,$nin:v,$all:b,$mod:m,$exists:x,$gte:E,$gt:g,$lt:j,$lte:O,$eq:q,$ne:_,$regex:R,$options:U,$where:A});const k={compound(e,t,o){const n=(Array.isArray(t)?t:[t]).map(e=>o.parse(e));return new r(e.name,n)},field:(e,r,o)=>new t(e.name,o.field,r),document:(e,t)=>new i(e.name,t)};function z(e,t,r){\"function\"==typeof e.validate&&e.validate(e,t);return(e.parse||k[e.type])(e,t,r)}class D{constructor(e){this.t=void 0,this.o=void 0,this.t=Object.keys(e).reduce((t,r)=>(t[r]=Object.assign({},e[r],{name:r.slice(1)}),t),{}),this.parse=this.parse.bind(this),this.o={field:\"\",query:{},parse:this.parse}}setParse(e){this.parse=e,this.o.parse=e}i(e,t,r,o){const n=this.t[t];if(!n)throw new Error(`Unsupported operator \"${t}\"`);if(\"field\"!==n.type)throw new Error(`Unexpected ${n.type} operator \"${t}\" at field level`);return this.o.field=e,this.o.query=o,z(n,r,this.o)}s(e,t){const r=[],o=Object.keys(t);for(let i=0,a=o.length;i<a;i++){const a=o[i];if(\"$\"!==a[0])throw new Error(`Field query for \"${e}\" may contain only operators or a plain object as a value`);const s=this.i(e,a,t[a],t);s!==n&&r.push(s)}return r}parse(e,t){if(t&&t.field)return a(this.s(t.field,e));const r=e,o={query:r,parse:this.parse},n=[],i=Object.keys(r);for(let e=0,t=i.length;e<t;e++){const t=i[e],a=r[t],p=\"$\"===t[0],c=this.t[t];if(p){if(!c)throw new Error(`Unsupported operator \"${t}\"`);if(\"document\"!==c.type&&\"compound\"!==c.type)throw new Error(`Unknown top level operator \"${t}\"`);n.push(z(c,a,o))}else s(a)?n.push(...this.s(t,a)):n.push(this.i(t,\"$eq\",a,r))}return a(n)}}const M=F;export{b as $all,f as $and,$ as $elemMatch,q as $eq,x as $exists,g as $gt,E as $gte,y as $in,j as $lt,O as $lte,m as $mod,_ as $ne,v as $nin,u as $nor,h as $not,U as $options,d as $or,R as $regex,w as $size,A as $where,D as MongoQueryParser,M as allParsingInstructions,k as defaultParsers};\n//# sourceMappingURL=index.mjs.map\n","import{ITSELF as r,createInterpreter as t}from\"@ucast/core\";function n(r,t,n){for(let e=0,o=r.length;e<o;e++)if(n(r[e],t))return!0;return!1}function e(r,t){return Array.isArray(r)&&Number.isNaN(Number(t))}function o(r,t,n){return e(r,t)?r.reduce((r,e)=>{const o=n(e,t);return void 0!==o?r.concat(o):r},[]):n(r,t)}function u(r){return(t,n,e)=>{const o=e.get(n,t.field);return Array.isArray(o)?o.some(n=>r(t,n,e)):r(t,o,e)}}const c=(r,t)=>r[t];function i(r,t,n){const e=t.lastIndexOf(\".\");return-1===e?[r,t]:[n(r,t.slice(0,e)),t.slice(e+1)]}function f(t,n,e=c){if(n===r)return t;if(!t)throw new Error(`Unable to get field \"${n}\" out of ${String(t)}.`);return function(r,t,n){if(-1===t.indexOf(\".\"))return o(r,t,n);const e=t.split(\".\");let u=r;for(let r=0,t=e.length;r<t;r++)if(u=o(u,e[r],n),!u||\"object\"!=typeof u)return u;return u}(t,n,e)}function s(r){return(t,n)=>f(t,n,r)}const a=(r,t)=>r===t;function l(r,t){return r===t?0:r>t?1:-1}function g(r,n={}){const e=n.compare||l;return t(r,Object.assign({get:f,compare:l,equal:(r,t)=>0===e(r,t)},n))}const p=(r,t,{interpret:n})=>r.value.some(r=>n(r,t)),y=(r,t,n)=>!p(r,t,n),b=(r,t,{interpret:n})=>r.value.every(r=>n(r,t)),m=(r,t,{interpret:n})=>!n(r.value[0],t),A=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&!Array.isArray(r.value)?n(u,r.value,e):e(u,r.value)},d=(r,t,n)=>!A(r,t,n),q=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||-1===e}),h=u((r,t,n)=>-1===n.compare(t,r.value)),j=u((r,t,n)=>1===n.compare(t,r.value)),w=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||1===e}),_=(t,n,{get:o})=>{if(t.field===r)return void 0!==n;const[u,c]=i(n,t.field,o),f=r=>!!r&&r.hasOwnProperty(c)===t.value;return e(u,c)?u.some(f):f(u)},v=u((r,t)=>t%r.value[0]===r.value[1]),x=(t,n,{get:o})=>{const[u,c]=i(n,t.field,o),f=r=>{const n=o(r,c);return Array.isArray(n)&&n.length===t.value};return t.field!==r&&e(u,c)?u.some(f):f(u)},O=u((r,t)=>r.value.test(t)),N=u((r,t,{equal:e})=>n(r.value,t,e)),$=(r,t,n)=>!N(r,t,n),z=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&r.value.every(r=>n(u,r,e))},E=(r,t,{interpret:n,get:e})=>{const o=e(t,r.field);return Array.isArray(o)&&o.some(t=>n(r.value,t))},M=(r,t)=>r.value.call(t);var S=Object.freeze({__proto__:null,or:p,nor:y,and:b,not:m,eq:A,ne:d,lte:q,lt:h,gt:j,gte:w,exists:_,mod:v,size:x,regex:O,within:N,nin:$,all:z,elemMatch:E,where:M});const U=Object.assign({},S,{in:N}),k=g(U);export{z as all,U as allInterpreters,b as and,l as compare,s as createGetter,g as createJsInterpreter,E as elemMatch,A as eq,a as equal,_ as exists,f as getObjectField,i as getObjectFieldCursor,j as gt,w as gte,k as interpret,h as lt,q as lte,v as mod,d as ne,$ as nin,y as nor,m as not,p as or,O as regex,x as size,M as where,N as within};\n//# sourceMappingURL=index.mjs.map\n","import{createTranslatorFactory as o,ITSELF as t}from\"@ucast/core\";export*from\"@ucast/core\";import{MongoQueryParser as r,allParsingInstructions as e,defaultParsers as c}from\"@ucast/mongo\";export*from\"@ucast/mongo\";import{createJsInterpreter as n,allInterpreters as f,compare as s}from\"@ucast/js\";export*from\"@ucast/js\";function i(o){return o instanceof Date?o.getTime():o&&\"function\"==typeof o.toJSON?o.toJSON():o}const m=(o,t)=>s(i(o),i(t));function p(e,c,f){const s=new r(e),i=n(c,Object.assign({compare:m},f));if(f&&f.forPrimitives){const o={field:t},r=s.parse;s.setParse(t=>r(t,o))}return o(s.parse,i)}const a=p(e,f),u=p([\"$and\",\"$or\"].reduce((o,t)=>(o[t]=Object.assign({},o[t],{type:\"field\"}),o),Object.assign({},e,{$nor:Object.assign({},e.$nor,{type:\"field\",parse:c.compound})})),f,{forPrimitives:!0}),j=a;export{p as createFactory,j as filter,a as guard,u as squire};\n//# sourceMappingURL=index.mjs.map\n","import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf, Generics } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, Normalize } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1],\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subject);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): Condition | null {\n const query = rulesToQuery(ability, action, subject, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): AnyObject {\n return ability.rulesFor(action, subject)\n .filter(rule => !rule.inverted && rule.conditions)\n .reduce((values, rule) => {\n const conditions = rule.conditions!;\n\n return Object.keys(conditions).reduce((fields, fieldName) => {\n const value = conditions[fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const uniqueFields = ability.possibleRulesFor(action, subject)\n .filter(rule => rule.matchesConditions(subject))\n .reverse()\n .reduce((fields, rule) => {\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["t","constructor","n","operator","this","value","Array","isArray","Error","r","o","field","e","c","s","numberOfArguments","Object","assign","interpret","i","bind","ast","u","f","length","push","a","l","hasOwnProperty","p","name","type","validate","parse","map","d","h","RegExp","$","w","y","v","b","m","x","E","Date","g","j","O","q","_","R","query","$options","U","A","F","freeze","__proto__","$and","$or","$nor","$not","$elemMatch","$size","$in","$nin","$all","$mod","$exists","$gte","$gt","$lt","$lte","$eq","$ne","$regex","$where","k","compound","document","z","D","keys","reduce","slice","setParse","M","Number","isNaN","concat","get","some","lastIndexOf","String","indexOf","split","compare","equal","every","test","N","call","S","or","nor","and","not","eq","ne","lte","lt","gt","gte","exists","mod","size","regex","within","nin","all","elemMatch","where","in","getTime","toJSON","forPrimitives","wrapArray","setByPath","object","path","ref","lastKey","pop","res","prop","rulesToQuery","ability","action","subject","convert","create","rules","rulesFor","rule","op","inverted","conditions","ruleToAST","JSON","stringify","rulesToAST","buildOr","buildAnd","rulesToFields","filter","values","fields","fieldName","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","options","fieldsFrom","uniqueFields","possibleRulesFor","matchesConditions","reverse","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}
{"version":3,"file":"extra.js","sources":["../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, ExtractSubjectType } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subjectType);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): Condition | null {\n const query = rulesToQuery(ability, action, subjectType, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): AnyObject {\n return ability.rulesFor(action, subjectType)\n .reduce((values, rule) => {\n if (rule.inverted || !rule.conditions) {\n return values;\n }\n\n return Object.keys(rule.conditions).reduce((fields, fieldName) => {\n const value = rule.conditions![fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const subjectType = ability.detectSubjectType(subject);\n const uniqueFields = ability.possibleRulesFor(action, subjectType)\n .reduceRight((fields, rule) => {\n if (!rule.matchesConditions(subject)) {\n return fields;\n }\n\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["wrapArray","value","Array","isArray","setByPath","object","path","ref","lastKey","indexOf","keys","split","pop","reduce","res","prop","rulesToQuery","ability","action","subjectType","convert","query","Object","create","rules","rulesFor","i","length","rule","op","inverted","conditions","push","$or","ruleToAST","ast","Error","JSON","stringify","rulesToAST","$and","buildOr","buildAnd","rulesToFields","values","fields","fieldName","constructor","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","subject","options","fieldsFrom","detectSubjectType","uniqueFields","possibleRulesFor","reduceRight","matchesConditions","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","map","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"uGAEO,SAASA,EAAaC,UACpBC,MAAMC,QAAQF,GAASA,EAAQ,CAACA,GAGlC,SAASG,EAAUC,EAAmBC,EAAcL,OACrDM,EAAMF,MACNG,EAAUF,MAEa,IAAvBA,EAAKG,QAAQ,KAAa,OACtBC,EAAOJ,EAAKK,MAAM,KAExBH,EAAUE,EAAKE,MACfL,EAAMG,EAAKG,OAAO,CAACC,EAAKC,KACtBD,EAAIC,GAAQD,EAAIC,IAAS,UAClBD,EAAIC,IACVV,GAGLE,EAAIC,GAAWP,ECNV,SAASe,EACdC,EACAC,EACAC,EACAC,SAEMC,EAAsBC,OAAOC,OAAO,YACpCC,EAAQP,EAAQQ,SAASP,EAAQC,OAElC,IAAIO,EAAI,EAAGA,EAAIF,EAAMG,OAAQD,IAAK,OAC/BE,EAAOJ,EAAME,SACbG,EAAKD,EAAKE,SAAW,OAAS,UAE/BF,EAAKG,cACJH,EAAKE,mBAEF,QACET,EAAMQ,UACNR,MAEJ,CACLA,EAAMQ,GAAMR,EAAMQ,IAAO,GACzBR,EAAMQ,GAAKG,KAAKZ,EAAQQ,YAIrBP,EAAMY,IAAMZ,EAAQ,KAG7B,SAASa,EAAUN,OACZA,EAAKO,UACF,IAAIC,MAAO,iBAAgBC,KAAKC,UAAUV,+EAE3CA,EAAKO,IAGP,SAASI,EACdtB,EACAC,EACAC,SAEME,EAAQL,EAAaC,EAASC,EAAQC,EAAae,MAE3C,OAAVb,SACK,SAGJA,EAAMmB,YACFnB,EAAMY,IAAMQ,UAAQpB,EAAMY,KAAOS,WAAS,OAG/CrB,EAAMY,IACRZ,EAAMmB,KAAKR,KAAKS,UAAQpB,EAAMY,aAGzBS,WAASrB,EAAMmB,MAGjB,SAASG,EACd1B,EACAC,EACAC,UAEOF,EAAQQ,SAASP,EAAQC,GAC7BN,OAAO,CAAC+B,EAAQhB,QACXA,EAAKE,WAAaF,EAAKG,kBAClBa,SAGFtB,OAAOZ,KAAKkB,EAAKG,YAAYlB,OAAO,CAACgC,EAAQC,WAC5C7C,EAAQ2B,EAAKG,WAAYe,OAE1B7C,GAAUA,EAAc8C,cAAgBzB,OAC3ClB,EAAUyC,EAAQC,EAAW7C,UAGxB4C,GACND,IACF,IAGP,MAAMI,EAAiBpB,GAA6BA,EAAKiB,OAQzD,SAASI,EAA8BC,QAChCC,OAAOD,GAGd,SAASE,EAA2BF,QAC7BG,IAAIH,GAGJ,SAASI,EACdrC,EACAC,EACAqC,EACAC,EAAqC,UAE/BC,EAAaD,EAAQC,YAAcT,QACnC7B,EAAcF,EAAQyC,kBAAkBH,SACxCI,EAAe1C,EAAQ2C,iBAAiB1C,EAAQC,GACnD0C,YAAY,CAAChB,EAAQjB,SACfA,EAAKkC,kBAAkBP,UACnBV,QAGHkB,EAAQN,EAAW7B,MAErBmC,EAAO,OACHC,EAASpC,EAAKE,SAAWmB,EAAaG,EAC5CW,EAAME,QAAQD,EAAQnB,UAGjBA,GACN,IAAIqB,YAEFhE,MAAMiE,KAAKR,GAGpB,MAAMS,EAAenE,GAA6BC,MAAMC,QAAQF,GAASA,EAAMoE,KAAK,KAAOpE,EAWpF,SAASqE,EACd9C,EACA+C,UAEO/C,EAAMgD,IAAK5C,UACV6C,EAA0B,CAC9BL,EAAaxC,EAAaV,QAAWU,EAAa8C,SAC3B,oBAAhBH,EACHvE,EAAU4B,EAAK2B,SAASiB,IAAID,GAAaF,KAAK,KAC9CD,EAAYxC,EAAK2B,SACrB3B,EAAKG,YAAc,EACnBH,EAAKE,SAAW,EAAI,EACpBF,EAAKiB,OAASuB,EAAYxC,EAAKiB,QAAU,EACzCjB,EAAK+C,QAAU,WAGTF,EAAWA,EAAW9C,OAAS,GAAI8C,EAAW7D,aAE/C6D,IAMJ,SAASG,EACdpD,EACAqD,UAEOrD,EAAMgD,IAAI,EAAEtD,EAAQqC,EAASxB,EAAYD,EAAUe,EAAQ8B,YAC1DG,EAAWvB,EAAQ5C,MAAM,WACzBiB,EAAO,CACXE,WAAYA,EACZZ,OAAQA,EAAOP,MAAM,KACrB4C,QAAkC,oBAAlBsB,EACZC,EAASN,IAAIK,GACbC,MAGF/C,EACFH,EAAKG,WAAaA,KAGhBc,EACFjB,EAAKiB,OAASA,EAAOlC,MAAM,QAGzBgE,EACF/C,EAAK+C,OAASA,SAGT/C"}

@@ -1,2 +0,2 @@

"use strict";Object.defineProperty(exports,"__esModule",{value:true});var t=require("@ucast/mongo2js");function e(t){return Array.isArray(t)?t:[t]}const s="__caslSubjectType__";function n(t,e){if(e)if(!e.hasOwnProperty(s))Object.defineProperty(e,s,{value:t});else if(t!==e[s])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[s]}`);return e}function i(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(s))return t[s];const e="function"===typeof t?t:t.constructor;return e.modelName||e.name}function r(t,s){let n=e(s);let i=0;while(i<n.length){const e=n[i++];if(t.hasOwnProperty(e))n=n.concat(t[e])}return n}function o(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach(e=>{const s=e===t[e]||Array.isArray(t[e])&&(-1!==t[e].indexOf(e)||-1!==t[e].indexOf("manage"));if(s)throw new Error(`Attempt to alias action to itself: ${e} -> ${t[e]}`)})}function c(t){if("production"!==process.env.NODE_ENV)o(t);return e=>r(t,e)}function u(t,e,s){for(let n=s;n<e.length;n++)t.push(e[n])}function h(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let s=0;let n=0;const i=[];while(s<t.length&&n<e.length)if(t[s].priority<e[n].priority){i.push(t[s]);s++}else{i.push(e[n]);n++}u(i,t,s);u(i,e,n);return i}function a(t,e,s){let n=t.get(e);if(!n){n=s();t.set(e,n)}return n}const l=t=>t;function f(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}class p{constructor(t,s,n=0){this.t=void 0;this.s=void 0;f(t,s);this.action=s.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?e(t.fields):void 0;this.priority=n;this.i=s}get o(){if(this.conditions&&!this.t)this.t=this.i.conditionsMatcher(this.conditions);return this.t}get u(){if(this.fields&&!this.s)this.s=this.i.fieldMatcher(this.fields);return this.s}get ast(){return this.o?this.o.ast:void 0}matchesConditions(t){if(!this.conditions)return true;if(!t||"string"===typeof t||"function"===typeof t)return!this.inverted;return this.o(t)}matchesField(t){if(!this.fields)return true;if(!t)return!this.inverted;return this.u(t)}}const d=(t,e)=>{const s={value:t,prev:e,next:null};if(e)e.next=s;return s};const g=t=>{if(t.next)t.next.prev=t.prev;if(t.prev)t.prev.next=t.next;t.next=t.prev=null};const y=()=>({rules:[],merged:false});const w=()=>new Map;const $=(t,e)=>{if(!t.h&&e.fields)t.h=true};class b{constructor(t=[],e={}){this.h=false;this.l=new Map;this.p={conditionsMatcher:e.conditionsMatcher,fieldMatcher:e.fieldMatcher,resolveAction:e.resolveAction||l};this.detectSubjectType=e.detectSubjectType||i;this.g=t;this.$=this.m(t)}get rules(){return this.g}update(t){const e={rules:t,ability:this,target:this};this.M("update",e);this.g=t;this.$=this.m(t);this.M("updated",e);return this}m(t){const s=new Map;for(let n=t.length-1;n>=0;n--){const i=t.length-n-1;const r=new p(t[n],this.p,i);const o=e(r.action);const c=e(r.subject);$(this,r);for(let t=0;t<c.length;t++){const e=this.detectSubjectType(c[t]);const n=a(s,e,w);for(let t=0;t<o.length;t++)a(n,o[t],y).rules.push(r)}}return s}possibleRulesFor(t,e){const s=this.detectSubjectType(e);const n=a(this.$,s,w);const i=a(n,t,y);if(i.merged)return i.rules;const r="manage"!==t&&n.has("manage")?n.get("manage").rules:void 0;let o=h(i.rules,r);if("all"!==s)o=h(o,this.possibleRulesFor(t,"all"));i.rules=o;i.merged=true;return o}rulesFor(t,e,s){const n=this.possibleRulesFor(t,e);if(s&&"string"!==typeof s)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return n;return n.filter(t=>t.matchesField(s))}on(t,e){const s=this.l.get(t)||null;const n=d(e,s);this.l.set(t,n);return()=>{if(!n.next&&!n.prev&&this.l.get(t)===n)this.l.delete(t);else g(n)}}M(t,e){let s=this.l.get(t)||null;while(null!==s){const t=s.prev;s.value(e);s=t}}}class x extends b{can(...t){const e=this.relevantRuleFor(...t);return!!e&&!e.inverted}relevantRuleFor(...t){const e=this.rulesFor(...t);const s=t[1];for(let t=0,n=e.length;t<n;t++)if(e[t].matchesConditions(s))return e[t];return null}cannot(...t){return!this.can(...t)}}const m={$eq:t.$eq,$ne:t.$ne,$lt:t.$lt,$lte:t.$lte,$gt:t.$gt,$gte:t.$gte,$in:t.$in,$nin:t.$nin,$all:t.$all,$size:t.$size,$regex:t.$regex,$options:t.$options,$elemMatch:t.$elemMatch,$exists:t.$exists};const M={eq:t.eq,ne:t.ne,lt:t.lt,lte:t.lte,gt:t.gt,gte:t.gte,in:t.within,nin:t.nin,all:t.all,size:t.size,regex:t.regex,elemMatch:t.elemMatch,exists:t.exists,and:t.and};const v=(e,s,n)=>t.createFactory(Object.assign({},m,e),Object.assign({},M,s),n);const E=t.createFactory(m,M);const j=/[-/\\^$+?.()|[\]{}]/g;const _=/\.?\*+\.?/g;const F=/\*+/;const O=/\./g;function A(t,e,s){const n="*"===s[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";const i=-1===t.indexOf("**")?"[^.]":".";const r=t.replace(O,"\\$&").replace(F,i+n);return e+t.length===s.length?`(?:${r})?`:r}function C(t,e,s){if("."===t&&("*"===s[e-1]||"*"===s[e+1]))return t;return`\\${t}`}function z(t){const e=t.map(t=>t.replace(j,C).replace(_,A));const s=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${s}$`)}const R=t=>{let e;return s=>{if("undefined"===typeof e)e=t.every(t=>-1===t.indexOf("*"))?null:z(t);return null===e?-1!==t.indexOf(s):e.test(s)}};class q extends x{constructor(t=[],e={}){super(t,Object.assign({conditionsMatcher:E,fieldMatcher:R},e))}}class T{constructor(t){this.v=t}because(t){this.v.reason=t;return this}}class S{constructor(t){this.rules=[];this.j=t;const e=this;e.can=e.can.bind(e);e.cannot=e.cannot.bind(e);e.build=e.build.bind(e)}can(t,e,s,n){const i={action:t};if(e){i.subject=e;if(Array.isArray(s)||"string"===typeof s)i.fields=s;else if("undefined"!==typeof s)i.conditions=s;if("undefined"!==typeof n)i.conditions=n}this.rules.push(i);return new T(i)}cannot(t,e,s,n){const i=this.can(t,e,s,n);i.v.inverted=true;return i}build(t){return new this.j(this.rules,t)}}function Y(t,e){const s=new S(q);const n=t(s.can,s.cannot);if(n&&"function"===typeof n.then)return n.then(()=>s.build(e));return s.build(e)}const D=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`;const I=function t(e){this.message=e};I.prototype=Object.create(Error.prototype);class L extends I{static setDefaultMessage(t){this._="string"===typeof t?()=>t:t}static from(t){return new this(t)}constructor(t){super("");this.field=void 0;this.ability=t;if("function"===typeof Error.captureStackTrace){this.name="ForbiddenError";Error.captureStackTrace(this,this.constructor)}}setMessage(t){this.message=t;return this}throwUnlessCan(...t){const e=this.ability.relevantRuleFor(...t);if(e&&!e.inverted)return;this.action=t[0];this.subject=t[1];this.subjectType=this.ability.detectSubjectType(t[1]);this.field=t[2];const s=e?e.reason:"";this.message=this.message||s||this.constructor._(this);throw this}}L._=D;exports.Ability=q;exports.AbilityBuilder=S;exports.ForbiddenError=L;exports.PureAbility=x;exports.buildMongoQueryMatcher=v;exports.createAliasResolver=c;exports.defineAbility=Y;exports.detectSubjectType=i;exports.fieldPatternMatcher=R;exports.getDefaultErrorMessage=D;exports.mongoQueryMatcher=E;exports.subject=n;exports.wrapArray=e;
"use strict";Object.defineProperty(exports,"__esModule",{value:true});var t=require("@ucast/mongo2js");function e(t){return Array.isArray(t)?t:[t]}const s="__caslSubjectType__";function n(t,e){if(e)if(!e.hasOwnProperty(s))Object.defineProperty(e,s,{value:t});else if(t!==e[s])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[s]}`);return e}function r(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(s))return t[s];const e="function"===typeof t?t:t.constructor;return e.modelName||e.name}function i(t,s){let n=e(s);let r=0;while(r<n.length){const e=n[r++];if(t.hasOwnProperty(e))n=n.concat(t[e])}return n}function o(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach(e=>{const s=e===t[e]||Array.isArray(t[e])&&(-1!==t[e].indexOf(e)||-1!==t[e].indexOf("manage"));if(s)throw new Error(`Attempt to alias action to itself: ${e} -> ${t[e]}`)})}function c(t){if("production"!==process.env.NODE_ENV)o(t);return e=>i(t,e)}function u(t,e,s){for(let n=s;n<e.length;n++)t.push(e[n])}function h(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let s=0;let n=0;const r=[];while(s<t.length&&n<e.length)if(t[s].priority<e[n].priority){r.push(t[s]);s++}else{r.push(e[n]);n++}u(r,t,s);u(r,e,n);return r}function a(t,e,s){let n=t.get(e);if(!n){n=s();t.set(e,n)}return n}const l=t=>t;function f(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}class p{constructor(t,s,n=0){this.t=void 0;this.s=void 0;f(t,s);this.action=s.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?e(t.fields):void 0;this.priority=n;this.i=s}get o(){if(this.conditions&&!this.t)this.t=this.i.conditionsMatcher(this.conditions);return this.t}get u(){if(this.fields&&!this.s)this.s=this.i.fieldMatcher(this.fields);return this.s}get ast(){return this.o?this.o.ast:void 0}matchesConditions(t){if(!this.conditions)return true;if(!t||"string"===typeof t||"function"===typeof t)return!this.inverted;return this.o(t)}matchesField(t){if(!this.fields)return true;if(!t)return!this.inverted;return this.u(t)}}const d=(t,e)=>{const s={value:t,prev:e,next:null};if(e)e.next=s;return s};const g=t=>{if(t.next)t.next.prev=t.prev;if(t.prev)t.prev.next=t.next;t.next=t.prev=null};const y=()=>({rules:[],merged:false});const w=()=>new Map;const $=(t,e)=>{if(!t.h&&e.fields)t.h=true};class b{constructor(t=[],e={}){this.h=false;this.l=new Map;this.p={conditionsMatcher:e.conditionsMatcher,fieldMatcher:e.fieldMatcher,resolveAction:e.resolveAction||l};this.detectSubjectType=e.detectSubjectType||r;this.g=t;this.$=this.m(t)}get rules(){return this.g}update(t){const e={rules:t,ability:this,target:this};this.M("update",e);this.g=t;this.$=this.m(t);this.M("updated",e);return this}m(t){const s=new Map;for(let n=t.length-1;n>=0;n--){const r=t.length-n-1;const i=new p(t[n],this.p,r);const o=e(i.action);const c=e(i.subject||"all");$(this,i);for(let t=0;t<c.length;t++){const e=a(s,c[t],w);for(let t=0;t<o.length;t++)a(e,o[t],y).rules.push(i)}}return s}possibleRulesFor(t,e){const s=a(this.$,e,w);const n=a(s,t,y);if(n.merged)return n.rules;const r="manage"!==t&&s.has("manage")?s.get("manage").rules:void 0;let i=h(n.rules,r);if("all"!==e)i=h(i,this.possibleRulesFor(t,"all"));n.rules=i;n.merged=true;return i}rulesFor(t,e,s){const n=this.possibleRulesFor(t,e);if(s&&"string"!==typeof s)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return n;return n.filter(t=>t.matchesField(s))}on(t,e){const s=this.l.get(t)||null;const n=d(e,s);this.l.set(t,n);return()=>{if(!n.next&&!n.prev&&this.l.get(t)===n)this.l.delete(t);else g(n)}}M(t,e){let s=this.l.get(t)||null;while(null!==s){const t=s.prev;s.value(e);s=t}}}class x extends b{can(...t){const e=this.relevantRuleFor(...t);return!!e&&!e.inverted}relevantRuleFor(t,e,s){const n=this.rulesFor(t,this.detectSubjectType(e),s);for(let t=0,s=n.length;t<s;t++)if(n[t].matchesConditions(e))return n[t];return null}cannot(...t){return!this.can(...t)}}const m={$eq:t.$eq,$ne:t.$ne,$lt:t.$lt,$lte:t.$lte,$gt:t.$gt,$gte:t.$gte,$in:t.$in,$nin:t.$nin,$all:t.$all,$size:t.$size,$regex:t.$regex,$options:t.$options,$elemMatch:t.$elemMatch,$exists:t.$exists};const M={eq:t.eq,ne:t.ne,lt:t.lt,lte:t.lte,gt:t.gt,gte:t.gte,in:t.within,nin:t.nin,all:t.all,size:t.size,regex:t.regex,elemMatch:t.elemMatch,exists:t.exists,and:t.and};const v=(e,s,n)=>t.createFactory(Object.assign({},m,e),Object.assign({},M,s),n);const E=t.createFactory(m,M);const j=/[-/\\^$+?.()|[\]{}]/g;const _=/\.?\*+\.?/g;const F=/\*+/;const O=/\./g;function A(t,e,s){const n="*"===s[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";const r=-1===t.indexOf("**")?"[^.]":".";const i=t.replace(O,"\\$&").replace(F,r+n);return e+t.length===s.length?`(?:${i})?`:i}function C(t,e,s){if("."===t&&("*"===s[e-1]||"*"===s[e+1]))return t;return`\\${t}`}function z(t){const e=t.map(t=>t.replace(j,C).replace(_,A));const s=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${s}$`)}const R=t=>{let e;return s=>{if("undefined"===typeof e)e=t.every(t=>-1===t.indexOf("*"))?null:z(t);return null===e?-1!==t.indexOf(s):e.test(s)}};class q extends x{constructor(t=[],e={}){super(t,Object.assign({conditionsMatcher:E,fieldMatcher:R},e))}}class T{constructor(t){this.v=t}because(t){this.v.reason=t;return this}}class S{constructor(t){this.rules=[];this.j=t;const e=this;e.can=e.can.bind(e);e.cannot=e.cannot.bind(e);e.build=e.build.bind(e)}can(t,e,s,n){const r={action:t};if(e){r.subject=e;if(Array.isArray(s)||"string"===typeof s)r.fields=s;else if("undefined"!==typeof s)r.conditions=s;if("undefined"!==typeof n)r.conditions=n}this.rules.push(r);return new T(r)}cannot(t,e,s,n){const r=this.can(t,e,s,n);r.v.inverted=true;return r}build(t){return new this.j(this.rules,t)}}function Y(t,e){const s=new S(q);const n=t(s.can,s.cannot);if(n&&"function"===typeof n.then)return n.then(()=>s.build(e));return s.build(e)}const D=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`;const I=function t(e){this.message=e};I.prototype=Object.create(Error.prototype);class L extends I{static setDefaultMessage(t){this._="string"===typeof t?()=>t:t}static from(t){return new this(t)}constructor(t){super("");this.field=void 0;this.ability=t;if("function"===typeof Error.captureStackTrace){this.name="ForbiddenError";Error.captureStackTrace(this,this.constructor)}}setMessage(t){this.message=t;return this}throwUnlessCan(...t){const e=this.ability.relevantRuleFor(...t);if(e&&!e.inverted)return;this.action=t[0];this.subject=t[1];this.subjectType=this.ability.detectSubjectType(t[1]);this.field=t[2];const s=e?e.reason:"";this.message=this.message||s||this.constructor._(this);throw this}}L._=D;exports.Ability=q;exports.AbilityBuilder=S;exports.ForbiddenError=L;exports.PureAbility=x;exports.buildMongoQueryMatcher=v;exports.createAliasResolver=c;exports.defineAbility=Y;exports.detectSubjectType=r;exports.fieldPatternMatcher=R;exports.getDefaultErrorMessage=D;exports.mongoQueryMatcher=E;exports.subject=n;exports.wrapArray=e;
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport { CanParameters, Abilities, Normalize, Subject, SubjectType } from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject);\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectType = this.detectSubjectType(subjects[k]);\n const subjectRules = getOrDefault(indexedRules, subjectType, defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: CanParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subject?: Subject): Rule<A, Conditions>[] {\n const subjectType = this.detectSubjectType(subject);\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: CanParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subject);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters } from './types';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>) {\n const rules = this.rulesFor(...args);\n const subject = args[1];\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","this","_lazyMatchConditions","ast","matchesConditions","matchesField","field","_lazyMatchField","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectType","subjectRules","possibleRulesFor","actionRules","manageRules","has","rulesFor","filter","on","handler","head","delete","payload","current","PureAbility","can","args","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","messageOrFn","_defaultErrorMessage","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport {\n Abilities,\n Normalize,\n SubjectType,\n AbilityParameters,\n AbilityTuple,\n ExtractSubjectType\n} from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\ntype AbilitySubjectTypeParameters<T extends Abilities, IncludeField extends boolean = true> =\n AbilityParameters<\n T,\n T extends AbilityTuple\n ? IncludeField extends true\n ? (action: T[0], subject: ExtractSubjectType<T[1]>, field?: string) => 0\n : (action: T[0], subject: ExtractSubjectType<T[1]>) => 0\n : never,\n (action: Extract<T, string>) => 0\n >;\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject || 'all');\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectRules = getOrDefault(indexedRules, subjects[k], defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: AbilitySubjectTypeParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subjectType?: SubjectType): Rule<A, Conditions>[] {\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: AbilitySubjectTypeParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subjectType?: SubjectType, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subjectType);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters, Subject } from './types';\nimport { Rule } from './Rule';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>): Rule<A, Conditions> | null\n relevantRuleFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions> | null {\n const rules = (this as any).rulesFor(action, this.detectSubjectType(subject), field);\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","this","_lazyMatchConditions","ast","matchesConditions","matchesField","field","_lazyMatchField","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectRules","possibleRulesFor","subjectType","actionRules","manageRules","has","rulesFor","filter","on","handler","head","delete","payload","current","PureAbility","can","args","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","messageOrFn","_defaultErrorMessage","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}

@@ -1,2 +0,2 @@

class t{constructor(t,e){this.operator=t,this.value=e}}class e extends t{constructor(t,e){if(!Array.isArray(e))throw new Error(`"${t}" operator expects to receive an array of conditions`);super(t,e)}}const r="__itself__";class n{constructor(t,e,r){this.operator=t,this.value=r,this.field=e}}const o=new t("__null__",null);function i(t,e){const r=t[e];if("function"!=typeof r)throw new Error(`Unable to interpret "${e}" condition. Did you forget to register interpreter for it?`);return r}function c(t,e){const r=e;let n;switch(r?r.numberOfArguments:0){case 1:n=e=>i(t,e.operator)(e,o);break;case 3:n=(e,r,n)=>i(t,e.operator)(e,r,n,o);break;default:n=(e,r)=>i(t,e.operator)(e,r,o)}const o=Object.assign({},r,{interpret:n});return o.interpret}function s(t,e){return(r,...n)=>{const o=t(r,...n),i=e.bind(null,o);return i.ast=o,i}}function u(t,r){return r instanceof e&&r.operator===t}function a(t,r){return 1===r.length?r[0]:new e(t,function t(e,r,n){const o=n||[];for(let n=0,i=r.length;n<i;n++){const i=r[n];u(e,i)?t(e,i.value,o):o.push(i)}return o}(t,r))}const f=t=>a("and",t),l=t=>a("or",t);function p(t){if(!t||t&&t.constructor!==Object)return!1;for(const e in t)if(t.hasOwnProperty(e)&&"$"===e[0])return!0;return!1}function d(t,e){if(!Array.isArray(e))throw new Error(`"${t.name}" expects value to be an array`)}function h(t,e){if(d(t,e),!e.length)throw new Error(`"${t.name}" expects to have at least one element in array`)}const w=t=>(e,r)=>{if(typeof r!==t)throw new Error(`"${e.name}" expects value to be a "${t}"`)},y={type:"compound",validate:h,parse(t,e,{parse:r}){const n=e.map(t=>r(t));return a(t.name,n)}},$=y,b={type:"compound",validate:h},v={type:"field",validate(t,e){if(!(e&&(e instanceof RegExp||e.constructor===Object)))throw new Error(`"${t.name}" expects to receive either regular expression or object of field operators`)},parse(t,r,o){const i=r instanceof RegExp?new n("regex",o.field,r):o.parse(r,o);return new e(t.name,[i])}},g={type:"field",validate(t,e){if(!e||e.constructor!==Object)throw new Error(`"${t.name}" expects to receive an object with nested query or field level operators`)},parse(t,e,{parse:o,field:i}){const c=p(e)?o(e,{field:r}):o(e);return new n(t.name,i,c)}},m={type:"field",validate:w("number")},j={type:"field",validate:d},x=j,E=j,O={type:"field",validate(t,e){if(!Array.isArray(e)||2!==e.length)throw new Error(`"${t.name}" expects an array with 2 numeric elements`)}},A={type:"field",validate:w("boolean")},_={type:"field",validate:function(t,e){if(!("string"==typeof e||"number"==typeof e||e instanceof Date))throw new Error(`"${t.name}" expects value to be comparable (i.e., string, number or date)`)}},q=_,U=q,S=q,k={type:"field"},R=k,D={type:"field",validate(t,e){if(!(e instanceof RegExp)&&"string"!=typeof e)throw new Error(`"${t.name}" expects value to be a regular expression or a string that represents regular expression`)},parse(t,e,r){const o="string"==typeof e?new RegExp(e,r.query.$options||""):e;return new n(t.name,r.field,o)}},N={type:"field",parse:()=>o},z={type:"document",validate:w("function")};var M=Object.freeze({__proto__:null,$and:y,$or:$,$nor:b,$not:v,$elemMatch:g,$size:m,$in:j,$nin:x,$all:E,$mod:O,$exists:A,$gte:_,$gt:q,$lt:U,$lte:S,$eq:k,$ne:R,$regex:D,$options:N,$where:z});const P={compound(t,r,n){const o=(Array.isArray(r)?r:[r]).map(t=>n.parse(t));return new e(t.name,o)},field:(t,e,r)=>new n(t.name,r.field,e),document:(e,r)=>new t(e.name,r)};function F(t,e,r){"function"==typeof t.validate&&t.validate(t,e);return(t.parse||P[t.type])(t,e,r)}class J{constructor(t){this.t=void 0,this.o=void 0,this.t=Object.keys(t).reduce((e,r)=>(e[r]=Object.assign({},t[r],{name:r.slice(1)}),e),{}),this.parse=this.parse.bind(this),this.o={field:"",query:{},parse:this.parse}}setParse(t){this.parse=t,this.o.parse=t}i(t,e,r,n){const o=this.t[e];if(!o)throw new Error(`Unsupported operator "${e}"`);if("field"!==o.type)throw new Error(`Unexpected ${o.type} operator "${e}" at field level`);return this.o.field=t,this.o.query=n,F(o,r,this.o)}s(t,e){const r=[],n=Object.keys(e);for(let i=0,c=n.length;i<c;i++){const c=n[i];if("$"!==c[0])throw new Error(`Field query for "${t}" may contain only operators or a plain object as a value`);const s=this.i(t,c,e[c],e);s!==o&&r.push(s)}return r}parse(t,e){if(e&&e.field)return f(this.s(e.field,t));const r=t,n={query:r,parse:this.parse},o=[],i=Object.keys(r);for(let t=0,e=i.length;t<e;t++){const e=i[t],c=r[e],s="$"===e[0],u=this.t[e];if(s){if(!u)throw new Error(`Unsupported operator "${e}"`);if("document"!==u.type&&"compound"!==u.type)throw new Error(`Unknown top level operator "${e}"`);o.push(F(u,c,n))}else p(c)?o.push(...this.s(e,c)):o.push(this.i(e,"$eq",c,r))}return f(o)}}const T=M;function B(t,e,r){for(let n=0,o=t.length;n<o;n++)if(r(t[n],e))return!0;return!1}function C(t,e){return Array.isArray(t)&&Number.isNaN(Number(e))}function G(t,e,r){return C(t,e)?t.reduce((t,n)=>{const o=r(n,e);return void 0!==o?t.concat(o):t},[]):r(t,e)}function H(t){return(e,r,n)=>{const o=n.get(r,e.field);return Array.isArray(o)?o.some(r=>t(e,r,n)):t(e,o,n)}}const I=(t,e)=>t[e];function K(t,e,r){const n=e.lastIndexOf(".");return-1===n?[t,e]:[r(t,e.slice(0,n)),e.slice(n+1)]}function L(t,e,n=I){if(e===r)return t;if(!t)throw new Error(`Unable to get field "${e}" out of ${String(t)}.`);return function(t,e,r){if(-1===e.indexOf("."))return G(t,e,r);const n=e.split(".");let o=t;for(let t=0,e=n.length;t<e;t++)if(o=G(o,n[t],r),!o||"object"!=typeof o)return o;return o}(t,e,n)}function Q(t,e){return t===e?0:t>e?1:-1}function V(t,e={}){const r=e.compare||Q;return c(t,Object.assign({get:L,compare:Q,equal:(t,e)=>0===r(t,e)},e))}const W=(t,e,{interpret:r})=>t.value.some(t=>r(t,e)),X=(t,e,r)=>!W(t,e,r),Y=(t,e,{interpret:r})=>t.value.every(t=>r(t,e)),Z=(t,e,{interpret:r})=>!r(t.value[0],e),tt=(t,e,{equal:r,get:n})=>{const o=n(e,t.field);return Array.isArray(o)&&!Array.isArray(t.value)?B(o,t.value,r):r(o,t.value)},et=(t,e,r)=>!tt(t,e,r),rt=H((t,e,r)=>{const n=r.compare(e,t.value);return 0===n||-1===n}),nt=H((t,e,r)=>-1===r.compare(e,t.value)),ot=H((t,e,r)=>1===r.compare(e,t.value)),it=H((t,e,r)=>{const n=r.compare(e,t.value);return 0===n||1===n}),ct=(t,e,{get:n})=>{if(t.field===r)return void 0!==e;const[o,i]=K(e,t.field,n),c=e=>!!e&&e.hasOwnProperty(i)===t.value;return C(o,i)?o.some(c):c(o)},st=H((t,e)=>e%t.value[0]===t.value[1]),ut=(t,e,{get:n})=>{const[o,i]=K(e,t.field,n),c=e=>{const r=n(e,i);return Array.isArray(r)&&r.length===t.value};return t.field!==r&&C(o,i)?o.some(c):c(o)},at=H((t,e)=>t.value.test(e)),ft=H((t,e,{equal:r})=>B(t.value,e,r)),lt=(t,e,r)=>!ft(t,e,r),pt=(t,e,{equal:r,get:n})=>{const o=n(e,t.field);return Array.isArray(o)&&t.value.every(t=>B(o,t,r))},dt=(t,e,{interpret:r,get:n})=>{const o=n(e,t.field);return Array.isArray(o)&&o.some(e=>r(t.value,e))},ht=(t,e)=>t.value.call(e);var wt=Object.freeze({__proto__:null,or:W,nor:X,and:Y,not:Z,eq:tt,ne:et,lte:rt,lt:nt,gt:ot,gte:it,exists:ct,mod:st,size:ut,regex:at,within:ft,nin:lt,all:pt,elemMatch:dt,where:ht});const yt=Object.assign({},wt,{in:ft}),$t=V(yt);function bt(t){return t instanceof Date?t.getTime():t&&"function"==typeof t.toJSON?t.toJSON():t}const vt=(t,e)=>Q(bt(t),bt(e));function gt(t,e,n){const o=new J(t),i=V(e,Object.assign({compare:vt},n));if(n&&n.forPrimitives){const t={field:r},e=o.parse;o.setParse(r=>e(r,t))}return s(o.parse,i)}const mt=gt(T,yt),jt=gt(["$and","$or"].reduce((t,e)=>(t[e]=Object.assign({},t[e],{type:"field"}),t),Object.assign({},T,{$nor:Object.assign({},T.$nor,{type:"field",parse:P.compound})})),yt,{forPrimitives:!0});function xt(t){return Array.isArray(t)?t:[t]}function Et(t,e,r){let n=t;let o=e;if(-1!==e.indexOf(".")){const r=e.split(".");o=r.pop();n=r.reduce((t,e)=>{t[e]=t[e]||{};return t[e]},t)}n[o]=r}function Ot(t,e,r,n){const o=Object.create(null);const i=t.rulesFor(e,r);for(let t=0;t<i.length;t++){const e=i[t];const r=e.inverted?"$and":"$or";if(!e.conditions)if(e.inverted)break;else{delete o[r];return o}else{o[r]=o[r]||[];o[r].push(n(e))}}return o.$or?o:null}function At(t){if(!t.ast)throw new Error(`Ability rule "${JSON.stringify(t)}" does not have "ast" property. So, cannot be used to generate AST`);return t.ast}function _t(t,e,r){const n=Ot(t,e,r,At);if(null===n)return null;if(!n.$and)return n.$or?l(n.$or):f([]);if(n.$or)n.$and.push(l(n.$or));return f(n.$and)}function qt(t,e,r){return t.rulesFor(e,r).filter(t=>!t.inverted&&t.conditions).reduce((t,e)=>{const r=e.conditions;return Object.keys(r).reduce((t,e)=>{const n=r[e];if(!n||n.constructor!==Object)Et(t,e,n);return t},t)},{})}const Ut=t=>t.fields;function St(t){this.delete(t)}function kt(t){this.add(t)}function Rt(t,e,r,n={}){const o=n.fieldsFrom||Ut;const i=t.possibleRulesFor(e,r).filter(t=>t.matchesConditions(r)).reverse().reduce((t,e)=>{const r=o(e);if(r){const n=e.inverted?St:kt;r.forEach(n,t)}return t},new Set);return Array.from(i)}const Dt=t=>Array.isArray(t)?t.join(","):t;function Nt(t,e){return t.map(t=>{const r=[Dt(t.action||t.actions),"function"===typeof e?xt(t.subject).map(e).join(","):Dt(t.subject),t.conditions||0,t.inverted?1:0,t.fields?Dt(t.fields):0,t.reason||""];while(!r[r.length-1])r.pop();return r})}function zt(t,e){return t.map(([t,r,n,o,i,c])=>{const s=r.split(",");const u={inverted:!!o,action:t.split(","),subject:"function"===typeof e?s.map(e):s};if(n)u.conditions=n;if(i)u.fields=i.split(",");if(c)u.reason=c;return u})}export{Nt as packRules,Rt as permittedFieldsOf,_t as rulesToAST,qt as rulesToFields,Ot as rulesToQuery,zt as unpackRules};
import{buildOr as n,buildAnd as t}from"@ucast/mongo2js";function r(n){return Array.isArray(n)?n:[n]}function e(n,t,r){let e=n;let o=t;if(-1!==t.indexOf(".")){const r=t.split(".");o=r.pop();e=r.reduce((n,t)=>{n[t]=n[t]||{};return n[t]},n)}e[o]=r}function o(n,t,r,e){const o=Object.create(null);const u=n.rulesFor(t,r);for(let n=0;n<u.length;n++){const t=u[n];const r=t.inverted?"$and":"$or";if(!t.conditions)if(t.inverted)break;else{delete o[r];return o}else{o[r]=o[r]||[];o[r].push(e(t))}}return o.$or?o:null}function u(n){if(!n.ast)throw new Error(`Ability rule "${JSON.stringify(n)}" does not have "ast" property. So, cannot be used to generate AST`);return n.ast}function c(r,e,c){const i=o(r,e,c,u);if(null===i)return null;if(!i.$and)return i.$or?n(i.$or):t([]);if(i.$or)i.$and.push(n(i.$or));return t(i.$and)}function i(n,t,r){return n.rulesFor(t,r).reduce((n,t)=>{if(t.inverted||!t.conditions)return n;return Object.keys(t.conditions).reduce((n,r)=>{const o=t.conditions[r];if(!o||o.constructor!==Object)e(n,r,o);return n},n)},{})}const f=n=>n.fields;function s(n){this.delete(n)}function l(n){this.add(n)}function a(n,t,r,e={}){const o=e.fieldsFrom||f;const u=n.detectSubjectType(r);const c=n.possibleRulesFor(t,u).reduceRight((n,t)=>{if(!t.matchesConditions(r))return n;const e=o(t);if(e){const r=t.inverted?s:l;e.forEach(r,n)}return n},new Set);return Array.from(c)}const b=n=>Array.isArray(n)?n.join(","):n;function y(n,t){return n.map(n=>{const e=[b(n.action||n.actions),"function"===typeof t?r(n.subject).map(t).join(","):b(n.subject),n.conditions||0,n.inverted?1:0,n.fields?b(n.fields):0,n.reason||""];while(!e[e.length-1])e.pop();return e})}function p(n,t){return n.map(([n,r,e,o,u,c])=>{const i=r.split(",");const f={inverted:!!o,action:n.split(","),subject:"function"===typeof t?i.map(t):i};if(e)f.conditions=e;if(u)f.fields=u.split(",");if(c)f.reason=c;return f})}export{y as packRules,a as permittedFieldsOf,c as rulesToAST,i as rulesToFields,o as rulesToQuery,p as unpackRules};
//# sourceMappingURL=extra.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"extra.mjs","sources":["../../../../node_modules/.pnpm/@ucast/core@1.5.0/node_modules/@ucast/core/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo@2.3.1/node_modules/@ucast/mongo/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/js@2.2.1/node_modules/@ucast/js/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo2js@1.3.0/node_modules/@ucast/mongo2js/dist/es6m/index.mjs","../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["class t{constructor(t,n){this.operator=t,this.value=n}}class n extends t{constructor(t,n){if(!Array.isArray(n))throw new Error(`\"${t}\" operator expects to receive an array of conditions`);super(t,n)}}const r=\"__itself__\";class o{constructor(t,n,r){this.operator=t,this.value=r,this.field=n}}const e=new t(\"__null__\",null);function c(t,n){const r=t[n];if(\"function\"!=typeof r)throw new Error(`Unable to interpret \"${n}\" condition. Did you forget to register interpreter for it?`);return r}function s(t,n){const r=n;let o;switch(r?r.numberOfArguments:0){case 1:o=n=>c(t,n.operator)(n,e);break;case 3:o=(n,r,o)=>c(t,n.operator)(n,r,o,e);break;default:o=(n,r)=>c(t,n.operator)(n,r,e)}const e=Object.assign({},r,{interpret:o});return e.interpret}function i(t,n){return(r,...o)=>{const e=t(r,...o),c=n.bind(null,e);return c.ast=e,c}}function u(t,r){return r instanceof n&&r.operator===t}function f(t,r){return 1===r.length?r[0]:new n(t,function t(n,r,o){const e=o||[];for(let o=0,c=r.length;o<c;o++){const c=r[o];u(n,c)?t(n,c.value,e):e.push(c)}return e}(t,r))}const a=t=>f(\"and\",t),l=t=>f(\"or\",t);export{n as CompoundCondition,t as DocumentCondition,o as FieldCondition,r as ITSELF,e as NULL_CONDITION,a as buildAnd,l as buildOr,s as createInterpreter,i as createTranslatorFactory,u as isCompound,f as optimizedCompoundCondition};\n//# sourceMappingURL=index.mjs.map\n","import{optimizedCompoundCondition as e,FieldCondition as t,CompoundCondition as r,ITSELF as o,NULL_CONDITION as n,DocumentCondition as i,buildAnd as a}from\"@ucast/core\";function s(e){if(!e||e&&e.constructor!==Object)return!1;for(const t in e)if(e.hasOwnProperty(t)&&\"$\"===t[0])return!0;return!1}function p(e,t){if(!Array.isArray(t))throw new Error(`\"${e.name}\" expects value to be an array`)}function c(e,t){if(p(e,t),!t.length)throw new Error(`\"${e.name}\" expects to have at least one element in array`)}const l=e=>(t,r)=>{if(typeof r!==e)throw new Error(`\"${t.name}\" expects value to be a \"${e}\"`)},f={type:\"compound\",validate:c,parse(t,r,{parse:o}){const n=r.map(e=>o(e));return e(t.name,n)}},d=f,u={type:\"compound\",validate:c},h={type:\"field\",validate(e,t){if(!(t&&(t instanceof RegExp||t.constructor===Object)))throw new Error(`\"${e.name}\" expects to receive either regular expression or object of field operators`)},parse(e,o,n){const i=o instanceof RegExp?new t(\"regex\",n.field,o):n.parse(o,n);return new r(e.name,[i])}},$={type:\"field\",validate(e,t){if(!t||t.constructor!==Object)throw new Error(`\"${e.name}\" expects to receive an object with nested query or field level operators`)},parse(e,r,{parse:n,field:i}){const a=s(r)?n(r,{field:o}):n(r);return new t(e.name,i,a)}},w={type:\"field\",validate:l(\"number\")},y={type:\"field\",validate:p},v=y,b=y,m={type:\"field\",validate(e,t){if(!Array.isArray(t)||2!==t.length)throw new Error(`\"${e.name}\" expects an array with 2 numeric elements`)}},x={type:\"field\",validate:l(\"boolean\")},E={type:\"field\",validate:function(e,t){if(!(\"string\"==typeof t||\"number\"==typeof t||t instanceof Date))throw new Error(`\"${e.name}\" expects value to be comparable (i.e., string, number or date)`)}},g=E,j=g,O=g,q={type:\"field\"},_=q,R={type:\"field\",validate(e,t){if(!(t instanceof RegExp)&&\"string\"!=typeof t)throw new Error(`\"${e.name}\" expects value to be a regular expression or a string that represents regular expression`)},parse(e,r,o){const n=\"string\"==typeof r?new RegExp(r,o.query.$options||\"\"):r;return new t(e.name,o.field,n)}},U={type:\"field\",parse:()=>n},A={type:\"document\",validate:l(\"function\")};var F=Object.freeze({__proto__:null,$and:f,$or:d,$nor:u,$not:h,$elemMatch:$,$size:w,$in:y,$nin:v,$all:b,$mod:m,$exists:x,$gte:E,$gt:g,$lt:j,$lte:O,$eq:q,$ne:_,$regex:R,$options:U,$where:A});const k={compound(e,t,o){const n=(Array.isArray(t)?t:[t]).map(e=>o.parse(e));return new r(e.name,n)},field:(e,r,o)=>new t(e.name,o.field,r),document:(e,t)=>new i(e.name,t)};function z(e,t,r){\"function\"==typeof e.validate&&e.validate(e,t);return(e.parse||k[e.type])(e,t,r)}class D{constructor(e){this.t=void 0,this.o=void 0,this.t=Object.keys(e).reduce((t,r)=>(t[r]=Object.assign({},e[r],{name:r.slice(1)}),t),{}),this.parse=this.parse.bind(this),this.o={field:\"\",query:{},parse:this.parse}}setParse(e){this.parse=e,this.o.parse=e}i(e,t,r,o){const n=this.t[t];if(!n)throw new Error(`Unsupported operator \"${t}\"`);if(\"field\"!==n.type)throw new Error(`Unexpected ${n.type} operator \"${t}\" at field level`);return this.o.field=e,this.o.query=o,z(n,r,this.o)}s(e,t){const r=[],o=Object.keys(t);for(let i=0,a=o.length;i<a;i++){const a=o[i];if(\"$\"!==a[0])throw new Error(`Field query for \"${e}\" may contain only operators or a plain object as a value`);const s=this.i(e,a,t[a],t);s!==n&&r.push(s)}return r}parse(e,t){if(t&&t.field)return a(this.s(t.field,e));const r=e,o={query:r,parse:this.parse},n=[],i=Object.keys(r);for(let e=0,t=i.length;e<t;e++){const t=i[e],a=r[t],p=\"$\"===t[0],c=this.t[t];if(p){if(!c)throw new Error(`Unsupported operator \"${t}\"`);if(\"document\"!==c.type&&\"compound\"!==c.type)throw new Error(`Unknown top level operator \"${t}\"`);n.push(z(c,a,o))}else s(a)?n.push(...this.s(t,a)):n.push(this.i(t,\"$eq\",a,r))}return a(n)}}const M=F;export{b as $all,f as $and,$ as $elemMatch,q as $eq,x as $exists,g as $gt,E as $gte,y as $in,j as $lt,O as $lte,m as $mod,_ as $ne,v as $nin,u as $nor,h as $not,U as $options,d as $or,R as $regex,w as $size,A as $where,D as MongoQueryParser,M as allParsingInstructions,k as defaultParsers};\n//# sourceMappingURL=index.mjs.map\n","import{ITSELF as r,createInterpreter as t}from\"@ucast/core\";function n(r,t,n){for(let e=0,o=r.length;e<o;e++)if(n(r[e],t))return!0;return!1}function e(r,t){return Array.isArray(r)&&Number.isNaN(Number(t))}function o(r,t,n){return e(r,t)?r.reduce((r,e)=>{const o=n(e,t);return void 0!==o?r.concat(o):r},[]):n(r,t)}function u(r){return(t,n,e)=>{const o=e.get(n,t.field);return Array.isArray(o)?o.some(n=>r(t,n,e)):r(t,o,e)}}const c=(r,t)=>r[t];function i(r,t,n){const e=t.lastIndexOf(\".\");return-1===e?[r,t]:[n(r,t.slice(0,e)),t.slice(e+1)]}function f(t,n,e=c){if(n===r)return t;if(!t)throw new Error(`Unable to get field \"${n}\" out of ${String(t)}.`);return function(r,t,n){if(-1===t.indexOf(\".\"))return o(r,t,n);const e=t.split(\".\");let u=r;for(let r=0,t=e.length;r<t;r++)if(u=o(u,e[r],n),!u||\"object\"!=typeof u)return u;return u}(t,n,e)}function s(r){return(t,n)=>f(t,n,r)}const a=(r,t)=>r===t;function l(r,t){return r===t?0:r>t?1:-1}function g(r,n={}){const e=n.compare||l;return t(r,Object.assign({get:f,compare:l,equal:(r,t)=>0===e(r,t)},n))}const p=(r,t,{interpret:n})=>r.value.some(r=>n(r,t)),y=(r,t,n)=>!p(r,t,n),b=(r,t,{interpret:n})=>r.value.every(r=>n(r,t)),m=(r,t,{interpret:n})=>!n(r.value[0],t),A=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&!Array.isArray(r.value)?n(u,r.value,e):e(u,r.value)},d=(r,t,n)=>!A(r,t,n),q=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||-1===e}),h=u((r,t,n)=>-1===n.compare(t,r.value)),j=u((r,t,n)=>1===n.compare(t,r.value)),w=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||1===e}),_=(t,n,{get:o})=>{if(t.field===r)return void 0!==n;const[u,c]=i(n,t.field,o),f=r=>!!r&&r.hasOwnProperty(c)===t.value;return e(u,c)?u.some(f):f(u)},v=u((r,t)=>t%r.value[0]===r.value[1]),x=(t,n,{get:o})=>{const[u,c]=i(n,t.field,o),f=r=>{const n=o(r,c);return Array.isArray(n)&&n.length===t.value};return t.field!==r&&e(u,c)?u.some(f):f(u)},O=u((r,t)=>r.value.test(t)),N=u((r,t,{equal:e})=>n(r.value,t,e)),$=(r,t,n)=>!N(r,t,n),z=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&r.value.every(r=>n(u,r,e))},E=(r,t,{interpret:n,get:e})=>{const o=e(t,r.field);return Array.isArray(o)&&o.some(t=>n(r.value,t))},M=(r,t)=>r.value.call(t);var S=Object.freeze({__proto__:null,or:p,nor:y,and:b,not:m,eq:A,ne:d,lte:q,lt:h,gt:j,gte:w,exists:_,mod:v,size:x,regex:O,within:N,nin:$,all:z,elemMatch:E,where:M});const U=Object.assign({},S,{in:N}),k=g(U);export{z as all,U as allInterpreters,b as and,l as compare,s as createGetter,g as createJsInterpreter,E as elemMatch,A as eq,a as equal,_ as exists,f as getObjectField,i as getObjectFieldCursor,j as gt,w as gte,k as interpret,h as lt,q as lte,v as mod,d as ne,$ as nin,y as nor,m as not,p as or,O as regex,x as size,M as where,N as within};\n//# sourceMappingURL=index.mjs.map\n","import{createTranslatorFactory as o,ITSELF as t}from\"@ucast/core\";export*from\"@ucast/core\";import{MongoQueryParser as r,allParsingInstructions as e,defaultParsers as c}from\"@ucast/mongo\";export*from\"@ucast/mongo\";import{createJsInterpreter as n,allInterpreters as f,compare as s}from\"@ucast/js\";export*from\"@ucast/js\";function i(o){return o instanceof Date?o.getTime():o&&\"function\"==typeof o.toJSON?o.toJSON():o}const m=(o,t)=>s(i(o),i(t));function p(e,c,f){const s=new r(e),i=n(c,Object.assign({compare:m},f));if(f&&f.forPrimitives){const o={field:t},r=s.parse;s.setParse(t=>r(t,o))}return o(s.parse,i)}const a=p(e,f),u=p([\"$and\",\"$or\"].reduce((o,t)=>(o[t]=Object.assign({},o[t],{type:\"field\"}),o),Object.assign({},e,{$nor:Object.assign({},e.$nor,{type:\"field\",parse:c.compound})})),f,{forPrimitives:!0}),j=a;export{p as createFactory,j as filter,a as guard,u as squire};\n//# sourceMappingURL=index.mjs.map\n","import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf, Generics } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, Normalize } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1],\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subject);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): Condition | null {\n const query = rulesToQuery(ability, action, subject, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): AnyObject {\n return ability.rulesFor(action, subject)\n .filter(rule => !rule.inverted && rule.conditions)\n .reduce((values, rule) => {\n const conditions = rule.conditions!;\n\n return Object.keys(conditions).reduce((fields, fieldName) => {\n const value = conditions[fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const uniqueFields = ability.possibleRulesFor(action, subject)\n .filter(rule => rule.matchesConditions(subject))\n .reverse()\n .reduce((fields, rule) => {\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["t","constructor","n","operator","this","value","Array","isArray","Error","r","o","field","e","c","s","numberOfArguments","Object","assign","interpret","i","bind","ast","u","f","length","push","a","l","hasOwnProperty","p","name","type","validate","parse","map","d","h","RegExp","$","w","y","v","b","m","x","E","Date","g","j","O","q","_","R","query","$options","U","A","F","freeze","__proto__","$and","$or","$nor","$not","$elemMatch","$size","$in","$nin","$all","$mod","$exists","$gte","$gt","$lt","$lte","$eq","$ne","$regex","$where","k","compound","document","z","D","keys","reduce","slice","setParse","M","Number","isNaN","concat","get","some","lastIndexOf","String","indexOf","split","compare","equal","every","test","N","call","S","or","nor","and","not","eq","ne","lte","lt","gt","gte","exists","mod","size","regex","within","nin","all","elemMatch","where","in","getTime","toJSON","forPrimitives","wrapArray","setByPath","object","path","ref","lastKey","pop","res","prop","rulesToQuery","ability","action","subject","convert","create","rules","rulesFor","rule","op","inverted","conditions","ruleToAST","JSON","stringify","rulesToAST","buildOr","buildAnd","rulesToFields","filter","values","fields","fieldName","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","options","fieldsFrom","uniqueFields","possibleRulesFor","matchesConditions","reverse","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}
{"version":3,"file":"extra.mjs","sources":["../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, ExtractSubjectType } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subjectType);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): Condition | null {\n const query = rulesToQuery(ability, action, subjectType, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): AnyObject {\n return ability.rulesFor(action, subjectType)\n .reduce((values, rule) => {\n if (rule.inverted || !rule.conditions) {\n return values;\n }\n\n return Object.keys(rule.conditions).reduce((fields, fieldName) => {\n const value = rule.conditions![fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const subjectType = ability.detectSubjectType(subject);\n const uniqueFields = ability.possibleRulesFor(action, subjectType)\n .reduceRight((fields, rule) => {\n if (!rule.matchesConditions(subject)) {\n return fields;\n }\n\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["wrapArray","value","Array","isArray","setByPath","object","path","ref","lastKey","indexOf","keys","split","pop","reduce","res","prop","rulesToQuery","ability","action","subjectType","convert","query","Object","create","rules","rulesFor","i","length","rule","op","inverted","conditions","push","$or","ruleToAST","ast","Error","JSON","stringify","rulesToAST","$and","buildOr","buildAnd","rulesToFields","values","fields","fieldName","constructor","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","subject","options","fieldsFrom","detectSubjectType","uniqueFields","possibleRulesFor","reduceRight","matchesConditions","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","map","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}

@@ -1,2 +0,2 @@

import{createFactory as t,$eq as s,$ne as e,$lt as n,$lte as i,$gt as r,$gte as o,$in as c,$nin as h,$all as u,$size as a,$regex as l,$options as f,$elemMatch as d,$exists as p,eq as g,ne as y,lt as w,lte as $,gt as b,gte as m,within as M,nin as v,all as x,size as E,regex as j,elemMatch as _,exists as F,and as A}from"@ucast/mongo2js";function O(t){return Array.isArray(t)?t:[t]}const C="__caslSubjectType__";function z(t,s){if(s)if(!s.hasOwnProperty(C))Object.defineProperty(s,C,{value:t});else if(t!==s[C])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${s[C]}`);return s}function R(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(C))return t[C];const s="function"===typeof t?t:t.constructor;return s.modelName||s.name}function T(t,s){let e=O(s);let n=0;while(n<e.length){const s=e[n++];if(t.hasOwnProperty(s))e=e.concat(t[s])}return e}function q(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach(s=>{const e=s===t[s]||Array.isArray(t[s])&&(-1!==t[s].indexOf(s)||-1!==t[s].indexOf("manage"));if(e)throw new Error(`Attempt to alias action to itself: ${s} -> ${t[s]}`)})}function S(t){if("production"!==process.env.NODE_ENV)q(t);return s=>T(t,s)}function Y(t,s,e){for(let n=e;n<s.length;n++)t.push(s[n])}function D(t,s){if(!t||!t.length)return s||[];if(!s||!s.length)return t||[];let e=0;let n=0;const i=[];while(e<t.length&&n<s.length)if(t[e].priority<s[n].priority){i.push(t[e]);e++}else{i.push(s[n]);n++}Y(i,t,e);Y(i,s,n);return i}function I(t,s,e){let n=t.get(s);if(!n){n=e();t.set(s,n)}return n}const L=t=>t;function U(t,s){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!s.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!s.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}class k{constructor(t,s,e=0){this.t=void 0;this.s=void 0;U(t,s);this.action=s.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?O(t.fields):void 0;this.priority=e;this.i=s}get o(){if(this.conditions&&!this.t)this.t=this.i.conditionsMatcher(this.conditions);return this.t}get h(){if(this.fields&&!this.s)this.s=this.i.fieldMatcher(this.fields);return this.s}get ast(){return this.o?this.o.ast:void 0}matchesConditions(t){if(!this.conditions)return true;if(!t||"string"===typeof t||"function"===typeof t)return!this.inverted;return this.o(t)}matchesField(t){if(!this.fields)return true;if(!t)return!this.inverted;return this.h(t)}}const B=(t,s)=>{const e={value:t,prev:s,next:null};if(s)s.next=e;return e};const G=t=>{if(t.next)t.next.prev=t.prev;if(t.prev)t.prev.next=t.next;t.next=t.prev=null};const H=()=>({rules:[],merged:false});const J=()=>new Map;const K=(t,s)=>{if(!t.u&&s.fields)t.u=true};class N{constructor(t=[],s={}){this.u=false;this.l=new Map;this.p={conditionsMatcher:s.conditionsMatcher,fieldMatcher:s.fieldMatcher,resolveAction:s.resolveAction||L};this.detectSubjectType=s.detectSubjectType||R;this.g=t;this.$=this.m(t)}get rules(){return this.g}update(t){const s={rules:t,ability:this,target:this};this.M("update",s);this.g=t;this.$=this.m(t);this.M("updated",s);return this}m(t){const s=new Map;for(let e=t.length-1;e>=0;e--){const n=t.length-e-1;const i=new k(t[e],this.p,n);const r=O(i.action);const o=O(i.subject);K(this,i);for(let t=0;t<o.length;t++){const e=this.detectSubjectType(o[t]);const n=I(s,e,J);for(let t=0;t<r.length;t++)I(n,r[t],H).rules.push(i)}}return s}possibleRulesFor(t,s){const e=this.detectSubjectType(s);const n=I(this.$,e,J);const i=I(n,t,H);if(i.merged)return i.rules;const r="manage"!==t&&n.has("manage")?n.get("manage").rules:void 0;let o=D(i.rules,r);if("all"!==e)o=D(o,this.possibleRulesFor(t,"all"));i.rules=o;i.merged=true;return o}rulesFor(t,s,e){const n=this.possibleRulesFor(t,s);if(e&&"string"!==typeof e)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.u)return n;return n.filter(t=>t.matchesField(e))}on(t,s){const e=this.l.get(t)||null;const n=B(s,e);this.l.set(t,n);return()=>{if(!n.next&&!n.prev&&this.l.get(t)===n)this.l.delete(t);else G(n)}}M(t,s){let e=this.l.get(t)||null;while(null!==e){const t=e.prev;e.value(s);e=t}}}class P extends N{can(...t){const s=this.relevantRuleFor(...t);return!!s&&!s.inverted}relevantRuleFor(...t){const s=this.rulesFor(...t);const e=t[1];for(let t=0,n=s.length;t<n;t++)if(s[t].matchesConditions(e))return s[t];return null}cannot(...t){return!this.can(...t)}}const Q={$eq:s,$ne:e,$lt:n,$lte:i,$gt:r,$gte:o,$in:c,$nin:h,$all:u,$size:a,$regex:l,$options:f,$elemMatch:d,$exists:p};const V={eq:g,ne:y,lt:w,lte:$,gt:b,gte:m,in:M,nin:v,all:x,size:E,regex:j,elemMatch:_,exists:F,and:A};const W=(s,e,n)=>t(Object.assign({},Q,s),Object.assign({},V,e),n);const X=t(Q,V);const Z=/[-/\\^$+?.()|[\]{}]/g;const tt=/\.?\*+\.?/g;const st=/\*+/;const et=/\./g;function nt(t,s,e){const n="*"===e[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";const i=-1===t.indexOf("**")?"[^.]":".";const r=t.replace(et,"\\$&").replace(st,i+n);return s+t.length===e.length?`(?:${r})?`:r}function it(t,s,e){if("."===t&&("*"===e[s-1]||"*"===e[s+1]))return t;return`\\${t}`}function rt(t){const s=t.map(t=>t.replace(Z,it).replace(tt,nt));const e=s.length>1?`(?:${s.join("|")})`:s[0];return new RegExp(`^${e}$`)}const ot=t=>{let s;return e=>{if("undefined"===typeof s)s=t.every(t=>-1===t.indexOf("*"))?null:rt(t);return null===s?-1!==t.indexOf(e):s.test(e)}};class ct extends P{constructor(t=[],s={}){super(t,Object.assign({conditionsMatcher:X,fieldMatcher:ot},s))}}class ht{constructor(t){this.v=t}because(t){this.v.reason=t;return this}}class ut{constructor(t){this.rules=[];this.j=t;const s=this;s.can=s.can.bind(s);s.cannot=s.cannot.bind(s);s.build=s.build.bind(s)}can(t,s,e,n){const i={action:t};if(s){i.subject=s;if(Array.isArray(e)||"string"===typeof e)i.fields=e;else if("undefined"!==typeof e)i.conditions=e;if("undefined"!==typeof n)i.conditions=n}this.rules.push(i);return new ht(i)}cannot(t,s,e,n){const i=this.can(t,s,e,n);i.v.inverted=true;return i}build(t){return new this.j(this.rules,t)}}function at(t,s){const e=new ut(ct);const n=t(e.can,e.cannot);if(n&&"function"===typeof n.then)return n.then(()=>e.build(s));return e.build(s)}const lt=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`;const ft=function t(s){this.message=s};ft.prototype=Object.create(Error.prototype);class dt extends ft{static setDefaultMessage(t){this._="string"===typeof t?()=>t:t}static from(t){return new this(t)}constructor(t){super("");this.field=void 0;this.ability=t;if("function"===typeof Error.captureStackTrace){this.name="ForbiddenError";Error.captureStackTrace(this,this.constructor)}}setMessage(t){this.message=t;return this}throwUnlessCan(...t){const s=this.ability.relevantRuleFor(...t);if(s&&!s.inverted)return;this.action=t[0];this.subject=t[1];this.subjectType=this.ability.detectSubjectType(t[1]);this.field=t[2];const e=s?s.reason:"";this.message=this.message||e||this.constructor._(this);throw this}}dt._=lt;export{ct as Ability,ut as AbilityBuilder,dt as ForbiddenError,P as PureAbility,W as buildMongoQueryMatcher,S as createAliasResolver,at as defineAbility,R as detectSubjectType,ot as fieldPatternMatcher,lt as getDefaultErrorMessage,X as mongoQueryMatcher,z as subject,O as wrapArray};
import{createFactory as t,$eq as e,$ne as s,$lt as n,$lte as i,$gt as r,$gte as o,$in as c,$nin as u,$all as h,$size as a,$regex as l,$options as f,$elemMatch as d,$exists as p,eq as g,ne as y,lt as w,lte as $,gt as b,gte as m,within as M,nin as v,all as x,size as E,regex as j,elemMatch as _,exists as F,and as A}from"@ucast/mongo2js";function O(t){return Array.isArray(t)?t:[t]}const C="__caslSubjectType__";function z(t,e){if(e)if(!e.hasOwnProperty(C))Object.defineProperty(e,C,{value:t});else if(t!==e[C])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[C]}`);return e}function R(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(C))return t[C];const e="function"===typeof t?t:t.constructor;return e.modelName||e.name}function T(t,e){let s=O(e);let n=0;while(n<s.length){const e=s[n++];if(t.hasOwnProperty(e))s=s.concat(t[e])}return s}function q(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach(e=>{const s=e===t[e]||Array.isArray(t[e])&&(-1!==t[e].indexOf(e)||-1!==t[e].indexOf("manage"));if(s)throw new Error(`Attempt to alias action to itself: ${e} -> ${t[e]}`)})}function S(t){if("production"!==process.env.NODE_ENV)q(t);return e=>T(t,e)}function Y(t,e,s){for(let n=s;n<e.length;n++)t.push(e[n])}function D(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let s=0;let n=0;const i=[];while(s<t.length&&n<e.length)if(t[s].priority<e[n].priority){i.push(t[s]);s++}else{i.push(e[n]);n++}Y(i,t,s);Y(i,e,n);return i}function I(t,e,s){let n=t.get(e);if(!n){n=s();t.set(e,n)}return n}const L=t=>t;function U(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}class k{constructor(t,e,s=0){this.t=void 0;this.s=void 0;U(t,e);this.action=e.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?O(t.fields):void 0;this.priority=s;this.i=e}get o(){if(this.conditions&&!this.t)this.t=this.i.conditionsMatcher(this.conditions);return this.t}get u(){if(this.fields&&!this.s)this.s=this.i.fieldMatcher(this.fields);return this.s}get ast(){return this.o?this.o.ast:void 0}matchesConditions(t){if(!this.conditions)return true;if(!t||"string"===typeof t||"function"===typeof t)return!this.inverted;return this.o(t)}matchesField(t){if(!this.fields)return true;if(!t)return!this.inverted;return this.u(t)}}const B=(t,e)=>{const s={value:t,prev:e,next:null};if(e)e.next=s;return s};const G=t=>{if(t.next)t.next.prev=t.prev;if(t.prev)t.prev.next=t.next;t.next=t.prev=null};const H=()=>({rules:[],merged:false});const J=()=>new Map;const K=(t,e)=>{if(!t.h&&e.fields)t.h=true};class N{constructor(t=[],e={}){this.h=false;this.l=new Map;this.p={conditionsMatcher:e.conditionsMatcher,fieldMatcher:e.fieldMatcher,resolveAction:e.resolveAction||L};this.detectSubjectType=e.detectSubjectType||R;this.g=t;this.$=this.m(t)}get rules(){return this.g}update(t){const e={rules:t,ability:this,target:this};this.M("update",e);this.g=t;this.$=this.m(t);this.M("updated",e);return this}m(t){const e=new Map;for(let s=t.length-1;s>=0;s--){const n=t.length-s-1;const i=new k(t[s],this.p,n);const r=O(i.action);const o=O(i.subject||"all");K(this,i);for(let t=0;t<o.length;t++){const s=I(e,o[t],J);for(let t=0;t<r.length;t++)I(s,r[t],H).rules.push(i)}}return e}possibleRulesFor(t,e){const s=I(this.$,e,J);const n=I(s,t,H);if(n.merged)return n.rules;const i="manage"!==t&&s.has("manage")?s.get("manage").rules:void 0;let r=D(n.rules,i);if("all"!==e)r=D(r,this.possibleRulesFor(t,"all"));n.rules=r;n.merged=true;return r}rulesFor(t,e,s){const n=this.possibleRulesFor(t,e);if(s&&"string"!==typeof s)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return n;return n.filter(t=>t.matchesField(s))}on(t,e){const s=this.l.get(t)||null;const n=B(e,s);this.l.set(t,n);return()=>{if(!n.next&&!n.prev&&this.l.get(t)===n)this.l.delete(t);else G(n)}}M(t,e){let s=this.l.get(t)||null;while(null!==s){const t=s.prev;s.value(e);s=t}}}class P extends N{can(...t){const e=this.relevantRuleFor(...t);return!!e&&!e.inverted}relevantRuleFor(t,e,s){const n=this.rulesFor(t,this.detectSubjectType(e),s);for(let t=0,s=n.length;t<s;t++)if(n[t].matchesConditions(e))return n[t];return null}cannot(...t){return!this.can(...t)}}const Q={$eq:e,$ne:s,$lt:n,$lte:i,$gt:r,$gte:o,$in:c,$nin:u,$all:h,$size:a,$regex:l,$options:f,$elemMatch:d,$exists:p};const V={eq:g,ne:y,lt:w,lte:$,gt:b,gte:m,in:M,nin:v,all:x,size:E,regex:j,elemMatch:_,exists:F,and:A};const W=(e,s,n)=>t(Object.assign({},Q,e),Object.assign({},V,s),n);const X=t(Q,V);const Z=/[-/\\^$+?.()|[\]{}]/g;const tt=/\.?\*+\.?/g;const et=/\*+/;const st=/\./g;function nt(t,e,s){const n="*"===s[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";const i=-1===t.indexOf("**")?"[^.]":".";const r=t.replace(st,"\\$&").replace(et,i+n);return e+t.length===s.length?`(?:${r})?`:r}function it(t,e,s){if("."===t&&("*"===s[e-1]||"*"===s[e+1]))return t;return`\\${t}`}function rt(t){const e=t.map(t=>t.replace(Z,it).replace(tt,nt));const s=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${s}$`)}const ot=t=>{let e;return s=>{if("undefined"===typeof e)e=t.every(t=>-1===t.indexOf("*"))?null:rt(t);return null===e?-1!==t.indexOf(s):e.test(s)}};class ct extends P{constructor(t=[],e={}){super(t,Object.assign({conditionsMatcher:X,fieldMatcher:ot},e))}}class ut{constructor(t){this.v=t}because(t){this.v.reason=t;return this}}class ht{constructor(t){this.rules=[];this.j=t;const e=this;e.can=e.can.bind(e);e.cannot=e.cannot.bind(e);e.build=e.build.bind(e)}can(t,e,s,n){const i={action:t};if(e){i.subject=e;if(Array.isArray(s)||"string"===typeof s)i.fields=s;else if("undefined"!==typeof s)i.conditions=s;if("undefined"!==typeof n)i.conditions=n}this.rules.push(i);return new ut(i)}cannot(t,e,s,n){const i=this.can(t,e,s,n);i.v.inverted=true;return i}build(t){return new this.j(this.rules,t)}}function at(t,e){const s=new ht(ct);const n=t(s.can,s.cannot);if(n&&"function"===typeof n.then)return n.then(()=>s.build(e));return s.build(e)}const lt=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`;const ft=function t(e){this.message=e};ft.prototype=Object.create(Error.prototype);class dt extends ft{static setDefaultMessage(t){this._="string"===typeof t?()=>t:t}static from(t){return new this(t)}constructor(t){super("");this.field=void 0;this.ability=t;if("function"===typeof Error.captureStackTrace){this.name="ForbiddenError";Error.captureStackTrace(this,this.constructor)}}setMessage(t){this.message=t;return this}throwUnlessCan(...t){const e=this.ability.relevantRuleFor(...t);if(e&&!e.inverted)return;this.action=t[0];this.subject=t[1];this.subjectType=this.ability.detectSubjectType(t[1]);this.field=t[2];const s=e?e.reason:"";this.message=this.message||s||this.constructor._(this);throw this}}dt._=lt;export{ct as Ability,ht as AbilityBuilder,dt as ForbiddenError,P as PureAbility,W as buildMongoQueryMatcher,S as createAliasResolver,at as defineAbility,R as detectSubjectType,ot as fieldPatternMatcher,lt as getDefaultErrorMessage,X as mongoQueryMatcher,z as subject,O as wrapArray};
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport { CanParameters, Abilities, Normalize, Subject, SubjectType } from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject);\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectType = this.detectSubjectType(subjects[k]);\n const subjectRules = getOrDefault(indexedRules, subjectType, defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: CanParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subject?: Subject): Rule<A, Conditions>[] {\n const subjectType = this.detectSubjectType(subject);\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: CanParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subject);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters } from './types';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>) {\n const rules = this.rulesFor(...args);\n const subject = args[1];\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","this","_lazyMatchConditions","ast","matchesConditions","matchesField","field","_lazyMatchField","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectType","subjectRules","possibleRulesFor","actionRules","manageRules","has","rulesFor","filter","on","handler","head","delete","payload","current","PureAbility","can","args","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","messageOrFn","_defaultErrorMessage","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}
{"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport {\n Abilities,\n Normalize,\n SubjectType,\n AbilityParameters,\n AbilityTuple,\n ExtractSubjectType\n} from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\ntype AbilitySubjectTypeParameters<T extends Abilities, IncludeField extends boolean = true> =\n AbilityParameters<\n T,\n T extends AbilityTuple\n ? IncludeField extends true\n ? (action: T[0], subject: ExtractSubjectType<T[1]>, field?: string) => 0\n : (action: T[0], subject: ExtractSubjectType<T[1]>) => 0\n : never,\n (action: Extract<T, string>) => 0\n >;\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject || 'all');\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectRules = getOrDefault(indexedRules, subjects[k], defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: AbilitySubjectTypeParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subjectType?: SubjectType): Rule<A, Conditions>[] {\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: AbilitySubjectTypeParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subjectType?: SubjectType, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subjectType);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters, Subject } from './types';\nimport { Rule } from './Rule';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>): Rule<A, Conditions> | null\n relevantRuleFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions> | null {\n const rules = (this as any).rulesFor(action, this.detectSubjectType(subject), field);\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","this","_lazyMatchConditions","ast","matchesConditions","matchesField","field","_lazyMatchField","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectRules","possibleRulesFor","subjectType","actionRules","manageRules","has","rulesFor","filter","on","handler","head","delete","payload","current","PureAbility","can","args","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","messageOrFn","_defaultErrorMessage","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}
import { Condition } from '@ucast/mongo2js';
import { PureAbility, AnyAbility } from './PureAbility';
import { RuleOf, Generics } from './RuleIndex';
import { RuleOf } from './RuleIndex';
import { RawRule } from './RawRule';
import { Rule } from './Rule';
import { AnyObject, SubjectType, Normalize } from './types';
import { AnyObject, SubjectType, ExtractSubjectType } from './types';
export declare type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;

@@ -12,5 +12,5 @@ export interface AbilityQuery<T = object> {

}
export declare function rulesToQuery<T extends AnyAbility>(ability: T, action: Normalize<Generics<T>['abilities']>[0], subject: Normalize<Generics<T>['abilities']>[1], convert: RuleToQueryConverter<T>): AbilityQuery | null;
export declare function rulesToAST<T extends AnyAbility>(ability: T, action: Normalize<Generics<T>['abilities']>[0], subject: Normalize<Generics<T>['abilities']>[1]): Condition | null;
export declare function rulesToFields<T extends PureAbility<any, AnyObject>>(ability: T, action: Normalize<Generics<T>['abilities']>[0], subject: Normalize<Generics<T>['abilities']>[1]): AnyObject;
export declare function rulesToQuery<T extends AnyAbility>(ability: T, action: Parameters<T['rulesFor']>[0], subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>, convert: RuleToQueryConverter<T>): AbilityQuery | null;
export declare function rulesToAST<T extends AnyAbility>(ability: T, action: Parameters<T['rulesFor']>[0], subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>): Condition | null;
export declare function rulesToFields<T extends PureAbility<any, AnyObject>>(ability: T, action: Parameters<T['rulesFor']>[0], subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>): AnyObject;
export declare type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;

@@ -17,0 +17,0 @@ export interface PermittedFieldsOptions<T extends AnyAbility> {

import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';
import { Abilities, CanParameters } from './types';
import { Rule } from './Rule';
export declare type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;

@@ -9,4 +10,4 @@ export declare type AnyAbility = Public<PureAbility<any, any>>;

can(...args: CanParameters<A>): boolean;
relevantRuleFor(...args: CanParameters<A>): import("./Rule").Rule<A, Conditions> | null;
relevantRuleFor(...args: CanParameters<A>): Rule<A, Conditions> | null;
cannot(...args: CanParameters<A>): boolean;
}
import { Rule, RuleOptions } from './Rule';
import { RawRuleFrom } from './RawRule';
import { CanParameters, Abilities, Normalize, SubjectType } from './types';
import { Abilities, Normalize, SubjectType, AbilityParameters, AbilityTuple, ExtractSubjectType } from './types';
import { LinkedItem } from './structures/LinkedItem';

@@ -39,2 +39,3 @@ export interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {

export declare type Unsubscribe = () => void;
declare type AbilitySubjectTypeParameters<T extends Abilities, IncludeField extends boolean = true> = AbilityParameters<T, T extends AbilityTuple ? IncludeField extends true ? (action: T[0], subject: ExtractSubjectType<T[1]>, field?: string) => 0 : (action: T[0], subject: ExtractSubjectType<T[1]>) => 0 : never, (action: Extract<T, string>) => 0>;
export declare class RuleIndex<A extends Abilities, Conditions> {

@@ -53,4 +54,4 @@ private _hasPerFieldRules;

private _buildIndexFor;
possibleRulesFor(...args: CanParameters<A, false>): Rule<A, Conditions>[];
rulesFor(...args: CanParameters<A>): Rule<A, Conditions>[];
possibleRulesFor(...args: AbilitySubjectTypeParameters<A, false>): Rule<A, Conditions>[];
rulesFor(...args: AbilitySubjectTypeParameters<A>): Rule<A, Conditions>[];
on<T extends keyof EventsMap<this>>(event: T, handler: EventHandler<EventsMap<Public<this>>[T]>): Unsubscribe;

@@ -57,0 +58,0 @@ private _emit;

@@ -1,2 +0,2 @@

(function(r,n){"object"===typeof exports&&"undefined"!==typeof module?n(exports):"function"===typeof define&&define.amd?define(["exports"],n):(r=r||self,n((r.casl=r.casl||{},r.casl.extra={})))})(this,(function(r){"use strict";function n(r,n){r.prototype=Object.create(n.prototype);r.prototype.constructor=r;r.__proto__=n}var t=function r(n,t){this.operator=n,this.value=t};var e=function(r){n(t,r);function t(n,t){if(!Array.isArray(t))throw new Error('"'+n+'" operator expects to receive an array of conditions');return r.call(this,n,t)||this}return t}(t);var o="__itself__";var i=function r(n,t,e){this.operator=n,this.value=e,this.field=t};var u=new t("__null__",null);function f(r,n){var t=r[n];if("function"!=typeof t)throw new Error('Unable to interpret "'+n+'" condition. Did you forget to register interpreter for it?');return t}function a(r,n){var t=n;var e;switch(t?t.numberOfArguments:0){case 1:e=function n(t){return f(r,t.operator)(t,o)};break;case 3:e=function n(t,e,i){return f(r,t.operator)(t,e,i,o)};break;default:e=function n(t,e){return f(r,t.operator)(t,e,o)}}var o=Object.assign({},t,{interpret:e});return o.interpret}function c(r,n){return function(t){for(var e=arguments.length,o=new Array(e>1?e-1:0),i=1;i<e;i++)o[i-1]=arguments[i];var u=r.apply(void 0,[t].concat(o)),f=n.bind(null,u);return f.ast=u,f}}function v(r,n){return n instanceof e&&n.operator===r}function s(r,n){return 1===n.length?n[0]:new e(r,function r(n,t,e){var o=e||[];for(var i=0,u=t.length;i<u;i++){var f=t[i];v(n,f)?r(n,f.value,o):o.push(f)}return o}(r,n))}var l=function r(n){return s("and",n)},p=function r(n){return s("or",n)};function d(r){if(!r||r&&r.constructor!==Object)return!1;for(var n in r)if(r.hasOwnProperty(n)&&"$"===n[0])return!0;return!1}function h(r,n){if(!Array.isArray(n))throw new Error('"'+r.name+'" expects value to be an array')}function y(r,n){if(h(r,n),!n.length)throw new Error('"'+r.name+'" expects to have at least one element in array')}var w=function r(n){return function(r,t){if(typeof t!==n)throw new Error('"'+r.name+'" expects value to be a "'+n+'"')}},b={type:"compound",validate:y,parse:function r(n,t,e){var o=e.parse;var i=t.map((function(r){return o(r)}));return s(n.name,i)}},$=b,j={type:"compound",validate:y},m={type:"field",validate:function r(n,t){if(!(t&&(t instanceof RegExp||t.constructor===Object)))throw new Error('"'+n.name+'" expects to receive either regular expression or object of field operators')},parse:function r(n,t,o){var u=t instanceof RegExp?new i("regex",o.field,t):o.parse(t,o);return new e(n.name,[u])}},g={type:"field",validate:function r(n,t){if(!t||t.constructor!==Object)throw new Error('"'+n.name+'" expects to receive an object with nested query or field level operators')},parse:function r(n,t,e){var u=e.parse,f=e.field;var a=d(t)?u(t,{field:o}):u(t);return new i(n.name,f,a)}},x={type:"field",validate:w("number")},O={type:"field",validate:h},E=O,_=O,A={type:"field",validate:function r(n,t){if(!Array.isArray(t)||2!==t.length)throw new Error('"'+n.name+'" expects an array with 2 numeric elements')}},q={type:"field",validate:w("boolean")},U={type:"field",validate:function r(n,t){if(!("string"==typeof t||"number"==typeof t||t instanceof Date))throw new Error('"'+n.name+'" expects value to be comparable (i.e., string, number or date)')}},S=U,k=S,R=S,D={type:"field"},M=D,N={type:"field",validate:function r(n,t){if(!(t instanceof RegExp)&&"string"!=typeof t)throw new Error('"'+n.name+'" expects value to be a regular expression or a string that represents regular expression')},parse:function r(n,t,e){var o="string"==typeof t?new RegExp(t,e.query.$options||""):t;return new i(n.name,e.field,o)}},z={type:"field",parse:function r(){return u}},F={type:"document",validate:w("function")};var J=Object.freeze({__proto__:null,$and:b,$or:$,$nor:j,$not:m,$elemMatch:g,$size:x,$in:O,$nin:E,$all:_,$mod:A,$exists:q,$gte:U,$gt:S,$lt:k,$lte:R,$eq:D,$ne:M,$regex:N,$options:z,$where:F});var P={compound:function r(n,t,o){var i=(Array.isArray(t)?t:[t]).map((function(r){return o.parse(r)}));return new e(n.name,i)},field:function r(n,t,e){return new i(n.name,e.field,t)},document:function r(n,e){return new t(n.name,e)}};function T(r,n,t){"function"==typeof r.validate&&r.validate(r,n);return(r.parse||P[r.type])(r,n,t)}var B=function(){function r(r){this.t=void 0,this.o=void 0,this.t=Object.keys(r).reduce((function(n,t){return n[t]=Object.assign({},r[t],{name:t.slice(1)}),n}),{}),this.parse=this.parse.bind(this),this.o={field:"",query:{},parse:this.parse}}var n=r.prototype;n.setParse=function r(n){this.parse=n,this.o.parse=n};n.i=function r(n,t,e,o){var i=this.t[t];if(!i)throw new Error('Unsupported operator "'+t+'"');if("field"!==i.type)throw new Error("Unexpected "+i.type+' operator "'+t+'" at field level');return this.o.field=n,this.o.query=o,T(i,e,this.o)};n.s=function r(n,t){var e=[],o=Object.keys(t);for(var i=0,f=o.length;i<f;i++){var a=o[i];if("$"!==a[0])throw new Error('Field query for "'+n+'" may contain only operators or a plain object as a value');var c=this.i(n,a,t[a],t);c!==u&&e.push(c)}return e};n.parse=function r(n,t){if(t&&t.field)return l(this.s(t.field,n));var e=n,o={query:e,parse:this.parse},i=[],u=Object.keys(e);for(var f=0,a=u.length;f<a;f++){var c=u[f],v=e[c],s="$"===c[0],p=this.t[c];if(s){if(!p)throw new Error('Unsupported operator "'+c+'"');if("document"!==p.type&&"compound"!==p.type)throw new Error('Unknown top level operator "'+c+'"');i.push(T(p,v,o))}else d(v)?i.push.apply(i,this.s(c,v)):i.push(this.i(c,"$eq",v,e))}return l(i)};return r}();var C=J;function G(r,n,t){for(var e=0,o=r.length;e<o;e++)if(t(r[e],n))return!0;return!1}function H(r,n){return Array.isArray(r)&&Number.isNaN(Number(n))}function I(r,n,t){return H(r,n)?r.reduce((function(r,e){var o=t(e,n);return void 0!==o?r.concat(o):r}),[]):t(r,n)}function K(r){return function(n,t,e){var o=e.get(t,n.field);return Array.isArray(o)?o.some((function(t){return r(n,t,e)})):r(n,o,e)}}var L=function r(n,t){return n[t]};function Q(r,n,t){var e=n.lastIndexOf(".");return-1===e?[r,n]:[t(r,n.slice(0,e)),n.slice(e+1)]}function V(r,n,t){if(void 0===t)t=L;if(n===o)return r;if(!r)throw new Error('Unable to get field "'+n+'" out of '+String(r)+".");return function(r,n,t){if(-1===n.indexOf("."))return I(r,n,t);var e=n.split(".");var o=r;for(var i=0,u=e.length;i<u;i++)if(o=I(o,e[i],t),!o||"object"!=typeof o)return o;return o}(r,n,t)}function W(r,n){return r===n?0:r>n?1:-1}function X(r,n){if(void 0===n)n={};var t=n.compare||W;return a(r,Object.assign({get:V,compare:W,equal:function r(n,e){return 0===t(n,e)}},n))}var Y=function r(n,t,e){var o=e.interpret;return n.value.some((function(r){return o(r,t)}))},Z=function r(n,t,e){return!Y(n,t,e)},rr=function r(n,t,e){var o=e.interpret;return n.value.every((function(r){return o(r,t)}))},nr=function r(n,t,e){var o=e.interpret;return!o(n.value[0],t)},tr=function r(n,t,e){var o=e.equal,i=e.get;var u=i(t,n.field);return Array.isArray(u)&&!Array.isArray(n.value)?G(u,n.value,o):o(u,n.value)},er=function r(n,t,e){return!tr(n,t,e)},or=K((function(r,n,t){var e=t.compare(n,r.value);return 0===e||-1===e})),ir=K((function(r,n,t){return-1===t.compare(n,r.value)})),ur=K((function(r,n,t){return 1===t.compare(n,r.value)})),fr=K((function(r,n,t){var e=t.compare(n,r.value);return 0===e||1===e})),ar=function r(n,t,e){var i=e.get;if(n.field===o)return void 0!==t;var u=Q(t,n.field,i),f=u[0],a=u[1],c=function r(t){return!!t&&t.hasOwnProperty(a)===n.value};return H(f,a)?f.some(c):c(f)},cr=K((function(r,n){return n%r.value[0]===r.value[1]})),vr=function r(n,t,e){var i=e.get;var u=Q(t,n.field,i),f=u[0],a=u[1],c=function r(t){var e=i(t,a);return Array.isArray(e)&&e.length===n.value};return n.field!==o&&H(f,a)?f.some(c):c(f)},sr=K((function(r,n){return r.value.test(n)})),lr=K((function(r,n,t){var e=t.equal;return G(r.value,n,e)})),pr=function r(n,t,e){return!lr(n,t,e)},dr=function r(n,t,e){var o=e.equal,i=e.get;var u=i(t,n.field);return Array.isArray(u)&&n.value.every((function(r){return G(u,r,o)}))},hr=function r(n,t,e){var o=e.interpret,i=e.get;var u=i(t,n.field);return Array.isArray(u)&&u.some((function(r){return o(n.value,r)}))},yr=function r(n,t){return n.value.call(t)};var wr=Object.freeze({__proto__:null,or:Y,nor:Z,and:rr,not:nr,eq:tr,ne:er,lte:or,lt:ir,gt:ur,gte:fr,exists:ar,mod:cr,size:vr,regex:sr,within:lr,nin:pr,all:dr,elemMatch:hr,where:yr});var br=Object.assign({},wr,{in:lr}),$r=X(br);function jr(r){return r instanceof Date?r.getTime():r&&"function"==typeof r.toJSON?r.toJSON():r}var mr=function r(n,t){return W(jr(n),jr(t))};function gr(r,n,t){var e=new B(r),i=X(n,Object.assign({compare:mr},t));if(t&&t.forPrimitives){var u={field:o},f=e.parse;e.setParse((function(r){return f(r,u)}))}return c(e.parse,i)}var xr=gr(C,br),Or=gr(["$and","$or"].reduce((function(r,n){return r[n]=Object.assign({},r[n],{type:"field"}),r}),Object.assign({},C,{$nor:Object.assign({},C.$nor,{type:"field",parse:P.compound})})),br,{forPrimitives:!0});function Er(r){return Array.isArray(r)?r:[r]}function _r(r,n,t){var e=r;var o=n;if(-1!==n.indexOf(".")){var i=n.split(".");o=i.pop();e=i.reduce((function(r,n){r[n]=r[n]||{};return r[n]}),r)}e[o]=t}function Ar(r,n,t,e){var o=Object.create(null);var i=r.rulesFor(n,t);for(var u=0;u<i.length;u++){var f=i[u];var a=f.inverted?"$and":"$or";if(!f.conditions)if(f.inverted)break;else{delete o[a];return o}else{o[a]=o[a]||[];o[a].push(e(f))}}return o.$or?o:null}function qr(r){if(!r.ast)throw new Error('Ability rule "'+JSON.stringify(r)+'" does not have "ast" property. So, cannot be used to generate AST');return r.ast}function Ur(r,n,t){var e=Ar(r,n,t,qr);if(null===e)return null;if(!e.$and)return e.$or?p(e.$or):l([]);if(e.$or)e.$and.push(p(e.$or));return l(e.$and)}function Sr(r,n,t){return r.rulesFor(n,t).filter((function(r){return!r.inverted&&r.conditions})).reduce((function(r,n){var t=n.conditions;return Object.keys(t).reduce((function(r,n){var e=t[n];if(!e||e.constructor!==Object)_r(r,n,e);return r}),r)}),{})}var kr=function r(n){return n.fields};function Rr(r){this.delete(r)}function Dr(r){this.add(r)}function Mr(r,n,t,e){if(void 0===e)e={};var o=e.fieldsFrom||kr;var i=r.possibleRulesFor(n,t).filter((function(r){return r.matchesConditions(t)})).reverse().reduce((function(r,n){var t=o(n);if(t){var e=n.inverted?Rr:Dr;t.forEach(e,r)}return r}),new Set);return Array.from(i)}var Nr=function r(n){return Array.isArray(n)?n.join(","):n};function zr(r,n){return r.map((function(r){var t=[Nr(r.action||r.actions),"function"===typeof n?Er(r.subject).map(n).join(","):Nr(r.subject),r.conditions||0,r.inverted?1:0,r.fields?Nr(r.fields):0,r.reason||""];while(!t[t.length-1])t.pop();return t}))}function Fr(r,n){return r.map((function(r){var t=r[0],e=r[1],o=r[2],i=r[3],u=r[4],f=r[5];var a=e.split(",");var c={inverted:!!i,action:t.split(","),subject:"function"===typeof n?a.map(n):a};if(o)c.conditions=o;if(u)c.fields=u.split(",");if(f)c.reason=f;return c}))}r.packRules=zr;r.permittedFieldsOf=Mr;r.rulesToAST=Ur;r.rulesToFields=Sr;r.rulesToQuery=Ar;r.unpackRules=Fr;Object.defineProperty(r,"__esModule",{value:true})}));
(function(n,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports,require("@ucast/mongo2js")):"function"===typeof define&&define.amd?define(["exports","@ucast/mongo2js"],r):(n=n||self,r((n.casl=n.casl||{},n.casl.extra={}),n.ucast.mongo2js))})(this,(function(n,r){"use strict";function t(n){return Array.isArray(n)?n:[n]}function e(n,r,t){var e=n;var u=r;if(-1!==r.indexOf(".")){var i=r.split(".");u=i.pop();e=i.reduce((function(n,r){n[r]=n[r]||{};return n[r]}),n)}e[u]=t}function u(n,r,t,e){var u=Object.create(null);var i=n.rulesFor(r,t);for(var o=0;o<i.length;o++){var f=i[o];var c=f.inverted?"$and":"$or";if(!f.conditions)if(f.inverted)break;else{delete u[c];return u}else{u[c]=u[c]||[];u[c].push(e(f))}}return u.$or?u:null}function i(n){if(!n.ast)throw new Error('Ability rule "'+JSON.stringify(n)+'" does not have "ast" property. So, cannot be used to generate AST');return n.ast}function o(n,t,e){var o=u(n,t,e,i);if(null===o)return null;if(!o.$and)return o.$or?r.buildOr(o.$or):r.buildAnd([]);if(o.$or)o.$and.push(r.buildOr(o.$or));return r.buildAnd(o.$and)}function f(n,r,t){return n.rulesFor(r,t).reduce((function(n,r){if(r.inverted||!r.conditions)return n;return Object.keys(r.conditions).reduce((function(n,t){var u=r.conditions[t];if(!u||u.constructor!==Object)e(n,t,u);return n}),n)}),{})}var c=function n(r){return r.fields};function a(n){this.delete(n)}function v(n){this.add(n)}function s(n,r,t,e){if(void 0===e)e={};var u=e.fieldsFrom||c;var i=n.detectSubjectType(t);var o=n.possibleRulesFor(r,i).reduceRight((function(n,r){if(!r.matchesConditions(t))return n;var e=u(r);if(e){var i=r.inverted?a:v;e.forEach(i,n)}return n}),new Set);return Array.from(o)}var l=function n(r){return Array.isArray(r)?r.join(","):r};function d(n,r){return n.map((function(n){var e=[l(n.action||n.actions),"function"===typeof r?t(n.subject).map(r).join(","):l(n.subject),n.conditions||0,n.inverted?1:0,n.fields?l(n.fields):0,n.reason||""];while(!e[e.length-1])e.pop();return e}))}function p(n,r){return n.map((function(n){var t=n[0],e=n[1],u=n[2],i=n[3],o=n[4],f=n[5];var c=e.split(",");var a={inverted:!!i,action:t.split(","),subject:"function"===typeof r?c.map(r):c};if(u)a.conditions=u;if(o)a.fields=o.split(",");if(f)a.reason=f;return a}))}n.packRules=d;n.permittedFieldsOf=s;n.rulesToAST=o;n.rulesToFields=f;n.rulesToQuery=u;n.unpackRules=p;Object.defineProperty(n,"__esModule",{value:true})}));
//# sourceMappingURL=extra.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"extra.js","sources":["../../../../node_modules/.pnpm/@ucast/core@1.5.0/node_modules/@ucast/core/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo@2.3.1/node_modules/@ucast/mongo/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/js@2.2.1/node_modules/@ucast/js/dist/es6m/index.mjs","../../../../node_modules/.pnpm/@ucast/mongo2js@1.3.0/node_modules/@ucast/mongo2js/dist/es6m/index.mjs","../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["class t{constructor(t,n){this.operator=t,this.value=n}}class n extends t{constructor(t,n){if(!Array.isArray(n))throw new Error(`\"${t}\" operator expects to receive an array of conditions`);super(t,n)}}const r=\"__itself__\";class o{constructor(t,n,r){this.operator=t,this.value=r,this.field=n}}const e=new t(\"__null__\",null);function c(t,n){const r=t[n];if(\"function\"!=typeof r)throw new Error(`Unable to interpret \"${n}\" condition. Did you forget to register interpreter for it?`);return r}function s(t,n){const r=n;let o;switch(r?r.numberOfArguments:0){case 1:o=n=>c(t,n.operator)(n,e);break;case 3:o=(n,r,o)=>c(t,n.operator)(n,r,o,e);break;default:o=(n,r)=>c(t,n.operator)(n,r,e)}const e=Object.assign({},r,{interpret:o});return e.interpret}function i(t,n){return(r,...o)=>{const e=t(r,...o),c=n.bind(null,e);return c.ast=e,c}}function u(t,r){return r instanceof n&&r.operator===t}function f(t,r){return 1===r.length?r[0]:new n(t,function t(n,r,o){const e=o||[];for(let o=0,c=r.length;o<c;o++){const c=r[o];u(n,c)?t(n,c.value,e):e.push(c)}return e}(t,r))}const a=t=>f(\"and\",t),l=t=>f(\"or\",t);export{n as CompoundCondition,t as DocumentCondition,o as FieldCondition,r as ITSELF,e as NULL_CONDITION,a as buildAnd,l as buildOr,s as createInterpreter,i as createTranslatorFactory,u as isCompound,f as optimizedCompoundCondition};\n//# sourceMappingURL=index.mjs.map\n","import{optimizedCompoundCondition as e,FieldCondition as t,CompoundCondition as r,ITSELF as o,NULL_CONDITION as n,DocumentCondition as i,buildAnd as a}from\"@ucast/core\";function s(e){if(!e||e&&e.constructor!==Object)return!1;for(const t in e)if(e.hasOwnProperty(t)&&\"$\"===t[0])return!0;return!1}function p(e,t){if(!Array.isArray(t))throw new Error(`\"${e.name}\" expects value to be an array`)}function c(e,t){if(p(e,t),!t.length)throw new Error(`\"${e.name}\" expects to have at least one element in array`)}const l=e=>(t,r)=>{if(typeof r!==e)throw new Error(`\"${t.name}\" expects value to be a \"${e}\"`)},f={type:\"compound\",validate:c,parse(t,r,{parse:o}){const n=r.map(e=>o(e));return e(t.name,n)}},d=f,u={type:\"compound\",validate:c},h={type:\"field\",validate(e,t){if(!(t&&(t instanceof RegExp||t.constructor===Object)))throw new Error(`\"${e.name}\" expects to receive either regular expression or object of field operators`)},parse(e,o,n){const i=o instanceof RegExp?new t(\"regex\",n.field,o):n.parse(o,n);return new r(e.name,[i])}},$={type:\"field\",validate(e,t){if(!t||t.constructor!==Object)throw new Error(`\"${e.name}\" expects to receive an object with nested query or field level operators`)},parse(e,r,{parse:n,field:i}){const a=s(r)?n(r,{field:o}):n(r);return new t(e.name,i,a)}},w={type:\"field\",validate:l(\"number\")},y={type:\"field\",validate:p},v=y,b=y,m={type:\"field\",validate(e,t){if(!Array.isArray(t)||2!==t.length)throw new Error(`\"${e.name}\" expects an array with 2 numeric elements`)}},x={type:\"field\",validate:l(\"boolean\")},E={type:\"field\",validate:function(e,t){if(!(\"string\"==typeof t||\"number\"==typeof t||t instanceof Date))throw new Error(`\"${e.name}\" expects value to be comparable (i.e., string, number or date)`)}},g=E,j=g,O=g,q={type:\"field\"},_=q,R={type:\"field\",validate(e,t){if(!(t instanceof RegExp)&&\"string\"!=typeof t)throw new Error(`\"${e.name}\" expects value to be a regular expression or a string that represents regular expression`)},parse(e,r,o){const n=\"string\"==typeof r?new RegExp(r,o.query.$options||\"\"):r;return new t(e.name,o.field,n)}},U={type:\"field\",parse:()=>n},A={type:\"document\",validate:l(\"function\")};var F=Object.freeze({__proto__:null,$and:f,$or:d,$nor:u,$not:h,$elemMatch:$,$size:w,$in:y,$nin:v,$all:b,$mod:m,$exists:x,$gte:E,$gt:g,$lt:j,$lte:O,$eq:q,$ne:_,$regex:R,$options:U,$where:A});const k={compound(e,t,o){const n=(Array.isArray(t)?t:[t]).map(e=>o.parse(e));return new r(e.name,n)},field:(e,r,o)=>new t(e.name,o.field,r),document:(e,t)=>new i(e.name,t)};function z(e,t,r){\"function\"==typeof e.validate&&e.validate(e,t);return(e.parse||k[e.type])(e,t,r)}class D{constructor(e){this.t=void 0,this.o=void 0,this.t=Object.keys(e).reduce((t,r)=>(t[r]=Object.assign({},e[r],{name:r.slice(1)}),t),{}),this.parse=this.parse.bind(this),this.o={field:\"\",query:{},parse:this.parse}}setParse(e){this.parse=e,this.o.parse=e}i(e,t,r,o){const n=this.t[t];if(!n)throw new Error(`Unsupported operator \"${t}\"`);if(\"field\"!==n.type)throw new Error(`Unexpected ${n.type} operator \"${t}\" at field level`);return this.o.field=e,this.o.query=o,z(n,r,this.o)}s(e,t){const r=[],o=Object.keys(t);for(let i=0,a=o.length;i<a;i++){const a=o[i];if(\"$\"!==a[0])throw new Error(`Field query for \"${e}\" may contain only operators or a plain object as a value`);const s=this.i(e,a,t[a],t);s!==n&&r.push(s)}return r}parse(e,t){if(t&&t.field)return a(this.s(t.field,e));const r=e,o={query:r,parse:this.parse},n=[],i=Object.keys(r);for(let e=0,t=i.length;e<t;e++){const t=i[e],a=r[t],p=\"$\"===t[0],c=this.t[t];if(p){if(!c)throw new Error(`Unsupported operator \"${t}\"`);if(\"document\"!==c.type&&\"compound\"!==c.type)throw new Error(`Unknown top level operator \"${t}\"`);n.push(z(c,a,o))}else s(a)?n.push(...this.s(t,a)):n.push(this.i(t,\"$eq\",a,r))}return a(n)}}const M=F;export{b as $all,f as $and,$ as $elemMatch,q as $eq,x as $exists,g as $gt,E as $gte,y as $in,j as $lt,O as $lte,m as $mod,_ as $ne,v as $nin,u as $nor,h as $not,U as $options,d as $or,R as $regex,w as $size,A as $where,D as MongoQueryParser,M as allParsingInstructions,k as defaultParsers};\n//# sourceMappingURL=index.mjs.map\n","import{ITSELF as r,createInterpreter as t}from\"@ucast/core\";function n(r,t,n){for(let e=0,o=r.length;e<o;e++)if(n(r[e],t))return!0;return!1}function e(r,t){return Array.isArray(r)&&Number.isNaN(Number(t))}function o(r,t,n){return e(r,t)?r.reduce((r,e)=>{const o=n(e,t);return void 0!==o?r.concat(o):r},[]):n(r,t)}function u(r){return(t,n,e)=>{const o=e.get(n,t.field);return Array.isArray(o)?o.some(n=>r(t,n,e)):r(t,o,e)}}const c=(r,t)=>r[t];function i(r,t,n){const e=t.lastIndexOf(\".\");return-1===e?[r,t]:[n(r,t.slice(0,e)),t.slice(e+1)]}function f(t,n,e=c){if(n===r)return t;if(!t)throw new Error(`Unable to get field \"${n}\" out of ${String(t)}.`);return function(r,t,n){if(-1===t.indexOf(\".\"))return o(r,t,n);const e=t.split(\".\");let u=r;for(let r=0,t=e.length;r<t;r++)if(u=o(u,e[r],n),!u||\"object\"!=typeof u)return u;return u}(t,n,e)}function s(r){return(t,n)=>f(t,n,r)}const a=(r,t)=>r===t;function l(r,t){return r===t?0:r>t?1:-1}function g(r,n={}){const e=n.compare||l;return t(r,Object.assign({get:f,compare:l,equal:(r,t)=>0===e(r,t)},n))}const p=(r,t,{interpret:n})=>r.value.some(r=>n(r,t)),y=(r,t,n)=>!p(r,t,n),b=(r,t,{interpret:n})=>r.value.every(r=>n(r,t)),m=(r,t,{interpret:n})=>!n(r.value[0],t),A=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&!Array.isArray(r.value)?n(u,r.value,e):e(u,r.value)},d=(r,t,n)=>!A(r,t,n),q=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||-1===e}),h=u((r,t,n)=>-1===n.compare(t,r.value)),j=u((r,t,n)=>1===n.compare(t,r.value)),w=u((r,t,n)=>{const e=n.compare(t,r.value);return 0===e||1===e}),_=(t,n,{get:o})=>{if(t.field===r)return void 0!==n;const[u,c]=i(n,t.field,o),f=r=>!!r&&r.hasOwnProperty(c)===t.value;return e(u,c)?u.some(f):f(u)},v=u((r,t)=>t%r.value[0]===r.value[1]),x=(t,n,{get:o})=>{const[u,c]=i(n,t.field,o),f=r=>{const n=o(r,c);return Array.isArray(n)&&n.length===t.value};return t.field!==r&&e(u,c)?u.some(f):f(u)},O=u((r,t)=>r.value.test(t)),N=u((r,t,{equal:e})=>n(r.value,t,e)),$=(r,t,n)=>!N(r,t,n),z=(r,t,{equal:e,get:o})=>{const u=o(t,r.field);return Array.isArray(u)&&r.value.every(r=>n(u,r,e))},E=(r,t,{interpret:n,get:e})=>{const o=e(t,r.field);return Array.isArray(o)&&o.some(t=>n(r.value,t))},M=(r,t)=>r.value.call(t);var S=Object.freeze({__proto__:null,or:p,nor:y,and:b,not:m,eq:A,ne:d,lte:q,lt:h,gt:j,gte:w,exists:_,mod:v,size:x,regex:O,within:N,nin:$,all:z,elemMatch:E,where:M});const U=Object.assign({},S,{in:N}),k=g(U);export{z as all,U as allInterpreters,b as and,l as compare,s as createGetter,g as createJsInterpreter,E as elemMatch,A as eq,a as equal,_ as exists,f as getObjectField,i as getObjectFieldCursor,j as gt,w as gte,k as interpret,h as lt,q as lte,v as mod,d as ne,$ as nin,y as nor,m as not,p as or,O as regex,x as size,M as where,N as within};\n//# sourceMappingURL=index.mjs.map\n","import{createTranslatorFactory as o,ITSELF as t}from\"@ucast/core\";export*from\"@ucast/core\";import{MongoQueryParser as r,allParsingInstructions as e,defaultParsers as c}from\"@ucast/mongo\";export*from\"@ucast/mongo\";import{createJsInterpreter as n,allInterpreters as f,compare as s}from\"@ucast/js\";export*from\"@ucast/js\";function i(o){return o instanceof Date?o.getTime():o&&\"function\"==typeof o.toJSON?o.toJSON():o}const m=(o,t)=>s(i(o),i(t));function p(e,c,f){const s=new r(e),i=n(c,Object.assign({compare:m},f));if(f&&f.forPrimitives){const o={field:t},r=s.parse;s.setParse(t=>r(t,o))}return o(s.parse,i)}const a=p(e,f),u=p([\"$and\",\"$or\"].reduce((o,t)=>(o[t]=Object.assign({},o[t],{type:\"field\"}),o),Object.assign({},e,{$nor:Object.assign({},e.$nor,{type:\"field\",parse:c.compound})})),f,{forPrimitives:!0}),j=a;export{p as createFactory,j as filter,a as guard,u as squire};\n//# sourceMappingURL=index.mjs.map\n","import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf, Generics } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, Normalize } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1],\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subject);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): Condition | null {\n const query = rulesToQuery(ability, action, subject, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Normalize<Generics<T>['abilities']>[0],\n subject: Normalize<Generics<T>['abilities']>[1]\n): AnyObject {\n return ability.rulesFor(action, subject)\n .filter(rule => !rule.inverted && rule.conditions)\n .reduce((values, rule) => {\n const conditions = rule.conditions!;\n\n return Object.keys(conditions).reduce((fields, fieldName) => {\n const value = conditions[fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const uniqueFields = ability.possibleRulesFor(action, subject)\n .filter(rule => rule.matchesConditions(subject))\n .reverse()\n .reduce((fields, rule) => {\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["t","n","operator","this","value","Array","isArray","Error","_t2","r","o","field","e","c","s","numberOfArguments","Object","assign","interpret","i","bind","ast","u","f","length","push","a","l","constructor","hasOwnProperty","p","name","type","validate","parse","map","d","h","RegExp","$","w","y","v","b","m","x","E","Date","g","j","O","q","_","R","query","$options","U","A","F","freeze","__proto__","$and","$or","$nor","$not","$elemMatch","$size","$in","$nin","$all","$mod","$exists","$gte","$gt","$lt","$lte","$eq","$ne","$regex","$where","k","compound","document","z","D","keys","reduce","slice","setParse","M","Number","isNaN","concat","get","some","lastIndexOf","String","indexOf","split","compare","equal","every","test","N","call","S","or","nor","and","not","eq","ne","lte","lt","gt","gte","exists","mod","size","regex","within","nin","all","elemMatch","where","in","getTime","toJSON","forPrimitives","wrapArray","setByPath","object","path","ref","lastKey","pop","res","prop","rulesToQuery","ability","action","subject","convert","create","rules","rulesFor","rule","op","inverted","conditions","ruleToAST","JSON","stringify","rulesToAST","buildOr","buildAnd","rulesToFields","filter","values","fields","fieldName","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","options","fieldsFrom","uniqueFields","possibleRulesFor","matchesConditions","reverse","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}
{"version":3,"file":"extra.js","sources":["../../src/utils.ts","../../src/extra.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { Condition, buildAnd, buildOr } from '@ucast/mongo2js';\nimport { PureAbility, AnyAbility } from './PureAbility';\nimport { RuleOf } from './RuleIndex';\nimport { RawRule } from './RawRule';\nimport { Rule } from './Rule';\nimport { setByPath, wrapArray } from './utils';\nimport { AnyObject, SubjectType, ExtractSubjectType } from './types';\n\nexport type RuleToQueryConverter<T extends AnyAbility> = (rule: RuleOf<T>) => object;\nexport interface AbilityQuery<T = object> {\n $or?: T[]\n $and?: T[]\n}\n\nexport function rulesToQuery<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n convert: RuleToQueryConverter<T>\n): AbilityQuery | null {\n const query: AbilityQuery = Object.create(null);\n const rules = ability.rulesFor(action, subjectType);\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n const op = rule.inverted ? '$and' : '$or';\n\n if (!rule.conditions) {\n if (rule.inverted) {\n break;\n } else {\n delete query[op];\n return query;\n }\n } else {\n query[op] = query[op] || [];\n query[op]!.push(convert(rule));\n }\n }\n\n return query.$or ? query : null;\n}\n\nfunction ruleToAST(rule: RuleOf<AnyAbility>): Condition {\n if (!rule.ast) {\n throw new Error(`Ability rule \"${JSON.stringify(rule)}\" does not have \"ast\" property. So, cannot be used to generate AST`);\n }\n return rule.ast;\n}\n\nexport function rulesToAST<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): Condition | null {\n const query = rulesToQuery(ability, action, subjectType, ruleToAST) as AbilityQuery<Condition>;\n\n if (query === null) {\n return null;\n }\n\n if (!query.$and) {\n return query.$or ? buildOr(query.$or) : buildAnd([]);\n }\n\n if (query.$or) {\n query.$and.push(buildOr(query.$or));\n }\n\n return buildAnd(query.$and);\n}\n\nexport function rulesToFields<T extends PureAbility<any, AnyObject>>(\n ability: T,\n action: Parameters<T['rulesFor']>[0],\n subjectType: ExtractSubjectType<Parameters<T['rulesFor']>[1]>,\n): AnyObject {\n return ability.rulesFor(action, subjectType)\n .reduce((values, rule) => {\n if (rule.inverted || !rule.conditions) {\n return values;\n }\n\n return Object.keys(rule.conditions).reduce((fields, fieldName) => {\n const value = rule.conditions![fieldName];\n\n if (!value || (value as any).constructor !== Object) {\n setByPath(fields, fieldName, value);\n }\n\n return fields;\n }, values);\n }, {} as AnyObject);\n}\n\nconst getRuleFields = (rule: RuleOf<AnyAbility>) => rule.fields;\n\nexport type GetRuleFields<R extends Rule<any, any>> = (rule: R) => string[] | undefined;\n\nexport interface PermittedFieldsOptions<T extends AnyAbility> {\n fieldsFrom?: GetRuleFields<RuleOf<T>>\n}\n\nfunction deleteItem(this: Set<string>, item: string) {\n this.delete(item);\n}\n\nfunction addItem(this: Set<string>, item: string) {\n this.add(item);\n}\n\nexport function permittedFieldsOf<T extends AnyAbility>(\n ability: T,\n action: Parameters<T['can']>[0],\n subject: Parameters<T['can']>[1],\n options: PermittedFieldsOptions<T> = {}\n): string[] {\n const fieldsFrom = options.fieldsFrom || getRuleFields;\n const subjectType = ability.detectSubjectType(subject);\n const uniqueFields = ability.possibleRulesFor(action, subjectType)\n .reduceRight((fields, rule) => {\n if (!rule.matchesConditions(subject)) {\n return fields;\n }\n\n const names = fieldsFrom(rule);\n\n if (names) {\n const toggle = rule.inverted ? deleteItem : addItem;\n names.forEach(toggle, fields);\n }\n\n return fields;\n }, new Set<string>());\n\n return Array.from(uniqueFields);\n}\n\nconst joinIfArray = (value: string | string[]) => Array.isArray(value) ? value.join(',') : value;\n\nexport type PackRule<T extends RawRule<any, any>> =\n [string, string] |\n [string, string, T['conditions']] |\n [string, string, T['conditions'] | 0, 1] |\n [string, string, T['conditions'] | 0, 1 | 0, string] |\n [string, string, T['conditions'] | 0, 1 | 0, string | 0, string];\n\nexport type PackSubjectType<T extends SubjectType> = (type: T) => string;\n\nexport function packRules<T extends RawRule<any, any>>(\n rules: T[],\n packSubject?: PackSubjectType<T['subject']>\n): PackRule<T>[] {\n return rules.map((rule) => { // eslint-disable-line\n const packedRule: PackRule<T> = [\n joinIfArray((rule as any).action || (rule as any).actions),\n typeof packSubject === 'function'\n ? wrapArray(rule.subject).map(packSubject).join(',')\n : joinIfArray(rule.subject),\n rule.conditions || 0,\n rule.inverted ? 1 : 0,\n rule.fields ? joinIfArray(rule.fields) : 0,\n rule.reason || ''\n ];\n\n while (!packedRule[packedRule.length - 1]) packedRule.pop();\n\n return packedRule;\n });\n}\n\nexport type UnpackSubjectType<T extends SubjectType> = (type: string) => T;\n\nexport function unpackRules<T extends RawRule<any, any>>(\n rules: PackRule<T>[],\n unpackSubject?: UnpackSubjectType<T['subject']>\n): T[] {\n return rules.map(([action, subject, conditions, inverted, fields, reason]) => {\n const subjects = subject.split(',');\n const rule = {\n inverted: !!inverted,\n action: action.split(','),\n subject: typeof unpackSubject === 'function'\n ? subjects.map(unpackSubject)\n : subjects\n } as T;\n\n if (conditions) {\n rule.conditions = conditions;\n }\n\n if (fields) {\n rule.fields = fields.split(',');\n }\n\n if (reason) {\n rule.reason = reason;\n }\n\n return rule;\n });\n}\n"],"names":["wrapArray","value","Array","isArray","setByPath","object","path","ref","lastKey","indexOf","keys","split","pop","reduce","res","prop","rulesToQuery","ability","action","subjectType","convert","query","Object","create","rules","rulesFor","i","length","rule","op","inverted","conditions","push","$or","ruleToAST","ast","Error","JSON","stringify","rulesToAST","$and","buildOr","buildAnd","rulesToFields","values","fields","fieldName","constructor","getRuleFields","deleteItem","item","delete","addItem","add","permittedFieldsOf","subject","options","fieldsFrom","detectSubjectType","uniqueFields","possibleRulesFor","reduceRight","matchesConditions","names","toggle","forEach","Set","from","joinIfArray","join","packRules","packSubject","map","packedRule","actions","reason","unpackRules","unpackSubject","subjects"],"mappings":"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"}

@@ -1,2 +0,2 @@

(function(t,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports,require("@ucast/mongo2js")):"function"===typeof define&&define.amd?define(["exports","@ucast/mongo2js"],r):(t=t||self,r(t.casl={},t.ucast.mongo2js))})(this,(function(t,r){"use strict";function n(t,r){for(var n=0;n<r.length;n++){var i=r[n];i.enumerable=i.enumerable||false;i.configurable=true;if("value"in i)i.writable=true;Object.defineProperty(t,i.key,i)}}function i(t,r,i){if(r)n(t.prototype,r);if(i)n(t,i);return t}function e(){e=Object.assign||function(t){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i))t[i]=n[i]}return t};return e.apply(this,arguments)}function u(t,r){t.prototype=Object.create(r.prototype);t.prototype.constructor=t;t.__proto__=r}function o(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function f(t){return Array.isArray(t)?t:[t]}var a="__caslSubjectType__";function s(t,r){if(r)if(!r.hasOwnProperty(a))Object.defineProperty(r,a,{value:t});else if(t!==r[a])throw new Error("Trying to cast object to subject type "+t+" but previously it was casted to "+r[a]);return r}function c(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(a))return t[a];var r="function"===typeof t?t:t.constructor;return r.modelName||r.name}function h(t,r){var n=f(r);var i=0;while(i<n.length){var e=n[i++];if(t.hasOwnProperty(e))n=n.concat(t[e])}return n}function v(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach((function(r){var n=r===t[r]||Array.isArray(t[r])&&(-1!==t[r].indexOf(r)||-1!==t[r].indexOf("manage"));if(n)throw new Error("Attempt to alias action to itself: "+r+" -> "+t[r])}))}function l(t){if("production"!==process.env.NODE_ENV)v(t);return function(r){return h(t,r)}}function d(t,r,n){for(var i=n;i<r.length;i++)t.push(r[i])}function p(t,r){if(!t||!t.length)return r||[];if(!r||!r.length)return t||[];var n=0;var i=0;var e=[];while(n<t.length&&i<r.length)if(t[n].priority<r[i].priority){e.push(t[n]);n++}else{e.push(r[i]);i++}d(e,t,n);d(e,r,i);return e}function y(t,r,n){var i=t.get(r);if(!i){i=n();t.set(r,i)}return i}var g=function t(r){return r};function w(t,r){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!r.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!r.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var b=function(){function t(t,r,n){if(void 0===n)n=0;this.t=void 0;this.i=void 0;w(t,r);this.action=r.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?f(t.fields):void 0;this.priority=n;this.u=r}var r=t.prototype;r.matchesConditions=function t(r){if(!this.conditions)return true;if(!r||"string"===typeof r||"function"===typeof r)return!this.inverted;return this.o(r)};r.matchesField=function t(r){if(!this.fields)return true;if(!r)return!this.inverted;return this.s(r)};i(t,[{key:"_lazyMatchConditions",get:function t(){if(this.conditions&&!this.t)this.t=this.u.conditionsMatcher(this.conditions);return this.t}},{key:"_lazyMatchField",get:function t(){if(this.fields&&!this.i)this.i=this.u.fieldMatcher(this.fields);return this.i}},{key:"ast",get:function t(){return this.o?this.o.ast:void 0}}]);return t}();var $=function t(r,n){var i={value:r,prev:n,next:null};if(n)n.next=i;return i};var m=function t(r){if(r.next)r.next.prev=r.prev;if(r.prev)r.prev.next=r.next;r.next=r.prev=null};var j=function t(){return{rules:[],merged:false}};var M=function t(){return new Map};var E=function t(r,n){if(!r.h&&n.fields)r.h=true};var x=function(){function t(t,r){if(void 0===t)t=[];if(void 0===r)r={};this.h=false;this.v=new Map;this.l={conditionsMatcher:r.conditionsMatcher,fieldMatcher:r.fieldMatcher,resolveAction:r.resolveAction||g};this.detectSubjectType=r.detectSubjectType||c;this.p=t;this.g=this.$(t)}var r=t.prototype;r.update=function t(r){var n={rules:r,ability:this,target:this};this.m("update",n);this.p=r;this.g=this.$(r);this.m("updated",n);return this};r.$=function t(r){var n=new Map;for(var i=r.length-1;i>=0;i--){var e=r.length-i-1;var u=new b(r[i],this.l,e);var o=f(u.action);var a=f(u.subject);E(this,u);for(var s=0;s<a.length;s++){var c=this.detectSubjectType(a[s]);var h=y(n,c,M);for(var v=0;v<o.length;v++)y(h,o[v],j).rules.push(u)}}return n};r.possibleRulesFor=function t(r,n){var i=this.detectSubjectType(n);var e=y(this.g,i,M);var u=y(e,r,j);if(u.merged)return u.rules;var o="manage"!==r&&e.has("manage")?e.get("manage").rules:void 0;var f=p(u.rules,o);if("all"!==i)f=p(f,this.possibleRulesFor(r,"all"));u.rules=f;u.merged=true;return f};r.rulesFor=function t(r,n,i){var e=this.possibleRulesFor(r,n);if(i&&"string"!==typeof i)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return e;return e.filter((function(t){return t.matchesField(i)}))};r.on=function t(r,n){var i=this;var e=this.v.get(r)||null;var u=$(n,e);this.v.set(r,u);return function(){if(!u.next&&!u.prev&&i.v.get(r)===u)i.v.delete(r);else m(u)}};r.m=function t(r,n){var i=this.v.get(r)||null;while(null!==i){var e=i.prev;i.value(n);i=e}};i(t,[{key:"rules",get:function t(){return this.p}}]);return t}();var O=function(t){u(r,t);function r(){return t.apply(this,arguments)||this}var n=r.prototype;n.can=function t(){var r=this.relevantRuleFor.apply(this,arguments);return!!r&&!r.inverted};n.relevantRuleFor=function t(){var r=this.rulesFor.apply(this,arguments);var n=arguments.length<=1?void 0:arguments[1];for(var i=0,e=r.length;i<e;i++)if(r[i].matchesConditions(n))return r[i];return null};n.cannot=function t(){return!this.can.apply(this,arguments)};return r}(x);var _={$eq:r.$eq,$ne:r.$ne,$lt:r.$lt,$lte:r.$lte,$gt:r.$gt,$gte:r.$gte,$in:r.$in,$nin:r.$nin,$all:r.$all,$size:r.$size,$regex:r.$regex,$options:r.$options,$elemMatch:r.$elemMatch,$exists:r.$exists};var A={eq:r.eq,ne:r.ne,lt:r.lt,lte:r.lte,gt:r.gt,gte:r.gte,in:r.within,nin:r.nin,all:r.all,size:r.size,regex:r.regex,elemMatch:r.elemMatch,exists:r.exists,and:r.and};var k=function t(n,i,u){return r.createFactory(e({},_,n),e({},A,i),u)};var z=r.createFactory(_,A);var q=/[-/\\^$+?.()|[\]{}]/g;var C=/\.?\*+\.?/g;var R=/\*+/;var T=/\./g;function F(t,r,n){var i="*"===n[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";var e=-1===t.indexOf("**")?"[^.]":".";var u=t.replace(T,"\\$&").replace(R,e+i);return r+t.length===n.length?"(?:"+u+")?":u}function S(t,r,n){if("."===t&&("*"===n[r-1]||"*"===n[r+1]))return t;return"\\"+t}function Y(t){var r=t.map((function(t){return t.replace(q,S).replace(C,F)}));var n=r.length>1?"(?:"+r.join("|")+")":r[0];return new RegExp("^"+n+"$")}var L=function t(r){var n;return function(t){if("undefined"===typeof n)n=r.every((function(t){return-1===t.indexOf("*")}))?null:Y(r);return null===n?-1!==r.indexOf(t):n.test(t)}};var B=function(t){u(r,t);function r(r,n){if(void 0===r)r=[];if(void 0===n)n={};return t.call(this,r,e({conditionsMatcher:z,fieldMatcher:L},n))||this}return r}(O);var D=function(){function t(t){this.j=t}var r=t.prototype;r.because=function t(r){this.j.reason=r;return this};return t}();var G=function(){function t(t){this.rules=[];this.M=t;var r=this;r.can=r.can.bind(r);r.cannot=r.cannot.bind(r);r.build=r.build.bind(r)}var r=t.prototype;r.can=function t(r,n,i,e){var u={action:r};if(n){u.subject=n;if(Array.isArray(i)||"string"===typeof i)u.fields=i;else if("undefined"!==typeof i)u.conditions=i;if("undefined"!==typeof e)u.conditions=e}this.rules.push(u);return new D(u)};r.cannot=function t(r,n,i,e){var u=this.can(r,n,i,e);u.j.inverted=true;return u};r.build=function t(r){return new this.M(this.rules,r)};return t}();function H(t,r){var n=new G(B);var i=t(n.can,n.cannot);if(i&&"function"===typeof i.then)return i.then((function(){return n.build(r)}));return n.build(r)}var I=function t(r){return'Cannot execute "'+r.action+'" on "'+r.subjectType+'"'};var J=function t(r){this.message=r};J.prototype=Object.create(Error.prototype);var K=function(t){u(r,t);r.setDefaultMessage=function t(r){this.O="string"===typeof r?function(){return r}:r};r.from=function t(r){return new this(r)};function r(r){var n;n=t.call(this,"")||this;n.field=void 0;n.ability=r;if("function"===typeof Error.captureStackTrace){n.name="ForbiddenError";Error.captureStackTrace(o(n),n.constructor)}return n}var n=r.prototype;n.setMessage=function t(r){this.message=r;return this};n.throwUnlessCan=function t(){var r;var n=(r=this.ability).relevantRuleFor.apply(r,arguments);if(n&&!n.inverted)return;this.action=arguments.length<=0?void 0:arguments[0];this.subject=arguments.length<=1?void 0:arguments[1];this.subjectType=this.ability.detectSubjectType(arguments.length<=1?void 0:arguments[1]);this.field=arguments.length<=2?void 0:arguments[2];var i=n?n.reason:"";this.message=this.message||i||this.constructor.O(this);throw this};return r}(J);K.O=I;t.Ability=B;t.AbilityBuilder=G;t.ForbiddenError=K;t.PureAbility=O;t.buildMongoQueryMatcher=k;t.createAliasResolver=l;t.defineAbility=H;t.detectSubjectType=c;t.fieldPatternMatcher=L;t.getDefaultErrorMessage=I;t.mongoQueryMatcher=z;t.subject=s;t.wrapArray=f;Object.defineProperty(t,"__esModule",{value:true})}));
(function(t,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports,require("@ucast/mongo2js")):"function"===typeof define&&define.amd?define(["exports","@ucast/mongo2js"],r):(t=t||self,r(t.casl={},t.ucast.mongo2js))})(this,(function(t,r){"use strict";function n(t,r){for(var n=0;n<r.length;n++){var i=r[n];i.enumerable=i.enumerable||false;i.configurable=true;if("value"in i)i.writable=true;Object.defineProperty(t,i.key,i)}}function i(t,r,i){if(r)n(t.prototype,r);if(i)n(t,i);return t}function e(){e=Object.assign||function(t){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i))t[i]=n[i]}return t};return e.apply(this,arguments)}function u(t,r){t.prototype=Object.create(r.prototype);t.prototype.constructor=t;t.__proto__=r}function o(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function f(t){return Array.isArray(t)?t:[t]}var a="__caslSubjectType__";function s(t,r){if(r)if(!r.hasOwnProperty(a))Object.defineProperty(r,a,{value:t});else if(t!==r[a])throw new Error("Trying to cast object to subject type "+t+" but previously it was casted to "+r[a]);return r}function c(t){if(!t)return"all";if("string"===typeof t)return t;if(t.hasOwnProperty(a))return t[a];var r="function"===typeof t?t:t.constructor;return r.modelName||r.name}function h(t,r){var n=f(r);var i=0;while(i<n.length){var e=n[i++];if(t.hasOwnProperty(e))n=n.concat(t[e])}return n}function v(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach((function(r){var n=r===t[r]||Array.isArray(t[r])&&(-1!==t[r].indexOf(r)||-1!==t[r].indexOf("manage"));if(n)throw new Error("Attempt to alias action to itself: "+r+" -> "+t[r])}))}function l(t){if("production"!==process.env.NODE_ENV)v(t);return function(r){return h(t,r)}}function d(t,r,n){for(var i=n;i<r.length;i++)t.push(r[i])}function p(t,r){if(!t||!t.length)return r||[];if(!r||!r.length)return t||[];var n=0;var i=0;var e=[];while(n<t.length&&i<r.length)if(t[n].priority<r[i].priority){e.push(t[n]);n++}else{e.push(r[i]);i++}d(e,t,n);d(e,r,i);return e}function y(t,r,n){var i=t.get(r);if(!i){i=n();t.set(r,i)}return i}var g=function t(r){return r};function w(t,r){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!r.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!r.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var b=function(){function t(t,r,n){if(void 0===n)n=0;this.t=void 0;this.i=void 0;w(t,r);this.action=r.resolveAction(t.action);this.subject=t.subject;this.inverted=!!t.inverted;this.conditions=t.conditions;this.reason=t.reason;this.fields=t.fields?f(t.fields):void 0;this.priority=n;this.u=r}var r=t.prototype;r.matchesConditions=function t(r){if(!this.conditions)return true;if(!r||"string"===typeof r||"function"===typeof r)return!this.inverted;return this.o(r)};r.matchesField=function t(r){if(!this.fields)return true;if(!r)return!this.inverted;return this.s(r)};i(t,[{key:"_lazyMatchConditions",get:function t(){if(this.conditions&&!this.t)this.t=this.u.conditionsMatcher(this.conditions);return this.t}},{key:"_lazyMatchField",get:function t(){if(this.fields&&!this.i)this.i=this.u.fieldMatcher(this.fields);return this.i}},{key:"ast",get:function t(){return this.o?this.o.ast:void 0}}]);return t}();var $=function t(r,n){var i={value:r,prev:n,next:null};if(n)n.next=i;return i};var m=function t(r){if(r.next)r.next.prev=r.prev;if(r.prev)r.prev.next=r.next;r.next=r.prev=null};var j=function t(){return{rules:[],merged:false}};var M=function t(){return new Map};var E=function t(r,n){if(!r.h&&n.fields)r.h=true};var x=function(){function t(t,r){if(void 0===t)t=[];if(void 0===r)r={};this.h=false;this.v=new Map;this.l={conditionsMatcher:r.conditionsMatcher,fieldMatcher:r.fieldMatcher,resolveAction:r.resolveAction||g};this.detectSubjectType=r.detectSubjectType||c;this.p=t;this.g=this.$(t)}var r=t.prototype;r.update=function t(r){var n={rules:r,ability:this,target:this};this.m("update",n);this.p=r;this.g=this.$(r);this.m("updated",n);return this};r.$=function t(r){var n=new Map;for(var i=r.length-1;i>=0;i--){var e=r.length-i-1;var u=new b(r[i],this.l,e);var o=f(u.action);var a=f(u.subject||"all");E(this,u);for(var s=0;s<a.length;s++){var c=y(n,a[s],M);for(var h=0;h<o.length;h++)y(c,o[h],j).rules.push(u)}}return n};r.possibleRulesFor=function t(r,n){var i=y(this.g,n,M);var e=y(i,r,j);if(e.merged)return e.rules;var u="manage"!==r&&i.has("manage")?i.get("manage").rules:void 0;var o=p(e.rules,u);if("all"!==n)o=p(o,this.possibleRulesFor(r,"all"));e.rules=o;e.merged=true;return o};r.rulesFor=function t(r,n,i){var e=this.possibleRulesFor(r,n);if(i&&"string"!==typeof i)throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");if(!this.h)return e;return e.filter((function(t){return t.matchesField(i)}))};r.on=function t(r,n){var i=this;var e=this.v.get(r)||null;var u=$(n,e);this.v.set(r,u);return function(){if(!u.next&&!u.prev&&i.v.get(r)===u)i.v.delete(r);else m(u)}};r.m=function t(r,n){var i=this.v.get(r)||null;while(null!==i){var e=i.prev;i.value(n);i=e}};i(t,[{key:"rules",get:function t(){return this.p}}]);return t}();var O=function(t){u(r,t);function r(){return t.apply(this,arguments)||this}var n=r.prototype;n.can=function t(){var r=this.relevantRuleFor.apply(this,arguments);return!!r&&!r.inverted};n.relevantRuleFor=function t(r,n,i){var e=this.rulesFor(r,this.detectSubjectType(n),i);for(var u=0,o=e.length;u<o;u++)if(e[u].matchesConditions(n))return e[u];return null};n.cannot=function t(){return!this.can.apply(this,arguments)};return r}(x);var _={$eq:r.$eq,$ne:r.$ne,$lt:r.$lt,$lte:r.$lte,$gt:r.$gt,$gte:r.$gte,$in:r.$in,$nin:r.$nin,$all:r.$all,$size:r.$size,$regex:r.$regex,$options:r.$options,$elemMatch:r.$elemMatch,$exists:r.$exists};var A={eq:r.eq,ne:r.ne,lt:r.lt,lte:r.lte,gt:r.gt,gte:r.gte,in:r.within,nin:r.nin,all:r.all,size:r.size,regex:r.regex,elemMatch:r.elemMatch,exists:r.exists,and:r.and};var k=function t(n,i,u){return r.createFactory(e({},_,n),e({},A,i),u)};var z=r.createFactory(_,A);var q=/[-/\\^$+?.()|[\]{}]/g;var C=/\.?\*+\.?/g;var R=/\*+/;var T=/\./g;function F(t,r,n){var i="*"===n[0]||"."===t[0]&&"."===t[t.length-1]?"+":"*";var e=-1===t.indexOf("**")?"[^.]":".";var u=t.replace(T,"\\$&").replace(R,e+i);return r+t.length===n.length?"(?:"+u+")?":u}function S(t,r,n){if("."===t&&("*"===n[r-1]||"*"===n[r+1]))return t;return"\\"+t}function Y(t){var r=t.map((function(t){return t.replace(q,S).replace(C,F)}));var n=r.length>1?"(?:"+r.join("|")+")":r[0];return new RegExp("^"+n+"$")}var L=function t(r){var n;return function(t){if("undefined"===typeof n)n=r.every((function(t){return-1===t.indexOf("*")}))?null:Y(r);return null===n?-1!==r.indexOf(t):n.test(t)}};var B=function(t){u(r,t);function r(r,n){if(void 0===r)r=[];if(void 0===n)n={};return t.call(this,r,e({conditionsMatcher:z,fieldMatcher:L},n))||this}return r}(O);var D=function(){function t(t){this.j=t}var r=t.prototype;r.because=function t(r){this.j.reason=r;return this};return t}();var G=function(){function t(t){this.rules=[];this.M=t;var r=this;r.can=r.can.bind(r);r.cannot=r.cannot.bind(r);r.build=r.build.bind(r)}var r=t.prototype;r.can=function t(r,n,i,e){var u={action:r};if(n){u.subject=n;if(Array.isArray(i)||"string"===typeof i)u.fields=i;else if("undefined"!==typeof i)u.conditions=i;if("undefined"!==typeof e)u.conditions=e}this.rules.push(u);return new D(u)};r.cannot=function t(r,n,i,e){var u=this.can(r,n,i,e);u.j.inverted=true;return u};r.build=function t(r){return new this.M(this.rules,r)};return t}();function H(t,r){var n=new G(B);var i=t(n.can,n.cannot);if(i&&"function"===typeof i.then)return i.then((function(){return n.build(r)}));return n.build(r)}var I=function t(r){return'Cannot execute "'+r.action+'" on "'+r.subjectType+'"'};var J=function t(r){this.message=r};J.prototype=Object.create(Error.prototype);var K=function(t){u(r,t);r.setDefaultMessage=function t(r){this.O="string"===typeof r?function(){return r}:r};r.from=function t(r){return new this(r)};function r(r){var n;n=t.call(this,"")||this;n.field=void 0;n.ability=r;if("function"===typeof Error.captureStackTrace){n.name="ForbiddenError";Error.captureStackTrace(o(n),n.constructor)}return n}var n=r.prototype;n.setMessage=function t(r){this.message=r;return this};n.throwUnlessCan=function t(){var r;var n=(r=this.ability).relevantRuleFor.apply(r,arguments);if(n&&!n.inverted)return;this.action=arguments.length<=0?void 0:arguments[0];this.subject=arguments.length<=1?void 0:arguments[1];this.subjectType=this.ability.detectSubjectType(arguments.length<=1?void 0:arguments[1]);this.field=arguments.length<=2?void 0:arguments[2];var i=n?n.reason:"";this.message=this.message||i||this.constructor.O(this);throw this};return r}(J);K.O=I;t.Ability=B;t.AbilityBuilder=G;t.ForbiddenError=K;t.PureAbility=O;t.buildMongoQueryMatcher=k;t.createAliasResolver=l;t.defineAbility=H;t.detectSubjectType=c;t.fieldPatternMatcher=L;t.getDefaultErrorMessage=I;t.mongoQueryMatcher=z;t.subject=s;t.wrapArray=f;Object.defineProperty(t,"__esModule",{value:true})}));
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport { CanParameters, Abilities, Normalize, Subject, SubjectType } from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject);\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectType = this.detectSubjectType(subjects[k]);\n const subjectRules = getOrDefault(indexedRules, subjectType, defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: CanParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subject?: Subject): Rule<A, Conditions>[] {\n const subjectType = this.detectSubjectType(subject);\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: CanParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subject);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters } from './types';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>) {\n const rules = this.rulesFor(...args);\n const subject = args[1];\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","matchesConditions","this","_lazyMatchConditions","matchesField","field","_lazyMatchField","ast","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectType","subjectRules","possibleRulesFor","actionRules","manageRules","has","rulesFor","filter","on","handler","head","_this","delete","payload","current","PureAbility","can","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","_PureAbility","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","setDefaultMessage","messageOrFn","_defaultErrorMessage","from","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/Rule.ts","../../src/structures/LinkedItem.ts","../../src/RuleIndex.ts","../../src/PureAbility.ts","../../src/matchers/conditions.ts","../../src/matchers/field.ts","../../src/Ability.ts","../../src/AbilityBuilder.ts","../../src/ForbiddenError.ts"],"sourcesContent":["import { AnyObject, Subject, SubjectClass, ForcedSubject, AliasesMap } from './types';\n\nexport function wrapArray<T>(value: T[] | T): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function setByPath(object: AnyObject, path: string, value: unknown): void {\n let ref = object;\n let lastKey = path;\n\n if (path.indexOf('.') !== -1) {\n const keys = path.split('.');\n\n lastKey = keys.pop()!;\n ref = keys.reduce((res, prop) => {\n res[prop] = res[prop] || {};\n return res[prop] as AnyObject;\n }, object);\n }\n\n ref[lastKey] = value;\n}\n\nconst TYPE_FIELD = '__caslSubjectType__';\nexport function setSubjectType<\n T extends string,\n U extends Record<PropertyKey, any>\n>(type: T, object: U): U & ForcedSubject<T> {\n if (object) {\n if (!object.hasOwnProperty(TYPE_FIELD)) {\n Object.defineProperty(object, TYPE_FIELD, { value: type });\n } else if (type !== object[TYPE_FIELD]) {\n throw new Error(`Trying to cast object to subject type ${type} but previously it was casted to ${object[TYPE_FIELD]}`);\n }\n }\n\n return object as U & ForcedSubject<T>;\n}\n\nexport function detectSubjectType<T extends Subject>(subject?: T): string {\n if (!subject) {\n return 'all';\n }\n\n if (typeof subject === 'string') {\n return subject;\n }\n\n if (subject.hasOwnProperty(TYPE_FIELD)) {\n return (subject as any)[TYPE_FIELD];\n }\n\n const Type = typeof subject === 'function' ? subject : subject.constructor;\n return (Type as SubjectClass).modelName || Type.name;\n}\n\nexport function expandActions(aliasMap: AliasesMap, rawActions: string | string[]) {\n let actions = wrapArray(rawActions);\n let i = 0;\n\n while (i < actions.length) {\n const action = actions[i++];\n\n if (aliasMap.hasOwnProperty(action)) {\n actions = actions.concat(aliasMap[action]);\n }\n }\n\n return actions;\n}\n\nfunction assertAliasMap(aliasMap: AliasesMap) {\n if (aliasMap.manage) {\n throw new Error('Cannot add alias for \"manage\" action because it is reserved');\n }\n\n Object.keys(aliasMap).forEach((alias) => {\n const hasError = alias === aliasMap[alias]\n || Array.isArray(aliasMap[alias]) && (\n aliasMap[alias].indexOf(alias) !== -1 || aliasMap[alias].indexOf('manage') !== -1\n );\n\n if (hasError) {\n throw new Error(`Attempt to alias action to itself: ${alias} -> ${aliasMap[alias]}`);\n }\n });\n}\n\nexport function createAliasResolver(aliasMap: AliasesMap) {\n if (process.env.NODE_ENV !== 'production') {\n assertAliasMap(aliasMap);\n }\n\n return (action: string | string[]) => expandActions(aliasMap, action);\n}\n\nfunction copyArrayTo<T>(dest: T[], target: T[], start: number) {\n for (let i = start; i < target.length; i++) {\n dest.push(target[i]);\n }\n}\n\nexport function mergePrioritized<T extends { priority: number }>(\n array?: T[],\n anotherArray?: T[]\n): T[] {\n if (!array || !array.length) {\n return anotherArray || [];\n }\n\n if (!anotherArray || !anotherArray.length) {\n return array || [];\n }\n\n let i = 0;\n let j = 0;\n const merged: T[] = [];\n\n while (i < array.length && j < anotherArray.length) {\n if (array[i].priority < anotherArray[j].priority) {\n merged.push(array[i]);\n i++;\n } else {\n merged.push(anotherArray[j]);\n j++;\n }\n }\n\n copyArrayTo(merged, array, i);\n copyArrayTo(merged, anotherArray, j);\n\n return merged;\n}\n\nexport function getOrDefault<K, V>(map: Map<K, V>, key: K, defaultValue: () => V) {\n let value = map.get(key);\n\n if (!value) {\n value = defaultValue();\n map.set(key, value);\n }\n\n return value;\n}\n\nexport const identity = <T>(x: T) => x;\n","import { wrapArray } from './utils';\nimport {\n MatchConditions,\n MatchField,\n Abilities,\n ToAbilityTypes,\n Normalize,\n ConditionsMatcher,\n FieldMatcher,\n} from './types';\nimport { RawRule, RawRuleFrom } from './RawRule';\n\ntype Tuple<A extends Abilities> = Normalize<ToAbilityTypes<A>>;\n\nfunction validate<A extends Abilities, C>(rule: RawRuleFrom<A, C>, options: RuleOptions<A, C>) {\n if (Array.isArray(rule.fields) && !rule.fields.length) {\n throw new Error('`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa');\n }\n\n if (rule.fields && !options.fieldMatcher) {\n throw new Error('You need to pass \"fieldMatcher\" option in order to restrict access by fields');\n }\n\n if (rule.conditions && !options.conditionsMatcher) {\n throw new Error('You need to pass \"conditionsMatcher\" option in order to restrict access by conditions');\n }\n}\n\ntype ResolveAction<T> = (action: T | T[]) => T | T[];\nexport interface RuleOptions<A extends Abilities, Conditions> {\n conditionsMatcher?: ConditionsMatcher<Conditions>\n fieldMatcher?: FieldMatcher\n resolveAction: ResolveAction<Normalize<A>[0]>\n}\n\nexport class Rule<A extends Abilities, C> {\n private _matchConditions: MatchConditions | undefined;\n private _matchField: MatchField<string> | undefined;\n private readonly _options!: RuleOptions<A, C>;\n public readonly action!: Tuple<A>[0] | Tuple<A>[0][];\n public readonly subject!: Tuple<A>[1] | Tuple<A>[1][];\n public readonly inverted!: boolean;\n public readonly conditions!: C | undefined;\n public readonly fields!: string[] | undefined;\n public readonly reason!: string | undefined;\n public readonly priority!: number;\n\n constructor(\n rule: RawRule<ToAbilityTypes<A>, C>,\n options: RuleOptions<A, C>,\n priority: number = 0\n ) {\n validate(rule, options);\n\n this.action = options.resolveAction(rule.action);\n this.subject = rule.subject!;\n this.inverted = !!rule.inverted;\n this.conditions = rule.conditions;\n this.reason = rule.reason;\n this.fields = rule.fields ? wrapArray(rule.fields) : undefined;\n this.priority = priority;\n this._options = options;\n }\n\n private get _lazyMatchConditions() {\n if (this.conditions && !this._matchConditions) {\n this._matchConditions = this._options.conditionsMatcher!(this.conditions);\n }\n\n return this._matchConditions;\n }\n\n private get _lazyMatchField() {\n if (this.fields && !this._matchField) {\n this._matchField = this._options.fieldMatcher!(this.fields);\n }\n\n return this._matchField;\n }\n\n get ast() {\n return this._lazyMatchConditions ? this._lazyMatchConditions.ast : undefined;\n }\n\n matchesConditions(object: Normalize<A>[1] | undefined): boolean {\n if (!this.conditions) {\n return true;\n }\n\n if (!object || typeof object === 'string' || typeof object === 'function') {\n return !this.inverted;\n }\n\n return this._lazyMatchConditions!(object as object);\n }\n\n matchesField(field: string | undefined): boolean {\n if (!this.fields) {\n return true;\n }\n\n if (!field) {\n return !this.inverted;\n }\n\n return this._lazyMatchField!(field);\n }\n}\n","export interface LinkedItem<T> {\n next: LinkedItem<T> | null\n prev: LinkedItem<T> | null\n readonly value: T\n}\n\nexport const linkedItem = <T>(value: T, prev: LinkedItem<T>['prev']) => {\n const item = { value, prev, next: null };\n\n if (prev) {\n prev.next = item;\n }\n\n return item;\n};\n\nexport const unlinkItem = (item: LinkedItem<any>) => {\n if (item.next) {\n item.next.prev = item.prev;\n }\n\n if (item.prev) {\n item.prev.next = item.next;\n }\n\n item.next = item.prev = null; // eslint-disable-line\n};\n","import { Rule, RuleOptions } from './Rule';\nimport { RawRuleFrom } from './RawRule';\nimport {\n Abilities,\n Normalize,\n SubjectType,\n AbilityParameters,\n AbilityTuple,\n ExtractSubjectType\n} from './types';\nimport { wrapArray, detectSubjectType, mergePrioritized, getOrDefault, identity } from './utils';\nimport { LinkedItem, linkedItem, unlinkItem } from './structures/LinkedItem';\n\nexport interface RuleIndexOptions<A extends Abilities, C> extends Partial<RuleOptions<A, C>> {\n detectSubjectType?(subject?: Normalize<A>[1]): string\n}\n\ndeclare const $abilities: unique symbol;\ndeclare const $conditions: unique symbol;\ninterface WithGenerics {\n [$abilities]: any\n [$conditions]: any\n}\nexport type Public<T extends WithGenerics> = { [K in keyof T]: T[K] };\nexport type Generics<T extends WithGenerics> = {\n abilities: T[typeof $abilities],\n conditions: T[typeof $conditions]\n};\n\nexport type RuleOf<T extends WithGenerics> =\n Rule<Generics<T>['abilities'], Generics<T>['conditions']>;\nexport type RawRuleOf<T extends WithGenerics> =\n RawRuleFrom<Generics<T>['abilities'], Generics<T>['conditions']>;\n\nexport type RuleIndexOptionsOf<T extends WithGenerics> =\n RuleIndexOptions<Generics<T>['abilities'], Generics<T>['conditions']>;\n\ninterface AbilityEvent<T extends WithGenerics> {\n target: T\n /** @deprecated use \"target\" property instead */\n ability: T\n}\n\nexport interface UpdateEvent<T extends WithGenerics> extends AbilityEvent<T> {\n rules: RawRuleOf<T>[]\n}\nexport type EventHandler<Event> = (event: Event) => void;\n\nexport type Events<\n T extends WithGenerics,\n K extends keyof EventsMap<T> = keyof EventsMap<T>\n> = Map<K, LinkedItem<EventHandler<EventsMap<T>[K]>> | null>;\n\ninterface EventsMap<T extends WithGenerics> {\n update: UpdateEvent<T>\n updated: UpdateEvent<T>\n}\n\ntype IndexTree<A extends Abilities, C> = Map<SubjectType, Map<string, {\n rules: Rule<A, C>[],\n merged: boolean\n}>>;\n\nexport type Unsubscribe = () => void;\n\nconst defaultActionEntry = () => ({\n rules: [] as unknown as Rule<any, any>[],\n merged: false\n});\nconst defaultSubjectEntry = () => new Map<string, ReturnType<typeof defaultActionEntry>>();\nconst analyze = (index: any, rule: Rule<any, any>) => {\n if (!index._hasPerFieldRules && rule.fields) {\n index._hasPerFieldRules = true;\n }\n};\n\ntype AbilitySubjectTypeParameters<T extends Abilities, IncludeField extends boolean = true> =\n AbilityParameters<\n T,\n T extends AbilityTuple\n ? IncludeField extends true\n ? (action: T[0], subject: ExtractSubjectType<T[1]>, field?: string) => 0\n : (action: T[0], subject: ExtractSubjectType<T[1]>) => 0\n : never,\n (action: Extract<T, string>) => 0\n >;\n\nexport class RuleIndex<A extends Abilities, Conditions> {\n private _hasPerFieldRules: boolean = false;\n private _events: Events<this> = new Map();\n private _indexedRules!: IndexTree<A, Conditions>;\n private _rules!: RawRuleFrom<A, Conditions>[];\n private readonly _ruleOptions!: RuleOptions<A, Conditions>;\n readonly detectSubjectType!: Exclude<RuleIndexOptions<A, Conditions>['detectSubjectType'], undefined>;\n readonly [$abilities]!: A;\n readonly [$conditions]!: Conditions;\n\n constructor(\n rules: RawRuleFrom<A, Conditions>[] = [],\n options: RuleIndexOptions<A, Conditions> = {}\n ) {\n this._ruleOptions = {\n conditionsMatcher: options.conditionsMatcher,\n fieldMatcher: options.fieldMatcher,\n resolveAction: options.resolveAction || identity,\n };\n this.detectSubjectType = options.detectSubjectType || detectSubjectType;\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n }\n\n get rules() {\n return this._rules;\n }\n\n update(rules: RawRuleFrom<A, Conditions>[]): Public<this> {\n const event = {\n rules,\n ability: this,\n target: this\n } as unknown as UpdateEvent<this>;\n\n this._emit('update', event);\n this._rules = rules;\n this._indexedRules = this._buildIndexFor(rules);\n this._emit('updated', event);\n\n return this;\n }\n\n private _buildIndexFor(rawRules: RawRuleFrom<A, Conditions>[]) {\n const indexedRules: IndexTree<A, Conditions> = new Map();\n\n for (let i = rawRules.length - 1; i >= 0; i--) {\n const priority = rawRules.length - i - 1;\n const rule = new Rule(rawRules[i], this._ruleOptions, priority);\n const actions = wrapArray(rule.action);\n const subjects = wrapArray(rule.subject || 'all');\n analyze(this, rule);\n\n for (let k = 0; k < subjects.length; k++) {\n const subjectRules = getOrDefault(indexedRules, subjects[k], defaultSubjectEntry);\n\n for (let j = 0; j < actions.length; j++) {\n getOrDefault(subjectRules, actions[j], defaultActionEntry).rules.push(rule);\n }\n }\n }\n\n return indexedRules;\n }\n\n possibleRulesFor(...args: AbilitySubjectTypeParameters<A, false>): Rule<A, Conditions>[]\n possibleRulesFor(action: string, subjectType?: SubjectType): Rule<A, Conditions>[] {\n const subjectRules = getOrDefault(this._indexedRules, subjectType, defaultSubjectEntry);\n const actionRules = getOrDefault(subjectRules, action, defaultActionEntry);\n\n if (actionRules.merged) {\n return actionRules.rules;\n }\n\n const manageRules = action !== 'manage' && subjectRules.has('manage')\n ? subjectRules.get('manage')!.rules\n : undefined;\n let rules = mergePrioritized(actionRules.rules, manageRules);\n\n if (subjectType !== 'all') {\n rules = mergePrioritized(rules, (this as any).possibleRulesFor(action, 'all'));\n }\n\n actionRules.rules = rules;\n actionRules.merged = true;\n\n return rules;\n }\n\n rulesFor(...args: AbilitySubjectTypeParameters<A>): Rule<A, Conditions>[]\n rulesFor(action: string, subjectType?: SubjectType, field?: string): Rule<A, Conditions>[] {\n const rules: Rule<A, Conditions>[] = (this as any).possibleRulesFor(action, subjectType);\n\n if (field && typeof field !== 'string') {\n throw new Error('The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details');\n }\n\n if (!this._hasPerFieldRules) {\n return rules;\n }\n\n return rules.filter(rule => rule.matchesField(field));\n }\n\n on<T extends keyof EventsMap<this>>(\n event: T,\n handler: EventHandler<EventsMap<Public<this>>[T]>\n ): Unsubscribe {\n const head = this._events.get(event) || null;\n const item = linkedItem(handler, head);\n this._events.set(event, item);\n\n return () => {\n if (!item.next && !item.prev && this._events.get(event) === item) {\n this._events.delete(event);\n } else {\n unlinkItem(item);\n }\n };\n }\n\n private _emit<T extends keyof EventsMap<this>>(name: T, payload: EventsMap<this>[T]) {\n let current = this._events.get(name) || null;\n while (current !== null) {\n const prev = current.prev;\n current.value(payload);\n current = prev;\n }\n }\n}\n","import { RuleIndex, RuleIndexOptions, RuleIndexOptionsOf, Public } from './RuleIndex';\nimport { Abilities, CanParameters, Subject } from './types';\nimport { Rule } from './Rule';\n\nexport type AbilityOptions<A extends Abilities, Conditions> = RuleIndexOptions<A, Conditions>;\nexport type AnyAbility = Public<PureAbility<any, any>>;\nexport type AbilityOptionsOf<T extends AnyAbility> = RuleIndexOptionsOf<T>;\nexport type AbilityClass<T extends AnyAbility> = new (...args: any[]) => T;\n\nexport class PureAbility<\n A extends Abilities = Abilities,\n Conditions = unknown\n> extends RuleIndex<A, Conditions> {\n can(...args: CanParameters<A>): boolean {\n const rule = this.relevantRuleFor(...args);\n return !!rule && !rule.inverted;\n }\n\n relevantRuleFor(...args: CanParameters<A>): Rule<A, Conditions> | null\n relevantRuleFor(action: string, subject?: Subject, field?: string): Rule<A, Conditions> | null {\n const rules = (this as any).rulesFor(action, this.detectSubjectType(subject), field);\n\n for (let i = 0, length = rules.length; i < length; i++) {\n if (rules[i].matchesConditions(subject)) {\n return rules[i];\n }\n }\n\n return null;\n }\n\n cannot(...args: CanParameters<A>): boolean {\n return !this.can(...args);\n }\n}\n","import {\n $eq,\n eq,\n $ne,\n ne,\n $lt,\n lt,\n $lte,\n lte,\n $gt,\n gt,\n $gte,\n gte,\n $in,\n within,\n $nin,\n nin,\n $all,\n all,\n $size,\n size,\n $regex,\n $options,\n regex,\n $elemMatch,\n elemMatch,\n $exists,\n exists,\n and,\n createFactory,\n BuildMongoQuery,\n DefaultOperators,\n} from '@ucast/mongo2js';\nimport { ConditionsMatcher, AnyObject } from '../types';\nimport { Container, GenericFactory } from '../hkt';\n\nconst defaultInstructions = {\n $eq,\n $ne,\n $lt,\n $lte,\n $gt,\n $gte,\n $in,\n $nin,\n $all,\n $size,\n $regex,\n $options,\n $elemMatch,\n $exists,\n};\nconst defaultInterpreters = {\n eq,\n ne,\n lt,\n lte,\n gt,\n gte,\n in: within,\n nin,\n all,\n size,\n regex,\n elemMatch,\n exists,\n and,\n};\n\ninterface MongoQueryFactory extends GenericFactory {\n produce: MongoQuery<this[0]>\n}\n\ntype MergeUnion<T extends {}, Keys extends keyof T = keyof T> = { [K in Keys]: T[K] };\nexport type MongoQuery<T = AnyObject> = BuildMongoQuery<MergeUnion<T>, {\n toplevel: {},\n field: Pick<DefaultOperators<MergeUnion<T>>['field'], keyof typeof defaultInstructions>\n}> & Container<MongoQueryFactory>;\n\ntype MongoQueryMatcherFactory =\n (...args: Partial<Parameters<typeof createFactory>>) => ConditionsMatcher<MongoQuery>;\nexport const buildMongoQueryMatcher = ((instructions, interpreters, options) => createFactory(\n { ...defaultInstructions, ...instructions },\n { ...defaultInterpreters, ...interpreters },\n options\n)) as MongoQueryMatcherFactory;\n\nexport const mongoQueryMatcher = createFactory(defaultInstructions, defaultInterpreters);\nexport type {\n MongoQueryFieldOperators,\n MongoQueryTopLevelOperators,\n MongoQueryOperators,\n} from '@ucast/mongo2js';\n","import { FieldMatcher } from '../types';\n\nconst REGEXP_SPECIAL_CHARS = /[-/\\\\^$+?.()|[\\]{}]/g;\nconst REGEXP_ANY = /\\.?\\*+\\.?/g;\nconst REGEXP_STARS = /\\*+/;\nconst REGEXP_DOT = /\\./g;\n\nfunction detectRegexpPattern(match: string, index: number, string: string): string {\n const quantifier = string[0] === '*' || match[0] === '.' && match[match.length - 1] === '.'\n ? '+'\n : '*';\n const matcher = match.indexOf('**') === -1 ? '[^.]' : '.';\n const pattern = match.replace(REGEXP_DOT, '\\\\$&')\n .replace(REGEXP_STARS, matcher + quantifier);\n\n return index + match.length === string.length ? `(?:${pattern})?` : pattern;\n}\n\nfunction escapeRegexp(match: string, index: number, string: string): string {\n if (match === '.' && (string[index - 1] === '*' || string[index + 1] === '*')) {\n return match;\n }\n\n return `\\\\${match}`;\n}\n\nfunction createPattern(fields: string[]) {\n const patterns = fields.map(field => field\n .replace(REGEXP_SPECIAL_CHARS, escapeRegexp)\n .replace(REGEXP_ANY, detectRegexpPattern));\n const pattern = patterns.length > 1 ? `(?:${patterns.join('|')})` : patterns[0];\n\n return new RegExp(`^${pattern}$`);\n}\n\nexport const fieldPatternMatcher: FieldMatcher = (fields) => {\n let pattern: RegExp | null;\n\n return (field) => {\n if (typeof pattern === 'undefined') {\n pattern = fields.every(f => f.indexOf('*') === -1)\n ? null\n : createPattern(fields);\n }\n\n return pattern === null\n ? fields.indexOf(field) !== -1\n : pattern.test(field);\n };\n};\n","import { PureAbility, AbilityOptions } from './PureAbility';\nimport { Public } from './RuleIndex';\nimport { RawRuleFrom } from './RawRule';\nimport { AbilityTuple } from './types';\nimport { MongoQuery, mongoQueryMatcher } from './matchers/conditions';\nimport { fieldPatternMatcher } from './matchers/field';\n\n/**\n * @deprecated use `createMongoAbility` function instead\n */\nexport class Ability<\n A extends AbilityTuple = AbilityTuple,\n C extends MongoQuery = MongoQuery\n> extends PureAbility<A, C> {\n constructor(rules: RawRuleFrom<A, C>[] = [], options: AbilityOptions<A, C> = {}) {\n super(rules, {\n conditionsMatcher: mongoQueryMatcher,\n fieldMatcher: fieldPatternMatcher,\n ...options,\n });\n }\n}\n\nexport type AnyMongoAbility = Public<Ability<any, MongoQuery>>;\n","import { Ability, AnyMongoAbility } from './Ability';\nimport { AnyAbility, AbilityOptionsOf, AbilityClass } from './PureAbility';\nimport { RawRuleOf, Generics } from './RuleIndex';\nimport {\n ExtractSubjectType as E,\n AbilityTuple,\n SubjectType,\n TaggedInterface,\n Normalize,\n SubjectClass,\n AnyObject,\n} from './types';\nimport { ProduceGeneric } from './hkt';\n\nclass RuleBuilder<T extends AnyAbility> {\n public _rule!: RawRuleOf<T>;\n\n constructor(rule: RawRuleOf<T>) {\n this._rule = rule;\n }\n\n because(reason: string): this {\n this._rule.reason = reason;\n return this;\n }\n}\n\ntype ExtractWithDefault<T, U, D = never> = T extends U ? T : D;\ntype InstanceOf<T extends AnyAbility, S extends SubjectType> = S extends SubjectClass\n ? InstanceType<S>\n : ExtractWithDefault<Normalize<Generics<T>['abilities']>[1], TaggedInterface<Extract<S, string>>, AnyObject>;\ntype ConditionsOf<T extends AnyAbility, I extends {}> =\n ProduceGeneric<Generics<T>['conditions'], I>;\ntype ActionFrom<T extends AbilityTuple, S extends SubjectType> = T extends any\n ? S extends T[1] ? T[0] : never\n : never;\ntype ActionOf<T extends AnyAbility, S extends SubjectType> = ActionFrom<Generics<T>['abilities'], S>;\ntype SubjectTypeOf<T extends AnyAbility> = E<Normalize<Generics<T>['abilities']>[1]>;\n\ntype SimpleCanParams<T extends AnyAbility> = Parameters<(\n action: Generics<T>['abilities'] | Generics<T>['abilities'][]\n) => 0>;\ntype BuilderCanParameters<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\n\ntype BuilderCanParametersWithFields<\n S extends SubjectType,\n I extends InstanceOf<T, S>,\n F extends string,\n T extends AnyAbility\n> = Generics<T>['abilities'] extends AbilityTuple\n ? Parameters<(\n action: ActionOf<T, S> | ActionOf<T, S>[],\n subject: S | S[],\n fields?: F | F[],\n conditions?: ConditionsOf<T, I>\n ) => 0>\n : SimpleCanParams<T>;\ntype Keys<T> = string & keyof T;\n\nexport class AbilityBuilder<\n U extends AbilityClass<AnyAbility>,\n T extends InstanceType<U> = InstanceType<U>\n> {\n public rules: RawRuleOf<T>[] = [];\n private _AbilityType!: U;\n\n constructor(AbilityType: U) {\n this._AbilityType = AbilityType;\n const self = this as any;\n self.can = self.can.bind(self);\n self.cannot = self.cannot.bind(self);\n self.build = self.build.bind(self);\n }\n\n can<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n can<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n can(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions']\n ): RuleBuilder<T> {\n const rule = { action } as RawRuleOf<T>;\n\n if (subject) {\n rule.subject = subject;\n\n if (Array.isArray(conditionsOrFields) || typeof conditionsOrFields === 'string') {\n rule.fields = conditionsOrFields;\n } else if (typeof conditionsOrFields !== 'undefined') {\n rule.conditions = conditionsOrFields;\n }\n\n if (typeof conditions !== 'undefined') {\n rule.conditions = conditions;\n }\n }\n\n this.rules.push(rule);\n\n return new RuleBuilder(rule);\n }\n\n cannot<\n I extends InstanceOf<T, S>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParameters<S, I, T>): RuleBuilder<T>\n cannot<\n I extends InstanceOf<T, S>,\n F extends string = Keys<I>,\n S extends SubjectTypeOf<T> = SubjectTypeOf<T>\n >(...args: BuilderCanParametersWithFields<S, I, F | Keys<I>, T>): RuleBuilder<T>\n cannot(\n action: string | string[],\n subject?: SubjectType | SubjectType[],\n conditionsOrFields?: string | string[] | Generics<T>['conditions'],\n conditions?: Generics<T>['conditions'],\n ): RuleBuilder<T> {\n const builder = (this as any).can(action, subject, conditionsOrFields, conditions);\n builder._rule.inverted = true;\n return builder;\n }\n\n build(options?: AbilityOptionsOf<T>) {\n return new this._AbilityType(this.rules, options) as T;\n }\n}\n\ntype DSL<T extends AnyAbility, R> = (\n can: AbilityBuilder<AbilityClass<T>>['can'],\n cannot: AbilityBuilder<AbilityClass<T>>['cannot']\n) => R;\n\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, Promise<void>>, options?: AbilityOptionsOf<T>): Promise<T>;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void>, options?: AbilityOptionsOf<T>): T;\nexport function defineAbility<\n T extends AnyMongoAbility\n>(define: DSL<T, void | Promise<void>>, options?: AbilityOptionsOf<T>): T | Promise<T> {\n const builder = new AbilityBuilder(Ability as unknown as AbilityClass<T>);\n const result = define(builder.can, builder.cannot);\n\n if (result && typeof result.then === 'function') {\n return result.then(() => builder.build(options));\n }\n\n return builder.build(options);\n}\n","import { AnyAbility } from './PureAbility';\nimport { Normalize } from './types';\nimport { Generics } from './RuleIndex';\n\nexport type GetErrorMessage = (error: ForbiddenError<AnyAbility>) => string;\nexport const getDefaultErrorMessage: GetErrorMessage = error => `Cannot execute \"${error.action}\" on \"${error.subjectType}\"`;\n\nconst NativeError = function NError(this: Error, message: string) {\n this.message = message;\n} as unknown as new (message: string) => Error;\n\nNativeError.prototype = Object.create(Error.prototype);\n\nexport class ForbiddenError<T extends AnyAbility> extends NativeError {\n public readonly ability!: T;\n public action!: Normalize<Generics<T>['abilities']>[0];\n public subject!: Generics<T>['abilities'][1];\n public field?: string;\n public subjectType!: string;\n\n static _defaultErrorMessage = getDefaultErrorMessage;\n\n static setDefaultMessage(messageOrFn: string | GetErrorMessage) {\n this._defaultErrorMessage = typeof messageOrFn === 'string' ? () => messageOrFn : messageOrFn;\n }\n\n static from<T extends AnyAbility>(ability: T) {\n return new this(ability);\n }\n\n private constructor(ability: T) {\n super('');\n this.ability = ability;\n\n if (typeof Error.captureStackTrace === 'function') {\n this.name = 'ForbiddenError';\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n setMessage(message: string) {\n this.message = message;\n return this;\n }\n\n throwUnlessCan(...args: Parameters<T['can']>) {\n const rule = this.ability.relevantRuleFor(...args);\n\n if (rule && !rule.inverted) {\n return;\n }\n\n this.action = args[0];\n this.subject = args[1];\n this.subjectType = this.ability.detectSubjectType(args[1]);\n this.field = args[2];\n\n const reason = rule ? rule.reason : '';\n // eslint-disable-next-line no-underscore-dangle\n this.message = this.message || reason || (this.constructor as any)._defaultErrorMessage(this);\n throw this; // eslint-disable-line\n }\n}\n"],"names":["wrapArray","value","Array","isArray","TYPE_FIELD","setSubjectType","type","object","hasOwnProperty","Object","defineProperty","Error","detectSubjectType","subject","Type","constructor","modelName","name","expandActions","aliasMap","rawActions","actions","i","length","action","concat","assertAliasMap","manage","keys","forEach","alias","hasError","indexOf","createAliasResolver","process","env","NODE_ENV","copyArrayTo","dest","target","start","push","mergePrioritized","array","anotherArray","j","merged","priority","getOrDefault","map","key","defaultValue","get","set","identity","x","validate","rule","options","fields","fieldMatcher","conditions","conditionsMatcher","Rule","_matchConditions","_matchField","resolveAction","inverted","reason","undefined","_options","matchesConditions","this","_lazyMatchConditions","matchesField","field","_lazyMatchField","ast","linkedItem","prev","item","next","unlinkItem","defaultActionEntry","rules","defaultSubjectEntry","Map","analyze","index","_hasPerFieldRules","RuleIndex","_events","_ruleOptions","_rules","_indexedRules","_buildIndexFor","update","event","ability","_emit","rawRules","indexedRules","subjects","k","subjectRules","possibleRulesFor","subjectType","actionRules","manageRules","has","rulesFor","filter","on","handler","head","_this","delete","payload","current","PureAbility","can","relevantRuleFor","cannot","defaultInstructions","$eq","$ne","$lt","$lte","$gt","$gte","$in","$nin","$all","$size","$regex","$options","$elemMatch","$exists","defaultInterpreters","eq","ne","lt","lte","gt","gte","in","within","nin","all","size","regex","elemMatch","exists","and","buildMongoQueryMatcher","instructions","interpreters","createFactory","mongoQueryMatcher","REGEXP_SPECIAL_CHARS","REGEXP_ANY","REGEXP_STARS","REGEXP_DOT","detectRegexpPattern","match","string","quantifier","matcher","pattern","replace","escapeRegexp","createPattern","patterns","join","RegExp","fieldPatternMatcher","every","f","test","Ability","_PureAbility","RuleBuilder","_rule","because","AbilityBuilder","AbilityType","_AbilityType","self","bind","build","conditionsOrFields","builder","defineAbility","define","result","then","getDefaultErrorMessage","error","NativeError","NError","message","prototype","create","ForbiddenError","setDefaultMessage","messageOrFn","_defaultErrorMessage","from","captureStackTrace","setMessage","throwUnlessCan"],"mappings":"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"}
{
"name": "@casl/ability",
"version": "5.1.0-next.9",
"version": "5.1.0-next.10",
"description": "CASL is an isomorphic authorization JavaScript library which restricts what resources a given user is allowed to access",

@@ -32,3 +32,3 @@ "funding": "https://github.com/stalniy/casl/blob/master/BACKERS.md",

"build.core": "rollup -c ../../rollup.config.js -n casl -g @ucast/mongo2js:ucast.mongo2js",
"build.extra": "rollup -c ../../rollup.config.js -i src/extra.ts -n casl.extra",
"build.extra": "rollup -c ../../rollup.config.js -i src/extra.ts -n casl.extra -g @ucast/mongo2js:ucast.mongo2js",
"build.types": "rm -rf dist/types/* && tsc && cp index.metadata.json dist/types",

@@ -35,0 +35,0 @@ "build": "npm run build.types && npm run build.core && npm run build.extra",