!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("sift")):"function"==typeof define&&define.amd?define(["exports","sift"],i):i((t=t||self).casl={},t.sift)}(this,(function(t,i){"use strict";function n(){return(n=Object.assign||function(t){for(var i=1;i0),r=this.m(t,n.h);return n.l(this.O),this.j=r,this.g=t,this.s=n.s,this.$("updated",i),this},i.m=function(t,i){void 0===i&&(i=u);for(var n=Object.create(null),r=0;r1?"(?:"+i.join("|")+")":i[0];return new RegExp("^"+n+"$")}(t)),null===i?-1!==t.indexOf(n):i.test(n)}},O=function(t){function i(i,r){return t.call(this,i,n({conditionsMatcher:v,fieldMatcher:g},r))||this}return r(i,t),i}(h),$=function(){function t(t){this.rule=t}return t.prototype.because=function(t){return this.rule.reason=t,this},t}(),E=function(){function t(t){void 0===t&&(t=h),this.rules=[],this.M=t;this.can=this.can.bind(this),this.cannot=this.cannot.bind(this),this.build=this.build.bind(this)}var i=t.prototype;return i.can=function(t,i,n,r){var e={action:t};return i&&(e.subject=i,Array.isArray(n)||"string"==typeof n?e.fields=n:void 0!==n&&(e.conditions=n),void 0!==r&&(e.conditions=r)),this.rules.push(e),new $(e)},i.cannot=function(t,i,n,r){var e=this.can(t,i,n,r);return e.rule.inverted=!0,e},i.build=function(t){return new this.M(this.rules,t)},t}();var m=function(t){return'Cannot execute "'+t.action+'" on "'+t.subjectType+'"'},A=function(t){this.message=t};A.prototype=Object.create(Error.prototype);var x=function(t){function i(i){var n;return(n=t.call(this,"")||this).ability=void 0,n.field=void 0,n.ability=i,"function"==typeof Error.captureStackTrace&&(n.name="ForbiddenError",Error.captureStackTrace(function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(n),n.constructor)),n}r(i,t),i.setDefaultMessage=function(t){this._="string"==typeof t?function(){return t}:t},i.from=function(t){return new this(t)};var n=i.prototype;return n.setMessage=function(t){return this.message=t,this},n.throwUnlessCan=function(){var t,i=(t=this.ability).relevantRuleFor.apply(t,arguments);if(!i||i.inverted){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 n=i?i.reason:"";throw this.message=this.message||n||this.constructor._(this),this}},i}(A);x._=m,t.Ability=O,t.AbilityBuilder=E,t.ForbiddenError=x,t.PureAbility=h,t.buildMongoQueryMatcher=l,t.createAliasResolver=function(t){return"production"!==process.env.NODE_ENV&&function(t){if(t.manage)throw new Error('Cannot add alias for "manage" action because it is reserved');Object.keys(t).forEach((function(i){if(i===t[i]||Array.isArray(t[i])&&(-1!==t[i].indexOf(i)||-1!==t[i].indexOf("manage")))throw new Error("Attempt to alias action to itself: "+i+" -> "+t[i])}))}(t),function(i){return function(t,i){for(var n=e(i),r=0;r